From 326cb531606ca93236cc4406afc496525054616c Mon Sep 17 00:00:00 2001 From: krahets Date: Fri, 6 Dec 2024 07:19:06 +0800 Subject: [PATCH] deploy --- en/sitemap.xml.gz | Bin 1008 -> 1008 bytes sitemap.xml.gz | Bin 1011 -> 1011 bytes .../contribution.assets/edit_markdown.png | Bin 444155 -> 89985 bytes .../vscode_extension_installation.png | Bin 475802 -> 146194 bytes .../vscode_installation.png | Bin 488611 -> 124802 bytes .../chapter_appendix/terminology/index.html | 5 +++++ .../suggestions.assets/download_code.png | Bin 395104 -> 109029 bytes .../pythontutor_example.png | Bin 395258 -> 75912 bytes zh-hant/search/search_index.json | 2 +- zh-hant/sitemap.xml.gz | Bin 1010 -> 1010 bytes 10 files changed, 6 insertions(+), 1 deletion(-) diff --git a/en/sitemap.xml.gz b/en/sitemap.xml.gz index 02c3c525cc9f82201768b58c425454f82555fdc4..c2b4b2d2ea4faeeec1d2d06228be4701baf2f46f 100644 GIT binary patch delta 15 Wcmeys{(+rMzMF$XLun)1D`o&F9|WBM delta 15 Wcmeys{(+rMzMF$%JKILKSIht^?FA43 diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 24d0361351935c58405f61660ac3e18c21ef6452..23e7d18a4d56daf94968805b7404ca3451ea85c7 100644 GIT binary patch delta 15 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

V1G;Jm=4U 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 literal 444155 zcmb4pWl$XL67J$oaJS$t!JP#H!3pk~zy@~>65I*yu((4A?(P8=_u#NN1oun6@0@f0 z-KsmawKcob-Sf1+Z_k9QD$8P^lArGD`vU*~d!wqT z@&5Ja|JRY3nYpvG^FJ0S6l&;c5T6ilY;4@o(UFjlFg-o}^768^wRL)Yyt}&_(DLo+ z>4}`2>ged`;o;%#?v9j{LNG4u{QUgj=KA&6-`~HyxF8}T4G#||ARtz2t+~Cu#m2_N z#U)snU!bC*nVg(lSy^4**jQUz8y_DR5)z)7nd$EC9v&Xv+}y;+Ct6xsVq|2&#KaaA z73b#{q@kgwqhpkikaTr*Ymk}goMQY{(-c#^q!tx%AuyDq~z1<)BIm~jq?rtYyB0I<=Mko zRE2T5BjAjo^vcRAWMs7De9ElXGD3&#txdpfdL z=Dv>h2Go7CEwK%244pnXtQZ~`*x&hD<2}8yTsJn-J_&IycM5K(u_-G6*5+|nW~gN) ztzDd%7v*@@RJd2UNhim+IXcF*HOZ&NJ+-ooEXi(hEASQEBQ&tBcVc=3T z5|Oj>0)C7?EjMB z|NF$``d}U2A1fr!#P>zX9tKSk?@dTr24hbv?f*kmm+Bqm&#xJCdrJGicfAbyvIdiy z#+tl@s^|v`$@x9oVq$8E#NCcT&6-3ZdCCnFZ z?#~Jrw;G+qjc&8Cb5q+>E@b-zU_pOMFg+DNXZIvgERCa-gZv7JEY304($18ueA9w8 zs(SFV0`4Iu9!W|)jXnwg_t*om5E`Q=o{L@{nn@b}=se85HyQg5lA;c@C*=urul)R( zh#QX*!ZC}E6=70wmM1Yiw*h68Bq?l40tQ-7duZmM6_sGFb!W$%;POs|PEp0H5y?%Q zMtuvM5J8q0Cw!v>B+?1xi%8=3I-MiA5SbYz{pPTlcJnL{x4k+{|4?5vd z8GgGuaG{~>jgkqP=BJf4y?0jh6YfWPGt6)X)^~k#sbX|53T( z@3R4q6}ouse43MteQ6sY5`#Yj&9h&asVbkj}vTSO>Ov z*x~-EE;H}IQXzqDtRk3;hh0BiPA`3=hW(Cg^>I#`*zy7{zN_QbLxJKWe4l04wIwO5 zN$V%Vbsq32OjCqZuY(6n$fgc~whc6(c5KJ~fnK z#jwG?MPK-}h{)jZZjRc-{5ZtC7aLt0e&Mv+*K9o~bc-T0y;|^Uu#_VvS0LOxQ`zxW zz{PY|2kj=dz17eTFQl9C>-f{!h)Z%|&iZ~LVp*}`h2RiEUCUb?#G%U6Zz-{y%#9p3zU@MA3gFZS~>Ff!CWxqVwL z*NQR#Cx9A&Q&Lj+dogW9o*=*sZcmWRe4`-x0y;7|;K{Arg`7F?-b6VQ#obDHTwqwh zII@<~k}@XL@i}};FEh%23oFKzEO7H^aI));V&#Og`l$4NcFLxn=j$5=4Fz>JrFtIs zdY;TLU&5OCZiwD{EH8rO%ss!uepn{Sdwvn`)Rl_9!h)IkAkDfn1|uz3^O)vhDTAyME2k?RNsUw5}>}IXB9jxz_qawdVwY|z9rx<zTSZLd2+{0I-Hi@6NjF5Z%ngA2iEau{cARBfzRPm zVlWpw(;N?xS})-TfAX;2YxehVplH55p&1SIWZdqulzxXKO#mbIZHNShPSh4Y{%yrR zv8om<@U6p1D9Chs+d))aSFbd#cVt0luqdMRX>IlS<3$PF7-eP33kwpVi zJNM4MkP+|A3h+8?nv&U){SCcZQcK)HV}S<8XbH+!

9?^+=={D(+VW>;~UXH1fb{ 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�(X$5UR6Yhb10*%3K?`N&QWU!&uBy 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%0DPr9WQy$2CC0$y* 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

GZNC^spPQF18ikC%M7J``*2Gg#m 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%0Ay^s*Hv9Js~i6Sz-3L8-jvWZ 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�^hrF?HO1+~E9ZYeT; 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 z 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

J}Ll2Z@nV}`n?H^3F%@seke``5DdVF zz<(S#2+HbSbHB!)4^P7y(lkPckUv>%%rMcpe^XEmPJ3xnJs7wN(7CF~kQ^jzF5{z$ z*)jvczIRr!*<4$J63p4DWSoy+Md9)0Ds8p`+BAT_SJqE2%X8-jYJ=A= zqV3E|okcO>|6j?Ll~*-aYDI~cP$`*_`KKwUDrLpA$RG4XQUCc*pv-0zNNYL!*zfuW zRFppzCht!BIBt1Wm>wsUuMkj1MhK>8k?;>6j?JC^ zqEduQ5C?2S;@Zjo-mq7gN&NcnXBZh39Ik2(qL@KAqgiY^&lF8%o`m~nRmo!{1`E5 zyqL|t1Q#lt37aD=rY&@s^+M?NYEpp|%p=%MydNQtIS6&^!(8R3QGr*F&d(Gw01INQ z{yOmGx0FmkF`RaPae|Y~o&wo((f&E;oFJ090W2#bEv-HphN8R(>_ItC!U_*6f^drx zQj$v=5GSB9i0SZ!o_-$@Kt83mNtWf@DivH_^x9c{+cZB0xCv((OHx14bMn? z$VKL@AmNc`+QWCrT@4={OQQ!wyEk7wl}@bnDzr1I*n4Xd_=CI>tXunI`YzNHTMO=! zh>zR22Qo(%FAH`G zt*&}kyRIn5nSuzJ3<=CZ!Nk^`eGDC@AOLoHZ(+`_=wS#f489|;LQU&d&<*hLrW)mU zSCj4maCSdjoe_Tr3Wt{^#3}u5Rg)9wbZ2jdt#wO8x%a3a0tFyINilVKx^5`D&-QNK z%E9}HxDSMKtwPn#MJkIo;T#IN7pYaucUOoQr~xf^Ui_XvYXH9_kf?koALBQv8{_`l zdW1}yeHuUhkOflju=hv|1KO=QkpQ2bX7Bq~Bi(OI5AFw*CwgYh{mX;L{SKrr-i|f} zhoV&r6P+WMCU$&aEL9*3Oro;?3*R)_U(^;bzu<)p$DE=?WRn@fsuDM<= zm6bAa*lfBVd!?Jd!J?a!QkOMO1Av)uqTQe<(1|k&eisPaLA*<~^1!(o<@5A~u>dvC zeCzWX7R!z{`G3gZjm1wuS3R_}vOUWeIIiH6eb5bjOht5octoimfI_1Tr)UyK3boiF z?baMIGIemajCFh!7;kH1a_d(Z+2fw46J0qPe-7zi{!vqt>>x}k`b-{;XkhM8vS_t= zA{YE{H#-=xsPtapbNiR@n`74wjogOaW}+y2A&A|`cY~GpB~qT0qHEEXD-xOYW-J3A z7i@nW&3)B@$xr)uK@xr&kbL`83H(z96)vU9v$tK(yR|@;`-8#-T0uvQ{P-Hq|o7n&QZnE_ScR1^%UJiMRPPs~dVa6ejdBlWbY0#^Btym8bjA9k!o zM4O-6w#w1)nXL9Lj$p>ppL~LI#Poq0nD!xB3;3eUb5eF67e~$u3)kd7i%5f+MMH_F zLtr{DT;w)mr_gdPgy6AFk&LEK?a6y%Ug_;CW^U*;wEGH;Qd-JqgEd_s(_vrv*ntt< zsM&xc4C;Y^|0ZR}0iOQZh>^@f9Oo8}f#u~=C)>06PaJ!baV*F#@omJnaVW}0>NbFd zS|%y({5R_7`nY*-EJY9zj3pP%w+Cvvcoasv9@kwM*-julzJmUQibYw5S_ z0h90l3CrF(!X-d`iAY`EUh=O;peKw;htA8K<#YcTfUsEnanSWqw1hhl#ifg5poIy7 zN5|#&)V7^ zY5}#Z`{qcj1*K5MNnUCyb&AybFc=&QOjicO`6S_z@UVz~xl;5Rtb*47U`smPV=-fR zQjcPc2^qo=`I`n`im$qB@Qu@X9fKv8E@l~*Fah;+rK;2XBi#!va28gGgrE@e$m0*m zJ$E-yAyUuf1~bCXAoru3{PyEi{GZB;_$m_hbzRLp4Znp=x>sP~N|DlmkI^JYIs*qF z`8iGR_RKm&#gt+_N^Lpzx;OrS1Kdu!d@VwoXz>2Shn0^j-=IrrO1Y%pTChEvL8ybH zRBrvVX1gc*Ylbn^p;37;4nC2qa@MOy2U4E;NNvvP_K$*1%&51d(SPDu&?u@2=*8+_ z#5lRyYOu-flB4?=RQnE!Z}CD0&D;L>73vfFlC^#L*5`Zf#^Wjeysi0qv>?TSf}gJi zooyN7Dt6XK%>O1Ex|RLF%!7l=pJ=y}d#+38Bpg72E#FlZc{iK8h0?z+pE>;WQrh^l z*yGo;ce*uc_J<`R^uVTGGgT?U=M8|bkn4+9p3RY$1L9Hr9g3w9Dh-+p+3;S7Xg!z> zn2P?F-N;3b<&sV;S|9mHDtSx?*z8J;(KC^B<%581b<`yp?Y^Y|hJ*@vOTFr+^RxLC z@kWou^S6^|yz^pB>)b5%0zSm3|*AJ=J!M4B;pyJXf&A;n1q@2pCn$oL8c= z4jxAS_bX=8HVJNNJ%Z?LtmV=RFomLDd;sp^4yCsZ75;!R0K?i zt`@OtDKNXSQ=1V)AxF)hc!}Gfn_}vy65?Lns>9Jc$zAx95tQ`e9pN~JcuLtU_8%W4 zk2^Ossf%r96d-=kuPLjN&j8dVLgxx$I09)Eo0OLAdk`)2`#7-?)@V3m5$AOTd)jXs zP-~7}6pCWZ9N!ewV`8r9QSt3rvadmb>?rsfZRJ9V_29AhMhB@5O9Y?gsVW1V?nBrj6en!dLCa0(h}m31ndyW(X9 zy@&qB1n%avnV_f?$$A3{Yc&a{uF#y-WM8{BzxD!O7VB4R$_zfr$yf9-C^cKTQYxk{ zj)jp|RW!fI4WH;KtIi25@xF9?&RTj#!D_wo8Lp%%Y*;OWo=X;&pTH#J!>I-2K1wsf89Pi9pG^ndPJBfmqkGT^qpAf-Zpm4MG? zv{;K~c#A#VguO4)RG8+OMaFY*j2n&5Ua>}??_fhWXEh9m{!1X`l*WX#~u zEm5VCEj3Vp>@i1xxA1JZES^er0HP~EL-=ft&J=m!JNw0G@HGDXETiM8+Bj=x{pDwrxO4wWWJDb z4qC=HF{bZV>{UWC&ERWc9JVaPEpU8dU+na!Xe9mNi;W#UiYBacpBM|+l`!X{3t=KC zB!{x=&~}}sN>Op93#kqm9fSV~PO6HFGu4SVMXKlReKY$4VgNHAhkhJbaZ?+GmRKSU zmj@l_v?m|4+;3m=Wb5w-@?tR_xKh(=j)T&Uve$%hf5=<>*a?5d>2{K{7N_QSMG+wz z2B!^dh?6nHO>f~a!zi{?p3R|4nX%t&7(&yUtS()p(yh;a-PIxX*#wZpV@zOKa+z@f zd&Lz#X>cKTFJdI-+zRwVPP3^m4LhWM-x@?WC;Yn1AI}_#RA&Sp-n_KREg`1h@cZ8e zM)&puQ~7a42C_$@SCEVQKFP0k{R<4dKZ|uL@M^vbMFRK6AoayE3DSRCuSKQu4|cKw zK8u}lnJk&io%ryNLSsYWty{}sqD~SQp>Vxu_>D}ZAAy!bya zV)l2Y0npe<4;38$@J2rmE!`}R)O7me_>#fbTtpL5wtzdxwh#(z;48Wt7IUg$o03Cb?xzQ0$;taio$scy+D|m~t?mT)Du;2| zbgL6n+=rHCu;pNqHd#gkQE-E!9l`)w&b0v+aFQ<1p|BXC=BX5nCDNHrSy)0|`=$AGr!YRke*TL22K3pIHem)9N*j zc(FBHd#r?{brJr-7o2k9d--&1(ePWJ?11aKP76NTdjyW#+4+B~t3L-48S zK#JF&(>$v$F}*J8HL3CFV#CDJUV(vqq)fx36HuQA1xXLO`2MFE1FwJAz9mcL`=b^G z_buIsPHRm{-XQ!*A3v2_L|7+OqL@lrSubZ`X|+mqF4t{yp6lZFDZ=g~kdX#+hL{r; zzTH~CbrMWZLnhZBVogaD$CZ-9S(8|tOcDY5mDd}V*DVBzpwzgc8qJOV81Rhb6K-occedLuCT85qR?TjG;=Q?aUS_7K-$@KLornQg~t*M z(W7|fGov??(5?Jc~AGB)dEm-(NIK zab}@RUGp$M4AJLoS;kiEt6Pn+AxrFIqywRodeVU1Q4LQR zpLtyXPX*IhU$t5YaCp(W$FcAl^BtiGCS}`zY{N(Ylz}HwpUI2aH3pyL>CAhw&@cS9 z|Do;*&4#l$?%Xw5H^qjMfz3nNCYYT&+Yh@0+h4mn&4?Lmq!TZLfk}SseARl6u{Mrj zdrpEKbB06)$qnvDty)I+xM1!wmWgo{i|o8%;#({l0-I`@vQ5T4j5nvx8nSl@OU1r` zJ=xt~=)V(hmKVD6zn|?h!Hl>3mK$Rg>PR?Nj^s+q63Njnn!QCc;HhSt7wtt*JQcUhp4thdx~LQonUx{7mQBG>1}|5)Fkc>v6Xl*VsF z`-46~2R!6eg_rp}UwD>*j2wEHN;OvTMV~F&4jH!p?9vZkV-mibHFp0D&Q;_;ByLn$ zbhuU#cFI#N_Yt0LE8;b|I6_!Co=D|qQCdpgGY?909`N*~h|oaDVm)+XAFtWe!p}cT<>}v2?KNz3!Ed&#*&- zN<<73Mp`3H6N|wpJ^xL7SoW=-ES#w+Onofr^(lIKf!~cdUzcNA? zePD=6>1fo3ybJ*SsLu(jYj+}Q0OVbj2X;K0_HH%*|--Awc6ro)F*zdrk1y` z0_!|~o=LLC)oxY9%~0U#{mz8>iw9!FZGZ5OVd_k%CJ94g)l*#=P6i|&S?!sDnrn1W zQSe%^pSO}F?=XM@W~^FtZ|-!^X%KeTbo`Ye&;R4;t)rrRpZ9S^QbAk&4mG80SI z;!rAgDw@>cbqmDdR!WIkd`Nq%c8-!uQX9t<=F7c78jXbNJyfS{Fw=)?njf^9|6^@z z;RwQU2(~>G1&@=rRYyF(E09jXe8bIkfb+n9N<19g?p`enReL;3fzub6P@ZMVq_M9qyf0}4;tmimHHq9SMfO(L zO61*hWSX%i3d-3oURL6Arr>MDuc}4n;)^RfIXq?h<(oxYlB4xG76_d(SX|M|vG(bu z4xcr8jEdf@Pb#tMPW1a!OFZ!guh{IFK%28TBnb^Yac8@oTk-)qrJ6Q3A z&0@d!{BoL{-hG^l#mlLZH*8riqsCTGxb2pUS5C-_c;X5SjW-~I`G>h9=G`}ctQ1#K zrw%L_b!zwJ8R$2*lA12wmyK!O_mzKDbl-D-KmW~vYz@`0tnhrwpdrOpS!i9J!QT#% z(}tAmIDt8p8uo%6^Q70f?~2nhs4+_6*b#@XuA3h9$@j8isxn><8YV0yiWWb{i=X)O zd)O{TvuH>%+XnN?6Y};_$>6D((&SnrdK-ZVS^4J!G2?YQAtid~+EV#nah_RgE$PEI zJo0(+7f(^sF)$X5dklD{Z|yzU#5$b8fy&2$_%h}QbsQd_Zcx%qGOORhF~doX0x7N(F18zK^@atyzbxMWp({oesXsn zJ4!8A|LJ~M@!_zV@d-JGJcm*6v{v*S(9|jak@*uT^98Nsw0H=X?DcGu7vA9PS5h+B zXK{cV=Z3x=G>3q}(}I_Eg`i>G;JIgE3wd4tszgL+zBmVqY#(Ek`xH0!yHcJ*5w1bt z;c-0>tfH>OHqAam=>qZ9#vTLwZ23*FVo!&E!$8hgxk?u4D5WRuT-=!`ph{u4KUc?_ z(4X~$EpE|F{`ZTa)vQV(Hd)9ELI0FZ#b7OZ2jmi}2Gw{zCC36aP%zV4sJ+di+I(84 z!bS48;>ClJvBwgj>e1B|#V=w|pEZ8PaC`RaW3&oF3_j2pbBIy2htHl;8 zIFcTe$FM3mX5Nf%7xp*nF{#lmW`BN2?t>rMF*B@K%I|FySKUR@L3T>8x8*+!G^vm3-@gxtVXK>%g=@zXcY@I5%7uL9FoV-#aX- zRuppHTG8Y??1eS2i&CC?QuD{x=!6JIKaxy}1LLUwU>88u>$kAkh+C>+NDL*0H+SH7 zzA!6#pVn?|!L#Yq7K0C4zfeOkPe+HIKF^Y?sGuy~pc!gjNdR-8)`cxle;5mRtvM6@ zAY?tqfVX62_~RznG|mq(v8UC><=cEsoP@#4WT8{!2HV_>6aoxg@#)MR>?o~dT!{J6 z0UVNlNxd>C@#B>2lbGV1Ak}?IeSGYzJ8&yTl33?b%t?ZT-Wyf>z8@(|e}eigR$iB1 z4Y}jp@x7!y;4u_u4M8u0+lR}9Ips`Fh00hu-4A9Xr06>lbD?EgQx8kCJGzdPR}8Vx z^1UIateKOv2mRQmKD^cnm+yzjdK>KlhJ_y+G87@a$0xGazyavfXaQQuQ1{-NF%>|_ zz=Xo{HI#H%^6%yQ=nbpVj_XlXO#V8FJ6r% zU4V!dWyZRPv#$s6pSYP(xlAHLKq!V|umI|Pyhn?~lN48W4sNNLwj@LUWa?Cg}p;*T8|&la}8JPl(%P~MA%_z?tBiH_9cyo87O&116W#_&v$s|&lAmbtlD9y#NF-UtzcJt_(P ze$CoVJvCHGoP`F>h;g(7qT$x1``>emqdMx>vO7CDYWl zZW6mWB`+!iv6u~zziw(MUP_%*wZC>$2#=VSACCyw>jnSnF}A~s64}XmP_Md(^G~U_ zR8w6L_pc8)zUXn%aS@jmb-`V)g`Eu1!%>*+V?sB5zN4xqS1s(IYY;9?W%~s_ZYpyM zOFOOxTAs30mvbR)baO-z+neq7mzK4@$othY{0kB8h*?2@qFMd2g$`liLlT{i1d7@S z)(+Eo27REutWb_tUz@KJLHGM5f({S)!f`Uqk}628gFqmO3Gkg~Q`4tKuvna%Z7|uk zM=drR5Jt8YzHtn8KndNFjC(sLZhS}C6lvTR$)S8$(`9TMrwI-rn_^zoS8{%240kYV zD!TpU%kP+g18BRy!1D`0g=GsVqx3MddOzf1XN+p3n-W84-ChLDqy`-Hd$zyb80PxF zsqafoT+3jty+tl~))Ho|Qa))d#Fu&e+BtF=7^D6hlaD&sjy$;cR*s(;UR;QU#d7(& zYKk`@+#lI9-z=EbciexN0f&fk>?d0zzJ@?dl@0%R%7)A)K?e>gApG@JAXE zQImP*jvWG+Ljw%_zH|_a>75m@53OAbTk2W?CcoWUD*P>&i(|RtU4OYVOsj0$nN*1S zkWYt#*fMycLCF~hry;3lngzNIiRG{ZN*5(r86|0A`S)ZR_w(d7FWenF57N>rbu+5e zKYVW@y-mW@uvqv-?BweH)cV)SB2)+F#q?9LHufK2-@8mX_d|rw#3Imu@9qdQp_kTN zVPU%T7)QuMUD$NB->w(q41VS)PWo44NMwAiJkqJZ=w{pTlQ)g|<<0ju9`PbsE(PRl@ftQLX60g@Qop#EaqOTdtc_@O`EM$$ z6H(a*nZ#(OZm|e-{R81srcM@E)Lt1@4K__3mAMBvrAXGoZhwJ$^*;CiN%_NMEQMjb zaMJo$m|3tK4a3@3GX!U_3vO=qvrI3HjwuP|Lxh-&WNXeklTpT)JU~`92}x%@XRxjw zdKQvM2W=>KGHjy)oV%LNMiy)vOfx(35&n6C+XZ3&7A8a2Z{6BQ`AWS5ke6svA7mMC zYbP`4V~NivQ1VLBJtCkS#V_TbfgX@(8A5W2-i@E5PofGVXIq9nNhkgg?9UP5`@!5u{~*shlk%U`zAp^7kpmWyJL7G{y4IhA}M z)KR%27+H7xaqUfDYX@aLuCzj?X!QVSarD=7ZunY8BcbtFA+fc^2$W*GlLox`Yq*h%2EROtf=og6@CepfG8@!yS+1jpWc!gE!I ziEa;w0>i!_)t7-P?yf7zB3zLp{O{qf9NHtqJ>jepyH;yMABbfdk@RpX&WX%PYu@vz z(k>${wvp~Gz$gnXo5_NYGIDg&t;I53E2VYZ`}-n{4^kcXLGW!Ce!7YN>Pr-7j9z+@tPsy<*$}}6=+4LIL9r0d+y*o+@!U_m`>Mf zw;3efE#h;ZveOV-((5Ogb*V)2Bef_XxsG?BQ zJujTw8A-xf{`1nb;(VAZ&f5LRR!q@AE`6#PNUP%V(}CuA0c}MA+KT@yC0)f`m5Z5+ z-iU2gr$tS|Wk_XUF3;|?J96egQXz06cjcyYfGUJ%IV^3&cGl5sno?GE3DD(}fz9P% zQ*$HxnL~hJP(L_Ch^XWnG@|{Ho#=?*R0@IEpSB&{=(QZCDQPJ%5HXoBjzY0Qh#Iq@ z%l00T1+)Yq4hWEX?ph9k!VLeXo{(92)phAk#1i1fEynHJeQ;$NBoR=r@<^r^I=&gH zr^vR)Ma0sA)Zc*=(TaHWC=vh0g+W`8GIzf<;E?zqIS)*7`14E@JzuNzAcB< zPOd69g__=cc$zV$N_iQAa^Ro*D}n`uW(dLWfUtPmFM+sw%K-3V{;32>JY=!x5L~Dp zr-~c@smp2m^!S1lOi7Vx4{m-F%S1(WOF2^|?RfXi(sP(15O*Dy%Cxc4VA#uu?ea^2c>I zjJ{A!^)ojIQ$#W!sAI(EGao!ss|9qG*XYSjKJ|}19|sq+geI(zPf>|%S@3e_c4lA7M;8ud6CKCu;_~`mMY?iq8nTb(nm~2@#E1QkK&c` zVpd@%{y34k-)^vhIIgR2AfMth(3e{|afST82G1kPa-a$SP9%4LR?4gy%LqKB3D&sV zhuiJ#Zke%>cK6lw)N8_y@#TEk&n%(5It0LGtm_jHXjbQOMejjm<}8)IA&;{;q422$ zQ8o8*cpk!^NsGd%6AO`j9dV|v{7|Cgv|WVL1Ra6An8~+@Qy>Q=s3dHtJ=NWhv~A35 zhZ>3M07HNokJnFF&$hPft0PQM6?PA-S=>;2o(rQiLfmeDRx22q=Nxx^^X^LXUzTO3KZCil||h_$vMcgb>v65iQP&{H(JwO~6Y)4UF7PdnJ1^F+k1VF|?an z<*QC%*JdGbTAgL{Hkl2s*bnigOChrfrUvc9d2yM=*?ld`_3yuhy3st>ESUdxZ{8-e za}g@2YfH}fVZt#lPLpyDnt@V2_j*!WG?F9*9rv8s%U#KN(FiesG}D|471#wkFfNEP zjC>Pw5Bu7UpzeqUaTC(KgsuD;l){Y`60qM_;J&Z!JtLQ zxEH}kF)GKUr4k2vl#0-?sjk8$hA1Ny-Ld|NxDBdl@O-}Q`V1lP8S7`67&N!XN6$YG zU*_UB%g0n8*$f~jlEz==qJt+K;Cki$h}*g=4!DE6QF-kL$7}b~MO{$TX=I3o+A%BA zw;3`KOCComL#mW8t{H14-&^f(er#h7;jo*4l&IMATQ)xGnuD-9o{wq)H zZ_oWC$5(u+@J?UcrVoZ`x4z~tk zFy95TRn43;)(Qp}z%vzJ?GI#+Y}`yMGxSAQ2>65whDtCGV@p7D2U~xX>?Ojz((odg zc7%q!b`Ldbzf-Vo0_3^?R`R+e*Ck$z+58T>nm^t2yE`A({1r@a1GzzHbi|DHr6Fl| z>H@L6DBh3hMlW`6oMVE~!8A5mDKeZ&VO1!TneM&w;I{6Bcu76uvY`v0M!|PN;N|Rn zHY9G%tfG5m*!fDz&dX9cCA{byXR3eN)8HFH-AESdru=qXoi%-X-V!|f4(hI-lKUcv z^9Va)IDqVlq$>Q)A^2b~RwOc`NhuCy*MW>+QsFJ1b^MXzS`1KmRi#@6zaf(ySa2Gt z|Ek0#aKJ*vNdk#Ad~kbt_4!7meBQvU;a5SChI+nBBRp@1CF=;sfVU1$@EC_f+;8M= z-}S;4X@mDTdGqh64k(z)tWp}pCJsm4DsK+!{0yb%Se){vYEf{NpaT5%_2#A?h24U_ z76nf5vV3>K=VhxJ-J0v`?xvAyyFI)FHp)!h>T>~R zX7?2W*&bL{G@~l*p6z11ae3iiU{DoGc!shsxkbiKydqXtQQi0nJmfo8h@azq`P7)* zt!lgdvdWRLc)_ww>S4xbW;v)ar?|V>pZp&rQF1E5p)0RVkbDN+LE$dk_Inw=WJxc{ zdimi+d=s`YU#A(RXw-Z#-$_%h((ui_&>qxfHPm!>~&hPAH^$W}7HhSzE$3b;&o zBYizQA7o*O-Cdsd=pwpZ>rNlUzTplIgLL>(9#~>bHjTV$Mof`E{iHUH_*Yc&_q|a) z_7uGOs5kFYudWJo?G-h_KHruP@bIX}DbSp-(;@ya{fTy)JOs7k~<_CmnM|{^UN~4Z!45vkeZjF;bZ;#jkbhLn zK$9k&9^e;eU;CGtYL_zm|DjHv-TG|ylt*Ql&!h60{YYoxbaKhjChqsJ&$^#@@?U7x$%A+`j$sl;N;k+9GsAd4a`|(|ZIi32hK16>P{H#x8FM5goTzP{ zp=TUv?{5ifwcOmkdu$;mlO~9v3ST&|XksfJg~yC3U~yuy>rw;FvrQ=14r%vUCcFEy z>7o(WMtT&9-35<%X81@uYhJX=E)q~s4Y30OFk&8WeQlY_=|F!1gkPFjEg#6l$#8Kc za9}7yP+KfirT(>s3sM7`^ApzK1-Q%_YesGDtT_c^-FAM_R6iGIm)xn_{_T&CXTn1kJk$UP1;bqHHgx!M&4%Z$}@V=R`&LMncA@aLdbm#eI zz*?N1SEB^>j&m*oyv1ezWew~96_a*ot;Y9OGX*)2y77@u02$$;ZHn!bxpk|-3g#lY znzPfTuA0Yx0jT92a~Eq(5ds?5bY|5fUo?ox4DVPZHZNIP=iw>kA(!h|_i*)kU9q{y z*cTSRsu+st0P!i;6p}5tgu=meX?Olj8E$KO8+S_rilegzTcS&$#FpwblhzFm1fcBI z{M0M_eB-NHX*=WY(J*103?1Pwum!JX`2<+r=f+Um;Hvy^8|hwg>zT?N7&qZm4~&Ni zeDm=`jgE*p>CMm7DfMR;L>0Tgj-#oHi&mq6=H(-h<!~L|Z(`36bNO@ro464>cKHP6-2YUa2c9Xe4`AueK!QrdJ zMh4t2KMMQe9&Y=i2c7>rc8XCrnMEVk#DSowWZ2BLXvD|{sKB=P3Oa8{%}Ki#cVuI2 zG*cymI340@(81(0s^MIntEDwC%ndBM%C-4H?$miM^7o{&S-YNrSZBUzCoUi9LQlRn zsDyktR{JkQQyQA&N;OP}$cwRtyZ@|m4bH2iyYlb_L&305Ge5*r%*^&d++`-u;cbY_ z!V4G#Y*bql%mGpT8T%GUWa_t!99fGKj5t21zI8}vne=ZzM+FZ)&2lsl3+dUan#XTH z!15s^HQL2?j~W*TH6C?esh4z#_=YA>I}4F3I9HWT^K!6c|D~I*f*Nf`xe0~hT9La3 z)DFv0=5T?t|AfwW1}L)n>9{l9c+{{W;JWHG|6->=q$#NywWDAGVs~N!J?!@BU=t6T za#Qk=eevXtS8Zu+KMM7g=`}}I>NTNmE#02n*I*L75PKVc&+_sA9On`m*J%T0D;AB9A2X@arP(2J!_EL2 zMF;w45)CVv?`yCL%I>3EISxuT^uGaml{B4Ej{&K}a?}6Bv33f41j1%nZTutcvWUZK zUzIp*Y`ED-REna0mMb!Fw&V#-sE(LX3K;Ab&YLloC{1ic`SKN(Ur24}7fJP+{OdXZ z%C9K@4*gmQGE=$VetX>-_hnZE3)Xye{iGxmdhg2>zJIwMlgI-2GDNt+t1zQ#kI4MR zI&zsFD)ziJ>x~d^JSzNyCdf}pPEcvk?@B`QIRb-R#Ya_|@fj-yh^q)9*Z!Lv7=;1r zJHsnhjxmt~P{ zNEPbqPFz}TyOs&^M$Sv9D!U2=9su`D0!T}{F66rCOTb^HI*j*_5vhoRTP=IbpWx+l zh2}G>OeDRO<x zmwxaXBLVQ0XZO`V)he{ZO`AM4FZ~Kbjlkv4_RmkwR&L8TvMqnv8f)>xxw{a9#OIew z_rY`(C1&SFRKH%s!B(lWP^jRgEqak`$D0$YyZv@6#_;(08f>MEWYmAA;pNOKIb^p= zZ(Z{;uStB`^|%CK9DFkb=7+m8X?A7xcMcdT_=1DRyoA#1vAs*^E9F0w6ROM)8s?vB zBlM1e6AI5IL+jt$f$OQQWGj0%C|d#`-n~dh6nw)|OoShtKEFQQ$Q<4Eg|=khXMJhN zxOIi?!Nsxtx#jud@bJmf!IiJkMY9vuWCM|Cr3KX!K$@-lh6}f7G%>gYCZlZ-d3nfs z(|~$qYpT}iXg7ba1nhN!4x8=f5)*XKcK9K95pH7DW4wY;=Y-)NRDzbun-0xc=w8HF zw4&Cl@ZuHVq6-Z&jN-$cdm-tV*P5vXPgHQq1FHpoh}7ZGYts1QiDM02i+cu|+<(&1 zS&Q_vjr7!7LxyV1Y?A?pa|)%I_%{_QjFnd_g}IlBgDP zBDoR;E4sP_cqOS_poPeEm7Q|DmHDU&+RUcmAvM+$g>5nnIrp9C??_3 z1T!ZZ$&j#Pqpab@qhb~M0sZ;24kO!=bu=@pkzZeV?Zi(Y|HR3`jrq`UuVM(!U1f?8 zajhSM<6|JA{kz~u`|W5Ai-2^k?};*7Ln*pt z>nA|#uW|qS+g+&A4;W zIZ+j0!AxGA&ceBO5_YBqb#jr((c7V8Ht_p1t9P65PiC6(_Io401Z<~ojE7}5I4rvR zIecePfp-9&(@4=%J-v;b4hge0$5Y^VT^pEi|eJ*k-K{h3SBxFrB*eL2< zmvilof!2W?#fOea!>Lmnzh)nTeb+@^{mmkXFtijiP@Hj>={E`%UbMj-9AZ9DvefDki+rKi{5Jr(51LH)pw{CXk!kmQBn`f@ zKUi=_>z=3A(U{?6x8N|0|HU@N65CvQp@`t~;6MhZl%c6w5_)MeV%cLd3mkDHV6AVx z{9A}fOisq-$j$_8f>`$&r^I#!oz5q*UnCS&WcS^(*jco8zwh-Z?Bjxm``k8pVk%PD zr#~c`KTW033~9o)#3Z|0JUx_Ihm%EEnUN0Zv6HLQzHd*;#C>zGAz|Hgi(hjiXgj$% z{ZxU4&TeqXujWUe`8d$3z_|tifzpesWgM*I?nI+uN{6Xl!)aB0Ts8ENNw0%f;stDd z-WP-WG@!i(;EY&@?rT$M~lSnSMHLX?OXx+t+u|IzkhoWEMUvSNy!K9?PxP`4{G*8aM6I&+(|&S19xWJfege6FG{E!B^TS zi0bWyQ<|T>8OC#5qY@Mi{xX?%Qtel)+=&#P*8$oY=L7O~{PBZ9@`ybVqkM&8da9qkKHOthzY=!aq7WLnEn0^d@!K#NU{i5 zIvtP;ZPx+vM2?<>&=&mWkgS8c-O4kX8hXD(3=7IsP$MWJEk>0r7)*H!&=$q_C%S9C z%I47AU9jP|0an?52AZZ}4RuTI>zeb(JOEp;yuyhMOG%1K45z?J35;cw!oVnZ07H`E zL6FT74Iz!C-W25UdKR>1$=E_~0;-C44vF`_OwY3zqx8Jwv=f+sUc3>%S7mn!#3#9c z1C!++u3`*Eg}R?fV=^6;yVgbw4hrV7Ptz=m(lON--)F`FQG%TAbImcsHYf*hDXx5h zr1X<7&PabYsVaLcVkC~A7=TS!uXMj^ zHXWXeJ@+g9%$g;r+!F5_N17!}EWA!@bGBDFkiDw5&cEav=N>a6;6+Q}bh zK&E>K0R~RWxEJZF2+t1z>xa?Qei_Cw$>{w!Xy5(gdFScp=eZINY@5x0HODLQA-<}q zqY)GD{_p-FIRV6@R8_9udg-PlI3KFzWtM<#%tN*AfiLJULkVp-u5rON+Yhc ze$Ur-)N_Ng2$gX3;x~S&pQWZvFauSH1;XOr#sbMq*mGyw>+tbkQAXIPE*<$P_bz)? z7OvSclo_q(D3X8a444b?dUKh1$MwV)7ps3k#MW;f&rYD+KTy;?m|~EL$UN*xc>bTz zlFxv2>M#pZsZ4fr!+T7yrr_=pH%yw+d&fdewsF;3XhPq{2=0KS3Y~QNX`Jc^eHgb4crl9)>QxU ziG|V6_m#~r+Vt@}G5c;xpKlBB+7rM9=O!glde;UJ<%Q43u2Ci&c<-LpUwo@^Hy*)R zmvVi5XPMiT*HN}qO|@(9_TGS6|Fev}S2a_jJNKDP$442SoPkip4Z0e)C5)FH&THgEbZiNYEMM&*?TydSL9A1bm2;NdgRc5~I zDV*JH!bdb=*>qNp0SiPp`ivH8|NY6Fm083)r3S_*rM>q}Vuq6c)5GI=L(*T3-_Dkw zycq=4(?ICfatMxS1z4iWet!n6YqRU$!~&08%ERhkE2aunPDIIm9?#sR|Rtgz`K)0f41XO(*JxkY&0sfHZqp%SUq8;AQ8%?~o&?D>$>N z{eIWh^BS`a%e*N*rqnSFzkCc7gzSUr&k)SB|JIKm)}8-rptnrje0lR$qUvU7&wd+{ zI_>{mYR#~t{7+5`CyPMxna z>v?Fgvv)Z^y+6?7vP2v(c-pC~j*@F>Jo@dI=V^35yJ6>P={RwEDPYlL8X5G9QRgTQ z_OrWWZj+n!GNuC=bEO&+@@h#z)W!DxCGZzS?y)o~KQ;Ud|EaWD_t4(0-g`T0v@ymC zSC1np!)7s;Fa6rQ%QW7Etu`HO=W2r;e#v;i#c$LEJCvU3_GOv-cXCX=Dgw+f$&Jar zyJLJUS?VdAJ`;>b1??R!2KfC*%q_(~$tDM!#25O2BZ@V4UZ+`R4>skBeL9jns zkUD(A%3z!Z>X&x5Xj9iXlioPF{fNl^seMGR0o+Kh<3U$KeWECT;gjnv?~L7(=lvuH zpGtcGpOW>GtP`s{Yr^}uI3b9;*9hgIUv<9zz904WhR9HTQ0Bvd!GAIj|1IFYxRMYf zpc`?S#t-2ux?`le#oXtMxI(8UN_K^suH{|MyEV7qjL*k_6ZSjK!7mG)bu;?XrE&3O zCP%Y5`(=2~RV8m#k3g!SJAqc$#=~yxqECQ~z-m*;U%_IIWA?$dv$81~WX_?(7BU^1 zkH~z+Nn?{OU(oR1j~~qaOkOYkRnvHN5gt#?ntwaqeOFfMh5af{O9=8Q044TlMaL%yWJnqQ8n(nl~+Sb z#5!aB>)VnAbNF*oCQ%3H2dTCgE4RN#IF)9_=)dRd(Ij02z0Ka?dAQmkibPdaeICwS z#hgVGZy`=}BOe}z{f#d9C3&?K2t^EuJQZiX(}xs2DB%fDMOr*s&eCM-X-!mO2I>81 zj1lg6!eRO5KZeUQcC1~*+mdeE) z%_gjWgJp(>i-Wc^sBw*P5k7wHKIA#9vac2VE(;=j?gT{RVS*z4K#SZtNn))(i7!BwwdoT4e6im$q8+oiTB(;Q{1QOw4FK(WTg1vQ_eG#BHZwSlNDP*I$pEN&#IbK z!0}^+w%aWOGtGWC?NP1B=)VKug#xPoIZv*gmN-pdhVt$ciuK!fI9C;JMz*EUQBrxJ zco=4^mr32lZ{m^abL~;FYi>zVR%tO0(wbmid=dkA!yuq&v4${FnljP63~!Abn$ppb zZ|DQ4a)y`|=8msZcE3_EzGK%s&)N(iG={mE0}Dj_dt}_RpEw1-lQFvL%l$y;HBS92 z+d(}As-8+}qBjtciPyF#&~!*$9Z0&s*}m(1y65Jl2v9Z7QPGLzuhk%EGPHk z9#T^?3?b|6OA-yJ84qsI?SPjMkJ;{8+3F&q`sj<?n$KP zxao!bcN|lM?$DG`!Pr%m-FhDdJv21yc08`bp>8k--`-cJ^~LGN@=rmgP|Q^Tjsb3J zXpJVlu=T^$HYv3c-$mE8I!DHRua_#{$Hn-*dllxd=^tP3 z38^-bk^()SyT27|i&)0Vk|mY%6@*+0GYh1H`L9yZQ_+WWIq%-#)ypy{XHC{sk5g^Q zlv{ddz{mPA>2dQTlF9r`|7ic<0kO(^gPNh80our#%0a=yzKxBI5}%&Z!G=FZ4VFV* zuh_KQqrf4wlF<2Yr%D5%Pd`SIhQ1R=dH}aL_K=|*fBA3Pyhb~@{}7T%J$(J*a=v#; z7w^~;V(27^&n1b>GpawsBn&GC1uPt_>7M``T+UHN;?w~b2|GqY4+8M9cEpHtPw9RJ zB;%Dm0^4O$H?IcI^gZK0socdm=-?46?>afRA!Hl!yV_;=&hq3;*pl^(luC(RFa`SV zbRI!Oi*20p-k%DXFv^}jM{HCp>&LL1U&Ia&gEvwyLhC|R%W7Z9RKAjeMMn;c@Zyu? zPh!ajvv@~|7yN0VTDINS@p&0(le9spuj`Gb#(FO`_43;o7jOI_TzdSOr+U{z?%9Oe zSl(!S8LH5Jkws--x^!|z)fE*NEn~^ztWQVR+I;|iYeuQK-2W-V(tKXr)3cp#>lO@Z z$D);<=F-BAUkKCRy?giS&+Xl*RB#6`He=;WtQ?d#Ow_<((@M0cX|)Jle-VDQ#A)~z@}DWbCEY3IaL_b%ur z;~3kX+=ONEcB>6O9OL+mI=b1iHLSCFy+LK>%$~}Hw z-4%ZfIGh3+b08uZ5sBd~$rn?xQsU)eR9>ZoQk#OfrzwdF4X|OaFSNs6gVEVCt-xAf z>2w(RP=5tJw;jcBH}tk(%9AfU@}qyIYxkU1cI{QhtjV$^W~{T_C6f#TE#)=h%22n< zQKM%7k%L)cj1cy!Z&E128Dz5I{&FwPs)0!^;LdVh*CEoy7cug&@fD&8OVpba|8Q6C zsM7Eg#Frq!#>N&ud;jGQz*N*2ZQTHy_+U%!K8x!hdlQ9xWEij}_FX#2j#RwDI4<-I z?#%uEgWJL{d4s&KMEH2~JKG_oXkt~syXTKr@|#dS;mFL`jzmORydvT(!ZJPQ#nJk4 zfbTzWw{y_*3n3`|u(s)FYXWd^ZL-$LtN1hetHvXeius_4PSW-v z*WQ-;f>&UcQcF#oIGH44yIYz3%D1RWN+L#mOx0$7ZlBp+yyC4gv&Pp_k9XiDS(C^n zY+WXeWbflz+MAFDs@M}Yo3MJ@uyz$v1RqVsF!tjr+@`UwgTkkQo}YMshId!X^%Tfk z*Pv7#zS{(2QdIlQbEk3N?$6NA`%P|^H49;A?(mxEXHyjJAHk0+TXe$jG!-ar)1m2u zVtgYdmc9XyZ#NLNR&}$I=Vd$oZ4~gN30u&8&uO2D@@6>)%1l%tSmfK--(^XvWU)U*K_QL|LDc}L;gD?FTIy!y?JtBn%wjt$u9?9~MAwHIED zvlKrgHqdSj&CUO)t<7)6`%H`gRjV zo@tMXeVUBfvtZCI`M!z*Lf$)e2M7{u;x=>AWI&D@NO*lr8yEvhBz-$I!cP^c;EmHs zGLBC4)nFz`PMMpgM~n<(w5H4bbdlLS+zvokY$NiNVH~HK)EZOm#mgH-{Qmxc|86In zGEn`nwhnAsco1c)v&L6LHEmQRStPCumG%JJfqyBWgegKuPf}elcp3rLjUio95Z9uN zMk!SY_hROWaCS(EYVe;-8g7{!vcoTSBN)slzg#rR#d}{jdR;-lBZqRouuW+PN?1Of z${1MlOaGOqya3MTZLmEQ^P*DU2QR6;D{aT&%r$Cxpw7027EAe$oAV2OX<5K-nWtw^ zB;;DH*3|iUhPUWNl*;4cF8HP?#{A$K>%ye`GP3z|FVR6kwJ{ab6EUcx!VVVY$Fjfd z`xekK>L9GemK}wgSleoe`E#$@p09|!_0V@&{9pdJ&Cx$z;oh&p(fg-oa2RMtH{u+C z8?ZF{=p$ue!QN$nqHuQ!Ks;x3WLmdgGb3(V;Isf>c#Y5v%92${-c`9LEL2h=Z1VIo z>Plo`f&1pZ@%prP6C_XT1qZPc(wto5WFQA&a{lW@-uM>1VwnByo&j7W)sXv~F zn+Ey0^^%pvz4esUVw3LX2-baLFSY~Ztp4bjMSY-46Y>3e3;KkEIU(b&z9Rg1VerbB z^{(sdv6oHQ%4S#~)q7f6XBswfzW#E2W8EW;>)C09_q#V!td(D&zB2!MlZ!joXRq!< z%-rL_0~hJRpov`oLKbDrTc)bPPcEvlVzKqUy|?q7*;2l%q!f`F?)>xQjsu(DS$nr( z4={qQ(nL0e>(8~0ZJbXn9ULqjToxnl?$+5(J@j;a>*d8{VDhTzti1@Tz9Md#X4M)t z-|p#ZoL{PLh&K`+=qj{$-gYzV?kQ04>L#_Yexmq7h-+U@;?-qktcY#cxGn&RY5agGOI#II?98{yjtR|)2l0rI+jV(CSPN&|%6T17+> z^S=BeE(gf`eKhu36sfm(qjH(gDD&n_7kvjk-!Q4e71G;y*u?5+D< zknbE^hPB~>y&sc5eZSAK0zU&VPb#%`b>v_4%u*#mxt?#8HR!Xuu86%iA+dV4WAoPb zpVqS3TVL-6RL|5*n3k+==JSrDbTmQXN#Ls)H}7&QJHO&o2KSMvr~(GYAMhi$8645W z{fYjFgLk;MNjRGDH%aCcNO0J{?uP*27h28$w+M?$78I*rUMzFj$32erbZL(GtVydm1|8|&{~f9RvZGG; z6oGOkH0n68-S^uI3r1Eh;rz(K@3YJ1$3NE1LYiRzHih!uR|IhI(Fte#`CO7rN+abH zyiCQ)Mx=!I12X#GrFdJeP|J#+5T8j{?eAAVCFLG0xe?o1+(4Zv)!bf3#;B45UYVj9{(v)b#W=aUB;9J^F@DpC~P?=+#>0KX2vcpcto?XQD4zu%#1tJ`3=D4c(m8;IUN z*PXF$T{pRyKQDa1Z~klcG4f3Zer{(Dmb9E@TX^?FqI!?pwe)RoJCYwPbAJKr2=fk= z$5&PiK;(S2YMEz4u8RWeUQe6KLae}AgxhvX6X1VY+FX-M$m=+h;sZr?j0Q||@T_AK zt+XBca_!5G97_f4N+f-w?w7aBca!U%Us0f8 z0LNuUi0<(n2^LEw5ia)ole{KgT(E=DPbNp|XMhFeE&cKS*bVdFy2U2>PMB@pxvR@o zk3-JjY6%WEZhpDk&uNkseajayZDM}ymF%J1N$aQ?-;OB8eDr0=02Crw{d4c%{rx}> zsgx#^SnuFjQ|2c~mw#;;IQ*t1KG}S&;s4b5W#K%o==tcIn%+QL^S`9vsWKJ3x;Y0E zPAn>Z)!s*uV8v}j@N)k1d{kQ00*dQ7{6Q-jKPy~fDMu0Khq`|9JfE?ZOlqv59;y{f z(2RZ{m@X5vwa!%8Anon=+QnCAB|rIgVhXG3HMnuUma)`rdd)HGpGAgy%j6Uz21w(I zc{t|)udI|g)7=k_SB>YAWK2_~`!131@;{P&@d^37XG!i9aIJ$M!FBcgQkjds0J`L9}`LJYZv`+B+!H^Xbce7 z@UL-Nj?eG8-85oRbvmUQu$T|GNd@C98QJOGo;Wy(uiHId6}>gGnO-NKfZ0OF0YA#{ zN?sdAr;{z3m+i$>f)x+i?Grs)Z%}LMKC)6H!Sd2t(;t9Ud~p(&A2YZz6u4e>)=m9! zpzqe0St|bhXJ60%qv@@~n*6{2aS;WiM<_6QfCvV;5mJITCCCUt5R?#!F}g!ZsT&xe zvCv8ehGNs5X*WYv0e2Bi?QDm{N{Puq8$#pUwg#X(LF$1 z5Ur(`IQoYs{p&{LfslN`9T`gIYrnITtJASLSxL{SJyyic&_8D>9l8${$%BAshB{X*9(Sll1xZGASm<*h+mvU~KL zzd1i8J86ySpDI=Fi-8m5;!No;X0f~v6*0|7&ED0hhU4w6n+K&mA}c=E*c=SMj``?_ zxA-A;@E-*CKpBDUi$Zr9R#ti*X3>@W#WZM>Wfv3^Q>0H_o~=EcfAP>=522;IZU3`? zZ1K>g-cf;+)jb^)C|1Bh-(d48Kc`M$9q>AR%XaxiFV(t;O6V^GrsQ(od<5TjBfDk* z>EHV<)QPy7AYvLk0IZd{h_0E586;Q9Y6f@z1)l4>MZJ8!2MSqB+|BDi=xR*lKb_3C z_lNOWawvNnivW43 z(W++TWzIX~xt&ZZ@bGTk9YVIzWJB81uiw5mz4W#6h25S}Ggjez@5OEzy12C={Xkf^ z!Vgy0-vOO`vy`~OmMIa9pu7>TH*xT#z1mgeZ{>Jdz>Q1p7zcrujmp`dgRNv_pW<1w ze|TXLUk5U-Or;z%93>Hp8NU%eu_i4e2wo^MRqq+>xyC!|CRXo zX4YQ*8C{OlZ`w0cxx$zD3(_r|m0!1B$T zdm*Pd&lT_uHsCe3{}gDYOu(#U;d3$4&e#v%3NWJwb=+n-t6BH{sPuj#_RCXr1dT6vnAV|+dGE2hrNJP#y%~mj*_PcyJf9j&d(O-#q zz8f3V&IFMwH|)Nb^#29SE`){v-&fc;0ct~f)-tv;;6YslmZY)ZY4dK>E2AEDcSV?t zXu8dR4d{ibAiuCCpD4&6({UVuf;Z!vM4rDy0P zP8oAYb6&$(;ElaDcV^2SnJ8w}x-60@u5LgBvqKskM|D1dryoEuVyoMt>=S@8R)vKu z4wJBg{pp;>HcvZ+?gf6!A#$`!5DfON**~u8U3ab-(|+uw^4{ksOGwCZos@fdV0DQi z>y2iJXVi{Pa5fb^<=6N%m2XnpN?}Fzjly@CBg!^%4EnuzZz^BwtF%nS906wj!aL9{ zJi>>$6Vf9i78Ctwmcp+i;(i8Q*PPdr&fSl#EN;|0hpq&&JUY6JyQ_m^)ca39)@Jpg_K$oxKU!9{0DtjaMW5KqpOYF@DOs#-`>}(=9<19aTWynul znirF}0WSDs1HUa&X1O%f>~6|@4UB}~yUu_TS7I*=F+G_)0)y^J<_(e{sc+#7sGeLK z52q89W+UYl&F7wxeIBEmHx6xj?;riD;``M|?J#8{S&k5r+y9in{4c^Yw}`~qBHWO+ zN;pOYF_QK5Fon0yUAt4q_|zi(FaIl9^-}5pHp2D9`3GmfK5=0OFoW2)6WoEiYtkGC z6jPbBl#iy@4@S;DG7P9l*2^Ou>v=`($X9`zh;GebOt6B|WZWAMEU;b_^+OZv66(G= zEd}+kX|*_t%^-N;Bkna6QAIcV>f*qgo9I$Hm(WKKp$6e{-6^d3j*f1@{#cKNQJnI9 zw)QKT5Mu1T9H>s)DO92!@KF2<7<*#Wtw)}}HC-J_6BjI3 zk6t9!*B${cx;YspLicUxEW&A~JKv7Fj@XbWy?Qu81nLZ~;TtGuf731RmEZd_@TKzY zuzLZwI9(<3EJj#u$JOE>v0;wumG5KvlQRF~yU-4_iX)1o84~1`ri_E|D-p550lN*u zFzhpbY@5}9cD(rb6nA7Sgv=lP!2IFPzRf@u?#=B!{o%*6Yir%O>QQMp?_pgV%57E6 zNI&@^dA~i1Zguu<=QqgHLaL7f0{vVuQsd}!88Zv32I@_k20i9_*~)4UoXxuL9|jXbLa9WM-^_@~}9?eOpkg1D*gr)|H>yEl}@X>C)dgUPGJ3C&*Pjlsb@HYC8>jIW5tuvVD_80vA0&(ma zS{`t_Ikrs3bG}-G1A2pfS3=`|>UN!I6(W_`R2jhJ7_+Nv?w_L74rM$)TxBn#&n?M0 z0xF+lqIyh$^)D6S?|_}5+IT8h;!cp`Vb|xPmfxca8AP+kHX56Ar!;#;(0oM`U??G<`(mK(6wtGT? z##8c98w47n)VZAtdoG*vCDTLu*o=>i*mn{7`KoI0*N$z)@amh+Y8F>()}`irUg{n4 zSuEGF$?IRMSwZp9a2y6AEJmkq0uc7%T`C+~#C?{#40Jkmz(SY1c{=dKJ;6i3MHj&O2Mi)mkvx8wrhN|{`O=Q5A`g>j zrd%mLgoVI~migHUxaAGUDi6?OL>d@ND09X)^!iq+nk& zQl$CbJ*=0QMpXeub}jzPSJ_2_s`b9=cY?nv_P7@d!~SLGDMN{~-M6Rd=h@BmV0U{l z5hvm-8i!EXurZ8v6z*wi-ND%Y(T1mWUZiTv#mK|+;@8-P zg3qN7X6eE~wGR+XaWAu1X zJNWZ!qv5`<_lY9)SVlWTkM9Y`PozG(Zo{HDVOXIh@iOwcyN@pa~1i&47Je)~#{?k(mIbbk_*$TdO9*WAF4$CoRNuiFcqW zN$!S+snF&R8z5W9(?zlcB;V*-h}o;miRkE@D7Cl(cbI0y<2{>SK)GC2M(${W*T9=d&oc8@;5zJ@ z_M`tZ0RG*;s7xq5YJ-sp56{}DyMPnyEbYDK9c;?s6u-Fk5vMi$1U`$*RK5zo3}cV*s_nP9a-}Rh1hZj`EUNDEC}}NAmLI} z6=NX{*#iHFyZQFpSVkA5=(7dBtl~{Jj{aF+_-vc7z9x>A3y}_Vr@ugji+jWP}Z`R8L5m^av&T`-8D6%wJ=Ex>+1NuZ`ny^=$~C(x$@;o@|tv>yh@$eXt5!gOMV zMn_68s<2WtVUH&d6pxJ|HzPK-5r{*TL>HZ`jKy$g`==P?k$REF%t1+r04>Jm*yADX zq5jc@37h%px{8Dughp}J2DW9w#@~Urr3?X=X&FuZxPFa;8oX0OA7L_&cXHmn1vT9K+c%+)7I1ohcafqJC%tgvY+O zlgQh?V_4z?-$#uKH{)71GX}I7kt|`jwd+@=My-XiUqP?ktYX&Um$*bpWZ!$n$jIoh z!0`>HHC?;GQTqtXbN>YkzRv#mZfY3#;wlueebJo4DIb&fQ`?rVfAlzoOXmH^XO5>c z;yZg&gv!(H`!((lEDlF)CTPRBIcA@HWsKNIi{Kj737b5MSG&QY{(=TR%@*1hX9f-$ zv71KmAGO?zpKNybgI3yjC;OH`l*907UAjC=-ih1L;yHz!JKMhmsK55j_0vQ2;SE!2 zCoDZ<=yZ6peRWPmE1jH3JtCVa#gv*LVzUL4xVoyn;ydz=jcq0?lY|?=wwf-}S&Q#} zarPl4UWn|Bd8WJ>^JUgirD5o*YM?9jOn;%NESv6GK~sr@>oz)Mx|{0^&4d+h2X%c- zn_Iy-04KnPmN3C@Rc1%DCT6==35&D*@gPwJM=Q3Ft#ob~+uyy-^H{Xuk9{ce!?!LpP7AOybO@WH_ z#|?zf4#-5_fRUn{ra&{<^2S4vE)os1GJi6EUq-R@!1=N?{r>(WFns~InI1kl-M`=w zY9?{PIu8`+@z2CV)gz7-$}nCSJf&k9ueg-18d@cso#q2nu0?zL^UW1Rg@mrg?Oa#_ zl%o~Ay1$sJ09u6OZJsi_eO;|hdR&WqI|m?#z}Elf-DTU9KU?~ZkQq@A}H11 z{goTsh;r#X?LwB07;5QM7rONVMpQV)b49tSjunct_VCiYrTj|LxCpPn*>lhL`bab+Ys)}e;Z zBNO13XncAa9O?LO+NNL59i>{&TK9vz3EJpD8Q%f;u^G+FxjoIuhY;6WRV}}0<8NB; zW#IUbqoP9mH+v9Pi{zdIoQNMCE-(u)3wwp1x{;h3^dPg3AI=)4xJS*cvdJI3dqMI) z;vrW?*CpM%T&$``)zvfHRpP?$w8yB#uwY=$*j77z%Ns&PNEcK9_dG<;jE*$Ole5w0KvTokf!UGS-iZs@qv|2}7FO0q@i==xi z-X?U+#`$3T=Z1>Mo_9_q#?(r(_oaVpL1s937&jMS(2tLS{5j0 z51Slni)+;TcLd(g$ZGd(UMNJ~hrE4M2a$V`Eq>vZ^7KgpJI+WR@?pCB1FROuZIS6t zTz`i?M9Lj#(jk0`15O}l;^3|Yx_fR}#8=-{iegXs z@}EwYmo;NFKt6bu@-gp5CQ)i-3J}M;@`+|YzF1&+du;25Ya2aHg3a3P>Ci0Wh~QbGnRe>1up(2{`}1Z@9hrdwP<(Z`9KDi@RHFh6 z+g|YcS**|l+edg{tH#usq&&H^ysG(s$+|(H5A-W!@k$aRa|ngKzDo$? zXdFMb-IIr~i=y08*{{ExUF&F9u?UM{B+YzIMAV{bf}o|!7XWRG6#x86hP;#Ty@sa+_y;B_o~Tuz z8Lj`+I}yJm$lMP`DouC$ie*S57*sKz>YW=fjaJbLwmZLLnzQGC;6SLB4LbYWrev5; z!LGQ)_ZXer-_1UqTaVt)vL?}6S9J4AkWf-4RYXhNM2PJm7^HQj!M;QR)i-*2U1+P4 zOCO~ifPq~!>9#PUKH=YK#7VB*Cx6e6yf?t2dgLj84)CFN(Zy2!U;LAT)MVr^3%Fr0 z>$YNkVfO^B|Li74sQeB%4kqi>Ax~D{Bs}O?Rc!p@j?MC0v-|dIn^@WWrI0BK0!m4@>s2iz!FYF5 zwbWrwQ@&2VBQ}@_SaraS&YqEc%>K{3S8lB#5wA-1*ag8k-z57)y9@fVzH~08SM_*$ zt>c!DAlIp0N&s#g)LoV%T6LRvSM1_nLA?q0)$yud%%t{ z;{vKjFectO<^nVBi89S&Q(_Xed)o`=?kV@CP1Os_o1m3QQOb`N1kz!7mcce|0id$tw?E=SiE z3pvwav|CMj%)rp_b_x*!*G>BzTp8_mDQGM+zR$elCty&h?<3~C>g?^_oGikqnKPoh zAdhljLgw{9K;^xY@<EqvCqAF0P@(G;UEA1*fi)gAU2M})ft)W64VOYx5{wST9 z^2CP-ORx!GKR_{D#a1ty{SH=WRMfcTYQIn2U{5l~LFZn7Jm9r9dLHfZ-o#Hl9f}`3 z2VSwZMH?@xmBC&Fp$(3;cjVoz0As2hI^b(=iF#WC)LhP#2r_#6mga-o{U0&J{ScPM zZnj3Bo+6(6^P=wTNhJy6C!IcPr1tgSTXp%7V=f5#Q^Qtiglze^ITu4`@V?0&*z zzV#TG@z`@OZkh#TzSchb2uO_w@6zXcAc9Oyrn|QZ0PTy>``Pf=>qje(hX3A49=%HA zKD&3IuTec`e`-jOdZdrcc$BU2=!E*3M=?8i;GK} z0almV#5WH=GgD>()IvI*EK5ZDo2K^hMb=Gp0@O9X1hic1^_e<#zbD<4%o=-yu-l#+ z1DBk`X`nIY;fp<>lb$>5&g&&Wbqr=?9>Fak@GE>9$QMd8s~=|d5F!-tD^n5!jk!aE zWtDnpPRZqF>cfb0G1M_F-6S{x0%8bVShfy4ZK&niOl5HJi60zlA#4EzUf6say;=7i z-910u?Wx6)Rk_=lYRXq30 z^8fHnR~BgvfFX}D(D@`a@nv0fBAss#-bMv)!{-XiV79V;ZA}(1$KknZ4S>cHQi6&L zv^2`p4Vb5htazCh^n^JY%^HBZRl!xoC%dLV&lP*DTK+WS4I;~@{vF`mrXuiG%Xs1D0hiGqco3FQnyBeRS1(%0F)bA2i{qjiYSlMht1Gm_V zwquvgDkZdpeTdw5v_v6VLZA-P9xd}>?MuEKm8ddB1EzEpR0CD)M&%G$6KX}RN*>vg zdjYrJ@{LBD^Z9xuK)qpJhdAVsY`-hcITV8-PSrJR~?1`>s2eqn3R;*oW*&8a?bu|0#1_e?5Fd& z)p3|-N}6$Q2)nI${{RN17!E8K@i5;(ZU0)x09u8p4kdy3a93Cut8Fzlc+pL^gBrRC zT&^OrQe`9&@y04;xGz~SJLK&Eh>tq{OkWp~iymds*D{T;BUE;QBR_-@sX_F%V@zoM zR2z5fa_*hiALmZ8-(BZ*F$4C{!EDM2lYY);kK zPDO`q$9Y}P)7#k@w|ns&*P?eLDZocGamURC>pKS=cY|Nr(3ZVSXo;~NP~JBLZ0eLpvwUuVfQR8 zaE;+*JKF@B%>N&^pvg-%PU$Ys@!wj}qi;UT_y@rJJz&OUUmlCe5F6y241!@P?EWIB zlJ2*Xz&@cKsseqY3p}5xe65WNR=gf zFl~>*S%st!`xlK6nb7@4$o<1w46mvcK$>=DAddZ0_fmA%g*A8;yno-6`4Ow#iy*eg ziXXrGziNd{yo-feMAb&;HwMJ-&I8>Vw5d+QzG*2>$O>2GarOi;t|KRGf5M5;wmb`H zgh?A8%?y^nG4Mxe5Zn+`MHvRNa&wF`ekj zVL^Of-$qfy_{hm`oV@H?%&S_vGLLpwCTqZamUsU~DL%qBW~e7A_SH+poM;_YD} zQBoiECD?_a5C8ppAV803`%LA=J(?{<`zZdJ@wLcNoA2bez8N?ix?mYw&{p#AwDI;o z?=`%w*1zxgq@CROL74sYn&sw?S8l@`s{op5J0$e81dX~U_EBYwMYdjE;X{Ns121Dv zY4OE<>c$XNM0tHJ?rOBR6HIE;JzJJ2(iF3sk6G>OOh#_~=c}X;Y@`bXwc3K8{=K%} zSPh1+C;OLG9ryj_SDoalu5J!GJ5(mTZz^u$?rUE7;P@xLVQROcsp(dO^8>`+t*EBr z=XB$f|Lh)|RGxWW8$XlQPGF~rGY)4JkU|jha*1fpwjXQ%#7*kB@wA1xzn~3F=`)s*NxC4OmdB-(`!7nxW!Ls ztC{CuPEz!@$f@?<HnfGv1UJv$1FOm-3uYD;K8H^Hjf*23&wx-SPm~Jfm5{m&+VrXFlfPG~ug4hc zdTKvd0*=(4dQAKuyUU-BC$K$jsKwRH0VXxeG(*jo>vvv!QCNtYLk#)XQG z>U`W_GB<~^YaxY7545fK+{6||(c3`Oo7GkK(Jyun$Yrx!32SI8NxYf^Bht0hDZMEI zdaoQ>26aYDkP+>u`xqGhFuc2_#%uni@Lu!LV%O5CqkMbB=#a_A%N1oI><%#g#H9nz z(#h%pYms!e<`Qq6wc%fLs}{zBII!Y+Up!FF*1W* zM8Qd-(+R!w0Fku{3L<#L8HBR9v-!XDhYxCa@ZnrxFRs|>A;=D(k|mKF9Uezn^YzHZ z^18r1%mip7QMbDVbZ9)`F?^EDi@b{D)exEJ1Bc7u#w&<;PRmwbwhzJAMeT^jL#R;i z5BbE)vC@A@1wddATJr_++SdYmn;3(?&6-wh2kNru1z~#I8YvCcJ)A`{`dqX8>4$ING z%v-$SOKm>}GQ!DKa1i}&2Q+09g{e>DM0_acms_@sl)Vk%^bbBBp%r?!Ro9Ysy~R@G zGXxr{O&S)`PIj8*`mJaqD9#oY4nF@&kbpY$07G(7LW(ezn1wB1iEHcZ(9m6rBSxbW zdA~gk&Mx-{#TR<5vI*^B4zoxdS95G`Q29*PlCv=MWfu<5Vt+rhe)x+q(lYM#yK4j_ zVDb$IP1#Uk@G?-NdwYJa_p8&}TiEm*bqBSC{zb@1(3)J!Sq}bdo8hWGXm-i^DbO0* zkUgn(2ITyD+Xj?aW63SCAg%NWN*`@IYcqbAtRt!_QKl?kn*`Q+ci}iNo}fRjc23Wh zDfT=6+A37NyVa(Cs|xGL$4Wjva^sHoOlf1%hqrsYiMOk)#6U9CQ8?Yz z-Cd_2SXEvvZMh1;JF%RfjHCW0S;Gc^DTGiaYOR9o%5;g1^Ucp_TQz@`MNY`>hAT^QugZS{&DDsQ)Z*gG$(@14Cbo7S*r2sLjJ z&;GQE=cBYwXnnDw%$FBawNxxaZPH#A5|($P(%pC1waIjV=doveWpPn~xZU>*_?sVf z5DqU|ob9WgYvJl*WkM~7iz0+#v7W{Zm33w0q|I@}qz=izP^L8FpA1%{@oJkw1rmStm)e;?lm@Sm~ zFW~!{w=JvDUByi$sIK=e**?g*dH^OmsM2jhaSva5pW%lT&Neq3&E6Wwk^dPRpS?W1 z@HA`Hea@@!6EU)3tAjx2Awxs!#D-hRc;URiBkBdSZ*3^rVCUw74Za;)piZapM{?uCh ziHB+EqmG5zi7@KggDiK4PnK9ha$oPep1+NpLult`9l%Fn#|i}0b>^#BC^*3l7khlq z0-Me3>`k{xLMQDaWc&|iJG*9PPl$`5zoQc5858qKXE4D3`vDkv41HbZZKut#g%FB$ zRPoW74YwB3e^I97+XI}9Ko@p@JrvKl_>HnEjj1PxGxV|=lYG2cfrI(g^-rj&NZG(g zP}%-ihQfEC560Y!^OAos?V}ZzR`bp~WoAkOLlvx5y4*azTs7J&m}W}=(b!R0|FAeL z=`RcU7RzY1gF0N};q$cZW{&c02aFLQ z;l&eXra?X^tK|cGo|E3~CrM4aWdqlsd$jUDirno%urSMBwBcnkOG!&(*SDlMu)g^| zq@8*UIAP;0{N+^-aO5RjCHTsd(%7#l{cox5Vq2S2e=1U8#aL%!6jn$l7z0|)0${_Xt`Ez^< zi57=}I%Si-;o(n`bw4WjDWhEO0TDbR%XI)q{ZD8fEl*PX>x>cD(q3Zil+c;T|B+cD z>XhbB=fLgikU*m!=C2Tu8Se>^45N^CJ-PFTx{l~wYa>*oInz_aviYQt~Pf&zYcZJL1tvO0#m$l5h+*_U}eb?;(Zo+*{kY6FzM5iWBOWf#)UPzed7bIs9GoSs{-cE&e3Qq3hgbvujeJ zIm-V(Rhi3?4Q(u64;x3Nc;V$CXTk2I+j}bJu&?Czd=2vD*nEdonW@tL9?O5#KT~9) zZ6^`3y&2p?Z*S}$)3-AhHK|Nn&JPVGp&f~wPjGx@#9YgRvc!yuK9n~yhkY!Glr0t+ zruNQh=Yt-ZOjyvj4WoIWWhLZ>qWZ7AfC2scc8d?$(@k_pouEeXpxyc_(hxqX8&>^t zrLG~bO|Qg742Z!OIMS3h1omS!QHePH=`ev6k+zN9fO>Pg2=l0pz6y+gB%Mvz&y;aj zRL3USdlU7p_B?C84!}LkC9ctrQINO-+=qC-ku$l*iMqz8bOtJ_s6LiSSn{{Ms$APS{3|BvKneC%`<*lV7X+3xh2!(7Evq5?9vkWmrW9fuX~Vn~a2>lJmw z5b$yF#(~`TB# zDqZsAyrNW-`J@h}DV922DQY)3#p_Yt_MkK)is?mZZ0iA}fw2W?!UT$Ilzu+YzTw9LG65U`dFvlHcX9hN5Y?lC+u@-cWm z8gwS(M^QyIbhrO=-03n?P9dY29iz*JV_ORO+O(t!g@U;;!)iN--b$lHJmM;xSE6_P zGDdUkQW9QR;(@PEdUnv5@xq~AWOskLcw%i1;$v8THLFsBa2IAJyUl)viQMIY`(!0_@+TN93UxjK(jizKpFp?%b4+7gNjr~f}zO&~| z=hyYt#)JJ+LIC$+?UQe~bz~=Mt&6Dw$>_>e6!aTo5+?RnR{cw?c_$z?kACOPU^LWU zbmyx?9&j%X#ner^7o~+toOz}^NWrN(AvswzbbTOj;%-)279N;c$D~7FzQL;8SHG6i z{L{G;_$#H@hK-u*3oa^@EwQ<1$)2^@5$NzECl$G=v1Gv+H%M5enMqclQ4R zQ5zdo9WtjHw?6bEPWRW=milD-(|!{prOEr%I9#7EJs_9xd@X+1s zXrIgR|7^c5(e`Jte!aWJWdSo^Vli_?|9)1&MMfhxezV-7b}-(IR){va4G{DH0-1QE zY%@|L&KZwlB5tmMpT8%GHh~cJHb6~U^$$&Z%r$5z?1pKk=shb~8Aqh2@mSDr(T3?{ zc=4u3=OSCL@!=ku zG<=_i4ZOa08UUN_kW3uw`eda4MiZ*VrfUA%FHSk;{#N9#e;QMWDV``Lz-!f&Fo*cO z&@}7rF2u@Q3oyi7>%8%Mt-z(Ez+`&*+_LuAz0MCdvVv0i^s{H@jlT2E^rAj9(8SB_ zkQ-%nujRtMSzR0dSrF-SxytqS{A86Fq5VIrk9Yp_Rr>iG*kLgBAQmJ0-i1lBV+*MA z5wLk>G}1@HQ?NAAUCcUqZIM1J8a$7rN9z&NC`c!`5T^rQ?1WJr##al(20C~jV&(_3 zN!)~?WvR6pW#TWpU=;)A^6otSh&fWtZy0uzHp;5z#oLjMaf>0NatMZYLs2+sqWe)B z^+t*v&Od`G&gZiQR~)Kv2iP3KoQ|dZrNQtn5O|`3_Vx+)rz`0WBC|o%tVeo-t=Q z@=XdNCy5AAk4QV}5H}Kc5icr2nYsO1V<%kdHbM>dQA;XeQ+)js`32>WZt$_!Z;3ze ze+faai#~Dak%WIk%2~ozKTl9tjklpF<;JarpjzYTJO{?Rg(!)yu1sc+Q4$V)&vTsV zO`|4k-WghREOxDTOZ?u2i!9GsI%a@A-vNV3bN9whpq&jpUD$m}pNo0zb^PRc_y#pb zrX$!oz|YVm&-V0%|*( z-!F6sMov<^KC3d?4H2yl7wEVu{lM%)28s5Q_vCj_R-DROwNt$HAHWGG_SarZ?!}Vu zeX7YdFH(5WQd1`#E9a5^FZ-usJ)x#wlfk=Pi^-qC13JTrd|zQ`)!yk?N!lH#vjsNB za0z-nTH8!_(uNErft(PGf78MMZOv!7A{u^DD!X&L{HJLZUSmU%~S0 z4^+-sQwMJrE0twNthfC@^!^5T^Gb@EaRctBBo0~jekS1vWJB%!@c^vpq~PxiWpy$> zJtb^Z0=YSC^h1c~0PtJA0`mv#ExI=uo^p401BrSkvtn0b!tuQI!mRt`@=Q_Rhy&ei zvvr;-W5!h^VQWA+sTOT7ol);p9FtO?TY|o0PpEzc+w}akIc5RzXj*~piS}!CJGayb z|3FD}{Qk;65XeaFAMiU>ChrkyiMzF@#PrzLbFjaphWP6w6TR^zGVa7_Mjaed zUgu8QX#UTCq*U=kBVJVZesR1quKzsLtrzsN5!3ypu>Bk3ZA(1XX*WV6;SoH`dCMb2 zb9nQ^-LPccs-JV@LvNtv5cj_6Pq)RseYi_DBd5FatQ&X+_3jtbYRv9&?6XLQKy$7k z0!!4_GLd)9AwFQj&8Kc2LSRiKDE)0=$y}#s{ z!@Bu*ch1I%=!x#vVvG-HpQRere8cc}y;fD@IO5S0You8>Fv|0KvC)ZAsc9FI6C{+( z#4s`xeZN*%ZO{+=Q6W2BUDW6Oc*B_}h#p3I$8Kege2?a{yCvH`UuY~C z%D1I`7xZk#i7(5}+9;tC9V8eWsVuNNgNFfFhY5-ZSTWzl4a14@Xrm>P$u$-Qu9*Qq z;zEI0;&hAVIno2}b9D4nLE~uep!8$L|1v~}cHmF6eWEkRY6GvZTLRtqUDUET-E%-H}FMZJK1rY;9;?S>K_d6kstPJuHKt_tA1mCo@{Vm_n5cw26 z7f>XM_}i`BM>!bq!)K|v&cP5bKlJ&6t+&GZaXweZg>m003OjBk-az`3=E>QrGT7~B$A-x`)2tWM!BlT$ifG0&XvHc4{WppzXocX@^;wjt`%jgVQ_bZuHJO6jI zm&TQSdYLiuKdbPic*3T)&J#7yD>5w{5?#)eHcn$H!#Slhxlbdnbyu)M4IZvhf$bk| z&AQ`8=AS(g^q!*XOT-vKDZxV&D(cyrhtx55GSztHY5{{si(d1Mai_RGGclbECU;5i zOi@cHzi=KCAzMSpl(gknL!Z`-Tl_#RwaY5f__3*^Pf&0IGQz%d5m%fnU>hvbtF?AY z#Xmo5TXtQmq|Q|T-FY)Z#~j9L+nQN9bI2I$OE>{6+9C3O$wi@b9a5$O*L>6^(?Y{{ zJ0;zl2g2U}3kn!7ql%5FbadOf0GK)zt0Anak+#>Sj^~Lh?lqZAurOWt%Vh88$502} zrdbdug=r6qpjUk|Pq2*Y? zYb${mUn~u9DfkQD^Q~(9FZUL+fx^qbYqow5BsRcn6q@-hM6k$n0N)!Ynq`O19V}T_^I+pH^r8}iV zVv&xeyW!c-_xb(b?Td5H&OLL@Idh+T=9)^(lQxnkxTcHs(gL&$#z#U_4I`90dG0#o z0TJK@{N*ZA2>{TYo4wE3%ZjiLPzj)xrOC?OMS!gMo|C*95-HnN#_*O_PGi894}dr8 zWv@@kubIsU9AmsXPEr&+X|N~oy7}~Hw?7_>i}nrunpwRZPHCSM8iR-EPJV{#KSAHR z(XCeZXnxLV(O@~V1*@J?VwY@Kfwa{_*v69)ZF8b2zdo07N2!}hzT<}g-|z{RU&Z#2 zR>sP7r&y86N6s)1P~*8yE3T+zB?hNh>aqYL{h!6@JPCIItV%g0mQO^F$;=|p-8YAi z(G1>cDTzyOgdcNEOh!@@2|3nhAB7){6dhV%x`GVumZRCKgUS>&(6=2Cnm<@PslH_Y zdu6>~2uEi#VCsk9CPB$A`)fYU+%Uh)$qlP~{o~V|+zlikb5z?l-Y24M zRPid<3?mcc{oxX2E)&b*9Tw)BnrJ<|rKf+M5K@ZAe+Ak`c{Qk#Xw2~!`|?e_jd&d) zr{S-I{@|)T9twRoefXsuC#hTD)+#V=VYocNEPh&gCLnx@J5$a`a3Z_J$IaUN4t?Em zy1e$LnDAeT*xL$#gsjC)W&stlWdr$MbnCO=1VPhx3QQ_5G1j&hb9jm>OW&5%Zni>W(ENl<>gM!(S|5orGUvod-34Mmk zW_8cz1=;~R`$F+R)VrOZNnSnsRNDa=Nx{vh6`VI0+@zgtuY#?nLwigZ!g*Uu$|Jcr zqpWt!>$8PS_y(3^cr&dSz2NUjhqXk@P2u-yVSn+wr9+PKB<38l?mDjXURQXtK{%dw z*K|mWez0|cehVNu5`B!RO?WhNoW#b$#uYoJ8v1pFecor|cTAcpSv78(`}|qf$U!U5 z?LFS<2w^L0f=d$M<$RZ5MbhbgNwg2EAzV@+_mTlfD|M+_7sj@VBj~BeQROMu+W8=S zcoy%h{q)Yw7=%H*F2Uj9GIHSId6%Ve)Bm?XBb<&dS#UH9ANHeR>kHqJ80QN95ZY?nN{^_*<3&!Oa>yE}^uL1iDD=e%P!=muo!JXcTn*THIVX`V zRwrVYP@bL)KDDk;HCVs_2Bpg%w-OVv09g-efB!qwPXdOQY%6{U=Y>safd;#)igxj2 z0|p=y=mw21Ns2s;G2UxP)q2our2IW;nO{-AsCXSe8J<2u$Vax`j??e z;sYOUx5+EQTBnS*7xd6?fJ;=wC}Tu<4l!gymjSRoVm z(^T9HKEVAln7$f7k#pU^KOFYA1d^3;cZ+)e86ILQ7S#73^-is?HJm3L)zlolc6ewy zcK)!`g3Ab^%E_^vf~AU}J7OYMLtEyGQ<{KZy+FKC!$)EUEwHoy%0bkYOV0>^!l%&J zYjH@UU`nEz#x!WRNryU}5Rtq4@Ewlr}Q9l}9vX{GMmp7w%__ zb_62-BXE7i4y&9PIaen#!GUrF2p0UtN)B(9(brv&u=o%V@%rN$bCv=R-E)!Yl7R7L z`ca)c22`C=kXzPq<)=it;Gu*(ec6c32!lWKtVHp&K}YOn&0H5@)2BV*Z=wP%WWQ#O z(Tar|l$cX}V)6c&x^elkeP0Cbz0Df9!fLjosQLX#T8Lelle^Br&OdxaYani`A{ zN=b`pL`n^ygmuRwICt53I#UAIvZ>JJCAt|VZq=#6593$uMQw;RAS?Y!w~O^<_wZDz z&JMnyLju1RT? z@sbOHc=#Fj;}e<&4fZM_PWrEYp{(!4w97MS)at4zvDf7K3#+dno!y9or#z${_6woi zRj(VAgl?$yLm~G`>J-;ohl1y88F?b;W)eu7n~W2in0@_UKt$`yJD-YiWHr^&rGQ~L z1mWQ(V4I)V`GR@Nq)Eq0BY;8V*gU>XuJrYbYKJIqXA_oX?@Epl zPpBRL)-Nl@IXMN?5UUO^=t*@SWoF1w^88C{hp9R}`Q3tgrn!O*Vdv17s~+&+UcjIH zUGFIHHRKmkzjPP+ec4Ma|KQfX@9OIE%0C){3)R=y&ilQ6F(;QK$M~Gjs08xe5NBip z;HinlhbThveHeUZwf=E>VAsJ#ZAq%}cX?pf`FnhZ^7S$9sx0_!gw{Ak8hktL3%gAt z(-M^+LcB;8v;_i+kJJwX+u9)HqalI8mm{LUaDDaaJSlfnVA6xoOXlJO)j+2mZnu-I3*{{;d z)X^K(hc)>}4{l%bt$qiQ0?NmvKTI=(a@2}N55wKx%fJqi1UJrK6ckX;SbYZ7PX!Ii znIogj^fScL)IaCBUsf;zYgd5)DgZF74%TqX?)ieY!*sSkR4=~!s9R|D1`+Luda$*^ z_N^A6qoBY@w>HWQR*Wj1G5-*G1jYzwLnEb>vtYAg+=)0 zcm;;lznb?;z=J6x{lY4SdLYio<{@}Fvht|x(~NP)_VLE)=u%K=E~XrU)sVp;%o7W#s62?;pO zFZoKyK-Ho1#TI=wKE|R03#H+5R8r>s;0ty2_m?qVg1jUmJ2ducuaPSoe5ui6K}oB=Z2v8p%*TjT&`lGt}buc)buN0qNRP$35*!V`%;%qcFp^I z(N*|*L-NjQYL67=S%w#stEiLYa--tkVrlV_#@m|rZy~WFIaZ^E)h2Er*G%pgQQM*K z73xi=R2Nda<<@~=^3M8>Yv||(dUh0#^GmcH67G-r{h>7Ibr1!s-@A9JSNIA_)#^_o zA~1spe9R>BZ6p$oXr2!a5LLsz(1p$I!x#?yPH%eYA$K*ubFVbr{eo zd2mQp``^y_srgXQ_iv#}zDm*kQ0BGpRmuRB?O`E2k@(QW5RNZ%{g$srC-GCMUmiuS zpBn;axN#ARpGK;1V?xHVvZ7uM{&jAic{{Q2W2mGk7lrdz=xO;3InYnc{%+wnv@VFt zd!q)PZVGz(1y7CA$$7ft_aaYK9k~-91#8xg(X&tmtfU?c1HuWR*jSX&hB)oCm;INb z%QFv+-l^KkOZJVaFsE)k!tid2Sj9x6=4-mW#V4{#Wa@p(1ze7(`I-5u0_jgIHet{w zj#O<$H!oNQX@3%D@L}h<}9nR+dK+16=*) zIFRKk<-fe>SLvStv(!?dzV0l|oIL~P>70$j^PNn^F0C(nvU(=%ICbSpz7@5ZFVMAgjhD)y4wg98Xm|UY_p24zY1)5&QST76$`=se^ZBhf4DgyK^5EfaqQh7r_+|IN!Ew?yNjMdp>LBVX7nwr{u z&PhZ>sGhroN{~UJ-o&oz0K~cifY%XP4afqZ2`=%oR9(+By}~a~`B11j@BOV7{R~t@ zHO$A7*KY?|42XgpFs3t`noRNp!l{1rr{R3j27AXUV}N%QKQI7a%WHm@N_`JrGTody zez8ft!JY1BI@?%b^@^On(pWT6{*xQUBBT`Wguu*k?(Zi=5i%q>-yxBU?s}VT%St|x zoFBm|BH9Px8h+DUBxGIGH^&0+%_H{*gc!cNc_Ng=9k?9cDqtAs!5$@N_nH>?Nzk9n zR=8MMp(x{g^^I&o=T@HkkX-PqiE_Auf^M-@pi|(lX9O%CQdRrD1X_V2%%=n(oyyxx zH;_OGhAeOX!Lut!OFJHbS{&oSo>3)B6ysZh@g)j zZ2xE;3Vn65cXagf(rIcY(V1Acu@L=n3yGgsp^;iDq)gF-oia;e$_c$ z)_4&U+=Vv1B(BnAOtFChKN{4HLE5Of*>ozjubYSlMLIogWYcTsaufuKc)N(BkhIF-w!$e;?(1)*62cyu11<2?~kyB zy3w@a+6XRZL2ukqU5-AejKvu-VtaH3N-wl3E=#CxAo$ARY?mqC>v5h(Q$+Z`zn|tT-Km@25Pn9-{Mosp`JOfKVzidNpP4y0zC@(t9_{D!u-NfjHVrG z>@(%{ndBc;wfuAqEh85%5}dH~{&X&4>H8bBg#N-qfG&+>Ti`Bb#aI+ORZ-s^Paotl zw=2aTYD0TTOO4FuPcDGFFjr1N?7KC`>qtgsP^UjLS-&{ zO8q}?Sbwp5@8FoCAfGh*T)Me6P1eGNt9?S*sn~FS1NtD~eZzN=R4YG@eoeW%XgCDa z>vt~?sB(g(LaNbypB>?b-AxEsvU4Z<)61Fl)T%bpCQb`UfFH8C zIEqeZraBTgqV#+1q8;Jl8xRD$H19k4z*prW6pG10DJ)|6h3N_jwXQDk{1Lxp z*7`i+EeaWz@1HhHWm3|RzS2{#c>B7RkaE)RQ~7nMDO^{Dww*j%K2PSPL5DPcAeF`O z8SLw9q&r}vKP4WAxs{&&rNnQkJ>1tGINIcMj2s?__$h&{l(mR=Y>7&x1;lS+Yy``0 zCeCT}es65bM2R~)dwj9a*SV%$+7G_Ab!FXWO~yp1ay<{co{U@$Dt^OR_)HoToDH#Y z`!?P4-S6|ErPl5}*il5gLp{FdB=SDAIate7_sZliUPJ>-bgKV~^sCArXSZ2y%537` za&M3u)Ddn3A|`p~RA}tM+MghG`8R3%D{b)B9^^Q`?|IKhY(0 zY6T3yK(-J@$i}nhdX^W!@nDe1buGFJ2X5!z;NZEd4X#WH(}f8mzD{v zp#Jx9T9bZc9_sJA5o%EM=az$(`Ek>v*iaekGo1DkSSs{yyYAmgOI}gg9vjZ18)!?m zUR=2IUx}@3!T|IE_goE$_kzJHTRq@QD1BVJ)773syaIiNPbzy5mH~`MCQAe?pqOvy2Wj}#uS;r;`orvDo{Tj_I#Ufnz3?w}gCf!1nY!lq7w!b}$#Ji!S z3@+r=DJ%NmrmM?jAb=RZhPb`1$3FuoKvQY=vpR0c2Vl5`fD^5tOQgjnL|Pa{Mqv+n zSMw=QgZ=qxl4>@;063@;Ffsm|O0bgwjl=P(-M!u{R!rg5Kk^Bai6(`3JDwj9z6AqxXU+lIy>cYJgcDIUxi$z z0WrN_VCmtoL%JuvDAa;@;k833Us0c_sSb)X8>dy9sT?lP@lX?U2FV=Tqw0qzs4Q0vxpKOjV_|I^TzWQJu)L|Lk=~~X& z{CzJr-Hxr;o(#%O@E^^5#i46k;OB=&VZ&%(yvQ?We%?kqL|g6uhsG6jdPp#fhFocH5OHC+I1%oP6rM( zJ=+6UUEMs@Y7Xz&cC`lT{rzGSWz6s5W~#hFE3Llv1j3ibBNiI%(1PxT z-9ixh2F6WK!y>xgR@UwMC~1K$(V_|wY2hQ9MF}D1*8}hztrE_E?_wFK%}JF))=+{rl+ne0duPI zi`n^-T)1g>3hbz5^`9Sg9T{e0T|T(L)4qcZqy9i6X^4`u%#`_mvALKaC?d>KS;ZBk z`)#_LqA2rDtYG(cP8!0SnCb-)n9`kwQ=xnPu-&7)bVSv9Xi5LB!OA4cVIja>isz%8y*shx2N#PYHLiG(hMaa`eJCR`F?l=nrys zOkIUtLpwHA=wb}G=mVzgltyASbop}~{doC%lXbRc^ESYMY6tP59UEq?zl>eCjdTT& zCx0744sfbXRl0q_)JIg09gpl^a5)Pj5jFg6abh{UzQtVcp22&nVg-5JLHE(MlD3ep z1pE+Tk^&}|KmnWJbv1Nx0Kw&yjEOvwAK#&y!#V)u0%zKT4DTQSXCRBPg0HfHI4*Fp z5_G^Kvt+vhX)Y^c7?!M{M2picY>cQ!rgxUG+j#D*qx1t zh;YPk9nce5s6RFTCnYOuy47G#LE$vMx(Q*LTitK5<)16o-FjmCQSTl_Q^c3rsA>fI zNfA&3v$c~(_Zb8j+Q3cJ6Jj?tOO%07TCY(wkJ3RWJSu)LWJgJ5sz$m+sq0J!CFj+4 z>~nyUkY!W(lWe~;-2ZD2y?c&&x8bJn zbFT9kPHo4g{wdXgSHM5_-thHv`TYIkT;W$V*XP8%^Pz%Itg$ib^(C938W-$Dr_5UK zN{U9NcKR!DWJMy1aAa!*VQ4NLha5?%UdWor{O>8%_H={;=X&++B4N~>M@S988haiO z!=|m&m(O{1fSbtSS_c!BJij7dn?E9=$viyYFs=>~u47JwmM|?@~Nz)fqsHdd>0OFMY{4%%+hiV^w{W?;exS3Y|t&pg`dbh;7z23PG5x{ zk4UUoEbl~4q_IuTpE*dz`6~qS#q5ExozvTYWmn=Yse;+icR z8vsh^cirC_&u54d;W7iw~mzG{TC_rSG%{gFx=f1bPd{oX3*m!cG)N&dA|J&!CQk6G~+SuY1Qi7ezE`QDu^mSD?me=8ptjOnI7r`KK zbgw~9+hYAHx}Y`76eSh_k5Xx}i>;18!vu|2)q&eAbH=K+661DVK}(yQlrFpI$+-Z~ zeJ;+1{%RVH@F7@xj1vcz;e8}L9suX~KbYGmEeV4cRZnke5wR;_PqKNEfbuj0i~UXc zHh-Eo3-TCaXOflS0+ufV?0v>Xn`I`qc5bu7Jwis!|Ihv=jxphqy6Ai|rY^3}y!6y3 z-k?7@FmW)oW+)J1VwdAnG>*6&fq5Ih2zYyJ^KGSd{CzsMhejRX5^4q-gJ6(m9E{B6 zrlSb!bl9fW#u5lq2totI!MxTv$VtgaUg^bR$gUc9gh}VnylTBkT472IZ|p6^!20YM z`8o4I;{Wvi`^TW_s6sI9Q|XTRo=jQJr%1|;MYM-cGvKIm49%-+&A<{MyCcMhQ1&IT zg{yLFphdkoyyp{1rJ5NC5#UMH^YGA62BIhPWb5U! zc64X_tgr@5&UP)z-XXi6VtQR)UYVM1c?n9=%HQs!UK6jnez|FUwf+uUgCgJ+&7VKe zVXmz!OS7aY9wCw_Mq2rg$fA0Ey8UYgU@7h#i?BNYTm`@=`82?t6^qGJaR_w^a2+M* zahm?y?`}_KXJhPBBxX_c@ZTsSJVV|-!O1mt53Kc@#Wg;-%@SaT!tV=?!Qs#JT> zWRqGbD~XBqmT@2RqhFKd&qjdPqtJ`b?*z3IC1Ta2qtN4vHF?DrH{NyaTtYVEZXwlZ zbQM+aTE}V&o~_D}L^*}je-q-p^F#$FQnY&O#X|cb^gzsaoj9!tgdxIXR%}3FN6@tT z*1^I6 z5mxV2bdgfJW490ys={OuW|}19^*E@5iZQ4P@R`&n2;Dyz!vy;9%ljbOA+yprUzsFo zy>a{`4N)@4jrrqZ^l6`d5X#Vvng#|ne6Omj)(^oLTS{*cJl+99u!VG!lMXe5pd;A;T1MiWQmKz)Bq!;_&@I-`JA5# zqtsNpqtO5pAbyjZSba}pMqZzVnNy)6mo4LO zs>Wv{R*VEiyoG_*(Unu2vD`L(spx;!;LXg{5afM9;q|Ydwa5`73;FBB*ntMMl}g&R zYJ01YD)^7=FHozdZgdp2IDP*hWW z$PBzO@Y}b=8ETyK3?Kgx`0|8lV0-1IZ7H<7 zH`@bb>r}PY4~dqwpTZ2FiGgBd_7wk>54OfF!K+p`t*5lI<-b4Ca$k>|db}JKj2jm} z^gfsD>-2!Pw7^xOtj_p*0KADZ*3#(kB0t0UYR`9?yH-8F1=eD#VP+8ZMQghr9zq(oUs3rU$~|EDsOqpWa8#E!4#cMmveR5EZ$WR-RzEZt2p zHJZTd&G~v`H5g_4cJCf?cp37)X|Dg9rl!REjc>qLletx>}@OH&VbUlM}uoO@z-!Ky|_vq5Hc@eRz7U0$zUE5L%T2p}_Cst~-Pk)ElmKC#T z8R5Q7*@yn*pI9w0UAngjoM919BOpP-!XVj%H&Sp_PeBK+=sVKOl@EZ_rmL=EQi`O{J)bqzzhz7LHLJiv8rvgV6`q} z-1y8-NZ;)lT7sIv0s#i}mKrz;n;yS(CH_MF2ciwMHWT6%b$%E(CSyxIyG2q*-|=Yz z3)Qxjb#J{u0(X@!75`aDqchmDWR!FN(|fj+PjU9QHv4xa>!Qv-@MN>?^OO&POescV z-*XfRIa*-S@X%X`#igAsneE|K8VE>)^Zy>69^$3i)41r`K4E5i_6-d$Gvfo`%azJ< z?*vJ;xV_x#g7a2bFg&SRRhRBA{Ni>k4+L~aPiFZ~bMzxRXlO#HfoS$kBH22jiEoTP zOrx@KR8|Q7SgRaS=bM9BB6L(@@~O{p1l>Go1usqhKZD6h3>+m2*uIT0fphoL?|H$c zz|BF*Zp`0~>hO0uHv6X_>BvGIkt)DWL3LHce>1+vVqROELG-B3p2S5C7os`MjGy` zyGM%Su&|?Xw=-ih)O#>Z zBnfyPkPkO(QQg{@SAFYyE!^-qaliu}a0xMn+pZEl#!lM)cjEhO-#8YXTv=kXVV_O? z`DM&s5(mqJ8iLPN26fzb|Lq=BU={QpYTuKF7`8;^bT9M=fNt&W`QZ1T znP`F6!5~F+`fs^mWi+! z#EL=NGm~{Xfv{YImp%MR!|R^p#A#FCx`ir%GqQ6zTl*JU z7ad{Up!{3tZy@IH{{(%H7IX_lTAB(>xP{`B8gi$cPo-meI6y)`mg`Nbbd8$1I;T4+Js;z51_>^sNO0Z z*~gQf5Ow~_+j{H#dc6O(2EI$#e4O?6sLqaYz>F>mEjago(#(9=*xueT!8Y7U6G@?Q zfB8W|Z-ry0f2e7n%l@oG)xFpz=Bcb8c(n!KON(}un%xta0#1#LCu+i~(C}yja$WM} zOQjuIdgPfx+Ez9ft}L??561si{@b&wv9)1?Ew$|lg3~T}agjvT2=$Bowc#<-;&D9kX@f1y&CT7-r;HSN@315mYwu(mwYqLUO4xP};~_(< z;d%FXA!S-eWkZ0ln$n)5@(#KUU#`1bo_uhA%BL$G9>?}Ou5W*Qh)RLAH8nNOLMMsV z^1;7+a2D?&wu_^{{RMzK_b06f)bKcaGcX}WsPWL-+LDJqY8O#dgkb7ar97RUn`5JD z(O?k>Y{QeJvP`axTx{DAVX*m$BiA_Q5IO^WxUDHiXVSE#T}E>Z9C_#G291AODsX8V zCvH`y<$`>?0qEzJeeOx|Y5{P`KDKES`joz2{~FtEpGsQAEr67Ku6NG=H;TiunMjXC z3NL6Yv$%OZVZgRl!Y-G<=a*`Y4=w!eYV3^Yo6;`)otd!oF2qN`uwIJHvWZ=Kv7>r6 z_K>BD`Fu`#t{24Ri}!kn_wLXB3eZkR*CtLeo$uk`M@`^KV`wB+zT@}$ zF98Cj=PShaVh#rw3!5vwqGNgFwQfG)7f>X|$6v-*RU89j6BxO`_pw2WGyuMApWl?n z?x4ENvd{Tt*D}sZQCH<)e>x}lqs~%4-TlRatt8;UTgn?NS;uSx!dH=U{CC3lVRg0G zc>Pr*7YR-KTjVxQyi}9dYp{bUb+j}5S+s#jV50V@sZ|)z9Nj*(FI{g>zi+bouh2ZS zOpfsLE(F&cxy>a@qJRT(J;Z8B#_=qmRds#xDxaF32y33mesby%qYftGu}}9`Y;g0R zF>K96UyAe$wvt2IpuK@U;Ma#rWJdXeh~bIA+Z2>p4PB;fl#8y+0vN{}Md@8mFhvg8 zjDjg9qptJ=odx7){S4-t^9H0O@V?8PUbn?oeO)Pbs9(&Fx{$5&iu~yG@!;*#$(l+Y zTyqfWh>nUYXvan947Rhd@gn$N@jXd=>Kgs!ketV5UdQikjbQpiJ;qmbqhpD46)i1s z1$o=GhkH0?Rg7J@7XQIRI!z>y1*a`1s%>GrTvs)uI!6Aw2GCXzr2=d@mTdgj|59mH z+SOJ6=fg2`hWGtBNnm-~!_B0M#P!`N*TKPow?%KvVntg>9@Nw{$_|6CwXvn8C43QQ zQSLX4^unhux=F##`I(Z^iVUT@(Qgkyt;c4gbc@^B@rg3EHfOkxNGVVp`kPaMvtBFA zNQ;fsJc5>w1LZV1Ip=T0>WX(#BdK?@$Hts2=*Kbs?~EdVQ!93v)&&Q8|^VjiWE~+vMsw^No9l+kNd%nkyT4 zu!S2RHv`&Pg^-V|w(H4l_h-9YbUxZ_fQ`v=N#t5wwB+NHyM794Cy?<^Yns?lzN#Zj z9?cYc(5rojkJv%b)5X@Q2%d)Y^F%dHu~{hPT14jm(=z4r+4^4cAL7RFwd!Rp_He;OU)$nsik2;`bBqXHWv*lFDQ9X1fG(7tHKugaLvFs|WOZG7xb0H79S z^;FytE`8!4G00t2`0hQO^0JeVs|snDKCwB;diu(IR0uQP)((*|Wj`f@5D|B7C+OmN z!$p8{p}Z!G+8m|F#XIkBn~)JZ%J~|jiWEa3Dktp+6K^X;-kQ78OyKmNZK9FLPalLD z4#85?mDyb~&5gXy{g2z;pwoOViT7MmJW>Mwba{{r?V?lc+0Mt?p7)Az6-r!n0J#dC7QOQE+(EF&#faT zpfy9);R%yF)LUme0{r?bdcgaDb>sRpac~tIc;YI01nF38tD8Q$c1?Bl_wAkpmnB*3 z=&k`NwgD!=hZoPYNg!hjjv#rqzq=W6(c4rD#0Cp|u2{;9GCii4*Qx34{pOpj;ag*A zPY7v4UYeJGIC-mJmsh3jH1%6Z4S?Z;Z4M$a-sI ztV~9N#G7Z6a0G=l!1j!5L{leeaCt>vBQ5phZ;_m=B~Ed9hx=w(>`T=Z<7?yPj(-;!|WyGUaPJ zpX0cHzCiQ**e$PGk?9(V*G#x9QeoOQg%SwWk~oe{NST7&b=I^6GkEZz-^ixMkc`cI zn4yEHN}W8lTE86DbVdJCJzvvIdgxZC`U$DLKA!Brz3qH@IT2beAudzPFBd!*|LGxax? zvOnjc*lt)>{v!heVQKBRw`cC&-&taLN3B_~Uq>6t31gqUu$fZK4B>U|@d8sTJ0G_K z@t+ID!Cn2*`JP@PrjL6_ zGea*n10!x_lCZ|=l6Q#Q>s|=XVlB`2Xs8$plFh9Z-<_lGtH&C5aq!SadwUDoDDe8D zooo+kCBw>X&5Wvsvt>xziPFX zA>i9qS+LSm7J8ciE{ZJQ$X;-{{t{Z^+|Uyoryk2C{VZiYwT)C8R?&h(^JFb z&k8)*r7LzKm*0IDxu^NEjaS`I-_jO(Rt7rbj#Jb1AZqjt zb1u+pdV?**AO*8QHF|&VY+0PBZQhhw1pyOEI~S;q`0&HXl7}<{P$!`k-{@NlLU@$K zFntL@$^{8lGUOt?z_IN(-JUkmRt$YG8Q$#Jcz3wJ+;jK=L{JqSH`ns{msN6p<|OTB za8chPovB93aq7RQvfY6*ArfXUO4JBR&7DlwR}(Co_-DQrdN2;_ z-Gb9e0XtRY1kRmbpWgoZz3{apF~3r~ah!f`q+hLSsCs-U@jUfH;O}hPw~vY)coe(m zC%il(GwbcEf_!vNpe2!1q9o74m^up=0^pEyj7?&Mgf(HxZ0oz|jzGrHxzFK)FMaCA zJhIl0p9*t}CPeDmr9?1wkLlZL@w5`~gzYof@2vbpd`&b;lgSKGy)Z!g5y_IYEt>%Q!Z)Gm~M3BwZ9Oe#v*m7``c-xz_z=7_(3NO3&N z0gmH+WfmQdMaS^?XHo0}N7nhdxk=PZ?=%aD|AZoKyIb!Pb^ygINbUqQ=TSFDk!KoL z?@@-n`qtyw4v8nXfIn^#;NHLidoc;x0LbiRT*>0V6418r-S{43NG0ZsD!M4!V}OZ@~kcq^qz>Nve6sUqXQnB zv#)4_j5h;{0G)f==~VXa@LmVm@)K8@mBryGdd@O(tZ+bTw~x53vG<6(YHd!`D3FIw z%KHT900Q@nKKSjXUtn7M^Oc&HvG8l1vGAs7*f=#V?#~d!MPc#wX#11k2U;m1I4GuH z@ABJaIDuU4EMaxa0v1XLi+sPqMLc?&b>;8m82K`B4sbZ9Li$x!M7bc5rHmBOcc+nU0_ zvrRQ^21>nI0Sptl%hpf3vj;oWK1?L!fA(=a$pLOuw_YT8tCfC!k#SBUAopqN$AY-# zKJ5q)|HBW97gTah!%(HRPr*qX2Td?$`8jW^x}`W#pJ6B?eve;nQN=RGaPs*VeL&Aj z&?1W`n{5uIMBz`nRABC_NwJC^w}%>FVGwry+>d`qZC4O^iqCU-?ge`r#?2Q&N`AQW zM#=`60UL&)8igtY+5$yr_^;870OuSPn>di$#c|7`fqI* zS9nEnsHlMLagF#!uJ9HmDv{dP`eq-~h&d@}UEqFlZ2eDH0X8|? z^ddHM1SY4Eqe5c+)oTuSeaKD# zOjJwzH8uPRV1}vPsg}XparV?#D;YTNZ;MQ%uU2Jd8Yr7=HF| zkp=F=O|aCc zS|F9BTZXr0_OR|T0IYp!YOgg_KX2%85)TYphhmaDpHEM1r;Bk}yjOjr@quz15*r^R zYPbmzS79ZDt*40Dv28*eqy~jFYy#iV?`+r&V^%2Z(gZP~KG;lQfl>A=ZpQc-1GUlxRY53vh=b^IQQ!QES4t6@hL!*r!M_#%^v(hY5Ssc+QxZPf2XGrAN}I!TZifF;fp9P1I3Zv`SVG4c$p)nupT9O zQ6^*6RcgTif$*gPSS?tTY!d?7rjG;0wc}izLe{awDWe)3LC#u1?*!EtSq{O5AIc%C zST>Blz=3b^L90}{YQH{qu(NEMhq0pHwsQC}ChQ2dD8tj37eh@F^G*OZ#=A{}1a=>Z zHX&{=<6mC`)$E#SdhD=cHVx<{>+;G{0(c0nrW@rC@xYy0Zitl5otnG2ZLbSl{fGj@EBi@uarj#fkvG(6QT80J70Gtc~ebXFH#^xk{#tloQ#Ah`Q|_x|p^ z?;rcup4s=DoilT0&dl@h!as~>0b^|C*&qdww#O}WN&$BuAKFX531=u-f!kf)?7UcM z&H-W!rW_ok9A!7zgj>5svq-*i+|JsraDCwcnv1lpw3H7cp732c- z367GTY>@(ak5qhD#U!QXLhQM-7_`r1^7GgJC00ow74X<;Zlj!_mgbT!XE z?Xzi#uq8ZzM9~^^arcizXGBJAp5w9fAtco4yR?6U8^{PU(hJ3;P>c z?gpZ%@f8ZgOi-5qpJTQwsN97M!!G?nSSU80FrE0FhH)N#k+JR(v@3r~!L0pn!;v}W zb>cVdk&o5aGgB<3AF~I3&(`kT28{ugw`gWiiaHinqPu-hUb}2=EaBzz;nJir*-KkK zR%uB8m2k=j`K$#1%;8ba|Y)NXcc1WT~gdu4E?2o}b0i95(lgCkSK@S{-%F2@OkQLG5n z#?FrvALImgeEm1y>4zt-vA@#e3u|l^Z8jR^0K0y#UN$kXV|ZJzq{#Wo?k26- z?Gr2=53AgBwh&v{zspn z8M9dkVw@SaY4e-A`>ZXt2MNzktTymdd{CErSIhR(!rbk8+-U*{V+d#vnc?y(&EbtdrJzBAkL z^{RdwGJNn$H~e{s$ao-Y*Fu>m(UCR)OiDhucLRx_uIL+YSAqSTD0^D^IIwTY-ZcM1 z{MN&{V;ngvnaA^&h|14z(!vF4#DJp)UwwNMh6*>ED~eL!m5Ds~)s3yIuG#~e20TbXA>e~sCVe{?oBRAFHsdl5U)G2}~pEiL}h z9ncL|43PEV|2~<_`v^zxI~!e`~IC%o{*SH_9`s*x`hzOO|bA+wikKdU$(RR zX_$-fquf9&V{08b7bwMm0z>uqzQ&Hm@rs@A_3=#o9BM%WjR+j!0&m(Y*CwQ+kk!48 z>^j7kjP|pg`M`ME#-3BRFG$8EHQnhF@7=nea|<9y70lt=0ci4Q75G7OhPBVEq>|RMNi`9tFhcgb!0zlq?ybb;Gpm0x5HNN{ceMF4Y z9`XC5y*R#JG=2+~xt6)3{BFm%X>#3oTzGE`_k@efPT74Cnp#ub{b=@ia;*n(SCQjA zNUUklLZ#xXXV;$XklPy!)on;H#$~p!q_pGIrBWB(GUgr^m?MRCk$SzPuO31AW=l#c zl6uK@?DZj}{M(fZdnc0CcHTfcoV3vHqx{Qby5ZQj>Ebf&o2YOSI>hO-05Hglv4E|& zq~MLTxk=(+&)0vvJyTCxS)y9taI}L!^D8qP4;yOdDN1=DB5UPUGceGU5 z^)p)eBlr5Z1gP<7;Py{5iQ{$86l~HS;|GxDZwsKFnwW8^z*emhp_LBoY0698gGeF; z-aSr=K!HGgu`S5(=&F(3Q4)3oKW1M91T}E+io=cG_v@-HwTEp_bAGnx6nalmi14Gi_Hxl32D)?b?_yxg)3NfX|g zwCCwE4x$V;{>Jd`U}R%|)tC7AwWmri*_a%=%AC5?MF&FQAH+k=-+!?>E9~m4D?oRj z(GLKO`gD8YEm(rt{|>#=5Bpb|{Y2l=zw6Qn2hvP zrx?`c5q$mK&H=!Bj1&RTC0V8!7)*KTewPl$P_qMj^y? z0iGCtBSs997=@GL?eY{6+49;fRkzXz9}g&N9P=sDN_*@OqRo}EQWJ6T98-Qy zR>3b1G+;YO*R3rOwC-*&0eN;=oO_0jpsLVT;(XO|*S;Wi3&O%iu_oNnNaC2_h7`hP zW)H_7v7kp^k7UU;lTQDB*1KOmekd`;U%`rZNfZo3y?tP2k<%x|BN*s@@)6oHUT8$P zv>^BNVm0Dv%=3xCw0X#EON-_ykVZq{a(B44_3^0oq~*(oe580ZZL>)*aNaQK$Gnu# z19GIVF}-0Ncj}YgE7Y!kNO|7dK*OOmzX0Ipv-oZ7l&mOb{!$A}%gq-CuBm9&=dp=` zG_+{;b_*l~aP@(fc0b~v3Y0Yh)wdztAHd(b;CiDv+KK3MM1UeZ(X#a>zybQM2{?cC zzL-5;$D8B<ui z+w2O01z>CT}z$AI0a2+NlAEOBL5=-w`!uuq;(+DVq%G(}y!yC#f?YDI`b$wWyovcq3 zd2qU~VBboaYmCWwNd$t0a+t2dKd$2CMt=shXvB~{@Ls^fsTsRMVtAol*^utKam5jBBmksx zH`6C8szYC6JuI;gIe$(zqN+N2aeKJ|^=$$E6vinPkT=vnus^q$IP+NQqn>^}SE@Z* zw>K5OcJ=-G7`1pA8(kPAH5xF=?`?V5h~VmV&^j3&yR=)z={sVB;w%*J6IV!qtx7qZ(ey~!{n`itYdEH=Ei!Mt3 zlY?~3A%Y2;m#nQ;4Z-8kB_5>l$;b!Ou_!X0YhSz6;xF_3>!X=!K?MopEopDl(8~ObVt)IV86aB>|66o z`h4xBjKf$R*wH&xaRWKc&Wz#vQAQ4hq|&w@C<@?IgLeNsnjOvZwhS)qs-AlbZrR>C zZl-0U@b)q{R^!CGA{{Cv=ee?HG{Nx|ONS3$zF$H)Dd3wIOL#wQmKNjPg7{%LD5Qb4 zh2HCW7)kTC-VydE(vvN_RgYT1cx`i(xX21y9skz>hY!W|b&5yUvvB7QfbVio@i4Q} zle24-ZBP<97^gTzc^ksGFgol&zS4`Ygh;AK9ICqLph~#r6zaxXi5d_H)5VjYq!XVe zQHnlZY>wDZ-*aV>bHN8*=`O=R5M?9?FdPPcn1o`U{AuuAOJMh;r+@#3#VjP*eF(0> zB0Hn~j4oSq9i_1#`dT4pakI~-k z80@8S^86kr(8vgw3N&kPr36nX>I#1vg;T2`yI{|zI1k#YQ$0b13n2uYfCDwT!A8Is zo#-!tRvt!c-g^1Ay@+;w&m<%}O?m=$U`Nl?mfn{wsxOk?qqCm8UAOC@ys6Xlm!~&e z+Z}M@e}j%myTaw;h<|AINQCsl=Q71DS@PW%>ufNYT&Cc+6qX|I{9~FgP<^IQ6?1wr zBl$u~$7tqa(SSNUJ6dQMWTJ43NUySh9;p4kF*cv)WH{-Qe;BGxvpgG>^Ch#Q-Qmk5 zyorQVmHFP>kzC&47-v2sYzUq?hZ7qqzx+8Ec)!R---xC*xN&9W>f~LF=JgqZvmSZS zAUQSUzY7c$^L}hBW7oReN-8FGL0;KA^yEbg9&$P?;ykT-C26}Sn~am*?z(*F$*8wJxaHtJC<;cE-j3ABJmyc|lPJnJ#qTk9!rdxc?Y0o;X@UFP^Fof$fGk>PPs&fg2ez(lkdVr?pFXG^oRBbn?Tf73I)r z;$iu-UUQ~f-HJ~`Red5>ujfTIB))IvY`N_O0l(&@Gnzb?naU; znS4R&TrgaiFYw;%iLMEuP||^@2XKMf!|<0wlQK^F&zM&8&SU^;|epD3_u4=XRHoUUrx{U-@BNj+cBH`NZ7JwU-A0 zUYag?!PeDI3aPZ3Vz=n{>j%}A_7p$AtYF~#HOF8=Qp5UJSX>k*8I6dm2nRkEuhCmH zLHwmNvoZb1uP+ekjqIXh$&`8o^onRE^K4!boh5h0^X?S~*NB2KX%|r=LA1uJkRN3! zrYh?~R9G5c%F=$DIpGMLKun}*OxXTo=iT!)c4wudX0RXX7w{&CJ+rLguAjb9{l0&Z zjnQo~{KY>aQ1Hh3BfN!lRP`%4E!g`?}&P$T>d1_JK4k+P2UnI0)e0rzw z-E?>oaw7r0%(#NS51N0IG9b_3q@ShYc}K^?>OS<0M!WWt+!|4X=1%BTb=#r^>;zbY zG1s$`mQ!^<3vE+h!c$)GakQL!ee`=TWKcu|LhzQXp%EP+k2gmW{lYp#LmCCs8$W}E zkUOko1G~wz1PE;VDcq+sf5|oU(kAFx1NLJUGd5frE88|)9n=ifP<=R#X#PV5+LVN6 z>xC<2V=}UfJ#p2VKfULAoYSh!xM&61n^<}m&Eh9VSfi~lVx2(&Z(i1szUFbiJerJu z6SrXw_I{ldjX?*hZ36h7Wmf#-tN{J(06TVQ`UilrVYUjh^xzI7!kaNb6RDuNc^A%9 z1wSl_EE?~4?Y1d}Af(lDkRHAdn+@#X;Y@{o_|!a8K&EJxXY+I=EX_L2%VRWo2CUk7?QK{tjFUJ?vg2bbx>)Sj z{r;%`y#XZ;BO(8hckE7lVze5r3SN)*`gnH>sk~bBtmpl(gZI(N#twT$!eXD#QRlVE zQ8PYI496okW~7m*ZxB_gk;+a*rG!fm_W%A3o-E0$&8ktUn-FT%S8SLe=*s84_l|x@ z-=%PP0jE3u9Pa$6oPJZ5Ty!(t@+<>5erxqf-9@cuB?jzC5dcmDz^u2$8TYwR3SrV? zq%eB*U#aN-z@U;JhRaGP*|l|QZQa#{w-Oojw7~TOe)=uLQGRQ;VHPZ|v=7OAd)jl( z_fNtFL@Ov;Q~AdE8y=Vx@4s^w6V8j7*DPXcVsJSCQV_UR1byB=cfG{>p}7rty#L6b z)QGrS^jz_ya$Q+^7CODQcTYY{FZq>;W83XOS<@e$VImdrYrbbqZLs>T5bZPuT>nPE0f-hWNyPgkiL3fp71- zsWQ|*pXF!xe{SdOf{T=LJ^%lwS~qSHhN%G6FqX2``L|y7!S5WTE5H-s>E8j+McNyz zu;H~l?%D@i<@+Qc3>VlEKwd7^Xp+E#uoqH~zUNG@9|y@EtAWEai~o_!iGJlT<(@dj zs`8rDkhgw;jkE>NqUa~gC>cXBqWI#vUuL<}V&`%kLEbZcnh)8k>-2%vhJWPFXE zbKHmrL-d|8znYy)kO)x{M5>;DanrVFuP1BV>lM3}e)8l=9;FAU1X8P`X8ghf5MUhA z@*SmXbL||o|2G~>p(xkUZXa@$00(J;C{QKCee}?rjmBr%#Kd6nU8hdwP4!wVyOjusqLdo0&|`Ibh;sBf+;`dv2?ZDV7wUaU zqkZyZ2@gH^$LCOiCb6!?>;uRpsUWEY2X0H%x3UL_hZ9QYRR~B6`DyU1D)9Hfu^`BZyhkw_J!S-7SZzZsrh0DWj_kJ|& zCEpiK@AmEGyV33oxKVSJ0woVq04^=2Po6k~&|^(|Tx?n^srl{Bix;(f-`Af))KI(U zY&i5i&YpqjQiW|r4ZF?iDKT9nm0dZ)1C%9hx;OOX$tnarwk;Y&v-}Iv;3%Io1ESZ< z2d)l`Gu^p%?V7(!lX7;?H)Au%0+#qeTpf z#%s?i#QJ}W5tm#JSAAQmg_y!!Hp;}U(j=^L?oxRhdR@CglyAG42=9v!$+2U0&FMx< zDL~|^hJfk-|1*dF!$Rb{46v4Um!gVsp{x6btYKQpnnMLQtQtoZmXM)MwHw}m9P$^p zLF4ybPQyU>W~K{A9=|UJ{%0yGf{EQP0n73p@6uHKxf|`6_pNGktXz755j0ozg7c1- zM_x|VbT~bl$U#*2rvzHSyYT-vhy5nN;5fH|0o?J@WaKjl0P=qyPdy&BV#Vww;UOd` z25UFWg_uKpl;P(oh&se^KG2x~_&*w8b@&<7Bk9!TEicl+>-pzEn&#ea5YohRQdkv& zWEXXs^7}L#KCQTEds$dk3RIdeP%T#2!6i_5(gsH_;Mbp!eF#V1NIKZnXJ6;J+rFM^+}zIb^IC2Nx-0lUF zS*#OBA;j%3(?5u}I+bE*lK))CTbE_%PYhZT!;2ogdMM+LZ(vXF>#F!i^j~H9$~ok( zi~I=FPJ4;QTU=x(`c&j5v9E(t1W&8_svBPur635*`(8V^-&leSk}WKb?~9b*q;b<; z&D@Oy(gf^c=84*UO77XXAK_go0?&Tuv^Jt0wg!zXh&bwUlr+?z_r_A~jmVs+I^452 z_p4e4F3+6VO4LqRSDBYGmQ16pi*0=hbBDLSwMv80x`%#B=d{tgG~X@<75+QdSCaMv z^%uZjMCt~b0v)Y%o=uD}q!Bw|&f9EAb>%Lt+pTSZb(gigyZ?`W*zi0SReKpT@9G3* zGbrRCt#w;bp}{trf>%ij+ge5HRsW26Xt!|2F#VygSJQ&++xPB)u`3BBLIRpcd`dMb zpHE1qfyDnNr~@?>uk2?z6wX(ab2g;Fi}S4uCZvN2ZYpU$d!0 ziy_rNR`OZFnnBTw`1cIUjraMVppk3EJCZNXOjJj&Nv1tHaI+pA?`6tUydEgUdcEjw zA0Dy|4@3zQ_%1v7e8Ie15t+K9kC)#_vRYTdhk|TIC3*EnZc<$u8v7+)J*>G7Zn7Ah zNj|zD2(-#3!{{@*RlUnQWl?MfpVh7}J4gR(sGdaYf@w_;ARGm1aaEAq?Wu^D^Ch7N zkRfj2yWhMD3CED_;Nft+n4e`6YOm}P+wCnV{UfM}X!p6^*`Qy(;m9X_CG0^_WcJ{3 z7;a!m+2R_EBRR1HAunU`uUld3gd1FB-TzB};aFy1VU&`hj{FBhgL&A(61d!0R$8Ny zYRSHoS5bxH{{DxCnm`r&76D&(MXOt7NZqStIqIzZ>5pvnzsE+~}kNP@-GtXrxr=4k&KVQ#^nyXt}V|k)v(^?pr+} z1-okPysHYQKUMN3`Cp|^dLKwCY_BZ&xW#|Y=#Z37|M^HwLvx>U4;hGJ{Duh{?lk-d zGhv&!2D0;UWPM| zeA{R(De8sVDEJ&DG^QS zhH_$WMpE-Se+iarhRLFdz4WV^XK20EYt05Aps(Mgq(mIC&&7Ef%|GHZB^2luOQ0+< zr2igpG^#?eb?8<|U$oghU)G9jhx2FSt|)Xu&<|KGw)JK;h=hg)B`*1QJ0%pMrmx*w zC@Xl@vU~Vm=B=F>>LzDb(LXYJpPVku>(2ow|9}qKF+Y^VlyS)7t|LdHaQEuss3{g&xBmkv953TwfDvFU3BRP#9&EL zdPOlFV5CfHFk++SX+s<<-&|h@aLN&1-W4Ko(v#LS+j<~zI=Z7M-ZHxw!S<& z#tp#)3V~$4kh1BmKsey*F1&VS1}~V_?!!`xatW#&W`9!`OVIN!NqZO@%EUcWa)n}} zQ7D?kI}iCN-0aiTR5$Xe850W@ZppI>Dn~O34n#G6a10K-C+QedE88~zLjn~F)$?%C zE2qB;mh~$gM6(Qmb{$JG?=ms1btQM7Sj59GZ)s}m`TW=3whlG=y+9~E8_WxJW2kbq zRHN*`o81q~$qF^L0a>3_yT-c)_C(CO7G2gWXFSECw%+|Q!#nRNY|M4}I=?i%sBkP# zmq3nPqiT?=nYwseOn8_Ca1mepeZ~-xUING_-kkK-uHqMjT3TAVA6?b0F(I*NUN;a; z`0Wb_OsF>1yPBf409-7wXbo~nxHz2|qCWmE1?%T|imzey^scf0{pD~3)UrZM#vk0={oAo}na4wuH?FmRW>AT=+@Q5d z|9Bnos*_lW-No`jFP{0&%6!4R)32n(^MWIOO|?cHyIBeNjq90=?zPDq+Zrbym`oqX zs>6{ z^J{yJr2%CB7$5egY`K~^o(bfpLgys@eue*7r0H(#_K+krI>4+S)~pT^qZ4uHNtxng zQPN{`6p7aw{6pLC-8M_n(P#Cy_wM(qaKGkOb7h);HELu~^5o^}l-)0?6xUYnCw*7S z{bLE8EA)`XEf3VLvd!f_Uw{&ncxMsy`V)KWWw~%bY7(jLbQt!uWkvX>1y9Z3ix(10v z_(~A~4So@s!9crKf94g~wL7JtoxHVFlh}R}8h*?bC=w6tl1=}9T9M}a+(2v^$a$7L zLaU1dt-dI1rKB%)%KE}m`?Q2SE!ToSbSr|_F5}Nr-5HUV)`L=|+o=@~<4@JK19|3g zqFh9w&FdrrLRaf9GvzLu{kc9Z8Q8_Y>=DeoyiEQE1gL#qT&#={tS|4kor?OofYd@H zKmO|ke@5-TtPTT%^eeyA?I@#3&jsoIiEF+xbfzh}s4&i|6*sc(HAC(aLZ%R}7w)|axpQL|SVKk-qjMl~P3kPt`^6PFnF}R)M_jlGr zCfS`BQ&1$%V2L_g_)GCm`T9}}FTadJ41>c*ARb+lu19{Wc5cd)#g|}*H25zDS+;?J z$}kNSE<50`xkKbY|A*xnrAnSES6&K7$5Vd#(rug{!SPxFzA99+FC&^90Z>o z-^IiK;mzSys{WbJ3@qs*c%3-?h7uTGF`gXnFaY@_sRVp8p;K`?!iFU^e3bmTL~li@ zG3{k~NRH}@%MX-~KPRB#yHF`KUm+{jxN5pZS`bJgPrd~LXalH4?LA8g!thLQ!-Wb} zOw^xQF^E4;57Ct}e#aj+7VZKOCX)Z7T~U}Ij~w0+P&aPA(yAB zF`eTkd`iyQqH!1p_lSg>OGv&|CK}3t|JN@Vzo!up;7HWh_Y54_*3LKNXHzn|QTJ`? zRv;5ns6Cx=*pIP6LRw)>5F1O-@A-nS(I!4eN9g9iD=q!#_N$xNuaJ@(D^TqoDA;2Q0!r7E-$8SdDMD;gTjLI#}5rnj}mXM)kemUDv9ZSru!XHu7LY>r`g2p7=IhSch$Xhdz?gu2nYgvAZH)@a}vscSgg2#JxU z9V_$7%w25DtMfj&0Wey%{kdj~dEHse(X1U3m%+6Tu^^@(z_V~r(>YjUyXVLZrY{Fz zwFM51E%nf`4z1|^GzBe3s}>@lH>*T6Cv&8Z@0H5lFOZrFZ#A~rD~8S|H!wSMQ=aJ^ zlAfVJg0VCr0s;aJ=>nFPm$3p_$crK`)inQ0&fb_*s!n=4UDW&#wL2NkjrvHJ1c}0{ zUibir>P6Z9=@K-jPjSTo+wyW|w)Nb2KM7y?Zoe?2)lUY2Fwnf_d9?I?bQf_A2>$nm zI+#(Y$RgT)5AdcW8ve#G)(jf^m-i9j#}1rMl6s4=zfOT6Z(9L773Wo>P%Wb^PPt$rk!9!2x&dnKK%&I2Hw6_xosA;#+ zxd2Jlij6MB$h17Bh=|75+WWF0M$|a$`5s+>l<OG&I}tMbEgPxWECkx0Qf2Pa`9IGPVR!-#js=Z#Oz~M;Iz0KGfiSw{o7dq_}{b zYVP@6i?H?|Z#c)WFGMgShm+&tKD%XPGt4-j&Es(pbMCzs`h48CMnNDe@?YoAZ50TC zJeDx{o=PFnSWQ0Ubf4_^FNqYC1rpu1g<(o|dEVJ_$$0JcQ zBSV8*;260LR9=rkEra;RuZ_nFdF5?fBml_GvgPXvgzxs$_c{D(d@QL&-&!#2L3J{; zZB1@}O+?LTHiyH-Q(#l(O>|2?Nk=#%;X-gN(QM0_s4!HV&Gaa^;RhUBF1nFod>j7; z2&~{y$k+4O9SsBxtdvk|>GVIt+6=d)S@OiyUu8>ew=FgPP6^JZ0j_E7*QKi|h`xB4 zJhu?pfI~QwH}KISJtEO7eFQVThSQIF{PPcql|GY>e@WaGJjBPnl3a7)$Eno}&oW0( zPMKbf5g;P2W)9}`pj~ur9OToJTF~XJ+=L2%64!VH|D(6%hUgd3qY|o;S>wD|9Nfj^ z>}?0U6Tv^pu>b8U4)S|n2ngIdS;;E&_P~$7Gc2QLmgXjDT=Aa1m6;~uAp0$>i3~F) z#vB=@E;{k;YUBmDLDUX=#BIoYW@p9sVuK`UZ}BxvA(}oGN?t**U36uQedA(Vu}qC9 zIkbg8G8qoe*~T+sJ^Rd+9mZ>{O{FK75|MD z8UhiNQk51~6;F>*jPAE_MyUaS`h_gmLdhDH$=7ne!XlMBsf;fJETz)m&e6~B-;mn4 zy}ZrYd{V~k71~6JjVMh`CCPLGes9pq)P-Ahmk4Au?Bne6_oa)!VW`p&H2?Z4A!bO3 z(VgtPQEJIy@g1f!Li+Bvawe0Z3rEC<9!Lq)Qn}64fyz-255Y>Qje&HaFV}n`S`CxO z!J)&$*QW%>udug_4+e3m4&ds{*-YJ}QdA%$72WXW58VF}0a4jiD2C=o)_nj7Xj>SVYW; zzm9svit1udmy?T+3Ya#j$wS< z{cZsQubN5x%y0O5e$WwR7C+2quloFcE;QwGZYe$NT03j5;0V<4Dv4lfrxuk67d<5S zW|ka8SljDTYto+mPgZ38YyCq0C)a14k!B#(QG-LF=7&4@RMb%4F75v0tLSLQFe$5A zjlV6AQI~ZH1MQ@$!by+X4f>2n`*5FC_dqHdCSBT-_EyS5`WUuB<6_FE)^y^ZRp0x#R*g zo)$lyh(fL_U9VwfED(|A#t-})XZ`HcK0qdcXL3FqR)4o>O2bmZVg1+#8QQ-jGdb{n zOE9M>kVtl!FdUs1igmFtJ%`7UR)5ED1W1D$Eo(o#5w0jKDKw<~RcO&p82W*c*piNK zP%Yf~kZk{k9k@0V9H)zI%+;A+EgQZc_V$eJBmQ#U3kEjjumrJpk$5XLR(nw9X7;=- zE_Lj=CfJ7o$RKe75px^lHI=L{$9j%&2_GE(3n0YTo_v+XJ;zpQ^+Euf7%W9zm7JtN z|Ll@*JYJ3{4U^nqo__eZ0olJuwm`>dmz#qSNUegpc&*ynlz-Csd^R8Lmm;D#gQl2!F z_6%?5|Xy>S6-L=nsM7SI|Sm^Jm;p!6vFVj&mWWjAgu&e}og zJqmG0&MD3kX7PJM8D3VFzex_OMZL(UoV2ZsYDBLv>c*AHxG8E*QOvVZt%`zCQOtIg zvjQ;}_^p3lBMn~kE|b#cqd%c4bgPNFfvQ6D1+8)E3*w$OH95(FmE_-rrpV>5SS94R zi!sHKuAdW$>6=(B#z8a2XN+gRp3SkbdL#Dix{BWD3m?d(Ycfu~ugC?svNegQDgo~@1tp&*S=c6@nU7t0ZOJ$PTZB*fP@t_s zepou6K!dS&f$QMqsox`&6`Dky@eh!q8~#^8*#$vJn}$GmNs7sZq7MlT>L}F}r_G03 zy9Y~<)ylmv^Uc4ooydMgUm+oH1w-|G-U2fB%SrGdn+UCnUgo?zu$HbJ>ser&InvrL z?&SzL@>FUk(Yd33s?&!(X6wu^!z2VAI+iZwhE>4XBMuBWe3`D{GBV8N@ob(=#X8aQ zH)R!KM8V8{fT(Ex+gvz9r6#PT3gAW=%%!7?fBkRrb(6)`S_yt^PjYStIfTD@-`*7Y zwO=S69;(50Mslfq5eI+y^C3C9oJEx~^YbC5NMxT3gOpd*suPr4Q3UgEWRFw^!D`zF z3nVE^0%h5|Y-+fm2*)0@Ym4xPDws-eS=faU_)WOwmue<%sTs&PHucw?)2fxFJCW5N zS{gL6{6k;K_@iwjq9#wReLOwpSo|dj)nzEooJtmL$#R2&L`GE;DG1oPPi{bF%A9tx zAJ{2h<9RXhvF$${30weCq=Od}uBu9jJ&I_yVPQR;d z=bE&lPzZAo^XNjKVj}p;%pAoAr1)M@)G)gj-odh|>4Fp%s&HV(c>6c}*Q0-nX2==H zV(qQ1k_#2#uA0i2SC{30UJnF`!F1vOuCUBmr0T0-HOaE|>L4u^_I@K(xh74UyZ;CC zT04A^b60eJ!%m#SUz}p!7vy5=MDk*N8Mhm1S#RP~2h@)I`YI(v3MOZJi5m(3OU%2` zZHi8{lvvX3M?01=w2l^p!;hzvrq~6v+}#loV56O+4$%GXtkE2vRA$PFw$1#1^tEE1Hi|wT3rGhP<2-7pJ$!h%U z3Wv2dMj*G42q}Z3?XqWL#gZfg+B*EAPl`9N18k$6Hf@8Jgm(m1;wNNJC5;VcGi zZ<+z>cli~G2_fV2wJZSUM*^zNc|16pi@Dt&iGPwW6o9s=M|jzGt>ffcp4E{O*n8H5 zb-=e5#N^#2{C~nXWPA9-h~jY$6T!7hPV&g|=Rx$5aW$_LX0UbNTqTS=g-(G44Dxl_ zAg&yN4~epz_K|QdG$KK~@P>e_yCqc>qWi~@(BfBgS`BR-fDnIsrO(!_2n1sM_ar)! zuGQU6MRNAQr`F1xl`XZ|V#E_=Z$@|Hn%`bo=lgVI8E_YvyT8XE5|HT3+{wm7R z`s#H90kGZ}lX)iBc4@E*K*n-LB-5i>xzxx zp6v2ihWzzS>)+QGmL49<%qWTy+n-K%$0?r4Hwc^C4u3D}7B@5WiQ7)%j$+ER*SY`7 z{rnXgu8soAysM~62cWxO@!Ka1g}`8UjsoVUJ&mnG=Hqv#I6|cH#e1tLOLYZzd3|JA z%k9s5RS^Qx%L0!sX_ZYnb7XIIAjOD_McmsvB}Z+JE^iJXhCG+gl-l*$jWDbO>$trp zX)a~}^1uhw%cZZBMhbrI+W%Fe3Jor=+#T}^YVvCxpQ*9B#b986)x#*#K(cwVgWQjS zD?z&)q5d+XuwND9lxfUbW>cZT7HsCWTOvRy4-~t~&?a^@+gYe2e_dmDF#Uq#tM7~g zZ0;=xpVLhSI!>C{FqH@k{13^x#^rTvq_qqG$SK${SLRCQ@VHkC?Cd6fDo(YPQ(rI6 zvC$EdB35Wk4c=7()cv{1-sKeTivEXvCIR{+BZ8M4rz`{>O+%>qi&Nz~Hi{5y?ScM7 z8pj*wta-(E?+(P!;C&5Jd%7@g6T-llsU|e9xC$LRFlP6PcRR+!SUU_0#8-4Tb>BJ) z7KlEP@)kPrcP#~E18zOP+?g3p6rj@8;>VK$qu-Fi{qM&A0-^Glrxl*juQQVHuw}X- z+m|g^Nt7Q-elk44II8&>!^LGOaiJ>`h~4krXJ1#FcS9;-jtkt^GI?VK;#?fHp3cfX z2?zZkt@~a5S24h$s0k7F8Tlkq+~spm6r=pyV&u?MZ*nhSQ;oorGF{%)*{3uZK4FrL?jq}h4SXiag z^9zewZYT0zqBZ)j*A>E#rMCWwc+D|am!CP)UNG7C8Hgss(YR&l-%K>~VGa`!$cxV) z@f9>+8z-$&e#0{aBG4EUPX4-M7RdmnGY(Ow|H1G3V5yq+JbPT>BVXs=t5iwjyDW&M z`m3QmW?Gl~^P?4OWb2^5QKc~z@1SigCV{mVD_ zl5m4D3083u^jwd`Nf)#{EQGHkvR>TxdQs|+e*UDP%=`3FZTd|3iw|lQwVWaZ{O?^( zB?6?=Q>-O`{FX8Q%yzNqEiSK2{u&`!Fkhl()M-4_;Q9eo%PE2IC88N4vF}@DdBP$B znA8k91VJ%AtyDe<*$%f-d&umBTFpr@h9Cf$~>ei94ZwaeR872Sd=fU zMM9A*PMbS5@Q=@nCkqboMrAixZ)GYtjixx+G!=eTb+2oF0M7Uv@mahy%MbwUwpjnB}L1dFTUrs zbK&mQE-WAFIc=QRP(TXcmf&dW_eK=M_+~qPUpV2Hv|dA1-Y?VnBRhoUi{A#9{277u zg4(6B+Gs)+zVRw9^?WgRa#X`##ut0OwViT_!RjdbJXpc65V#`a&TpC}{bR9pI%)?k z+5I0Q*BcBN`AE}cs^$@3 z{K**IQTQd;6O-rjgLg8|S*S|WIg_{V)BAN%s)U8^y4%d41`3e2KvR|PscG>&2UF8w~w@7g&kT2&aWULvwbgP9q8xquDEp%JS|4Ano z-tstqk2}X^ocWUmj|6LYNkL@c7gI_k(wL2lNTul+IrsMO3pnXn7P!^NqZP3vBHsed zc?p0fmb%eW{JXTpr=Yb?(Vai4cC9@q%`O@;q}Rz1*9DnMY62g`b0{#$|E-L3boXp$ z2kk}}8c1IkP5Ayk*AdB1jS0`NVI3;yA66NEa^A^Ee%-~#teK!@n~O_o_L?FQyxwjc z>En=0{1$2(8Jm?HyHjqSY(m5~sEscc@UroKXTLX{E==OQj4If2!^Bs#$2A7t2YxwQbtD&gu zgtj6qn8eB5*i+BVV+U4*bIiMw>&yCPYJQ{)w3<(H8H}AE8oRl&%|O%=*Qr`X6XJ&g z%6ipM{s!<2g|9TyiK-gY9fpTWDc0M(7#e8qBlLbA%cI#lfu%|mc^ag!aHSo2;vyh+ z6L88I%Ze=_*~Xk48Q<~}$`_H>nQ6CWsm+<+m79#D3+3MC3JPFOY-lWTOf8vAUisS- z#riOrpJjOc({%1R>(#F5?)&GwsoSeku}u}l|8=uX|IuoW+#~9dRHvz9?fheKwtUPw z$dg}FeX2NKRO_!|4!qQ|6#x~DCx$W0B4fuR*A89EPKz@BDD$#7$lEes_SSx3FWI{D zuf6fScKi_?b=Q(X%WMuBghA&2Nd3v^%G$Z?1#4{55)1Vj9(075Qc3glL}Z+|Xe|p| z&9iQ6b5`CLF-_B3b-(mocmt-RTx{<%`!HUZJ{Zu!ESr+R~v_UyJ5dyCA@Ho^1oW;QBzl+JLqQyj<=}8T)@9vwyk%AUeGYkqyZg-)0G1n0ImIpo+aE9c>howL zvJQ;N`3#OYhe*#m(92;G0^0WCZ*V-gK|h)!mKAQNk36}FZ)mFvMx&*FGL8^Je}1|r^FDDv z%a6RwZm5!i#luaC*ANZAjwgCsi@cb9%G$>dWX)U0x0FQ`^DIas5*U&Ki31T%P0ND(P{pK3Tc|vkDcDgS4}VRO zUWvShzZ%9bTH+jBkFYcMDjLFT{Yy57*ceJPUFn;Fzv2HuTR+aVXpX`wM3+SJxvFcR zj)oQ0a_Sp}MY4eaS+po>x2x2+$6!w4>EE9GMpH9zjvc(PeN#4SnBbD=zR(F+3j`}F zBo>7Ik%Zj@l%DSQpm796Z>cvSR;!Tpw`S7D<)5$xWu?==pxzUzpEN<9yn7I4#$8D8 zb9A|B*Q$oGVVI|LD_~csf!cYMk99SpcaZwu73BBQ?n?!0&(`g3%kl=}GN<=Jzxr6j z_ZR9kMSM=Jv6br(S|F7AP8XgBc`&5C2td$uC674mLK2?*Yrc0~GwX^iTwwG#o7`q$1_f6g4rF2X@sxg2MSUU=7*=?5j zTv?Noz?Ven=jtvF{HzsqNg;|HV{kl1xbHpi}L%TMkxse1f+)^8bNyK z_5q|EQo0ckhVGKip^*k*=#cL2l#qrQS}6fhN)f#C{oVKd-1`qavCrQ7?6db-Yo$qa zzmtPE)33dt^ZM~MF`%2ivPc5869lVw@#H9ihIE=tAH=h1=)#3O>Xg|<=4^z@EQ`5|?)HwlOCHHd-J*=9ic)hc)w4VVnoz9~v>9O@2*|~v$~3-Xi2`E06af8xxCdp1 z{_nXDn5dW%!YOJayW>Tb{B*hqTf*5(fl@@y@p{0qrv~cx-j<7Sjg-Cgf};0Qyia5- zD0GMMdgj}R9}D4jaDXP0HoGms8^!eqOb1@d5mJGNXjmcYz!LEbOO?WSj->vV2YA0cNj4K7(rF3& zXs-lj18?qcWGABo&vvWFh$44Gq7B~Ro0xaZhvZcSczvysy^TXCb)@XJzy4R%Ei@zU7AO&{_1x-{7W5TMCo1; zz#HoS&O^Im4^BQd5}#w`!iQT#)z-MUQ{351t!g`v)ZM>5f6nN7$%JM!ki7j3^l9E0$)l?zC2G8lqK|jbMJ%1U*gO!JnO3K9=j>hpW}L1 zxrHeP9^>tetc{Ec;E6J5)*ui0$+=-4;;vofzl)1t{?QMm>yO_a$#2_mHkjivs9xU6 zqV4juu$w8l|Cc#~0@{xZqJNG_7P>-xf_c z)d9xONK=|+*&TpSB(z?a)#;Tbaa-X)sg?@OT`r~Y$izpaikk^1WIeb1j2M*oI>Cl7 z3VF{-z_3$~1}q;DDIe9(qj4bnXpVxGyM4pTpu5k>kmva#)g|lE{m`*LZ&CKQ&S&&hFH{nk{Fgbr%A6 zUmdN-28RIn1S7v;I^HACi#Y^Rm8db({1}eD-a4{It;9n-?0jkBEG|Kx4&q9D@)hX1 z0ZFrZ_*y>);-C^RoRSi@m#~v#80N3ZvLBS*ICcB)-N4!m^2mzPaHIW?t$0ygX>NY>(e=Tv`>gvk#-=g8a!us%*W+ z!*@FUaR?`XWK|R$>;UhZs?xeq6)ytqk;@?~aN$OBFX9FA@-TPsh#NY*(}wOW(-F<| zs8v@_N!LrQd|3LXdpa>_qRD)RD`x4i-tRbuXekIOXxu6?jA4FkgySgPTakF51{>~& zdows*{z?3pB6WWC>_7XxP=K>%79Ax(c6==qCus7Yb1de4GO(-n&H&x3!J56)-+ySK zV}jd~J3A^(4Z&Y0PO_RqtQPl`^iFS36}}X4FDSWPJq6Jjh>mI!etl4hoq7*ANUqlc zg74GuR^0^WdY>ik$93ZUT6IxcO?&P9EG2zsO`>zALKjPfEK|`QHMIo~JTH%c6b4Jw z0&5kdF)6x;z+E7CP`*pI@{-(d8zKiUI~Z+xw&2F(Jxn;n(4RpwgLId~60btr56yZE zcv6SjM|&cYttDc!Owfv|F4;DP%$z^#dc{?|Q)j`_`Y(qxU1_q3^k zh`(t9OcPA*X$y>JkXLw#XJ>$oc~HI!q$+OO^R3qP$=|{7OV5kgFugMXo`)I_-!nJ= z{Zo8@>V@px*LR z%Dl#2N#>{HFR}W_yL$`1iS=z`DmL7T%*$&{!~4scd=o6aK!Nt1mHVivnVx-L2G$>p z!?26VT}qA;Z@PTKNpzBobVuZOQ13?}_5%^>1)b@PUu#~f{)>$&9Z<}~sc>`en>RPo zfe21^y?3m}g)PQ52@boL1R(a`fWJg9^YSP|eun(HZ8?DbI(cC(`>TqOHk3+LC`@_x zWntjYA&w68d@}sTUR^HVw%i*-l2-ep11EWOxu|#9V9ehgM+pnuxfAmlZc&rPIt>n| zKa+6ceIP}@JGRWw)(*R-hFLH7;zhPz%jr+tt?e5pxp-zhJ6||#*5VPIHBxWX$^H$S zQK-Bv%Hjh%Gk=Wvk+y_4-h5bOGT4ooi zf3lZW;_0$%zdo&@L zy#(ku*$FVc2j<(v>s^ z3u-a)`)l`u7(Ny)&JI!|A}&vhMH9YwV22@==3$&TVD#kK#+*iUQQn~`9b}?J@$uC| z#ID9vnG2h?2fZ7meoG6X*tcT4lpq*++m|Wpzy5|y#c6*m;!N?rc}?}s*CV^|)8r+i zUN*v%9vj@QvuA7!T?>#!V|@S^KkC5|A_?C7Yi{8dV0 zdwQ7r_KRIQ4m{Z>_;&s-J?PI7o~(z!tO4k)Z4$;h&WPPcP&QA`tr)Z`nh3DctF^{h_#ht@( zJ1pVC683+Vn>S`>Ia_&14a)tDCGX`ScA09*7BuIo%M^gZZ!ppgls+Zh^xEnc2({Q7 zbdGV;sLV55txDa1Db?`caoGmf&G`%xPXxF1IFpGg#AS*B20D4T|0l+_W_RxAdh4O< ziTjP6CPWSf>`{2IHPX~c9iN+a(hJ=&p)1S)x32w;JGeG#?bg! z+=w~-OZF+CvF?f^=XhoPT^&W=M|Bmsr{2jO?UM*onsh68UplMzFXQoBPk&5ni5qn;)1G;Gmu9jH)R&c7WKPwz zFvPb>zymURj1U_YS6QLA6#YVhRIhksx^h8FBPa&%xo~3tUgo|ZySdzd%l`C;{uLcM zlrNeZvn<%KUp&+M750kgc$;Ck8e{GgX4{3rn(Qyr`FN*zwwAar2%U(AO=ICanizw3 z{Vpu}mt%=SKeOEtCP@4S+6E?*!<$`t%?<8NcQ7f0+sVF|)a|IM7y)7%NyW$%+HlKO z+%tNMTy*J3fvMY$;Rj7AKok^o6f!C9laS-&>N8&2?T=GGrK!45@6-lcQ%0P}(t^en#6XP__k}bH-u7)~ zKBh+z(~Y)rWF?lLSf-(;UwvkEFC5i9w>WE8;y=t%)DS=-7b4pUeysl$MTnTg!PL>e zTjoV`ocN5)tRSd)C-KDAxA{@_+dd!VC+tnsInus%8@?_6_uF6kWEsym>+}k~=8d;; z4nnWN8Cq$sM_3o5V*MwIRoi zBpXW9i#7jHAOB8X$J$&+!r^MBoJ^a(Ie15D3tUX23UyT-T z=`x6>J99*xh-UtFLnSqJk~OxMOB3t=tuCPJ@De&y9OzW`FGUdBKNGK`cG3{LHqb@1 z2{hWu^DRVSoT18@jKi9mX4mm{zdp6KfVs?SdMZNeTNsn?d-Db!3H?@d8b= z>aW5>pQ2`pAi>W{*{BSZ2b`;660U!u&X*H4yrF3lg{rH%Pb@XQC&$NCE<1+hc~jM}I-w`?xws=B z*uFZ|uiv5x6rY6}TgI{iMR}y*Fu}lYyIHozV8|9+BKp1yMA6 zLl-o1*U1ERj8leP!d~cbg0Jz>P7+HdU9K zWagS`Ghd8$EYx-KaQ<(aHr2_T98M-hC_#U2I20=SIczOVhd1H1^OMMb)pDcelr7i71S{xD^LMa0N1%4ZrZ4ljp^DGt4|R|?Ph z=9^REjBmHe*pUK)Za(t54WXhKg2lI!Ck7I&FyCf$y@G{xo-p_zL`<|kRZ@=;ti&@F zjNT%*rtN^x zn(a;hyqR?5_J}GF$czA`n7!0M<%0hB8cfO^td<45IMMd%6tXyaiBdVmyQs*?N!7{D zh-$BL1&36W!&0B<6c@FA_X1zxaKO|(MQ*ycP8G7&y13Y;Zk7X`wDhDr@DJO6FqMj8 zx1~jbvN;t0%Gf>9TUW?`fN@8)@(u!+l?>N~nPiD!!*H?(V^&zRtQN{|)jkA?AF`{Z z+h&}^^0trVZU%i}wMvf9jC!sn zcENSr9X#1!9^RWY3wICFSU~qhEoz1P&ujgAai7=r!{vA-(i}41spg;gfKSpzvTDEa zRJhz`dLC=+gpIwkx3#jjA?_8nY2en6J@@vP@dU$frK$0##y!iQ6&f11V)D{28^4vH z{k%G4b_meU+r5E5pE?9;c&A$tn79y`%#fT3`z4_tI&5@Lzp4K+7-~%`myrFXC&c7r z-->2f*5;gZ7;v~Qm!Ux~4n8FA3l|Pe8C3#Sm)m`%nC`;d}FwUC=;^OIDR#FfdN}|*!PU{(cd`J_js%~I&5!AQ|doM&k7?i z1Y!CiW1dCW(;KcI0TQjWNLJ?2xkq~<*T`ywRPySQzoYgs#jWc*Va}sbqzl; zH62KWoB?UQvw96DuOv|w;NBtpZ1!Lpuq_I%FJ`3oO6)NixvVI=yJ8)!yMs^#gz$@AS&QERC9Od|qnkJD$3K=yuRNIf+uIgI#(rqB&m3 zg2WU=2LF17o%j066)pO2^Qi0G>|tMYkRC=ArC2J?XG(qkM4VXkmZ*$F0?oST;hugh z!pUOYxdorzan17j$n5<5o4xuRZf>1L+O!yNGDs z`z44-kSE)G96;%Ar49fCr-CVi~mj2 zS0Img8-2_QBleJwZdCeJ8h79~vxtwXK*=vmMZB^WuqRzvB+&c5EL7Euy)?#L3omzP z##a&F4OQ8d{_y{$rb{%6_%KyM7;#Fzd6Apq`>ZQZLCEL{U2OY&!7n&pTxy~=Z&j+1 zXCssRX9cL<$d@jwUV_p#{rE3MDEokyD2^9B&-|Qgs_u*`p!Uk=gC||*eHgv}`1sk_ z0JP3pl-)EaZs}{e+Yg0m>=jcXSHwI)^?^pVV#W=cQ2C^T&K~|LbKp&ao>@^T#SYI= z`Y0J2AS@nYmIt~>;S3nBBY%bhff~BgeM+}UyVkf z9tuD-guMNS{?tyXldzVplUshwGL1u^QmD|JPjH@MBh?j5oULQH{!(DBAt1+FYD>I8$#ET0TqAkBeG)=C4_0rH9j*^a6kL@@py`cek6C4gyhN9}o|<&Z=?5e^qvF!GVZMQu)=E3P-$ zSvZ|glJS8(Gq4hBoVx$HcM%?}dEShVNNH7t3GW2QKzk6H+zuTKi64ds9|R)M+n^we z8)6EArTjyIF-|rTLUL8?EZ*t<4vJa|;n2!Ai`VwjY!}pPa^NrWtWAAktS@d}Y2KMZ z(X5WPZLw@%>kc4$A2_470lS=No2_{SclAl(XAO?0>DfcMcsgoFJ8y_TLE29j3lfh= zd1;tIWcy-3&=);f4#TanMMa>a7QS)K_-|2x7f)=hJFTIr?ejPYIqYu$T1MhBFhJ&l zpn+f>%~w6Z+#&)IG|GArNZLNHjg60|tR}cbPimKWU*uEv%gq$?XHc<5;}Fe!J7LBK z;;6sA=#_*UBD{T`DJ}KUZo^Tu%uXpHh7jx@X`UEH|Fxl>Djs%pJTj;nbdT zmx&r@vLUFYxt!*(+BJqPZk_-b**T5Pk*frHSc zO!w{=%x0;KNeUNp4*o`w(seRtIV>W2dYJ=<$8-)}v9eM>Q0Rk*bp<<}a}g+qdr6pI zNqm&Ot|`ID$gsnHsFyROc96qxZq1XN_zgsh-(4xKhZ@z85i#?qJsBO|Y#>8}b5wi#>nJQE>C`C&kAc5Z%DY^PwlLvlU*@xKZvXn>p6>y4MZ-L&<}%M{mkDeGm+5|5Bd4Li+8@8B zsb@AUz1+8g30o22PW}E-bN(-*9qKKmiC5=lrYgo@-?6`()35&aB|RbOF>P?8Ue~vF3Ln3M_@dbGOF>Hxu9;2{ z%|HNe69<)|8H!O?=^O=u($bL{$>z&)}HWR<`;s72Rzy)1$GWYQlfgF2&EHL#MxpM#UQJy6d~AkppqcAL}p6(S}pw=m}XTv=-r}a6Vrx(ogDlJl-hYAD{h$F*MHlkJ&K%)xi3& zgr@6BAXxc-&eqBKwEJPeH2UOpBDYRM1$k)ILCwO|4G~%jjdmJ=&l!bny&)x|BmkYN z?)GGqpILY-scE(ZaXpzjuDVJMvm+nN>3sTvPLwSEn8hx_@0g!{=*Awn=s;6kgyDSd z9hPCeOX@IJIK9~M|A;>H9DB#ge{qVU&I>L38<@gSs#_FEFbaR~&S+Gi@O=!HQ*%wu zJ*z$`?BGfY`SQZ+%_s3?rkl5WfUuZuthF9@Mp&w=%^R-|BoW;B6x>S2rj6r6FLwdA zPH0(Tc0-VEXvZf26$1!04OlA)VCJly03**5pI0*Rd8+VNr9xMbD%XQGD>QjC3VYLw zXxq)1y(cPArg3-KjoKw1L?fsewm+6`FGy(-TFCwW4XgsNV!_mrL=!LW^+a=n6*i%F zcoV0KM3Cbh!YAn6fuswB`mq>Z*cF0tm9gC!r7(Q`)2ceFDlbKSk$-YF9r`fLn;J{ch_yAj|&@# zN=Qz9Nh3xKy!###LaRQg3AzEDq3KzjH=D`pj|I_IhuO&dc{>EOR}hzSrk044@O>@0JA?g&RqwW>_`tfjxPHl^XqoPwqf-K}z7 z5;}M4gid$ZnFv0ENSN^9aRJ_Avg+y?(YviVQ>C< zg5_o~u46gRyORHF25=61-hP*a*RHnsp!l`pE~w`ATWB}_-5;%=0)-pzW;buT3b!Q& zl)G8o5N}A_5ORrFp9o1DS%*0Zw?4Kq39Ld(TmpBtp&|;BWNXw`2_R-}rm1!!E>Xyz zos=ih@L^JA78tqz{K{6y)yQW`Ju!jyly7y7Lp!dEdurcQr?fF<4|0>VPRfJykGm#= zAz#X;t3T{f?vLWKzqZN00Gm{sIj@S$pkg|oDeifxb)%4P_nNzn*87q{^AhAV)nzBb z9P4P=E?t>MDX(s$Ee!ow5IxOuvVFe9><*Cy&F2HIfa*(?F;(QD1#Ca5kSbw=hL7&Y zy-<#0hIz7?8L{ZZN1o3{8DRuB4D(`ZfdXs`-bwtpcc==jdi_{lFG=ws%s(mUE}&zL z+xXy=t^LxNWcaI)F?g~SsO6oWxT@`AMe}y3V*(l?ojY|%?D(UAmHCXIT<9bF#f>mJ!8rcCbO_(SnpYSks6`m`2qD5q;MwUTSIAthTWKdEt>#4G7o?LnHr>+#%N5ug9 zhv&|(m&CCBc%1fKBH_#45cICs&@pekQtNR~+BN_A4T0aWO9yF8^ma#hol5*@2u{c# zoWZ1U2h_%frmzl!vF>xC!}qaG8;vQ$oj#(1W~W^t@w&9K>+ujUb_~3D2?*b0S|x`i0z8!WtoG#a zvB<`=p*Q}PKhI!&3crs`>W%r_5ZE2ibiNIqk{dz>+De7-5{CBVc(e?HB2?fz3%PK@ z_6Lm6&*b|(u=H$N`DX~kBj+-4kzK%bfxywSFDqMK;ytJm-cmsHnZylDy|}W>;09EY zyMeDt7^nT(Gj4PTMCoZ|USIju=fB#j$vxhCGc^oPj95h;_Ch`x?}gtbuE0M9(Z8d& zV52)x{o!zF83^edUqWbS}!L2b zTe3;*Py~uOB9>%cGaT=Cv)wbRG+SPxrEy4YI9U%A`9sQ&go)Fe5$__3^Za~0y+Kg%ezR@FuiSNt zSH1>U=fs2$r{tvaZV%w(m=~omM0;+I!#fat6aEbIE-=DPDxGF{gM`07fXKk-bwrUW zsZ$Gb%XzgkU55a%t|IqpzIpf>o5OKpZaZ2bfFukrX%!Ch{UtGA8lpxGmG++biM~L? z`0^mL9s1oQP{VZp`-(j`uF^Q^E4Ar^-od)|)lC;xEaelmgaki#6(4F$dwV z{qtu0$F3WhRPo%vEvsK*qE=DsG58Q|tz%llf5P#Co;=8k0UmKv>^`P;xO)`4aQcwp zbEQ@L@ZIN9T--ZiF|+W31l&ZJm>Hz=Tcs)EJ_Zlb3u=w{S@?C=My~vh@p<2`{Yd0t zq*fuEk`?Aj4N)j|XT1iQCcd!bU~wXUhpwC-<#>J<(tn>CMAy3J@;@YW`fwumH0O#kX< zow+@|2UNd3f?p(9pjhWK+bz>;nn&Z^2ikVh9qG>skijETj$^?82U@x?$;b8f$1wYSn2gow`HDIP zBgH6vE|YhiW`k}vYL;6=J!3_@N&JN~mljP=6;&scpik9W(uq})+B%0-?Km-#`qyF) z<;D9Xbbfd(tc3IZ{Kw2Wu<-B%MsE7+28+l4dhcMkZ~$%jQ=L^sFST7jpq;b{OzDm( zstI{~YA+e$gN*Kr>tD1h=;ZmKY*V?xruK^~uN{ zis@1eMd|`f8y)MrqpvGI>PE>JAco-&GLC1E>lwS2SWdzrBZ?KMj(W2;pjy)kBU3nJ zFCpO6PLRd-TEGwcq=fURVYTWB+oOLZ5octyj+BNHgYrb)a9E9gM){w5+EyM;~ z1SHotI!{;!dVgCWFJQW?MOt%(O=Hg>2B zR<1^pys-T?43ztUFJ#bwj5?7cavf_G zQyE-^u)-72>13M0;5HC@VXxIymTj@G`QzU?U^=leQ`dG2trlE_Q+nTlD7OKb+Iwz2 z0d>+zWXu7Gz95f&?W;;(_1Gdk(N$Kb%a-XFF#StKQt{z>AzoU9Y(W8oI?3uqMt9PCBf3+=EmW`tB!JH!$#%TBhH z;^?&Wbuy4c8XqYO?KMACI-IS*bFL90WYc#3??JWmU)rbnkmLV|T~K1w8?F+6L}T}3 zjJxrCe1Bzis!T)T{`pC{J6+xdl%P0+f1h<^eEnG}hH=Lhg39{+?-L;eOP<54Y%Fu1 zL7G}C!0{5Z0qToi2Vw)PIXGdusliF5=+>N{L3vgR7Vo|Eyiw}U3Z%WfuE=WT5WM@$ z>h<-aTV$J5MdH}vZ^Ft<_uiCSL2)YuJM!xm^SzM+m^JvDmedz=kB;BI%~wy=p_1@b!to&(EA!1bfVGIb#<$)DoF64M=|FIiC+-9V(2ateCdRWXN(1gOIp6mnzav1>nJVktXknz)LCYO% z;Ov|F&6C25mKTn)7t5tZj%Olc>ZeG@0Bv~NKT|JHtN_?B+a}H!pftV$i97iBS3hIX z>%mO=;{qH5pV$@55B=t#ig+6SmX1wJ7V)S=P=JJC8!+pHf_DUjtUFVjL^7b6qK>ItW|qU8;o;OEjXOGsaV3_@Izybn(7; zQDx#h=4mB16MsLv-)7>ZMDr;~J9F|RFENw^6MbzKRst8ZbMcU;k@e!{Lsqne7f95h zR0?38>DJ(9Gw{{qzr0prPE&Ay^XYWqsziPr#9UJ4p1hYJwKiUV#ee+C1AF})^N#Bl zQRda91n{TpM*O!GO;;av{a=G$NwO8U&T-J=KpdZXf^Vb==}7eSsbrTw1TR0MtP1Fu z|8}-4yc~QL*qh=W1a=eZ8Sm{S4f4rKDQrj)-idL4E{fo?4n^1}RK_1vR?bM1x}bkV z?7x?~B2su2ml*ngr+_02_pV!nq37}MOCNagVT*Jda7T@e6r+vFB=0VCcF2((8D?)! zVYEKRN0iOvx!NSb-)O!`U~j#y9wyK9WhC`6geOMHKqjlh5#b#_crfI#&{WCq(W5}P zX4y%%Up=xyy4Emxbg^=W7I!66XcaDT_3{EO7-kKT&>Tn+grt55)`JL$4Uf-qM=3Va z)7aUdY3c3A?I7IT;RtNwZ6dk%@6j~pEZ>25RwMcwK}Y}4+|PqXmLm5d$iwtpWJLir z!A!O{8Q&41D?(qfum}gjBJ~-Lp9rV(_RIDKzFCay ziI;zxNT=t;iMGlAh^zN6|&T#TJk$1?WJA z_u~=a;QP^ml$neAΞ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

aSv-V*ij0JcUE0K0#7dW!PW; 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 bA6g92wIrGTr_3STe?YpLMjEwh4$=PuXJEMw diff --git a/zh-hant/chapter_appendix/installation.assets/vscode_installation.png b/zh-hant/chapter_appendix/installation.assets/vscode_installation.png index 0f9fb7dc8770a4eeb1398fe997182262610060ad..b27257aee42ad3479a25519f544e3ff78be737fb 100644 GIT binary patch literal 124802 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%0Al;^oA2(!VlM%{|LYHy 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 N002ovPDHLkV1jkn>4yLS literal 488611 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%0Avvp4e->cEqz_Y^4QlK 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 z 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%0D^dmlq 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� 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雜湊表 +hash set +哈希集合 +雜湊集合 + + bucket 桶 桶 diff --git a/zh-hant/chapter_preface/suggestions.assets/download_code.png b/zh-hant/chapter_preface/suggestions.assets/download_code.png index af909b4f69f8feb6f7740d7befddf3e420ba11db..c80230ebe72f1ae1970d22be83a71cdd1df943f7 100644 GIT binary patch literal 109029 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 b007Jd)=;vL3EuGm00000NkvXXu0mjf*z0(; literal 395104 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

`vcNJg`={ezjOGj5UFc|#|YN0 zK248|^{cXC%WEX|*_#e388Ie7hUIPw#N>AJH?RnK0>4l(+KZ+WOGpixFiqQm7#5GPIWN3hOY0| zg%L6Cmd-Q1J708guTZcnk-&!NF}jt$pHKm1Td}ycT9F@G$^QAEphgj&ERE1EvRx5m zg7-%6rw7p7hejwxTnGyN&C5@Z#j^QK4iqorzc8^FqY+HEhc|T_-Iyn702C?|w=>=_ zA+D!(G%la`QlB7dd7c4rRSjvm0SV%j6kqkEk5vD&Hnt}#Nl!neb^gBB{5+qx!_$kW z^(bc@2B0Zg8s8%Yc_F+yIXy{?JqXkJoRoG^L@wf?xEzxM^|-Ti-WfRlhqa`32Ki@aT6zuy-Bl#(Qv5-3v2~Z6Lh?pGo%LcIBQiF5GovOoZk}^O zkxK+h#4QJL%V*s7(;UCgHvCrO1m&79NF&a(mjsA*!VBEiP%WGN2RchfU9#V-@X`f% z`mwY;cJ-~Zjv5)GkdB0vBC%A=3-L%@(a~zrEC9#sk2vIj%eV%s43HL8WjM@ zl>Rb|rTIw$8M}Mw8iC}rM2OL`8CK=KKM=y6r18kUH2NE`!Z%*2h^d5-jKGa8YIqQ{ z)DooB$JWi{=i8wnrur&2s-E41@FdTX?*)=IiZ}X~(&YrXf@2MVe5{DI$QaMx7(We( z{`A|R-1IKVjlVDF%0ETy9R9$K^--cZvhL(jf`NDg8oj&?4D_qF_MAkl4;N)=Z7#!% ztB5cvq${7~5Mu<-2FgFd4bUt6F^1&u{_j>zR$7h;OchFv6~vG2NznUbe(hrmc$TCP(h-*_-!By-)EDs|$V;{%v6Jy{SJkhfxRgktPS}`WoRz zR=Y}K-G1eG<0&VtEsZU>l&1J8<&1ezuwdQ3H65mD*Fgpzk z8tALv>?rGtZ|Tgaa78SlcnVBhIzgF~mn{pDSO~qn%vMDMjRPfM&<(aY-rlYWpS&VH z4c#&y9B+}km~lw`a4kw{@Es<&NqBKC`r?NfYJ1_)XXG#$L_WsGzuHq?>AkcKqTzGjc#s5GV~ul~xNhMeKsPpz81)zho!DffmYk5KRm zE}?lfkReBpvfnfuR>yn`c^3$X-PRpEl{bRh)RRp4pHd_evqNF)tXo4Gtf+i4-1LHN zc9akq_~_*KRtJV%e~2i=;a(0l*#UnC*d@Iou`*(aK#sUJ^E4zzFr(NAi=8Na(a!ZZ z`&H=42aNQ<>SGLwD_o1#%l$ypYiLKd*zQaf3PFvbW!!EIBnaF7DtHJZ_KsT7ANy(x z|B_Xn+GWu>NU3U`a?JOt`o#7mc`Jn(C1qCIi^X63jexzcfHX&#flfU+v7}U04u#%m z^N@oH{=4}^)#ujRF@f#K6Z?$t*7A!1)|9G*14v%uKICa{J=}D@hptOjHD0fUYd_V2 zSW0)EFt6T79+o8+7WO^4gH9>ds?(ceOE0n)Yf!9JsF+Tb^IFBzq=n1v+e3ux8%p1- z-1>u*yn2FM1}5I@fJ@y0$~$OyWv>IX;Oo(fhYoW27X{tfskYdbJ1Kvuw16PT(?T7R zI0c|E$^(a@n#m-@lY7R2{!6Fk0Dp{TVG*}{mhU&O4NJ$Z+QiUWB?|DM#A65vQ&-UY zIXarIW^gJpMfm}5dNP)xI48nhTYm+++4eYLA1;?vc)AaKa7GBBBkm$wak39wuE%C#?~@&QYC{$G|{ zH*X5wLZ%{za>j-z$)e0TPk$e3%Htw?ab&q3U1&{VV+CoZbvn%}t>2|}W}VuR^8&B6 zR*4}x@`F{W69K|`4OP2c4LToj8x3=@PQ5W3$t+_ut@*Wv*u)7TN)b|5+Zf4A-?1Jv&6HDk)5Sc&;b#8mOO2F%oS;)p>+gc#(?K?$xtz4l%pB36!sZySNiE`>fc*LORdxKe!;%ElMcup6Z%A7xvqo zhY1oEjm`M$8|uZ96*&czjo{WXF9vzqO^G0YOdakGgKu`XfnmvGANZer+MV3=2~sRA zhH1FM`H3@K72}CvReIpBa{Kj^FuWcOkX}~uo02mOuyj%3)7^pbzlMDwACT9`!%GVR zZ9sVdj%P@Es-AtT;mI^Dv6}(u|GVSbEVyOD$F&Y-q8?mo#7!45w8%v2^vm1IOWbN` zWgtnyE9_N8!tQ6pOi+JIqQ*n;~UMW zoP?IMKvo}0f2bLKA*c#SlY<32ki}2G<7BzL&K{?@TIo$-GU9@N3f%{#>Ae=Cwwy|3lY3Ao#M`1n zDXcGA7Sp&_M0_Ovb}7t@mEi#dkS^_@_fyFIs7!n9aGU6|#gk-j_!)_?y{Ufsj%!7n zTxH@BW>#n#%*g<4=4kkzvz$8C zf<>Rrs&=m<v_VT)V2}RX_rkc=+EeZHO4RJ^ z?AKJ@R@|Ri*uH-$-#ydv&NQ>A2-_pxQXZ)6+T%L1n=bdsr#N*?^NY~p_OS>tXZ)hR zJDGhGpKD9y$Xu==XQ9r>LZRIv9Er>i1RlK$l;gfc#v6oPY4A9!JZ+?bFg-KLsjR!) zv0?cAOaRxIk%%bWmpi-PGYu*D@%Jz#Ppt1J2D|70&-NdPDwT^)8oQ$@Q%sxE9$*cl z^miAclN`|GYRc}Xs(*Y>$WUcI!VLj%Ctor0fIs)Mo5I`*7BXm6{Mx9D&zaM6ppl0j z-*&@-U0Cr~LrLf|t_-M4`ScAUSfK`O5GjWjdV6Ys5zQ2bw7JnG)}z2leuCH^a&xa| zBsT@kYL1cvrRX}Emnaz4jRD`K#UL|~oJA-)#a8+;x_JL(yW~x7hHy}9rPHJSby}D!IYHAYT|+z3SCdjxxt+Ub1Y2ZlVg9VgBKP< z69OKbHw;dH!jgR(@|#f{uPJk}!~V@4#@L$;i3?Gm<3$Lkn1I>LT`;!IT z(7#80YQhT$chVtZMx~`Cl0%rnz8LL+Ew}tCSNZUD5ksMwfKl zE7`9pXigh>ru>_#!C^{~B0~fQxl4vRbo?_5C&H@{2@`e|<$d8URbn;#%7_%4dURVL z3Tga^D-b8|pKz8g$}>4`Mia-Zp~E$wRcbVT_EiHYuAqVq z)w}qsjmz{?``Do+af2Hh!ER+la}04vB9B-l3LG)yNCeWKKG{x@b203(Rq{8LGcw;n zCL7IjHO}3A>hEWLP2pn<53U9;z&e@xsuh`{jnu^*ichGy0McBKPxg@IbI-vCxzvG| zRb?>mYpBy(hB>X>1Lfpz#FtK9>}E^q3cL?$UrtLQD)BRi9&^I%N653R;~eNo%0+eX zH#LRHmwLFU3eyCOV8|MN(|5l7Q?qD>4+2;%={0Xv`UySpYx=1FriNjvgIz&>ve1T9 zD*dWPr?nD5M6rW}2S*Ew!Iu1~0nFY=c}k5}hH>ekToyT2nX3T&Qj?c)$|*kQLSlvQ zy+?q(MU;tFwVb^W6Qt_Vp{u^tfFxXCx4EHSq#@!qYeN};pAwc^7pxu$v;A4u;`rw4 z6sRA?OYnQAUtNw3qO|Ei{Y6r6b$j)Eu}rVN@Da!A(exrq3l4pD#>3TmcB4r%I)npza$?6*z)i7zK~F)&INWi(-M=U--cq!5Cw^E>vrSmO@!X} z=Wkw;B!q}s{JyFzyv>V8GIYvpd2s1&siz@xVw3^-yHkq0w)?*Zs&MBNTw_f+)|*cB z3ptJk5{~H-fW@cUM%`Q)%zIf9g~ZEbH*Y0!A)yjogEJ0d2j$Fd;W?>-2WMx)4Ccr` z_u-SvT+~nNM_wGFs0Exq(x*M{HYYX?DD>U?Yv%+S>*=Wav{LUGpBWr{ za5Xs**5ZVExlvfUy4B<0Cw4LJgNMTJ?LVUw<^zRxgjER2p3qJyBOI>1d7irrW@RRl z(2f5(Dv3@kYMbv2<-p#Z1irdbd0H#!juI5`;L^RC+InYz4XFYI7?1ch#=6u0+Q;Hx zF>t*=nll)3RPMaE6^$ZOxF!v-WdaB7X|YXmMqjIbeojb9dTPgsE-L7@ojo}@8T%vY zQ*891x|w^JusDh+)3fxDeG(2}F8>{B|`X@NHwu_V6b#;sy(F(sSmBaNS{k22u)ZNoQ*~_M2CQ07C4fJR(8VR^p=1g>RSQ<|+ zV--sT|9-z>WLdjlhb8wtCt`ydi3Tl={7wuCKxYj$=+=iXUYNDu1X*<+x+ZMY7rr>0 z_~`L8r(%CbVZFMZdUPn(4g@;J9P{tPn(IQc?jJ>g|dzYaecp1ow{X})X$Q3zlSZ&|fST5tS z&o5S}y>}bm?yB9s&m!xN4FNuSlQ6C6f?2aHY`a~J}E`TFf7y^{g(SMs4C-QIC zN;k<_FW~vufOR{H0dsTI7AvVp7#@hRIvF;C;dGl9Vz=};54q@QJrU>#@t8;z)pv1U zG<$nD^0vw5D)>7eXKERx^+j4~Hj>wn8A9=2lb z?!hlRJ2F(ds?X0=RDCI`L!4W60|cXxz3hAx)gRkMH6C%I(%=sSJ(*R!$A;`+1uoVi ziU;%}kkVT-8;xP7W*41nPqWHi55F0y*`|w0(wt+5W)(luf6|<|S!(juz1a9m zIoO7|-q~HUpGP|QXM#Yf{WQXPA;YR>pA5VjRr984oU20hOQ;6$Eh@mP?v;_dk;{n( z%ncU?GHM90tJ5pmq(N7)EhoA2nAe}r39ej`hTle!e5f&$$ME*SGR*DDFl-`tRxyn= zXkpf_JfGPc{U_E19XrUruFiX-RC^yFxj58zpKP$jt1WRiqI% zmTWNUhKs{bhlKp4DaV?Vnb$83PqbK|Sw-UX`97{szWQMeepxH`?LKR4zmtM#bJ`nC zp@9Uo4&RSpVqduz-OEBN(y6|MQ2H`4Rj;YEC`av#cl<@Fkox|C%ZbD64epNY4sQhn zeaUB6j*tE3h3R`AC2vCd$MOmJ9oMp`Ckt~~45yBdeRpy@?kHts@*%v{EvVB#?hZnfuC%UqfZ`o1m(m*RmuQoGjyBarQnC!W-M7t+R=}p!!I(7M-#5E z+Adbs5;P~2fj2G}y_oS;HY|^P(TIU~R|yzb>O)t(T;LcL1_p(RPY#5xMYUzq12p3` zFFd6;Ugl_fI_Uot7NHVuxBs?ulNNp=o<>X+^Av_Ol3seR`yDnLEk&J=%cO%>CcSa> zc<_5sH0{TLO226FFGTE$M*Zd5WroeW%c@S|WEx)f{J1a!@6?y=QO~;&(GoOrifNai z!2-e|Lb5J?4J9nno#5)qquweg8VnYbVesqRu&YaH8xa)sC(NPsYC|=}1vWY420)7_ zeT&-AWxmmV&_TZKZ!2yBUDt?qy3CAke!q7qV@kl1N%L>x0yvpYx(gDCdcJME{FVF2 zH+?1O8xc-JyVY{CarKn`qk#C}(&9NUaGo)J@+q|~w`8p&r)XW4Z=vZ}m%Ai3{8kTZ z&|xP@HIF<_qr2vL{)lF`5jxR#rzHJL7PZrCZLkJUMgUn%0hA5nqf~ z^;UKN@)79Dl>k|)qs3Qlq*0uv`ETyP_gir01_=`MOdXXztr(eNN)Uc!iZZI%k zdj4#o{lDl^kewWMp=;ER^Fkndy$U6EJCKy<6!RNJg|LCji=to-yuB-P&a1LUjgr zewspL{$^LYlcSCl30}2x?XOIj;cAkKl8ihn*U=k6g1^6MiUBG29c9w+>TvAj`O5oU zFAOh^uBim5m~0O<8Q_&eaHN0uvDAJ4F7!Z6Z_+9xGQm1+vNLrgXq1PC})&x4>ri#^FAWjtjVdiFOcn zoZtqe?n~hk-Q_g<_r1hN5X=ERN(nA>>|lhcdaA764t!zqLB9PSzQZw0*ciJ0488lm zSh)T~a2mIoQ(o}JdKbiIz*Y%L?eq{zY&Do?~49}2%warA&H!+ z^T2rS?7(;@HQ6b1voK2a{O}vP=42_4GV$~hbu{-w(uwOg>)ewdHF}ke_5$zbnbIzr zu#_G3-J}X|#;Z&{tK912=R;ID&C>yH!m%@8G zZz$sN)7_?L4Ms(c$*8_j?bZXS1X>m(qz?UjQOMV-=eVBFGua3zS2lps=X`@ z*TegC?*OQp{jU1M9vGREL1q7|s`fF#6YZ*06yE!)D36~U&(C0S4iuf4_MSF)bZFiI z2z)75p=Z)T2DInC(yf4!jfNZ~eS*a2P1$O!%#1xTeMColnn^TkX=wf!$Gg@A#Bb67 ze_L}OpaI_xrw1QmK9b{QM?pl4w@(?~vQ4qeTYTAmLu1ixaTNp>GwfTQn?uT%*2`nk z5($-QZYwvJJ|NmZwVeBG(v=Y}v3t~_`y;7}{@B2EdfX-Bc-i=qeTrRLU<*w;$2Tl3 zKEVKeOzEVIt_Y$r@rgZKfJloXKDI`SsCB|_^!>L-yGzA)hH1rBg)g?erPo*1nlg)O zrOS9n%!};B7)4;r8v(@VDMs`dbun}|Q{p81VAR^qFej#eYZ#;?d`kl5&giNC9B@xq{z+6XU>)K^V;*>L z-B{n$Vty)c_d`ew#ZA~)_vMaoJd6`V&4p%wsH|ItPjuE~Bx6yF#V=9wyBn=b)*;?2_Enp2?mWeR!M1?iva3xb2!&8j}z4d^}qp z89(dea4Rl=NtC6i6ctoSy{RsZqWH+1oa$m$pXP@U?e-Bty>%RN{%FDN{Oiqry#Zr+ z{$LSdI#VTBIQp`<>?9I|5FoiX6e@=F3;4m9?SqKvu#DeW-ha5gmPzakzas?2y3UXK zAo`BtrjI}7)l-G3hSWL(+fpc{S8#*2Z{tGGDQWtq6CVj?ZA`xdnC2S~cl`_6lE;yW zJ&V3Uc1EqO=ekO+Aiw(QjTk4OP@6^m=ip2)o}d2ps^y{UaeRddeRc8iff?Lj?E4Yf zs2S1=*xlQ%b!VM1be$<-m5!gpuTOvK^Z_R(!5$(0`qi7R@Od`Pol-KoP8`f0$qZH@ zP?_pjbmV&XZ^JBH+ShgdUWiIpJK&9nqL%!^r`Wl7VE1;pdPJhxycnbGMd!Fob=3$O zjBy#3@ODKx`7?w}k+659YN@Cf>^`Bp!wvbd(YUQYgzf+u5AzZIyIJ zE0T3!=BH#uc8afsF+7}hnk(<`7AgEL$T89c?vrIhL>CXfz6|D*`Y;Tw(2cYOFuN8f z=)7B(n5N~g4k!L>W28LlKnAW24{-%ur@UXsDi0SrKb7s01?AZZf zJw6oCheJAlNcL*T&kfX`xI5uboT0%s6B~n7HZ%Vtvh@V=BF+hz?uy0VJ6KT-iSr~6 z*!(Ks_Q}W68-LaS$`v=px9{P{@;D&n?B2)^9&X9oWxUig00-@_;H`3{y?{22u+v#s zB|t*-;|zE~w{sbJVF}sFi+tgb5atjLTv)1A`o!6fjrYyWI~jRyE+wS0Ty2X$u}pyJ zqw|i4&x8TZ+v6p@NIVwM5l562V>OzQl7i8`h5{2|V{f!fBdm^M6MkOBLY>wn0hJ-* zr)9ezK{i2wUIm;xKVhk;1JqEZGvKF_BH!->?DAiVLP)Xbyj`MQa~|ZYw&&HHje778 z=e{wTU7;uity0ReJ=6-rHe3t|XTL-AQh1$5kyBPPL5>~a!o!N~ zMvS5;So7EUbmquuF=%ENLjq3h#A>QObo#N7swP9%-Ufu}a1u$92%(7Sd`SbgRllVf zy1k;PZ)T#goH&ztMbyYt^Xj9i{;m|uLa#*2N5eZBrlH%tvVP8CJNM7S1lB;Q+CR~R zHQ+78wev!$zdoaD7bz8;rV9%y;pZxueDRvmc zR2dmM%Kmx5qWy@9YI`Hv;QYyvP&+@O^unF*2c^wB_RV(aQ;*M&)0yu^kP~!ZI&Vux za2#0-=Wuy=6PFljK@tt`fR=n9fyVo|&`hF*>}PXpJ{o8?2w$Fzf0edQxv(ie{r;%> zQywH@gvfm14m23BHjD)+m8k-w#_U=lg(i9`?I#}r)rINIjtJY`$KE+l)>fSf)g2Wj zD^J-?!cK_vB&~wz4aqeV#KWNCVh@~&Dj+92{L>tpNn2f7%ex|Fe5|-E$&ft7Jjivp zrwye(pJ~XVFbB}|#S3@^=b+BC6Glf0Ic+imQB?fx6Sv+;|2vxjWC-F^_?fo-AFZ}% z<*CbClP>`30UbDbNa@V~^Ju9eW#d1!c0Lz&hP$o51MzFL=&HXG`y-6`(b^NyfP_5y zLk8F~zLad86GySy5eX01`;U|@H(CQ*oZo-6N2DF&zLtTI-n#%8_|>rzBy{aIfG1l3 z=iT?uu`721ZXc^=H9%T?92z#j3s84eyXP_T!yM}q6?B~u=bOrs@t8ah`35TA!>raI zG3b*2HqvGaZR(aPKo))7xYBrF6dB8dySutem(c8nr!`J6LNuE^ZFqAkTZR>RrJD_r zCqLGeZI>yPEg%2NJjIh_Ow1ODSuR|X6fqb+zN$Sd3{@|2GK!Z0A>1^~Cf7B<6T;Od>XcZf(!h->lydcrO=P7 z1|^fXYajpa_M-xrW{a8uF(^`PZw_r@a1|J8km%O5l~2fHBJkrkssKbUqUA*iXLky> z2BLb-Jt{dI@G~pip|i3b`cCP*kt9uG&?%%av9t%Zgt7MxAMf9&Hs@y{#A$4`DfXTeF}=@ePcJT% zTH?pY{N>P>w0+NxZ)=)wJP)NceKwa%FqdSPu48Ej? zO6_-<&oyK71zY46(X1|%5*0MvMKpaSLv0_H19-~PHPxfN{3k^wHuQ@8lq7=UzYJ4x z43o%vw^4Bb%cyS+e0#m~<=w0_@fC>fbnSOBY7(V87#E0#&!ltoZ$~z@ zj`_OQZ7l`+ned@vf8etA)hU)25uNvfDh>_g#_r%< za3XH5WV!BYMXS~9CrMe$V*On8rmv8ucC3;IN)JEi34bMu#2HnZQ;H9*ir{Dt+-iR< zIH9Ch6u~hO(kIdX!#!dlU*JVY@&Qim0s?_piH&z(3}k*K50xb`#;Z10|M*91{_%Up z4EeD)S-}QBW9G?~(#OCSW?;{EFeCHgP$OQEkswuE*n&IzSYW;I*qgvK2q(jYTO zVE7%H5)8#MXhbgl^6ZP-fHzU2lM_g`soTooDWjRuC%kuCSeBA-;vqQ4O{0;g1d5F9 zsi}~assyq>bz@Y)`G7>K-+xw^M+gc3Bl6s< zYD{*y&bCRVOYVCJCPo_?kTX#uKe2bsWMaxmTs@VAvdT!{8~;}$iBjh3YQps2#r;m( z58>s&*Qre7vX_;vZ~^=}NFB<9#I-YOp{DO?)L&5yrTvu_HNPv!(sme9wx+&ke4uZU zka3*YxT34<3c^Z4r<{lu%(B<@g7#FSIboW9q2y`&g|#%!KIx$!p)rXhQx9x}C}8Eo zKZ!zwpxSbG(CEX|WC%UMxm|#knJXI~e7`c|u?rw2_SS$`JDCa%rmmYZPf;?#YcXjm zjE!NLYCL~YMpJDAJPtiCV)GdcwxGwHk^;Hr_*Su)E|lVquYf+=@(^C})$dc2e1{xV zDmY&S?1zRf{Vg4??y&)S%F)Pn7#Q`VnyC$ZuL66sAt=c83l4p?Q6cg~PaH)} z>&*iot7x+tUN49d?&z%1L+!B@{?d3W$V2miaxhdDq~#%Sirb8=xIF#AVmD9cdpW!#*0%Ty6ytsK z*sa2(zqvyQsk{vZ1|b~=2FDW8!Dm%jYJp-~XZuGRXyI(`ImFPojz@CR&x00~}ks1E7uhD}ny`5~V4H6v ze@)#fc(n*_K-fS>1iZf&0a1H1{KQhceOrs(FRMFSskJg2B zHdcS)nB;>g>^MmpFYk;@D{s;NF!eiH^k**QB#20wcU=)uW{*#l=9kQlr^W-ucwz%2 zLn!v2Ti3}hl)lbAleV6Um~@zu*2YLbLCS($FW{>DZltp1Es%Seoro0a-PW4>Wk5|w z=XwmGAzX0Uv6K;iPq>jwbDC4oa!)<$_8*xNOv53=F0LiO{`pJAP!7Wv@skuTE1oub z(znQbzKscWsbzOyNUy0GFX~4#Yzmp-eSt78x5odanXl=1PcW|JezZ>Ue%S|IqL|eA z69SzJRttjzr2u|e8kLVHJkslo$k^ZABt-Of)qxXp{3KO0@9ZosZt|BuvugzeN2RuP zrfTj3&T8|frevHJ#=q72S004;*40F5pzJ52D!9wH#=0Yu?R5o_Ph^=|dxd&012uX< zVc)pvUNwn-2hx%OLyr@fCx3)ZV$LDy!S(M2voS&!yR=?DUtVZ>9O}apwcs6wOj4R_ z=^xqreBo(Q!5Dmtbf*x4lG+t?AUoXO+1tDo$w@(M$y*OJo=>L;(^lVA>iD03YWwHs zavRV+uOQ15SB~EF;ywzuPu{&AT){8PIbHa25wC7Di3luWpxN!&%%yA!D z5hOk%Jw;z0y1JI}>aMzXCGl+=WU9o&Ktpt4+;<_zY`@OMD7xA821giOTgeT*9xU*N zC%;ufxc_E`7sUJs48taK0hC4DB>*0uLI-|$VGRbxGH;Y89k^W>I@?*sT}^cGhmmaY z*WklJ2#OvJijM~8jHDT}0$gv))H3|PM93H-s#qC=*1_qM*jL}d;&8bv2f4YbEnJd+ z{)DCNFPiXed$KS170oDe{rQJI-$6=r4(dlfrF1JdCXsO}eX|&TZ1pZ}bq;OyNcAw& zx5&3z>>f`;>R+g_yJ4tq+rQo1N6hiyE@;3FJe~;a;2JkaymgR!op)w$(98^`2cy^Y zGZ6;Rp2kzZw&Mw<7L?7f`BjIy#VYgyNA_CrF*XyXv**FED1!XDHllrTnDtv1S~-aW z>ondz>V2BYtDVcAw#ouD9Cv-XiXsq!CZ!Y6!%ZnVTbbqLzf`vM%Km<;@!jw*YaHR5 zis5ahN_bks!l|=a>(uq}yU|PM&1X4@856N0vNcsgtZ3!g0PRinnAX7Ka7IR7MsObQ zDZima$x{Qy(`IgzebT2t(MN35*s9{FL+^8otiQ!Pn-tj>T7L(bz*sGy+r0bpt%kGX z<(m^3uX0eN9%BC)xA+5@&lngOGNy`*-e$e-l}=QhjBi{WhXl&YTY`DMI)D7*)$%5O z%lT`fqh2D7xk6NuylrT%g@*KK0U)E`(m@Q**jaomly>nF5RKBTvPM9 z{X{8RQJS+pdMv`QICadM6_8s%mQ^(Qd!Fs^j11$CV4&~rHkh)@Gn31pt9_ztnb`jG z3qweBSuS&9WMY%Iu7}5nyuu9u{=NWlSR*uI^kSPCbzLZG z*ib`T?_hB_aKC=vz3RBB@R-gTnJAT`ea>5+;2vjrZHl>+UC7ywHvu`>NQ)tIv3M^> z^0-@3A9C-jZVjo0{vUOqqbJM|%(i=VfW*R8^@FUH5*IS@T!%c7u6nLJNY@$IXBL*) z#vOSB4R85#fK!GhYK>m>^!8i|361l2p8c~f@9kOAKH2{q;E<5gs8w^1N&ItD?(exY zb)u|w1}X9Jtk@mCDUet5v5&Yth)P1n#AIq5OA!B>Q^UX*UI5t-%Dg)?KhF&~IvUc# zK)f=BYh!xrOhK;2pz3uh4~*&S^R{WFUoNs$YGlw=bD*3NIso6Zt;~HL@{_-K#+@PL zVod2Zf;j=lqO3pv1Z~Ko3K0%I=)VNr=KIp7y>Wxd`BjrYR2WO_93LY&*w=jzYAgmr z4zk&(xgC^H-?q8jq`->T^okbRQer6cx~6({0HFjMA_5cMr=`YL$}a_2@xism5n88^ zvtzGvxOhv?Np7_k8Ut}?49l#-_`_myNl0 z>N5j1mw?Q^AoK7qr6|Ij02S;2(U>`7+@M%G@N77i+25e_$eAe5cSemx7nL)kb#pB? z7b}0ZF5O^R`NLxpY)}l8969)XV^e(%2)$Sc3PH^R^i!hGH4l=X%d=4wLzsr$3~qc5 z9+OuGB)5nj6{KpF0fFbUeg(bnDE$D3)-E1z{LA6OV=R7yD%;Bhw0LUov51h1bl$@y z5DWa_6>71eW$JSugAaCqbWBqU3nVXS_A?U4A$jH+6K;B_f63FNoLr z?ME4X#jEFLl$y>E9>ZkcYSntrA94%EiAQ&h7I$#Zo(c^-NU|C?zlW^(+!W4J?coHF z&%TvM{lr4pLG3;BlFJ_M-L$BB>2y?a9I2}s>bEgYkS7CD407=el81N(aG|e)ychbn3c#(z z#w^~{$TD31Bk{uCy5n$k*}}PMRBs`gAfpbnzzWIJzx(0a)2Q3|0z+lph{kal2YO5~ zPFcjoMMf^hKy<%kt!01Q{loKv4L1cM5!$3YXD)kf1R2XiKA5Eh3t8V0Hr70MIoLcW z3@|NrgA|_2qPU<<^$m>JTJbOtR1au-pH^YSAd0%Cdw`f|s!!PrUX)W+lJ0W9mMS@B ztTvlBO@bAuK`^Vip_Xm)dhw2r0a)I1i`M)hVmf(vI16u!ad^XkhE6pE?zQYT+#tl>u>|v>NMU!Bis)<6& zRsUz|mRGW^d*%L+ik<7|M1=Rny?FM0htUXYv&PU$3 z$mSE=cX{8*RCvd|e=(B|n&xR+WhP(`PfjPoiX9Ls3|JCi< zRH-%Sp9v%!qaJuCt8PniOcwlH%&TSzW(m_{^!}$+ zx&<)9jqDHA)|i#802qr=uLhAR-jt^W0VDzXz&#o~)oZ9WfVUtb z0B)D9rvmy1M*KSIP4%l{B@^8HqjeS`!LNev?(W)lkjO1v0K*kOy>%C154 z;nb&tdO;cR6ixN<3;lx&!wn}yr+#re>zGdC(IY%a?dJdVu-O}xf2pd{Cwb$^0^rRP z88b7%LEjRlb^h3Rthcvh1oA^i|F{>nMe@HVOvgpDXfflm(1<``%q*l$kn3zXb-lA^ zobm$f3_|H0+E+3!zSK#0 zYvhO_TKMkd{y&Ap{zXdxX+rBnhKdw!ZYb==iOa7=S5wm^Y=#`YgHI0{6^z%vY4HyAMj=ncP=E=r7;3^x?w(n$=^^@lm}l1kGvx zM&iL?u z!Y%uI%_B3yaKZqkFV_S}l4x24I$yN_6+QL!@fppLrEYqv5Hc}$6+(2Sy0bUOeS4q6 z986L!?sT%~=VO;gKIptqx8QoKC5b*hAl*S9b5+&nD_%eM>>!z3QGF1HF~o*F8wJVs zw)4!c%7TN!IN;_B$QfgbhKW2)jw;`nDjMCuz%q{|BWrYhZ8G|`m<2_ zA}0_1l{z-G3u(tL{GRZtjwoG%3R#s^AtFF1jZPthni20!SYqV+Dg-byL{VX`*G;_i z;Ke<88=y-y@1Ny6L5{=VE=UFqAEQUqCegoj6vt{M3~e)0*97J0#lbO7B9G73+*XR!1P>tP{}d(DN~#81y3~ z@EqR#+!{}FMO!%@vT7MG-w|J*iRLpya>oQx!NobEa|gElk#4u-jV89vPv)A8ZH4vj z!EWDILA2gC(+?K}F$u2Mw?Sr$^$70WZ(@j`^oi&Imp}R!bgTwp zgjd-t{N%Z^M<`bb)Q`8=B2aWkk(lKeW+t|=L4FHIK?47IvXo~A`&ya6-AH(hC;Uvc z+F{_~#nehS>8Ya*`33eY$<+m6dImrCr5=34Nu=n_4mPuKXDhK2`HLW>HJWhD8=UD8 z5|X`e*A}u|e~ni3nUhVSpf}|@<+FQCP;+DtvcjvpIP*F=nXa0}%*->j1aosbyyC%Q z3h5Hb?}UvX3`r0VDoO$>Vn7Ts5ZS6yTw1k4|ZzR$PaG#Zx-(@FOQ7WMNE8k{=KKeWWmrZU4O2y zsC741YG9Xe2S~OYE+y%MD_Cx^U2KqCj;bdX8eX0w2 zlV8(p=YF5{D-ZDf)c(0sId=RIwVG^r8}_zw>B22AiF&XJ$n>H04td~r)m!V0N;VF9 zW$G(xUYSijnjKzZh0`Y6wjYZF1w1mT-C6kOnkflZN51-wy_g}-8qkhNT;9dMyPqCE zlh)fg8G)u##X9*&)17HLkmY;drngT|EPtH>*S~GSuZXCry?*4_J$PgbmPpjj$k_=< zVy8bDv7IlSE_=H$UzhM~8Rmb_sdc?gbJgfpi?2tMx%60DwIIl1f^J?Z=UV`gahd6! zma3@NWgJg|8+F?3t`Jnh+9b1IPu&kw$d4ui#|E z&#`hmC3tB=3ykNVfcEl5c57Yk29OgY3#OpoK|>`vZyE}jM}MaECbbl49tx+BeTgIF za2(E_jcq8@8o~$`OyQ+UU9;j&De3L0+V6{V*F49(apt}-jy@mXI=7yQ-O1MQnOo>_ zz0}U$d}E>4oDkIH`_hHr2|SJp3}rLZwt>~zelV--q7qhp3{MV{9f7*=MkHe$1QG>2 zQkzL+wsU8%#x_^W{DtX|^+)0ZA4vPstd{Lsvr>xBgX5bI)!zFv%J$!urCd!v2L(kd zYF_2p)!F6P@f9MxID`ZERe+?bAnh9{$j9C+hoFoU}G}L*f_M@mR?dwbef;f60qVnf>9_7`3i)b0X#FS%S z(J_v;pQY13e?j*A#%TV%9k7W$HaMZFZl%1yn8LM0S8m32#FLdgL8(C8%!VFU z_z)5jZ>eep>^&d^)zwM|`)`S&OgFTWj0pDyn-&g=-Xshh(_Lh5Hh@tB5giE&>D&v0 zZp(G7wBEas?{{^EkZ zhAs%beljS?oolWJGWY5+@ktzn*AU@}_HywK_NQH`AUcKAy&<%*E&?YBcBlmz(`y7|`g zFl(QIaQ7;R=$>|?N`tr<6(pnl{Q(KtOFEQFE`IqEwTDEcv|(i0d((ZGJEJ(E2$#p> zNV-+CU9d!UW&H%Q{r5ogCs?lqF~jlYOj_lu!*z)!Yk)m=-1~T|n@V7?CC-K6j>Lq- zHy=;m7n;EexADerfJ33MoXe{z5GIv_ZDXRiUjpm$tw&$8GT5cxU+p61E-? z`5vU2r7vY%Fe?~O<~mqEC|Hk^v`GH^0F50#HghXKvmJpgf0@4h@zpblw&F|8FuHL zZHZL6x)7T7>~GP^z$l`ry&x*XLGS}Tae3tw&Gebq1PekeY_f91KJ^I%S}&bd_$uYx zFErU^HQ-tQKLbTYDCkF4o zrN@O%zq`9|ug}?k3fV7N!a|)W_D4Qf9X+tB2D_hR+}52Ni0D zDWKlYuYYle*HoCkC77~BPh3mUh|r(DZt8G{YRQ*(&~@jhs(u_hUaUmZ&P8(W!^-d` zt}kJ%=gPsJnI_t`f`2CV(PTw6xUB_ki5zd8CS39}H&c&9%uyd(Vdq2-D zxV!J0`l(9>;qB7Cjw$z_xtB*wBZAVZ0W%_uBm?oIBfZ4m6%lJDE0!l0x=b){|58hg-u5qgw9S0{kLMs^?b%yX5<+XB1ux0kf3S=7 z!?RyNRlokw2bEOnk(WV2jK^>L_Xd}Kn0jq#`FzTJ`A|2hQXkBbQaZbM-C zEk+3fLIvU=MO}UOMX*FH4;SXDM_+ORgv3T}A2z zp@%$@Qk>2ah&*~R_UDZ35pS)xLKyDNi|j%^Pl1Hg-N6U&P$Jk{6z6&!No|H*_OdTQO+LPq_;-#uo(ugvAxCmm=LeZwhxW< zTS73=u6boT-Bh9KY>i&}Y3h92@yED0Wq<8P+6uXo8S~MifXDLr%hUq62)Q@y-zO9A0XFr`KjIPDO8P|nb$Pmg3IydQR6gJH{;_nCjP ziMi!hXat$%%(}qLWt2u32rWOUJcBspv-A0U4xY0DoMtZX#;`hlj*Ekl5RRs{l82=u zEfZjLtfPLBjH$vB2bMtlM*uFOu=gV#$75N4U79ZhTCd~PNM`V0j4rM=x?*)v79q7i z)}ogU`K&;FQ(BLAVzmzEkvGqVx4+Dj2=HL# zu{qwv{FjmEKe-ciA?1CtDrlwN!~6D42XT%%mCFNIO6E zt)3p?jDX3PKD&*jTI`nR6HDQ46KGG|hanu8%=7M%(;%EXK4>6K=$-`<-ldQ}H;9-= zoRqu_dT=mPh@z4=4y(QCn_K-H^=#ZO+ zh4NLie%N+a+b91UZbi^Hz~tvzZMMNo|Lx#Lmf&&gLKe>UD~&=D?Bo2OneU4L6R(Y7&vpzM<12&y=-(8W-m0QO&a{a7127&vvoWk{p7v zKqA(!e0y8$cW2?%^H z#I_B4BC?J+DHpmQ!-?yqS%O@*n!agRbB#wrWHHcs$naKT_X&-Ma94<*tzD|~)062A zEdB83CtI|rxg-%i8m;PmL3oM<#Z>qhk?T;xq%*vG1O~b&hr9(E1e;0X_Wl{pu z#?)9vsl0I8KFD&3kuDpyY5&c;=T!F?-q2CVKy-np@|k{sAm7udwfXvXgO~gbAg0l` zadY0)4n`QV4oEX6f{3+ zZ_bpd#4DxwpdZ*|OnIs*73r%3aeAc~EaLFPv+7rx-U*4Gm-K1H*bHUT^CrR%ub=$_ z;SA0ckdw( zJtwb#S3LJzJ?OlEFr-IQh{=Rfi2IRy`H42U*18`r(Lyw<`GctqJCd|375mn|%@tii z_}U>(mqZtj;Xnw-l`N*k+aUQ}C9N+cqizBDOw;E)m33Uz8c=qLNJ<0LzNMAGT&zmY z0BmiDHDGnUYnW@qCWl>JOkkX>`XaGo2SSIcvj#|OtLuDfW<%$bt;;B2BKp)K0v3gu z5Wf2A`ZSBuSx!SsnoW`FhU*~@{dQ+KP);-J3L|xk0ZXwqlxCB%qKk-(bB8{H1vD;L zKjKJz1L!~GkzyRUx`=K;NC_|SlTw@ubNK_vLQ`W@psAvxKD5&$QYY<3WQr|ytDP>U zj%s=jMK99~gy1g%uxtToTo6e{OOk-O zw;Z1>5SdT1mg8Zzg3kv|8CemG6MgJjM4%36#^yfc8(!ZGaExv+lI=i7ir#i@Rls_W zDTwOt3&A(i_qv=tIV|ycM(nb;czz>I0ydIqOlVL$7DFzKUJ<264v2BMh=myFOk0BR zoF%I4>#^FNz=_s0)>=Ano52=DlN>wig8?t9*FeJ+-IfF#_|*4HCc0rY!0m~xd#N*^ zU{l)I+7p?Z2;m!%@1mMR_RzFJpFuMGO`yj4t}b7G4Ffg5k#)V(5F#aN)b&${>Cw@1 zL>CPNhH$E#fapTXTOu&0t8&C=(`HhVGQZ-lC6s7p=Fbr)xJ6e1- za_mIbaLu7d=~V)jAbq_wHacSoNJaU&zddmDp^)6Sl|@8nMmO9Ug7{N0DjTer7Vc|l z$@MB8)kFLl6FYbDVs_|RszW@XsghV_R$!q(&nugtS>WXl>6Mo^S>lCEA z)GZ?~%pDX&JM?#Kjx&Q5 z0W?rgd8z_6t`^)%I~1v|ex>#~R>eR6Qg+%&ow^oBgo-I4iQN=Y;se>eTBQ{^ed^L2 zG`kTSjq6uUm526Z{$)!yEoVYt!zDTS}cJmJdjf$ZhJrSDq8 zc%T=HV?5#h(uu!%Fe7R-z@0=8Uc@HmIr%!<%Z3l3^6f!+jvHL@48AzB`t+^>cwIm& zcRwQdDU_8b{JST+V3Z1Z54cLf!=HR)nnk3UuQ>WO>2!z{2xVFv1WlnZgpciyUH97< zy6yuwV!b$5r|klt_w*~Q`1s)U^CX3nR-`~d@n5TWXe!sQ*PWnGzH$XUoTFT(FS&L1 ze?k3VZqD1`pE}F4IOfK|Rwir!>zYDI!^X6+MuQ_S38QYLD|e+4sgj+G%MK^I=w&GL z$zlZQ@@* z`QUy_W8$b#xfOO`KyYkHOe_r-kN&E1n1ln)^I|T>UUu=Y740_3MVgd?{QsG-$&aw+ z!NiV9Yu+zQ~Dos*pBF&zGBkjaru zG;QbAFk@yQ0$2US`WT(Yr(GCWs_(L`K)hIKi@AJHn9tkZS~|B^r^pa!#Cft5pavc@ z`{o{>rSHJ9^8W_B>twlX3P}j}0|jF(KPE%TR&f6M?6hTOHoTL@kS~k(_Yj2PpS8-7oX|UWZGwD!k`MkaQHwRh%iE9P zP&{)27Foua(|vJt1YV9!*^CG8(2g%Lok+8vB+pyX*COy~t9Onsjt0DC)ILI`;@*B# zISRxXk8`TI_aZB`Y`h4U1{ET>*t9ByvkrhE0f$6iX#M;h(5k7U>EX#RzMBx;J-XOzs-aAiXqG>}F!^he*<@zZy9K8)v36 z>{kG^s^VdgZXTrDH=Zc<@dp@#cCkt?8zQNb15;vnH_gkW+TXv{8qoKZ+D-Z=?9Osc zzZj!on{DgwB#+^BF~S<(jQykyhvZoe=tTHu%3nDF11P%@xqbb%Z{F3n><;c_-u6JF zv6WwHe?vmgIUdJD1f>&Z3-!Ujm>)$<@_)uWsZ$e%Zt(?n2GcwGw|))S=wl}06;%_L z*RPS_eH0uK-~m?TaAhvIDU>7Jvr#r0>z?~!L9GqM-HJR;y{Fo<@0;`x*Fa62pD&#b z-hd{|4RR`hnV9FQntED=z|J|gXRQ3MR3!2lWUR4_lCco-7(ZCHx!JX#!Ufd_k zh#xN;0mrNNUXyqH2fqJifl4u*EBeiMVGY>zl@Z8lB>sBPa-aU|Q3a~#5AbcHvmO!^ z#X)~Ol0>mR@c0QkD^Y6n^N%Ezp5;Nd5~!jbENP7pJQ|Ph;Y=dDy_@42LhwcWn-s*y zha@xh(r_9P_}B9C!keE(=Lz6f6 zP+2LAu|#SQ^hw51qmIutS)7)E%^9X*aWe!*^T5U_)7a4id@=U2;k@!pm#@{B=r_~z z8=5AC&KI(R5KX-wWSbYc*M73u=ij7_=jtU#UwQ5?Ctc2J`uYjjOmlCdgv|<_`2%>b zbRbdImc0nRggVO6o5ZyQ4X_Sg=o3VqDzr{$h5B*3Nt3|2gI*l$=d%$@C&KoT7ill6-RoCP6mXY~GF$KG=X7~+Z1>CrUS!fK2Fv7xV-^-<*o7QaxNkQ}uTY}+6b@>8n zrB*&dWQaLS`}6OGJdwKc>=&jZRmbmM_H(;0o|UrBhRX_P7F9j{1R|(zLK^1suCorO zSZSa8Vz$%i=`da~FoVvadp#XVVdmKaI8}jbDn5H_(~bxmRhtjQ2I$ffM4wk)RT@!h z$&p@WuV_+!D#gO;CA(YR`cGq4UEiyLzwi6=#M0D%-QXaS^fLc2zDl(C+5wl(%ia}* z(|APzO%GKI)1j$PHR~tm(o>bvORCQ&W`*6s%aj2>hC3~{&-VDk-s;t`t&73qwl!6r zV{g$~0y!%lRfh&tzBXwlk4L;hsxP4YYZmA+?_Pp|lqkLJqnWQajjzGd z-pnioxYyh6KohCRwP8^Tg@5^zN`>t@Nvaxgh(8&mQ3PRQo$Yh1@{=vZGYwjA=;H5S z-1hcZ*$g-7=y*KWS^YB?u_wx?W@4d4{09hAcS{2Yw<*L*wx5wUgxK*V- zEx9{)py3N*Fzfbt5jL)Cd@E3M4s9F6IJSP|GFO6yX=&)pGd3#DHClYF zA(#l!l`(i+I4a$JA7HiAYwy*O zsM!jK_|1CRQk#Hz>IQ!>|E0^JXy^@@q@Y4l4Ve8k)*z+KVbWvf^wfE%&qwA`O53xp zVvj-Zo?ILYqxON$DIQ&-q?b+F|)t>Mnq!oHjDM18zhhuaSN7u$&6m)2#HxR zTMDs$lS`c+I`!<=eeE^xprD~5?{_P%#oWrwJ~_qltJ1XW{j2&6>;~fAqxPE32PyL) z`2Gp=5Xh$0eT|p)3!jnHIgf72~q1%H&<1I{;icT5_vI=vQNaq z`6Oc3*e0|z0B3s|^+G?Um?xpK}{I4!H<4T^1@(U%e zS;Y+rNFIVFNH0gQEW>Z+kD2feh>^!)cC*Psyt|hg4a+*oK%9gjk58A6k#?Vg?De~{ zk7tX35_e#O6p@*8&}Nnv{zqN#QB=mGV!yW7@i)2S$|Barn|{|lm8|Im(9MpP`)k=) zSV4(7vsK;7C8HMA_rSH&2NT&q8fD8i)J|p9rH%SkHj2G=v5Gwpj zvA8cR4e^h+0=@w^)TmY_gqV3C|KQGGpDu@>foS0i(hJ_7MmVH{)$N;X-_OXc9o==% zF3*&@*KHg-v4Q7s5t?2ECp&6CUP=HG1yiIA z2Ddxi$_t_yqK&NLE7YHs>^sr_d-(3Z5h{9sn<8%U!QL{6W8w<#BWwJt;(WM)6|xT2 zg?-UaP(=C`jui;O3Npv~*Ibhg;yPm>b{JhQv z<_aV}#0`V|1&hL`^u!6HRq(M$gA7e=#u4k(m;yU65X|w^e=3VA7H<3CWMeZJphu|i zJC|9$>dCI4F#Htu@4-)_NMSXspseBwLn9kHR47?^e;->HL1Qe)_z5nA-mdH)Xb2a`PUR;ps$H( z(J9HuQ#^nEetM60K;38Q_0eMUXryuaFRmLIV4PSaHAs~ z^s%s>0#6n``vS)tfhnB*AAk~)MYy&l-$yaV!43`KC1V>{urrA#H zh<%8rU>iJpcb=`IljlVXKLKX0*#AD3rICRsF?S6tTt_C?kX<=V_G<6xQ|*v|CmovYVAtXs6uhSVo!aK+5%mz*sH1txpC(?9F~H}WT!M#m$7DVQye zsqAtzM6xND4|9V5o}}Kt(|_I@O!)vi^qDpbF+eQE;-L$iM@S1}Rx15*`7}fK9Lc2T zq|s3z@EUC7Cv?jQ3i8@PpC-FoJe=>^7YM7GfhAw^?EPO0)OtV6e0~F&`*A?i(hCHy zmP(LxZj@cwQ-RR)PJe#afuA5O`Jbq)hGo%P%pU$EKC;#U#6vKWYT!V?6KBq>QtJJG zUD7y|gas~0qusbR>}gI9mi!YYQjQp?T7|ltx@p*87J|sYPK<9Osn}^@UL{SA|9*w*c0HT>| zov>jKo@jFAC|%yQ8~sig%Rz+~>#^x}+y3!e5-l+sHYC)(=#)449oOQ@e&0XQvmYDG zy7vE6MpGjKT&Pat(+O#$O4K(b(VW@&&_-fF(S=I%Osy5Mly19wGDkL50|#YzCq2dvjayoK z2P+o&A!3&t^Kc#c$d$PMxbuEc&1`4J2C^B2=P&b$8@=%rar6Fv>Kws%8{sR_DO!jJ z#37IP_ezBD=5AomR_`Mpol~6J6JH$DkYQ?=u&^Ar7QFCjCozm30iBHzK!d|a=bXTj zaOQvw@RzP@T?P~=z_RiMGLgTv#20U8U|!E~uZ3<^E{Y*&{#8MAk3|J9S>(OzW1UB6 z`DQGv$x-vt+7C`-nC=ZE)iHt3@oC-1dDCyi7ZPd=9=CPU@P$1rtc^-ZIC61_!6Rz} zsVW}X@$Nmeo_&)@8cmO!m?+Bpi8$FM{wHG5n0;iJ+C8*lA8c?uzsN1@RkNMw4Bvez zT6A@!^d9W=zxjV&eNB&%Q%Ccc7?}qAA@Wc{A0#BZE^H#T2P@V3YNY>Z?gN=7#9l6f zk&gi*x4TTthm}0DaZbKhy3ANb;KTOcV!}yu(AUA8WAXS5Tad<^D}IJ%zcXR(>UEx~ zm%I-Xpa7S@%m1xUoSEk3Xidu@*r1s{gGbGfBsw_-kqHh{3U|);Kka=mDvg#C3tzj} z$RuALA>Fvd-?S2aFOvuDmFZeT;8PY!hlPbt`{TzTta-ixS5_HqWR3nF9Brb1{D9%U zkCzV2oE)WTc{|mRoc`$pH6BtOvW`u)c=HG(o?|S;=1pJoWhSC~ZOT3Kzm+MHUW+UH z2tA813u9kp^ax#y-a&42mA{X;JYXmD022}ZDNoW3qlcF3AOnWXoF-fK#7TAI6=Fcz zvYP?JTKiw8F~`zqz9$}7R# zW?UHnZ?LoT@fyeP zUDrpshRMRV{~J-LyNl~W+bk^XO)`<&Bbk_(-R>RaGn{LW$QgD)EHGCDS-JoN%h>3{ z7BcT*r1EOBq|tGHIvZaMQ%{kVh^DmvK6i293)DgUvrds45BL1!bo%a$*&@}Op-2fifQYkU zy;rfS@ND*X8~1WZh=SdVADnQP5V;_i#WX3CM;TF-M#k?B^DnMNzN1if%z@KP8-0>k z+p?qyTLHuea{OVxnk` zO-XbJbQjkDOHvdr9XX=}Pe7hd*{p3f;^~!t_`jAbVm!XY)A!)T@U+B%nseg4pY0v# zcTv($HH5p7!be84=?Jq2GWcU;J%->DpnI`+M2}(3Kt>M2(y(L)fg~CZ{i>^-bVNzr zOwkUTV0~>QX23)L#xK*0c3U9iLiRli_#9{f|4wwymCY2*s#!V{O*^}tRP=EheB}QL zoAC!m!OO4a?Qd675jjKsCfkUY2Igen?`PlnpKN~(E{oyUJEkSB<%i6?Iz)8Xi@~-d zH38a$jtEiDS6cNSR-y9S_x%4#WygVb2ps)uoXT3duOVudB%1j3&JXf7j6*#2^X`LG z8PzKut~0bKmEb15VCNo@0T#@YE4rxek?b$$rGiY@zx3$t9o_emb6W;rN>$L<1oE`%71ilp z8?&Gn6UHwiG2dc#KoEVgU^+Xk8Jrh+S&eU;7e1UB;nF%-O0~Q4Bx%dPwiaGvoy)&q z_Uh`vm2L18CxLbNx?XC)o}|2x=7{&JlecneBZW`J^2o!MdY<|bHZ?xeqh{=--0s*M z)78(R$lrXUjb&IV!!`D71T%N-3yDMCDY9omHT3_Pd-EppH)CpTv5y^5eYq+Kh{QK8 zp{r}RV-CQv-90HBiFa_iv9DQZ{u1SL^y_-(<=?=~jBY!>;RH*~?^)EE8%r|Jx#_>K zqjj!{Sf{=$is*97Vgjmc%ZJ;@rz}g`6Z_pHG<3cFZf|aJ^=(u5@gBX*q2WF*=Q<_A zrw!V02QJUu0i)2&EJVoys2&0*u4x=Q1bw0uDrnpR-o3_98uoE!*n$uYH;}eY)88oy zUy2=OMQ&q98E?x-hIvslll2I#y{!!-IM+yv)a;L_gFpTR>-AlEbC`g+XhnmtABP}~ zKNjyCF1R$6b30HM>1u;C+EyJRkK`L>iZrOi6FT;ikYQwSo$vlJN>72aQygup@47O0 z+>g*U>1=AK@_P)>w$*Mr_cSSPH7%9{N75}m@0D@3cs?-OY&<`alfqa&6im}IOhRgc zLR^@v#Gl?=9=9hHg*WuqS>o4Md&H-F?QATJL+*oFi|*gsdfOe$D=x;K|LvW_KfBe(})V>98s%Oa*A`r-?Y z?o&LaZ#lYmzYWjNn}H&QSHj0k0~IH(U1YoEY<48R+igl89am4#kgOb#YM)CS{g(VL zzu+FG?sI$5zxNqN2MuKE{D289l%-n$k9Myg%UJR`^8r#2%~_MDpNr4W?0~P|Yxld6 z=GrtEx{reBZfcB@dI7Zz^dbcgo&MXLUme@Qa@s6}ZVs)BZy>ws6@)lFzVd(Y1^O!c zjuikww7zXY3SYwVt$IRLonf_vk1Dc(-RTnZo=JVo7z{mUAey6QzOKvq22CRGUytkY+(miRko|I*uT3~kt4*{>NZ@0 zPJoR(x|>FXXV2a9BP{aDrt*Gu;Bn`~44giBuJL?%TOh9_LljN9em#z}>~9-hN*!FL z1M%0dJ8TMQqMo6IcNpDnO-&32nz4VJI(#%JcY86V*&fUmHD!}P)lwVMpSN*$^gv)? z?{jA0^;$87S)SMN)wZqTGtfz|&=?}f$j}|Z;Fevym1{0Gv_n+W)g)}zE=J%&r53h* zQ)>1kw5(i!oX44iVOm1DSlm8_xEU$+Zv!Q=w8TUSMfBf@e$~=vAS9byn>mQ$&)=1> zBH6zyu+aUWW?v%1fBb~Yv|@3(#p7`@VNO_;$?+2G4@k`_ae(45?cMrtqy9ROq{ZoVmehyFW<&Q z$cb+E`{`+{?JSxI7u9sQ(4op0>MM;V)W3ZY&a^V_A?x|9-1jt`3sG&4p`2Tuv*Yy> zFDpO1ZTy?s`W9+g@&h6Bi8N%Xf3@1-JJi^4?(b%FLz(5^W_xBT!e0fm%qW{$c!)@K zZkX(x*AQdiITk7Tk>!lP_1&2UAk6IUrFFTU8}TDDU^KHi9E6p$}?zoY|p$g=;y4Gyx-y|kn=54;1w|0 zzHNUzaJQ>f%3nWp+_dUE$J70O(_$h2lf4p}L@)l&FnO>%&liLJ5$vVlb=}Y(Z&>Ys z-SCKbaU(=^;;cI(okwTnp|9zugF&vS$tRQx_-B8l=gd7-BOG)PvTFs)={!$5)a`kL zqT}sn#&&n7Gpa&J7btxGytX_Bo<*{|`T z(gVowww^?J%$qqk7>~rqtc3z=s{;-TXRg>6omD+GwUWPrZ%rV(r`4|#m`R{|pGGdq z@~PgEJ3ea?gWpEzJSux6zJ}^-4v1}N{cFpTq#n&H@taScVdUK~l3crn@RP2a$uMCh zrzFyOq|}{56vUW$^}RuxX`DuFjo(l{+YI-R=WaBa_-D5yLRU@^1JTRtyG3SdgNT65 z+V8cMlo?S^Y&T#>0e}r7CYOlTk!RVlAfOo*Xf6w~B|P;TQY+Q&WfD`%ircQs05Lw7 z1@DKiBKTdh0)THjDF@3_m5s1S3$SLxvco)&o9x`VvR;1DhabO?pEVB`*WZ{2K`Q-? z@7cJyzBDC(`@eg6ZSTu4R(NiaKj^6>)`iUCIMK)^Fu_sAM(Qy28vc;-MNn3)$(?V_ zs8XYfNZ5oIf91%07vcXF7uP_Op{E`qM({8P>EYzVk|bTgmOEaDOJrODqms=KV@9Bf_kBDrygFyqM@&y~~wMbaA2W6`qN0r{s0JxLL{4JZbI{z;g;I zzI?I6=GOMVc?ezsD`F*fkb;0H;RtC41o5q`4VQDKQieWU46O^LEhGy;E(jeVnJfUK zj;A*d5hVeJjW>V8)^TVz!>E;-&d%})rJUa>4f5IA7y5x`TdT{fhlojJ zF&E82=h~e17)NHn&}*WS_|(9^W08dF*R-+Ys@~q$%jcC$B?q&nxF=^OGQyO8^74Ax zazC(XFg>`2rBqB|%6_2_cO#kFmVYwUM8V|M?u7{B1jP%HrrU&UiA?fQVY93HBHmG@ z6pi|*#q}t6Aypefl&Tx%a;Ruf8)|EO6Y4MAa6WY}g<^Iau9i7Lp@wTprM4-p+| z)^b_OM|@P05Tz=K;LJDv`n?OPjhmL4Q%OvW>bf)hX8Qv)!QYE}?4=5%|2owe80nYQ zU?g8JG0RjK_>rGe*($R|h7kM4Sz2IS_nEO9*}2DXlC#b335f)!Br1Y&_{TOw)&Gno zZ=gR^O7h>-kLT8oK>Ba|R+Zp4B+055MHI%RY&Iu|n|vs(CdOnTMEhylklr)zD|U7t z{Wj!W>GP^)mpcbwnrZc`iAGpd6jA+IaC9@ygp*4F5X1Y#jjcZG#Bah$=27d7J{G3r z00SKRFGyyy0qNog_59+bHkXqGM5(Jy(Z_8pvFir>NvG^~-V4+i9VHB0q=Z3h{b*84 znacyLLU&2@66C1z<&U$QIc<$onnt#sI=PJ{#nAjlzW2`AkIbI#9hYP%c^oO7OSUIl zD|vV*xwv^ks~uBhNbDu5!TaLCgb6SFUUbaI5GwQqX>q6Kgf=ybx%6~P&TZ>Ob}$hw zjn(dN9YKe8vJMe(E0J!`e!{h}C^UG&$Iy3a5P39{XO9n#lj>^i&7z2C-Tip{n)lUM zTE;_IzDF-jpohVSZYWB35_#Z9=blt8bTiyJH)L_2Tv~Uv8Ukt8Y1My8Ar}9&&0py(rPSey zxf3!s->Lo5;m^X3XwplcHvwab1gF@oxFC}ay(g~KozHt(3{o?MKXA)(wFQ2cbzXZo z0^dz1cd^U_L@vr7gAN{b^x_X{j5IGWja;#qEqF2enOL3)mns;?W@34qC;TflMjm9m zIj(xd*1$B5KD!q9d$#h=n07H3Z~00xi?IPKr+3P?lJ&&kf#H&7C>)@d>#yH?#-tdW z>!3F*<1r8R<=TC63SG+Ia^D@0c?P~M(IEo;u_j&L9qBTp0VgJ>W*_bkW z)){IHxst|rdXK-zNN17zm*#zfwIolBdk6!r8=HoJrxcPo{I+O$h&`xhUe9$(S z;0V||hZW%bG$niqByzZt4|Otsgw|s}9Y=;S2mQs(tXWq{SzJqRgoTwGz4)tePF4QR ztZK=C(0 ziNhcLT^+u=?5L!Zfb+>>)ckFM8{gx!hzUBTa`5p%*WDb?rl~JatVU2<3c8~7O!FQOh0u{{!pu^JrM)IMqmdiU zWuRjN;~b#5FpDI{#J(Q8PdaSa4KaP4NaXqp+&xpLeR?;Q)4sR{{i&wX_H4#`xo9EN zUb-PMB%$1>=c%lwCJea_QV_`eXc_q%Q7TqP^ zrFIkjhCjE=RhZ%~rH;eBr!%6qW2Oq})Lfg?yrTUe-6$!}6L ztdr%S!$dEH-V35gfs;TGRZM)B+iv81iJ1Bqb87=J=4(U{X)!dC?X3FTfcbN_-g44R z=!iH`X#R&ET=5&NK5|WQ5tqN&*td%Qq^Hb)%ke4iW)_pu0(4z=FR@M4*vT;{Q-L8G zF%_K<#um`&8gaFlY0=8)2^Ic2SviM4iKHXsLhwH(_wk7O&p&l$FZX~-Ie~zxOKOpr zh8vxCl|JV|3eA5SjP4guW9T>_*AsLe?)Gx<=q=gz|OLT{Xxv8-vKb1RD2^X_?C!;I~y z1d-+3vxPj{{Qhf_aYWDQH9=7+F4S1^Zp8!ag3wDcOXab;nX^C2G{iZbUT{^2?2lOo z{Ybf_{SBSVNNfln2lrLkz$kYj?Kfokl7*oIwg2yN8fizsAEE>H3tQ(e zvRE1}a-no0p3Lq{DU7?98+8B9f~s#{K`)4+VfhqN6v5+1$o-JGm@;&j7eZ?nSCarl z^aM7*%-`-5T;J#KPh6>xE3!x2gzDe;%tvfTVb|=twR|e=L8|$`h|Dr77@B-j*3_~b zCI(-A;&z0v6W@q%43X;~jF6x;{rDSM$n^HA=Ne1E*}ZlUG=d?NeTNaQx<*m{^FGRj z6`UcE{*&pk!WEe=q)AI`Zu}P4AK+7KR+1PSJkFv}t!7CXTXPez0L(u0cFkh%?txxv z@+ed6a3!pPM6}R3dg?<}?JmwBd|}zk7;I+!9GJ7GX2}eNOb*H&|yJiG+u6adS zWoy`ayL)R74ZTOtw=OC0)Pd{%Q&OUS{_h;hm9Xvnh6nHT>ED~Zcp(~-|J;Kz`^!WQ z|3M34#s=YBlz@1$BS_~F(~L7psKxt#XS4t?DEyHUjgdk7K17430UO`(N@SJd_Isdo z`x+SqyX}YUwmn3sJVy##iZTBZo7}idy-h=h0l8gSM8Ygh`&*}cy{qqVdGqaUb#`hG zIuEplJ{T95xbY1R-yMV(>`o#B?b)HzAPOC27eZ)ssbs~lEx=c-7fjs>nbYzYBCm;| z>71KZm17;le%aW`n978wrc~>nK)bVEXx1KDE7Z!u(NcMiRU_1#7Ydpkv}XQD`XZCD z2t8Y)IHRX1Lk5_ngQgVI*?Z(YrD(2fCG+uy(f;Y9MB_e}jHHal`k97|MFgF$t&wUJ*^Jq9`!Z`k+C*LgpiQ!5#L zsiAI=*^-FjR=K}Ay8`t=82Ogrx=c1)J0VW~q7tWt*MD9cf~+Uf+6Gb%Kuip*CeNgx zhZgl3F>tWsybc5al=u~ic6DS;m$X9YF1%hxdJ!}W9mZ~*k2|RKuhL(WV*MPFmpyMv z&S^+IY~R=+nx@p)PoX$oUND@NjJ*aGuVya4vdlO2nLZb-{j?sYaWGXJ=>mR-MOuVh zyh_dFzI19pbIN{gUN$sTbpR1SH$$Y5zYL1yTagI1uTE++N6dfOvd8)9P*iNOsx%l$TFm*rD0()RDD{Zh%y2UoTHpAk z{u@YQ(+^S-A&)*Z#dbp){ZKF}A(uEocsu!b<)f%wU&yZPYhaJ%+@lhvC{F8W3agtx zBYlzS7Q;C<8u9?=YrtFozNj^=nQ)`YI9N;%Qu$}E5XAq1bN;@})23Yncr2$z*o2Ia zAQwh+YvXoo^c|Z6LsjK#uF2{o_oRAy=o7kKnoH@KxV!bI*h|_OoxRb;8RwnMDAo;{F zS(2D#v+Mf^%2ne!=V0UUEoE0xBlVws!x1V>&h~TnoJG0>ZzT|NYg{AYo)tdLPJpz` zuA+wRGmDIFYLWfS?kj9g@&9@sO z+TkelX^wXfvzL$XP4@i)J1r<^z~{E%&0XqYCY>D7SNj)@II%)xs#!}(d;Z;APwa^8 z;@q+KDfm>5bKP&v7I$ZD7*&vE9OL5K=}fcy9>`rqIB2sX@&-Cam=dnoZNzeGV~~38 z0f}aEw)E4l&q5lHHZ^BI-L0KgzrMurp>ek$rpAA$f*%M5gn5aBuvm3Ju@D0+4_R1n zzLPPF+KJI|JIyG1krbbd4+1(Q*UtWf0X93-vnZ4a%X&?NDHzGJ((yfC>+hS%ATcgx zTh~J5fwiI8%bm`VAFfvbjI;!aRQf=~J>!^VIZgz>e|vF_(bJyv2lMKdE_9#EnwSxC z9{>yw;(mS&_*B+C)>_iw0;+dD$FU)wb$OrMh!MJOTJpp-3W7j;1!{QRN-%Dyuj}%a z!=_2dSFcfZONo|PQmWe)q~1Ld+JVST_s^?sCIrra1Xgobk-@A%*1iau;7dl~rOoE- zRNxyRc)T~@Lfz83>Wi#{y`<@KhCg&V(;~^xo{P}}Ks}*5qE@C62^iG3?Ya|Tk-vzO z1gKluYdYx(S_5GJLT&B0}iSP{gi`0C#Meq@@u`l;3+>l{U>=b%c}|3R zspGoEi=VF_422teq(P_mE|bwE10WMpTGd1%aU%x@!n&m69GpP*S9ZmNclL zYp6kBsG$as{tut;?|si2Sc|oobNAh6pXcs#?s=XquJ%6R2})-)ojy0r`jjZ7;V(p5 zyk>hPxA4u{q27sSLpcw#Pv?%!0N&<;9B!>69#VIWPS# zB~aIP@JW&@o+Zi{D869)Rv?_v0p9K%J7$}Un?}Rsy!7;^&Rh6;)`Q_kwcg9X{Mr={ z+@^eX(&idt=SG0Bd#EIb2m$*sgT$=Uluo(O6G;8j%5z_-OEm-51|GeSFSEb#%JeZi zj-R7bE|RcEPG8$O87DaCi>yDe!SVPnNA+dQ`5+C#)~G> zO5)3T)w11tj&avNn_e z$+$cQx>p(_kd1p^X{!_GtU(R<(tlI-~o(xd6 z5vM-g0rLb#rB1?KZ?H#c*AMyItHehF4_kMbeWuP=xxMRnW@&;M0E^~A43)hX&!6wU zEKso+wI5?sq%MI$0PL1Y@^n#U%a?QBuOBqqI!aXNC)0bXkk+! z{f8Sd)E|cbIQI@rviq9l`G3v>WL3v}bm`8+KSNdW`FWZ7%h|POJ|C$}hcqtInf)q< zZ_o&|j?d64yoR?=#8ljC9?Q`_3&pZFX^AV`jFh=KR^kCdqR%FMS_g%PI>=Z|t$IhE z6v(DpCgx`3FXq`DYfmIS0g;aAjcg4a9B-3iY!m#BN0PMx!})LR#3DaWvt8sN?BOBz zBxl&q9#vpUEq{K}@Mc?qxsKWea#;P-h%QX12QYXYm_0!yrF~lLXybj(-0(^D+_k=` zvvF5vOG?;wqon<~Jyy-0&&7Cw3%e~W>}RWxf4VuI{ub`Kjp_N(YWw(2+YOpL=TfY5 zh}jTyJO!O{z7EsEJqTKND#gIqhU;kahZD$HX6doSNUEqZsv`~x_5@&;VaP$Jg*F+~ z3HuH&Gy*WZ4_@6R<)dBZinyPnS{km+2N`LPxpwqdSEF09ooe!A3H=bms5mHU;9j@Q zpEn>xXO$d7HNX`)EWXluPf4MSJEs2MjbI}7OHnCFzNJ{hJ7fFh&*U5yx zl>4FD?+;l-WBKN+N}-d)PrSlxl`cM*)~bVazj=fnqetpJ z+N)N_Ab^|I>(%&`_V1;xCeB9yr7=X-DV~kNm}2h8gua5sEajs))t8#Nt|r}N5gnb5 z@c!)Mab)`%n`i%W3-GwG<|^cR!Ak907qTXL*^lBEbSI;He2k=8)~nbKUZWCDlLSmt zk&k9rGa37aziC)fqV?wM0eLbLx>6CfA*3VKJLHc2uye2=du9EJ8{ND_4M`3AZ? z$Ttq;R@0mE#&^%8=swqfn-d5PmEr@A?eTMX0CF43m{J>Q4s1bKzHju`m11eXA9Dwn z_fv=@aOd{?x<8C4LL6-QrTh2Xj-i2Z0+!gv>(Nt5{fdnenV_Y3!K&y#Ve zxdYmlG487-i^TmF3Igfx7wutUPxcqnX55Rqo zQS@a|izgM!y$i^S0w|yIf}I63$jd5`su=OLQ>e$}YWTtGGlAsr6S5rU+HlslU)xVA zwojbFQ^n)1I|IJ4Tjsqt7r_pVX?lie>5(>`hryEy(XXZV-`i=F zI_Bmqg2#f}d|U(|8Z6$%C+#Dg z?|zTAto|SoWPozU-vKQtY#?=i_e4hykUTl0uTBSo9?n89d*<{+>Ud5XgJf*{C39{I z=#-#DvW;f%GSVCTN7`LYLdH(epR|{{uFTpKs{;VTFLY0|Ed4nKFUMVAi-+7_kcV4u z=UA;DKLIdHJP;5+VPiMny%hu9iaf}5Qx<^;o7_-1m5s59%iF>WOVTR(VZWjNKcQoR zTQf>GRb2Co5h(?P zJ?Cf(=M0_d?m>xLdX_K2#VPncF5|$jqj&F9DzHY*w$$FusK**Zg5)&K<+z za#SeHAlaj;`%s$#pc-RX3CgcS^53~8g5z3&NiTbY@7w;vw`Om{5~zw{{-^7_R{UZ) zmQoL#SGif6a@@)TLjRCF6L*DA7ZXmcOIC2Wrb|~4#;8|(Eb!-sXEX|s8VMs{!NW#I zzAoI0OL@|hi_e5Gh@8Q6fgwX^CMzViOCyiPZRCq{`7XcW?h=#F{h%z$xJ-@ly-hwl zalDZdMmrKOTNuO3n50F;F0c9BB}3+Cuzj6T=;pIrIR{|y4%tFXsGRpJ9SbpRb!a>{ zb~*QR5tpepPsMWd!6aH`kt^|ma%{z~7=PjQ(yjL3%#9Z)0Y#R*pxj zDIIygL|WtugDrnrNoZ;?yYtchxV?5`7;w*PlRk>K|G_RHj%W*xj~Um?vVWkb7LQHu0eXbBKIJe}#JBW$vWU;rwoE;{<#V{~b`iWE<@@`U_h9 zvOmuH!>f`xM>^?#Xa+FO7XBA5aW980Km^gGO2V$^@L3bw4Jr)K2Uo%}|nvmwvf=<#RIC%xm9k$|ZL_cvxJpmPC~tI}5`lTf3QhZFF7i zwt8~-?52ABYKG{wBX#rh7}ca>&8eql*;VN+xgYZCsVrx+^)d*bXU1Wduszy;Xyk*8 z-FRGv6*ePH?1oDxSe4snzjDhPQ!9jtZ3s9)!`pM@w96`9Qq9TVb39l5o*mcq$R$>{ zWlE3d*k=#cr4hh-w(zQGFmybL*jLUdOLAIa%j~7}cjE!`lJ}4Eyl%7ec~&9x75cu! zBw%ABt0_3Qu*t_5g_%^!;lpk$!{z+SD`&G!AYJ~qss@1vi;?Seju;1@&+-0n;t-+I z^*7Gti}yOcX~P@a1C4|0-}^)6>RSVsy&Ilu71-`!tFw*Pu#M0Nf36Eq0xW*H()Y0j z4U5r=C9o1)ywGZ{8aE%~LsQ}Hr7k7QUvaI>f~maX zf0i9~Tb!=qzUOEMpZc@RZI8{`L4imML^pPAi>2oLL&qh&u?tS6vp5%LmLSIP$^km= z*=;dlg!?Rufy%+1Y?(Bl$gqkWY>zV$8fQ86q3?W~n{wW;ByT)ho#LqebC3#6BJg@l zz?1ZcatfK4a61Qe1bhv-($p*(H3@m~C~NRgWYrLRgvN5@hw?7923i-=9ej`U0aQEl zMSrB1TskGiuxFj%m`VBf3_i)aFd0?xHQaD67i`D-Vvcmg;a_1CCV&U76+pqaffSWrItK{JQ z?PWC{38rthgj`H4^7P9y^C526-y@OC4OrBN^~}u0&ooGe24)O9)P^~sB|vR*w|i9t zmGw*gt{c5N%k5e}f@wW|uK%FFKCOOnCHh;|P!dS_4Uam+z!gBKwlXU_)lEepYF= zM#k<{gk>E>5_E_aitM_T)+zmP^~|CxuicSaI2GAHur{zoZN+w!K1a>BF|=ruhfxvI632 zS!+%^xK5E6QAa41v^HkxLhl*tY{AjyYqELP{_1*j^}0+4uEh;;%Ebh!8*%uBk#d)0 zPH&mzV$YJayDzH+R5C~H^XgyYuK4}n%~UDuRN5&Eg#p~!y=n5YoE?S z1J`kFs6SVBW<9d~==n#{Jj}eb)Y`*>SbgW=RuliY$g55@`#7I?FaJsW?H+DY>;kAK zZ>cDuO)gAw8958aKGX!M=c=@z_~%geD3WSh_`f*LUzgnVUKVqb)GU|4UYPPZ)5cxK z*7UsKmsX^~cgGY|#&^@@q=NHNTnUzBjS^YBBew}QgGyJAgo$i|`Ar#y^9b^bC8Mc* z=A&`PTG+X|@LRap?CA>&n0|f(N^!~NtSNU^TsK8eJ{%-k3eF{BtB~-kV3qzyQ|Y*v zJY6EH(@Db>Bg7wM{l*6_mq*3rS?CFpTWH#2KyPH}^! z7Bz>|(9ebS%embhfMNi>coFWu)j)W2W|E2~MLxFnUKKD=?Y1lh@s&mb90{~zJX4>& zuoca`hdoq`vy#fxknbY%bkW4G+p(X$iqEjxwZ4l&TpKc7%f8_|eI(@^IxR(;%$Kh+--K#O|K{|m z6NRMgz}AE+6dVU5_uJau2>i9#*Czc@h^1*8)<4lRthbFbAjV*1P%fmuyuEVhvs%=l z@lQq2uRdW31b6L*6EdA^)w#c<&wj$IIvkR(iYCiP$FV@k;?zZ=r(o;odtzTvk`Ev_6({$`?8zvRc> z#dCsUte$pKbc3%dFQqd?C_kahxfjImOJU&*2aCI(E~;Ofudo?)CN_bW-?L!Sfy+R0 zY^fe>vn&8A|5gxntqCD!>$zUZzEW#-W#D>3`wg%_3>g9cGb^2zcc8W|M;?^@ZZ3PP zC?J&vJT7wJ6|wro<6%sKny0zV>{9#rcF`Vk^QFWyzR zoz#}boi6a^O+T78spNnAoTrbKXN%W3F-ei|uPhiEXDo3F+g7kTmy|>-P1>*#{Iqjg z({w|BpXlbj7s0~$q9{3+lLB5b_0G`lcyb+KKY_o)YIg9}o#%aV^!84Yz?s>07Yj4i z`mEe{SxT=$LWgrhLlop)J{qsUAXDodi_*NcJ8#TBslQ{sTB&$a4q)F$8q7dxDcEPA zjH(~?jG?^P7aV}$iK_qTD|c?G0Je=t_!O4(*<0U7XT*TY8ztS~*y=oPAJ+V4JYel@ET2=oN&$C|^(o5!2bb+=U-OiVS5 znIA}73g?2${NLOa4$R58=J9;j%jdSZ*@l)Kjtz8CFxW++>s0)CVdS*_73tCkyw7(f z=4+TFUW80~m*@Sn)($kv+2Bf6%X)Oae7KSI$0x+Wn*1WEp{1^0YIqsr`_2l1Gql(r zYU&KvW%Q*5y1!{X*>(@{?Nnzjh~E6$#xr7Q)X0N=ti z@x6a>&Hx(suc{q`%QbGp*$yY&T&y*}$nD)@urc)`^#oa0Mv^N4yQyI z`oj4xb~(q8og1NV`g*WcjfT5epN!}@!^d@8x0Iz&$q16u-x0ODi~26KKqf-Zsz!k@ zT#*S&KT7*I#8y(dkIjjOK0<_8{S0G~-5?c~$4?)>1b*&(@Xza+2y%FIh0(_`BxepR z#p7p6xp+IukOO|Q@$z(E{20so#+j_zP8xjAx=?_#Ree0SD@k zxj&r^{r$9)VyXP`S%9$3hu0Y4sUR@v!m@vYcQJ@(a3&;g^kK=wIZ~>!TbzY=Z0kMo zDSl(pC$^A}gTaJGQ2p=;hnzP9i;J@Ie(v1p3%2Uxib`?%k+< zE6{*d2SA@WuXBh+LLH?V<*p%u{v^*pp?U`$lY)n5X4k|)XArWwH4fS;M*k>vssclR zo*{gE?{(=$$l=$oX8)eZ4KCK2ttz2bd*zKDdMq>Qj_9er4?7<4F$ko3I>5$xk1NI1Xa76kK9bs3mWwi7UUNRnb79w!~$sc zI@c`!ogL3AJNNs1xlrt@H9z0^KOoegCHb}5%zmUW?Ow$4mE`wWUfED#P=#EGj$KNJ zP_uEkK7UCU`vm6DU+B-0k`im-6K*A{-tnxDZaYHO8^?3yVLx@v0wiKKEN+!R+x>3V zj`mALR*I^F>wl!dl`IX9fi@m0yDuTtMlI__bVvAbf=6wxp)w^L-e}1BD%KzeuyOAyY zzJLDvhqtVZ=h>{#=e%O`{ce-cMmxBMxci}12V=A4hyr0p3yiAOsM(wt0tX+saNHSL zCWHuMjSFP-qwSPp3|=mp%k-sLD87U?S|J2fJ<{(-j~IIl=-YhMLfN;$jIsKg&E`hY zr}emD6L*31GQCNa_o;MMF@ue%)N7pNCKGZw)1dne@0vC4*CmL}!$x%OVXe0@B5pN< zbOv_QN+eqS^hZpKI!Ix^jgv>3czKC9OXGkPD|T`);%_SqAVY(>}*1f!!m7)a_^RhGw6gk=Gt79B`*s`E>BxNXJr`b>XsQ zZL`g(M{nDmyuwdE3ORYy`}4q?#YY;Nh56)Ib%?R5bc{*~hHu=Z5PY*96hW3AG=s*rad8j(4vr`|)oOieVaGXB zegCC)B&SRLivUy?VNqO$jJ@QfAyB%qkAjjJ%i!kly;~H~?aC6ebNjSuR|yuiNg}40 zu1AE?6EB*zclquTGx+5{ii>}lP+on)eCpOpsJ}pw;~r0)8Fyx4pDnY$E6v2+e?5D) z3w;FKeBgtCpyg3oql34?+?a2F52~#Y!-D8`LPdYLAC?4<^Xx@4CD4~SxV zmBRgc9ne|}Wn?9u=fRTBaT2y`VdX*omYOL3juBkBEUqqy^I zcO2+@@>s2l8hMm^npq~?DvV=0t11U)(G;Ey{rL%!`JZRLdeH3Dn6C?>g@HeH(a(nA zq0u8GSdZ76-laKoli1Y2SwQPb=gddzw|~=@^aHMI~WnJT5u^yD!r&2j3j~ zumZMeZcNrMc>h%%b;v9W#JVB3&$1pbLK!Q+;>7|ayZ0>THO;T<{hcCR$m3Rr&xh!a zqVGvFU6bR4I5`(?CTHvPXDmhDB%wN4#<3_m>L9D=u&4PMQi51ZSc1e+j?=(RvWw7o z`D1Se)vnI#!q}@+PNkU_2wBLDBPDhf9npCsgjNJD-+yJ0PaR|qsY!&(0x5>AP!LCi zFJ;gg{TLn@L8w8#acc@QbonQ&OUj%m^eo|yu^fvn-cE~Y zB@9J4Oo<-7pViDY=EG{Q(4T4Czw<45GQqV%D;EQ9P%3Q4IZKDqI9%xZ``g3$%22~9te5gYBpX=|DIK%Ue5#6QYgo*~u zRXwQ|^>BV=N9tB_qUt*diiqdy#21U=Z7|+I@*o!yIi*Gy`07k4PJUs%4z7&4(!f5FoS=6-kS`^Bb;>&+Ev)Cl}V?yl!rk(96rs7^3Sju zO*l}!b2guOuFO{0u`J3cKyI^&2za1btzFp*v%rI6#u@WYa z1u(?$xOcxBB3BmWGwe)*@6)NhTZIkNh#`s%=o$77Y@?SfxSE>jizfIhof(Uy2h7Rk zJl2*dZKG~N#>tkqkQ+OPLO3`gULk=~IO#kn#F}aE$fhRbS$TuT9Kr3_7v6e z7+B8fQw3C3xN(g|V~*a+7Gjf`fTHuG3wQ85&ZI6pJWQd1xV1JhxLqpYd4jNX!f4tR z+Y((-FomiiWva>9@HeY!2OOOAoMrOsWsL`Oz^I$cEzzgrRe;4Vt;g2ib=KE(&Se$y zT}--59hv>L;4{590_|Ny%V&dWYyJFK6DJUsRU7rkJGlU;Nz@HHjgKW411)ApdX%F+ z;fM!)aaLuq^}xp(TOqHgoKW*vUHo<8)NV+iJW81w=QX4I$VL&_BF;-4_;LzG*_;4+ z&kC_9jQ(>jEANoO9$kPDTDv(|2mcCw$S^o}KKCtg7Y9fFD7B;B$&Hg}O{U*JZN6;o z^KNW^mLzA@yLb~2k!|Q+ziNhMDIw)}T3koq2`jc5qDYjcp>+_W`nPM1U`+N_nnG@V zRrTIv*~IPWUa59o^lg*&>5QXa*@E`Reyjjn6%%Hoyum^gv_4v%kZ2yS>Ww=;5Cwk{ zE58Yk1q${-PZHoKj9F}9_bo$Hy3+BmQv_!gIoA8Oh&|G-uf!zBzC)hyDOP+#D2YLl zBS{<;TxdP{yO3B2{v0Bu0VZ|rif*(o(uYj{3WPsJKSdqCvHQKqvS<4pC-T4DvTtAD z>{&lWqKxJ_N4xesT*o@d!ZTzkupQMVA1E014+E^ef1($ZU`%$K6=(d8EtcfPDRF-M zPW3nnzL^fZbXuNUp1YKYmjBN(oTh;9A7zxtg_u5`G$=co&%3b`EJ|fH2X{!|)!4E4 zgaitnXhY|q>QMEf-}dySO^?Lmja<}=&wH2#s@L<$EsSKSTRBd%*x2R9LJF#6SpM4+ zUhy>3lN&LyQAwF1FJrL;bcT9?6y%60)J@1iGQ(xa2;mBkd4u><)Izj~ zvPrW1%W#)dVH=jm_WlRds=TGTq2+!SbWyQyY3>af=1E5hoK&a)C~lSY-nr?xTKuyX}a$FpP9OT@Ip>U1)g6B7^ag%KN}%%7t? z3^`|DT_0EW*zfxM@kE-jM&pOQiTKC4TWcGa6DZt3+!>xrsReb}jK6x|E`|EuU)8Yv z{d699WlmsWmxNT3w}`HJ+3V90-pJl!T({>(Lnyd&*B4IQAhIXn6=5<|#ZN}yQcF=J ztTE62H5|;gtfhPtkP|zVz<`PZ(sIHFp4wVUluc(Uv8I6&frDNqCbHtnda2Y1~@*w1Sd{xqYQcuYUH0d@M*ujDQksVc8`Y{4QJv!u7L7*K!G zQO7o7>;(wTTnX$udI1)H5tR--;~jeum@GwLp#jET!tt#DRtwb&Wx*tsxrCV!zRoxq zm#3&ylif*`mLdVOk(9GU=OQ{HJvAi}TxjxWHJNBNSUhQYN*#|d0vDZ3*(GJ&VVx!4 z>DnID?7o}cBUHQ86@Gg`6wT`Wb75yj`Tn#aT3oSNw^p_te?8#zcx$43Ilfw2H(9jG zSb(0nPlz@?!=PX2#??&@ebt34Z#XbaqCccJ8uy0j=b&lkV9WEMpGCfWylB6lK3-h; z+Yz3$?b1}}FR{6OSgVNQJc*>it0*RyqaJp|6729z$L*8MovgnV?-@AWI#n;<`mHNR z*WZ_0blp43-iu3=mVRZ>v2j2l(Y|+@Y-TecroDNE(TjoO>3=E*7Vx{aRS zE7CNGRw^R5ptBH@Krt69`LFiGY;A1`7*$R?H_pvJULC$D*bnS{ip}Gscnq%R527sT)4}Rms8yPgyjhw;%;e$KS4dY*;A}xD}_Dx{Ce)S zkuW|$jI2fx6G1DyQ+>%9t1J;&BteIw)d&L2HTrW_q+p@xN7_0SB}TyZe%6Z+<9E4L1Y$3f2D zjMD5D3X@y<-t}18;>XpDQZv#`kRpok36-+ z+YJu5fygTMoQE!x7ekz{0^*=pkhzXhQ}cF_bP%( zoDHk+9P|0ufNfo%8*?X^JJq8I(p@0`50S2L@-*hyiej_Ja6}WPyqllsl`Bg3ly}Qz zUWbn6>^8hn%c?#qk>~Yb3RSQkfmlllBd?acX(}F4>DpNfVbp(}0n_)5>tolnB=wEU zkLrHel^EFw$tgK(CYeA%s5uqX z*meo)8PP|0x2h%&q2eC^{*$o|v9ULd(raax86GvbSj9%|wP&IQnv|5kx=cB=Ed|^e z9)L$_XLJ$zNFEAa^z(e!U|K(Qe5EzQr_2Lt`!a1q54l~@gGfbT$@rdsih<25U z{b0mr)!;e2Yh&Ww7_e8xP@$Amde?hEEnIBJd|gvjlXQ`ry@fqajkXoV<~haBxEt_s zv=mq24W7!8ch(}VOxI-x1B1V87HqJ$?}X;;Dfr&4cD2m2mu&B0YVURgsr{WyEbV`l1`{{VrSCK7!)*o%_I5E0m zz{(FRP<>^zKUdL&gwHI)VvDA2K_{as(ZgseRU)udtXU8HxZ)-`rqJa+df9=c?k$HH z6Dm;J-Dg!eE4D0{qQ9@5@hoelaN+~JUb3hphN9wA3_65x5d+7+@IL!Cu2_xv)@?N5 zx5m3q$`sHb|D&K8Hy(Q0mmOgoThUKW(`<@>e}O%@E&bd_PILAFmf&7{uW#y=zZSyc z2X&uf>2wxMeELE^v9e72g@3=9C7avwZSv_{4E9H_M=>R`i610~vZu(onH%X#rlHeP zqb-GQL9?-%GqkzM(HqeSJvDJ!eI)ny70#4?IhlAGMy1dcj5NXPEK1boC`JlrHo_X2 zLlqZ6(x3dc|74*bm(^1NtcDBzi-VN9VlRA(u-jMR%b|}u3Pi?c_UD(_Dn!CqT&}(J zb4;8=C7mc{O0zu=2j_OZouOhx7ltd+rr$4Qg#d0|a6cZj6Z{B&KozT^$C%A-kgs1QD+xl?hz4zk1Wx>7W39Rn)n^K9aTxc9*tY(6DD$ORz zJN%RQg@3<|t#>FLD^BjhSYJ>-2dJO3?R@Pb`n*D1q0J+e60=fZ*vsz9Yxc?PjUFeD9^q8e~vYF_GQ!yPiW85p9s4aDE|RI zBF*P163b>Pr_D7-NxKwTU3uAwW&U5JJ~W7@WX%)b`pAL!6eE9>D+qLCYhb=d{yucT z1gA5>oN7J*loWlFiCMe(or0*3DSEU>U@75=kPUF!CEFMx#|@Di9Kq?jK3|LXrrDH^ zZ@YBPvp^``Z|vGB#C$_uZS@a-S=;|ta4TzLl6Q-df2MzDv}KGw%hZMR4ErYC3@B~D zMwbcbfdUn#J%sOlO*^?;D9&+!!L;$uGRF7@E99%W5Zx6QS(xEt{v37=B& z#g-R&(lXvXEpy<2l>p|IQvz5BPU;qB29FIt=>e^0t<0?ixU*fx^m$$u4A9@=81HTT z?s&bg#qOOQPHOk*LS>(}Wu3)sJ9hTV8uaslHR+papgiPw0e({oafHNZ=9|Fj82O9M z{ew|ac;s6#6gctmbX{?xup)(Ark@o0x7s5@eZpieOw}X*?V`5m04Ec$AmfBv!@?C$ z__SN_XMNn1;Nu&k`I!ncgy#O#aMyxxiYv{gU;HCO+RcJTBU1t+i>Hp+lwY<+k6Mrj zDRAH7qZC}Mk<#&kUcrmPBiebXlP|^OrY`!Ouk8{mE6_5IX#$Olqi9KzkBT;7W0W6|jj zqTWq!J@bjSE0m37dUraP6v@%-LnZMX{#q>c)8Xj7P@kS1*xU#B2Xh7%4mmtha!Ph` z36#mfs>|aZ21-wMMT3>EW>Ngm1sZsEggbXcZC|gYN*3|A{YD`8@R5so-aeYTSy2T! zZh9fQ0z!sxBU`2V&K(m3!wHWnFO2vG z*Hhu8$gzSs>Y9&fWHpU~HLY>4#I?vIG8=MgN%bk&14&Z_5C8l<+<=SJRBuL-A1vT0 z;D2kz4dJFu=-DTd$%8H8`o@dn(wIJH`yg{^A{PdW4UhLRc;A)D#a6A66^w|$ck2xoRbolt z)+gMt1OrswQul@{p__ntALKxC)$C5t{ji+Jn9R5vNEjl1r4Ry15hc!#h$~AT*}63Q z|KJMrL2Ot{UgYCwOQgXMB~4UeAi0lH((Jvz0G5dnuAQVPOC-VVkYJJNclZx=2Pc$h zbq*>!o1>0ixlrt0O)mY3mhA#gEP~|6GIqNYzD)XBi^J2yN?#=diQExS*qP}I9gqv7v$xtvb~(QD*1`?`Oq!WTt<69P2DuNxpiiJyRD9C3?&jdE z+YY_xBGiTevxB=fgMUGYr;?hWt`cs8$dBOcOI{YJ$%5tko$Mer;w$wmMZkAgy3puP z&Pbf#*Ke%8`P%<=%0mMoloY6OyBA1^-qnB~(>0vHxz0Biz2VAY;IM;-f9$015bzNf5|1q`xa z6H3dLnoE(>-1sCA^n+vZ?NjCrvEdhd@5`|jO9Mkc@Bs99aOih%C-QM#4&fh|Ug5C* zkTkDx(MFcBA_q+R^{eA^xzJWfR~203fOLFsPdBp6w!h2Rmy*goieWlm-C;&n+Mi5+=^(~ z(sMcFlt87t=`Zql({1cRn*0zutWAO=RL>?_O?cfEFsuUe)HE|!U`wRm)SJ1hH~iqw z_w8v+f0^!VHVT0Wn=Zb+TR3gOztscC)nTD(J#wqismP!3CUECDC^sfHrYsH}fxmSA zbe^J@WI{7?69*y5xKek>Apq*C$9XJ{bC7lv@dJWurg0Dd02!w8*B(q3&?fVZ<^j0+ zUG9>w@b^U6>NOHg@U55t+y(=TQM12QcsVw+zz6Grvjp#^BY4 z7|h9^bhhw%#`hy^fljcdZw>atHv?9l{m0DoI*o_Rz%A}H@6-|>siTlWYH1q3Kpo(S zRN9h>n%$O!|5hVR%OUgmWU~J@Bf%~r+`tA`7y}3A<8{e$NY}%q6@Bu&UKiP|_Hx~& zWmw=V7E&Pb7&=zGO}aEYWC6WDS&0qT_^_Es*-9rj;-G+T?C!HYRj@!+EBI($hsAUc zNlbC1zAScr)2e9Q$q->79A=V@bE_4xOtx~=5wX@E7@r24c*p8TP1tFK_?9MfD-6DQ z4TkjPTU%l)mE8qJbt5|sFZf=9%Vv5kz>|HG9fd^Tt`)w4GTxkjw7RF*l{zJ6=UM-4 z4V-54Iy1(>(0#2aIo?m$E!%Weqc)Cr=41#du;4vnIq%% zn^5ajcl_57`t36gLqsnvN7DfE*(bvwp&xrxaF~n;I8wD=Ha^&Z?dzdT!5S8;b*MJE zYNle1kk0hwCN{`Z1PcYOXSD3%kdpYVD>-JrC9=~}%>R3_@6z1UM;*yw2Ip;MlL zQ;N%p5c`wS-8S+|*Xv^&CeSxjFZ<#SnP2@4n2AkiC;)W22H5?@PTX1yu|9+EPP6m; zm!)HWRgZyxzs*k$bs$7nMgj)K`i4YpnKU08XabLih891ppd_dzBuCmq-3!0hg%f($W#Y#yJw&3`6sS^QkxaMgUp} zG_sYY&+RI0iFVVEZiZfDL{Vf!l6yo^c!ZsM1n_=*K1Cnw2x7{mGu`D+#$uxz(()_P z@C~yn)j`f5e)UeBY)$>ZT zVZl=r{*~z14mNyNSS_QbqQ5hraW;hwzgIAx@JOzj_t=SbyPF@`T8uq)@4rA5ddq12 zcGLSC?UDo-*Rh?`p7*L+aKs-@V7l5=u}@{GwjcnrPE{F`Rjn_Ij*AU1*yLjY{aT8Z zcPKO(-&0*bf={ju%b@$!)Yt~e8HZO9FB`@_a^*uuZnFtyDzKl{*fg%MUcR9OG0~p;|P%pKpv$_Bmp_~^Vep!-|pQ}HjM;){DG}OtLH>@P4Wdz94 zzHd(>UdiRgJYPnoYXjF#LTH`1OUJU64-rR<}x zp&L~0Wl-7Jg_{KW#|>iem@xYJC7oUAJ@0L(m6v2gxdY;@!r8wi#oCP1e_Cd1_TT|w z#|M6j)*g7zdP!(SOL0T2<|Xi4C-9e@=3A=ot(57k^k8gOv}gtVqgc!2R%4G>WA$Z* z%De6H-ANs>vfqoW%01+Jz4{BDMHV7#asv!2u~weyL7_cU@SUA>jdBU&ZgRQLvUM}H z#ru2&ghd1XO{z50W~e@8wXfk#(#Q=DV6Pfu8x4!S>$*CnfY{iEe>JG&O;Hg)!@;<^ zgx*IkZR}@Qw_M^Q*P`kgLA9kgp~u3N_@1~p{Jq#HBO*4Jo~L8R9CRaqDT^y}aJMU- zG2f!*w&w`@j!utwzD(S0MI=pP;2E_*MwPd+y+a}pv$Iab1v6Q7mct`9@Z|lGT-7bH zX7Z*^s%D*5cAsyja3T@9XADow60Qj!UjGjN8cuP{>F6%dq@z(%3ak9KCi;^m!|8;k z^S~2Fzn%Cs)3oS=P~`~;iGG{~j1Pza6sJq^-CpupUyq0V1__N~Ieqk#U4t>}yM1ue>GQ0b$g#SAZN2$RV9JbD zgA1GSERoabW_Qg2z=MYlM$=!NJ94>v2(u=`JX$MUwa;el-1Y(mOV|BW7*i<^1UUnu zIU7d@(Sozvuvd_80*|wFEV~0PJZU2~O>iIKM}3UYn=nI@|JY8&6NVf|Rnm{#k7Uh_ zW4-53jQGc&*CmKBqjNX>k-y6H!_DpM%o)93lH6x%ODpyg11EwkIc0?>#r_oB^o!gR zquMvJdYDlkIA%tr)kUfD!@*>6fA;N4`K4ZDm$kTT} zIfRt`M<8}+9AO;TA!;Nkf01L7s&W=x*|i@5F8dT-7EU3aQChe*ln8Zl?hT0#JN6h< zo&XY3MIC+wJ-T16licuM$le96Pcj>WcTB9G$Kvrk10{2 zFn#NRp=8V~?`aWSMR3S0Ga;sxosJ6;nx14RiV;#Y9n3<0Ah=*WAb-4Je8-=B#`7mi zDM}DbfFx-+u*ESw;yGq>ln=YCWBI}E-R^R$M;rRpSA%*mFA^IB5!LIcV(Da`4cwiO z*Z5yTA_N&y~h!FHQ2I94p{JqHBM>$kBGna&*0e<{8dax`1|91~p^}V0J+T3#!3#-Fp zBMnXxY1#Hpdh&nNb6imF|Iue;mrX_-5sI@rEAO=U|5WzJRvai;zDHEUhj`&R)!kCi zm08nih~|g2S43B?1S9U}?Jyg3+_=dNWUe6eJ2UCoBQLHkysEq`m8yMXg9ldjFnFjF z9JGvvTpfIi2wjQhiDdvS?y0y38`g=kGIl(Si_x8!H2Yy%?k?Z?zKv-V`a_L%MNj3^ zc*Lf_4=MKO2u%JFE@;M8aH$*@wkakvBaW~+9Z~5pq9W=c)Lp*Ks4Y77ov+HB`~v&P zOi%5BA1)yr{AEvlhwNjIQ2x)ExXS<{=~GRXo-q^8^VNApgkHHlktRg9H&jL@@S4~2 z=%TXyrmfo^bFuec@EHxPA!{bTy^|DYY$&ehvSRqlpMT8V;{9)Il9bNuKan^my8o?d zZdr2pa%`5>_IZH=F!srO>NV?=&@94|xYXTpe5W4HsW6&Fd zR!5SL2g$Zc#T_i2fICS3-zNcYvs21tqu3EJN|bN48}dr@A(WjjT)x@##Hb;381SJ3 z+;hv5l)f%bW%;p*q(;}XWxjPu#Z&tKRd(gkP=D_~OQV=UM2xXTb`nExBx`oECK`K| zA$p_8mbIC(j4W9vON|hbeUfcV$TlHMw#;NJYxXGl`keFqea`v*`Mc--bD!rq&vWm6 zUe9yxJ@?#uo5_XT|5Bug6~R%tl;vBBqKJSsX=aOsyU#4o-KDn7v$x||U$9u3sE3Jv z{b(9tC0AmnGo+{?a{LI;ug)atOqbDzlee7PxW-!OQlfo)ynd?UFaONdC)I6$t;xfj z#0*9X;~p~tO7s^7!stEUBi>oq7Ic9Nw3SBC6!eL}K40KjO(FF;wyI-uyO+z1x0D?t zy#YQprq!=SRh;jUS@14=CL}*BKv45y+`!D9dA<^)A08sI_YK&NQS~etl?ip7XlW(o z@hEm$dZ63R6O18A^LmOV{;&ua@*1>{*O>)!v0aI25vmO^U4pYNFM?mLvR7nN&Eni{ z*@+Ud;3_XFVUjsk$E-K+l%Fk-%SG92JLwq7M*O1b0Kbp^`epe#?DGB0S4rzb&Me-$ znj_&WP4^gruOGCx_J*f2^O-lk;F(ZA%a0x0E}zoXauWz6f*ps*0xv2wg~j`4{)f(Y zZ~;C9{a6K~rwDCD>y~1>(t8OMCm!o#M}4ZoPGM}Iqqq{MBe2xBsyviUQmJuTjd7q| z7odc1L@oxSAJ$8==SQrawhrAaeZ-Sf=%ccJ$xHO+UU%tkk!tiF%OO|Y+bha;x5$Iu zYVG58;HoybdLBGi=b^D)^a>Fjyx(CBj)!w56BIVKA{a483xofrHltC#w#N*1KuGeqeWtljeqE$+S+;}I22N} zb|9$pu@1DQ)8Kt5il5EXhq}~pye&;Xe9x zBXVg-G`4p|jj=%kp`&Y(74{91f9Vcib8PNKj$ZjwNuYpf!cnyi-Ha8l=bc-ha{Tu; z0cA!88DmKO9dlXbl3<93%dG~Uflh_?aUmcVQNipdjdzbpfGU$m4r%f%Yr-f~=&^fn z0f~CCpPO2WwhkoUBVWlSH6k|;A`eqWYjOTDayt)gvbyJ~!pKA|w|MREeB7O*dugkGPuIVRN8H(!LZONs1m!ZW zL6ikpCk|_CujsG6q1F$ltku@mVTX1xHM+&_u7Lf@NzXl%$udI*>e5#*h^Nv$AaQ-X zNabkrwOoHk^WR}Gq!GE-9@dazdGxliKk;T^%xz-)jOOolo}4=;{^I{H6{U*)$nNoV z{hml$gtKZWhOZfIocBX6t)ahvLf$C;YcCy@@vrE^*YfT-z6h!0^=Z9|yW1)qrc?8B zPEToS9j-Qn2)ly{X3G-dw1j?p)D?M6$%PhONYzb;J8ecNH-7U|O#WfliPf+Qan_2t zDCx;$d@K(GcElgt=>d^?aK!)(m?f#|QSAXIf^QE|(Zsm;DM^RAWKV45!u{w4J4i0~ z84<9~wtbPYXV8iV#Qmn@Av#U+9tVWV^rgR^>!^FEM=nA+*+)m;rKjt73SE`h3WWR0 zjf^ZWtHe1>@-fLJ%ee-z? zSUw5py>8AZmKnx!!V;?-1oZoqC2cpj}viU7x}&Y*B2pgRVe6OP~leYBFYf* zy9G05pV zur^t@kLMZXEqOda#@v=VEq^E!44Vc&n1GtB#mtH1(uW8$uCSO|EWrhe3v4TW#eplq z=tv`?l>u*ENd}T4RkV5R=0!{|>~??#e)t}%CPO20#b^`};&*#tBBE;!JmDEzGjHMNf>KUxzHZ0DkUUF%@btsq1-2b}za1 zn}0@;3xTCscLY+wwZ4rM5XH-C3YKGZSTD;3kK7&TNEV~+$T+V@|EX7xPg*>613rl2%1wQe5KF7t$Bo+>0_8X5S3`>?{pxw|ft5 zh3PAi-ANZfIGx$4YmlFEt2;NUj#AGHg~VTZ{WzMkc@ikoF7 zrcM|2B`YJh$2SA>o||g*fBW^SX1;*6y_W5OV)LiQi$i8|WCpv9taLTWdtNcz{WLjd z>lzsE#$Yzv)_sxugB56noO@PC&7!g+KI0f0!WOrMhz>DuTrCSFvuz&^G@sa$nYqM2 zYehpg|8#L=&DCV!=z>xdAKx$B1eL&n{r zTo?H5gwnX_WrI_KWIc*S?5Y^_mB|^#@Us+kz=1x~^^v_fxm%UKSPbunnI-bzXuM`v z8ZN6ynKp%S%YH;f0;;>Y7aVvgV{Jc}f#x%;B$b9S&_cZZhXnp^OxnDR*LW2KOl%wc zjIm-fOWrwA7rMSOpA&(oIGW%yKa`p>-QD8VKJmf+9pZ`@Vtnbup*>KFnccD^bu0$~jANv3 zV}Ku<<^xER_k~ctUHCaAp!YpZxuNmo*wNE9Y}x7;RlbU=WPe~e9Pn)y=Ha7+(e7y= zR=a3ZaS1)yplxVG$Z<|$+Bmq&hDPe-{MLqtV34tK$WbUd)KReWib~~o>c&>KlSabr zlbqLT8J<^$Zg;$YcE*KABS=Ewl^bj@#iLrD-NW&d?pJmYqMQ{S0qi4ycWjFgd}eS* z8ns%ptxD7u+z1uKe=nz{x*35TH}aXV{I*~!v)WZoxpjOac%y2R8^I!{K~S$*nT}>9 z?TZ6WOxR6PpqX)Trhmu`G^4j$Bn!Va!vr$n>b}Cn1!H^ZQCcxulQj12<`(_UgX^c! zS9EgJwBhxk7^F@d@?iMsf=$<#85QnS<@3{ed51R0GR$LE>4QrKa;lgfgZSHH3ojoh zO83u&h?R@-hH&4s`}u5y9@~e^%3h1AnE;o_*)QnC@3wa@cZdUHAat5eyo|0`0B<+M zjTp_NExp-QQDaK5(m9P4I-Yub4gVO()3pw+wGHO45Tj}~?cdPjs(gXoNwAR-M=upW zMwMac3eN>kHF{(>)ttefUhFW@r!A?O!>|P>i_@qk54jOQW&6GnpfRzmAxcP5(#c8C zfipe~G7wqT(axFU(GVx3%qM8W^91eO2t1lQfi3Y6#Jx>`s`xUsq4uMMEXMBp>a#?| z)^&Q14uMo51qj`fW%ukU-xme5Xz++FDhC|)21cvDJMY4AhLgwNI)mv-h+^EFEMRu4 zofr5py7By$JUHOkRy74J=EkEYt9S;ZUkcjA81HRDv3@GoVVR@exPZl4Hk??k5@J=K z_JHMw1#vzVY67$U;_sV*M^Yc2&Dv0-^-M;EpRH(N7y&cxVx{{me^V{h=HF`f4a1=Ji*`<%c86ZHr3Pq$miIT z4a4NxSHmdxOpr0s5H3G;8M2nw8T<`ieVgx7v~WI!5bWp9LU!5({c=pv`UD=EKy5;O zjoLC*Io;KEF&1uilcV&j;k`R_U-caxy%gLU(&nmH1Wl~+B^mUSPZCk5&&le7>Nx%< zNZB_2^$mnPa7S`EFdSQcbnf?V>cYoY1Qoe7B=qO~RI$pk&{qTt*YH;a;en7nv-YSE zJVB)*9f^<*kT5wg&3{Q3()`*zxsa7%^44>I-LgOkLwA&4UN2;jxoCgiZLG%{9L`F= zfF$~{tDRRU0q3RMnJFBcfZF+>2!AE^VycXFZNxpG|1wiC-yd%PqJ;MWZ^ycsyv`a1 zhh?xuw%klMf|q4XT;OMP5m zkR0?$GOm4D6pz^$zQ^0{pSAn@@|GUaO#nAy+TM-Dhpb;heTs>%mL(pRvmx|e%YZ!x z_*G*#J~GTO@QxuIx_be}eH2Hgs-!Ns>x3i_y5C<&ntfn5mOR8FLB$GI2b8hMOi46YG7-Q-7etvZ}MnmSTvVHK`E3y+_@xxe6izFTB2BZj~ot8Lshw$|HAj%?oVup#4!wJ5Rc2 z6`w@Ot0C{R4_tjF`myzjE8 zshJ_%QKzsx?m5;l2PJ}*5ouk=_H7jvBWG?(u4Y6uvRHeiaH?l;*sw&XzIrgl!A9JS z>$VuCRWlZs6;9CMuhcVlr4;HUd6QHaifgKGBr73HR5IPj*XW!anpyQt9~m2du}@dz zv?UFWz0^1vt>EWU4kg@LdFKTo4_@Por$LjW$(>1*_UXXg(bIrzQ{O;jr@@W_YX8MA zC~6;@>7SZ(GBN^5bp`aFdEnGL4YGoXF4aHO*aL$BH3uIh)Y%NP#9<%DerMuAWg~QP zb>y%82A;NC(?Zkk5DIoyG)j~zvpd41Lfk^#?JDPu3}=5XfnVkzsd`}kGh{lO5&Ub$ z1(>_T(15S$5RV76t1di?&|M{qw$BTcSO0xfHX&D#9NS;PcfriwQoGR?vSqwYbwbw(Nq8}v=7-(D0O=FHX- zstlPokA9VgP}Z|gWlJO`9PbDF+JwmZ>AvF|B5BC+G_Ckb@J#Os-2RY4X6CR^$>M;L zB&pTLDW_9PH5ZIf{FQN6V*G@ z+u7T@ph0BYBMdrcMpin^f}eX;lx%_T4W<6x?A~E?z%Ew}7O^*HxeHKSeyFwQ=0W58 z%#_T@>FrC3iC5+H^hjo44UV1A2&1jM$fL~plExdQ&B!~-M+3KIs)uO6GI+}_@@wD^ zyBPzxm(@^P+IvGd_j?gEj^#p<*6$21r=t8+BtJ!1ucKMCze);S!ef-vQaG1Lpskh@ zp6nG=l&XAsDGKv(NI}y7s&^`nu=(Ni)T?+rH0O&krDE!DF!?-w`C@Eu9eB03Herue z4YTFD%GGtX4Dx3Ae&+hL)q2+@{yl2rV(9)K^|4ir6_rdi(xJ;DDwX||i%`$|qoTT= zlPtZdh25g^hsurAvD2yb1L(9O=dM|$7eVrw&Pe~mXZbJhIP8dz8ATd9_zME#L$!3q zHGe*ypQ%J=yy8ToJ=CnTLR;h~hMH8iB_~x6-X%}b`J!ug-j<7;VbS6sRXY#RYx-DU z2+Y*->46Jg1uQM^k1&{M8V%&UUC?=b8>dYFqeHAP-Aay!d=+Vqu=u9>@!Ko4FGEv) zX!{gS11?*t<~uo7cPY&47TF|ClaaB=_ld1mcROrTH$8dQpSF%h`Tr??tT9-Uu@YNY zx3v2@Iq-wP&$SzM{;q!{)KRi`(4udP-u=#qUcKCZQKGn%P}I$qz#DZ~ZG)Cx=#q^* z=~+=XD}Qr}^MeCsTNp=Snw1qa-%0+;cec@yl6>pQ`@kAo$?w)@Jrgf=Hhqa@IKEYM z;)KxAn4Y=K{}dNCR>pr=QGcBHwEl*9eB++Bma`{M4dfndSi?alrCg10_Q zS6BC`Q+-v}%$(_K!c>%G&{0TG002Ojla>4g0Pz1*@BtF!U!yO9T=}narJ|rF^{@N? z6nc94e=|EeI>N)lLqbCSDFFci5fKq#VPXG<{)wihCJY99eSO{9+B!Wx-ap&FzrTNe ze*SZK^Z599d~~$CyZidue{*}YzrTNWcDA{>d31PqadB~Vb+xjxvcCTNpZ}JYmbtmP zv9Ym#Ze?R-8XFtWZqI}x-gkC(s;8(eEH0=fsk{s2?ds~%&(!ns@(vCTadUH5QB_q? zQ1q+uot&I387-Nandx8cmywbE7ooGWi=Ut0+qX>Z?d_D5R1OY~#Ka`HxOhlN$a;GE zU%%R=rKKe&C)3fr>Fw=RSJ!xb9gB>Nw6eCAkob_Doh>3FYG`OwR8*9opP!MDDJUp} zfq@wv9mCDd^W(=43kyqaZJnB$nu>~wo#WfV!NJwti;L{P4^?*X-q`clYe^_T;*=GjZ|v!RnvYisq%Wv-Xhskob5% z?KG{gzrN}?Rz){QAK$#XlsGRhRZJ{RWM=qbj@}3Zmt9eyGNuCBE|V3e)5O3m&oL% z(n}^8#a93N_4BPojOFr#M_wDXFO^kKgQ$DPsiffETk_(b>5-Ab>Z({f3sr^SqSVwM zV6LyeKBmQ0O@5wP1$X*oq#6~!#0?L6gaoo9z(Q3FrK;G%y=+Rvj^oy0ye^UAkAfjQv zB_O4u72pz;lygz&D=6qsFDS4xv+GkIG&}-8Zy4ny#ns%GkGlN-D->whkugv>Av&zC!qcqe@xKynPdpL~ZrSqmNc}RZ#uQ7@|?R}ag81owT z#N9phdadp}o*ON_T=X;eVl5q6=!;R->EfKdn)un{nU#e<9P!w};Lc65Iv^;HR__9f zlYdj2rb<=g5$XG^S+4gp*I%eR_#lHnl&4!*X>L$6@qm(exjp01^E*{RYIl2VUwGt~ z<7$=D*o1n@U3}D@@CgSQ*nc=`s!6=2o4=~}E*5?t3c{!uFxYX#O?Nut3`PPS z?a}lnlIO75(o}ub3nHC<7#U+qi=2B&P~nSiZ%j`UtjpTr8T>kI45)s`a6^Ej?oQ#& z?pT#MP{17$2FLMsT$C*mTyc(DbxDd{(41vQ&?&U##|j9<5q6?m?DXP~RF3~`pJo$; zb_EF3UG8Qz2LIk%cn z!`gI0H3pAV2;|FREQP#cB(pLWA{zbBBN>ks9) z$5x%e*`N3<#z66Fji89saJ?S4m|#XkWt6;Edg~C$pVEyi7JgHCkD7@2`&{S)m`@L# z(s43=w$E2(k@lYXJll8?M^H9c*g36F-AVBIEw<{1UFOa2_g`^o^x$z-Kbs~t({Z7u z+ogP>rm;@`!`Ajvet$aavUk!iSi9o-N2}3^ubaiN)q>zK@C{mhJ>a}^hx_s|<@0;Kx3 z_kk;MtpBhn?NICccY=tx=`=Bari-J{60%3?*@MSDGxpA&dMxaFNgi+S-#!V|XwRx@ zs$YkF6H114DN|k(+vt{zfK_Yn* zUacYZx!k?erajn`xdW_^CO;S2@R&Fno(r0B4?(h9Z(~^9dE1nqtK%<5X`3GaD}g zioMsV#X^8ES+Vfj=P9{trN-~3@LbvL&xOuTS5oCW8*#5s1n(CFI+#fTW}9f7zCQ(< zENnY=+uWAZE{n*ga=|WVjDcQm`X_8x<%jz-*kR_%ZT0KT<7!CMlGQFt!t#NAMneF7 z8_;hOV*zWPo&^rBqiAVqDPvvw)cQ$(_TOpi7Yh@SlajXTqSA{EjQl=aAalQa;LMlT zotX?L#g{EslxZj@K3T0bem!`fs<93WN#_lE+NIcbg0lt*=En+K*^`)St3eG`_)RO1okg^ zd3j$jt^W;+dLf@Bv9|*Rkrj-A4D#@@OT5hNmFx`c+ivCWG4dbv(^nd86z%4MJ3cUv zXEEthfIoVDTxgm0VlN*`;>@VH9^ld;64NJJbZIVR&rm_4er-1gJnkJ{L&h8efsdQg zvc32AT>*(e2P&B87IIfyve3Z?xyzr%f!(qjwpDg|=!e#M80|R%f%?%`Um1=v3ah;4 ze&+2#KfHlw)-WVLB5rc7&>~yTI{uAW=xn@~5Jz;dzb_QLzxe1HKZOJ9%}IcehAgN8 z$ke#hoR9&qvPYBGZv#mOexoS-Z$m8)_pTFg7$p#W{iGhniZ#$9_SSP8v$9M zcY67@u(gqNrR|mq3ZjtXth6I$da+RQdspCT%IWVFtZI| z4wU@EK$GRv>Te{Yj{{}j7@z<42$ezlsuu!47q0!s&w`mx~6Hk$;V@b#gA&+d_eIS@f6MYN) z=9emZ&;1tqgA;chAy^hEMg^JLRIpo(_X%VS^yo)7q`^2(@ir77e^VuRll%45i-NE& zxRDuTvyGBtEJ5iN&~h&-Cve0V9W>-E83tx!5i|%(jtIalfBu}p?Wjw~uTw@UAsO{s z#Pj-NS0zj25Wp6W1#9L;&Bow>YqHisa_7!A(nAVG-bLZ1YRan~a=}YSef>1ky+_ZY zg?!EML|fXu!8&1PtrkEk(INI_^f7`2w`(nem}QfE75xMqIjMAg3n)4clB93)v|9{P z`S2u`3Ln*iR23-mj*T5-B^ic;bX7@0A>#0M0DJJHt;TAipSg0fM+(2RF(7NDvC84nk;8uEtw~(yJxxw6qK5Fc2ka^0SN>r)I zNW1k5T!Pxa0n|hw*vu1!40i>EC=h-oZ*P6216bn%5BW|{+T71a$*s8LC-4Ja?Tm4Mb35_<43xS97$)8#g1vBL zt8IBqy3I{-#3nK{3pf<`ZR?oEz4v+K7qKMBC}cI^2Lzt4g1@8R|9P6ptG&z{VXyAf z7iaSt1LL zwwKDKULP#NFp1EfvQ)@4%WsNCp>`|aG$mx5Lq*XyqZ*c2m5&KeZ&Z}jK<3C4fS78i z+Hp+OUH)B6mzmaQ?qB%Dl~V7%!_-sHJ$Q@5h257gowrPt(^pm(pIaR-`90k_v`Aor zDlZ|9N}?@#JbWIf*?@5BHw_(21(oDoufsPX)n+Vdc-%Y$V+0p16~7Ya zXk@9d7IAI!>KTg{Bb<%|b=#YoJ19gXY4R4U(93qvZIQ4sFmn-r=OdnopOjfyMXS^`8+iPmbeM6MGgEaB5ejGP6ZsGqeyiX2XEL% zbK`7Fu2&B94O$~-zx*(1+0>edHE`o-ut|c@qU<#tth%P<#q7;pUGTH_Z5tHprsWS5 z#O0{A$*Fu|BOP*Tj&7ff`tk09PJ4l2Kcqx@S^Bi4csX#ZO_wWVM?#WHVwKH8S2M6A z&t1AE(}5gI^@LF4V`H5Be#S2_4MUriliFOp=^Cexa1y&q|I+;@8@I>e3igFD*C}g5 z#vP>&{iE`v$-07HdnbSkEKZE7iow~*ZtdC-FkUW-+8Fk>l0J&bAc}+FjAw}!w;EjlowkGwYIv+;115QI&#;ruY}9Q?m8;I=?;i| zaxqpb^&<9{ohsJQS?yw88MLBu>i(*{CcauNqP|$Y{}BN557!Ln z7_FHXBveO&6vU}_aXadHpH_t7ad%;O+}o~O8(PUoJ!R?ftF|VyCnb;}Z7J&!C7PsQ zQu$jeQDR+{nY;?q>jc}YRKdB~szd^d1OZcjHhE@lQq}}z+49`3q>wTEV@>lIidK5= zHR+a?2we%m^@_9~)g>@_8I)s{#5aWH`{jpeAL1;Xy#HWsf8_czPRKoWnx-v|TQ5;M zpUPgh(sj&%pM{>g)2yV#9#SxoP{EB%(XhmZ@J-jQfd9g zjQk=X*}_@pX~g|IvVMu1gUcsLRO|dpr|cv4O$dwzOYQ6XQx|UpNa54jdE&CW7}L4BSJagIU#gm@S-NrQGCq}5b zA9JG;irL&#Q)k_&7SCHLDJVVY&9a->z1i-Qxn=nM`kj1LLZAsm;fQN!mh?+#xXNez_HL72I^)A#TRio5yF?_fzq)?bK1kl$JVh;uSU{JRJO%YG?+s6`cX zg#rkZB6G(g{#H;x+JOt8OVqF#6H9t< za6U*ZN+A8H88XLHjgg}2g^wwcU%FKD(2R&+s>I1n2gQ%CKwAwu?~={eB?-Wl167T1@--M;D|1|G#W z+GimB$pw0(-?$=hn&~E#WN}wm>88Jd>1kqpz(A4>8~NQM@#gjJneT2V-!2c4%0kb% znZ=9beWHNrS@O$dM2!ZPYSE!vy+gM#P1>(uK}ZZp7y;96Si$=cf3+P&t}Owu^I z!}@)Aag?O71qff7T06M0A4mu!;{5Br#G#+r(6i}yG{s<__fBlyN!BwLQ3q|V7VV0J zV3afaD>y*r!rGI8PK?yW8XAEDrKMucM%JDI_;;&S;F8gPcnyeTCqPv8jDhGWqi$hR zC~gzRS?;CGEm}ren&{c=-Z-&?N2K2m_#ef$-8eSYI+_&){VPh}cM}j6e>+3%MMWWJ zQP;{OR~PUIfhW|Dv(Nu(L>f)(Ji0f}Slb`(<}5oi&}w0K#B-N;!PB)1*0i^_Nm7*| zEGS;>z~58pJ`Z78l^*lt(5(?4zIXfSP&Np%T)jSBo}%@rDZnbz<~T_oA^)qNI3W30 zti544fCYV*Q9F`WJDzm%CiB2mBOr1q7{4k9_sq4O{HOCb7E3rzmRUB?Veyx@nn?9&{v2hlf!=CX@ogl6!Ch2m z7tbHA0s1`2hz zT&Ui@p=l?37#(`Pp1a%k9(xxjCl@uB#G>rm8bRm+giqR6$GG@y`%7z|Y~erS{!*G3 zFK9>u(oK`PE@|=^q&*|p+u<}0_@AlI*%$s^f7=M%QSzm$V(?-qtzxqyR+BjWqJ-W? z+cW*;^oj^sbP{O(@CjuH30?ewe2Lx^1M){u8^RALjG`o%KN_m0+IE09Vhf!{Yq*?tla4L6-7QL zuQ5(Onk)%{HB2JXy-kdBfrr_9%zTZ)u*l*{8GL5E3}MbkWBP!?6q587(U3%V7=5%! z z1Bl43Ngx7xA;7N<^um=0JV~sq?dGIadYqCqizU&#Xx>J*C;xKJd<`~7rB4(kmj`#E Q-Li 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 z�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 literal 395258 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

    R%$RL_%=vY}87z>Q> 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

  1. Q9(wR}I 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

    ??J#C$CE|og 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 diff --git a/zh-hant/search/search_index.json b/zh-hant/search/search_index.json index 896a21f13..60b3c6c07 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. \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: [i32; 5] = [0; 5]; // [0, 0, 0, 0, 0]\nlet slice: &[i32] = &[0; 5];\n// \u5728 Rust \u4e2d\uff0c\u6307\u5b9a\u9577\u5ea6\u6642\uff08[i32; 5]\uff09\u70ba\u9663\u5217\uff0c\u4e0d\u6307\u5b9a\u9577\u5ea6\u6642\uff08&[i32]\uff09\u70ba\u5207\u7247\n// \u7531\u65bc Rust \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// Vector \u662f Rust \u4e00\u822c\u60c5\u6cc1\u4e0b\u7528\u4f5c\u52d5\u614b\u9663\u5217\u7684\u578b\u5225\n// \u70ba\u4e86\u65b9\u4fbf\u5be6\u73fe\u64f4\u5bb9 extend() \u65b9\u6cd5\uff0c\u4ee5\u4e0b\u5c07 vector \u770b\u4f5c\u9663\u5217\uff08array\uff09\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 [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 [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: &[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\u7684\u7279\u6027\u70ba\u5148\u9032\u5f8c\u51fa\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\u7684\u7279\u6027\u70ba\u5148\u9032\u5148\u51fa\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\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

    Tip

    \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\u64cd\u4f5c res = [[0]] * n \u751f\u6210\u4e86\u4e00\u500b\u4e8c\u7dad\u4e32\u5217\uff0c\u5176\u4e2d\u6bcf\u4e00\u500b [0] \u90fd\u662f\u7368\u7acb\u7684\u55ce\uff1f

    \u4e0d\u662f\u7368\u7acb\u7684\u3002\u6b64\u4e8c\u7dad\u4e32\u5217\u4e2d\uff0c\u6240\u6709\u7684 [0] \u5be6\u969b\u4e0a\u662f\u540c\u4e00\u500b\u7269\u4ef6\u7684\u5f15\u7528\u3002\u5982\u679c\u6211\u5011\u4fee\u6539\u5176\u4e2d\u4e00\u500b\u5143\u7d20\uff0c\u6703\u767c\u73fe\u6240\u6709\u7684\u5c0d\u61c9\u5143\u7d20\u90fd\u6703\u96a8\u4e4b\u6539\u8b8a\u3002

    \u5982\u679c\u5e0c\u671b\u4e8c\u7dad\u4e32\u5217\u4e2d\u7684\u6bcf\u500b [0] \u90fd\u662f\u7368\u7acb\u7684\uff0c\u53ef\u4ee5\u4f7f\u7528 res = [[0] for _ in range(n)] \u4f86\u5be6\u73fe\u3002\u9019\u7a2e\u65b9\u5f0f\u7684\u539f\u7406\u662f\u521d\u59cb\u5316\u4e86 \\(n\\) \u500b\u7368\u7acb\u7684 [0] \u4e32\u5217\u7269\u4ef6\u3002

    Q\uff1a\u64cd\u4f5c res = [0] * n \u751f\u6210\u4e86\u4e00\u500b\u4e32\u5217\uff0c\u5176\u4e2d\u6bcf\u4e00\u500b\u6574\u6578 0 \u90fd\u662f\u7368\u7acb\u7684\u55ce\uff1f

    \u5728\u8a72\u4e32\u5217\u4e2d\uff0c\u6240\u6709\u6574\u6578 0 \u90fd\u662f\u540c\u4e00\u500b\u7269\u4ef6\u7684\u5f15\u7528\u3002\u9019\u662f\u56e0\u70ba Python \u5c0d\u5c0f\u6574\u6578\uff08\u901a\u5e38\u662f -5 \u5230 256\uff09\u63a1\u7528\u4e86\u5feb\u53d6\u6c60\u6a5f\u5236\uff0c\u4ee5\u4fbf\u6700\u5927\u5316\u7269\u4ef6\u8907\u7528\uff0c\u5f9e\u800c\u63d0\u5347\u6548\u80fd\u3002

    \u96d6\u7136\u5b83\u5011\u6307\u5411\u540c\u4e00\u500b\u7269\u4ef6\uff0c\u4f46\u6211\u5011\u4ecd\u7136\u53ef\u4ee5\u7368\u7acb\u4fee\u6539\u4e32\u5217\u4e2d\u7684\u6bcf\u500b\u5143\u7d20\uff0c\u9019\u662f\u56e0\u70ba Python \u7684\u6574\u6578\u662f\u201c\u4e0d\u53ef\u8b8a\u7269\u4ef6\u201d\u3002\u7576\u6211\u5011\u4fee\u6539\u67d0\u500b\u5143\u7d20\u6642\uff0c\u5be6\u969b\u4e0a\u662f\u5207\u63db\u70ba\u53e6\u4e00\u500b\u7269\u4ef6\u7684\u5f15\u7528\uff0c\u800c\u4e0d\u662f\u6539\u8b8a\u539f\u6709\u7269\u4ef6\u672c\u8eab\u3002

    \u7136\u800c\uff0c\u7576\u4e32\u5217\u5143\u7d20\u662f\u201c\u53ef\u8b8a\u7269\u4ef6\u201d\u6642\uff08\u4f8b\u5982\u4e32\u5217\u3001\u5b57\u5178\u6216\u985e\u5225\u4f8b\u9805\u7b49\uff09\uff0c\u4fee\u6539\u67d0\u500b\u5143\u7d20\u6703\u76f4\u63a5\u6539\u8b8a\u8a72\u7269\u4ef6\u672c\u8eab\uff0c\u6240\u6709\u5f15\u7528\u8a72\u7269\u4ef6\u7684\u5143\u7d20\u90fd\u6703\u7522\u751f\u76f8\u540c\u8b8a\u5316\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.as_ref());\n        pre_order(res, node.borrow().right.as_ref());\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
    ### \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 ###\ndef pre_order(root)\n  return unless root\n\n  # \u8a18\u9304\u89e3\n  $res << root if root.val == 7\n\n  pre_order(root.left)\n  pre_order(root.right)\nend\n
    preorder_traversal_i_compact.zig
    [class]{}-[func]{preOrder}\n
    \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.as_ref());\n        pre_order(res, path, node.borrow().right.as_ref());\n        // \u56de\u9000\n        path.pop();\n    }\n}\n
    preorder_traversal_ii_compact.c
    /* \u524d\u5e8f\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
    ### \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c ###\ndef pre_order(root)\n  return unless root\n\n  # \u5617\u8a66\n  $path << root\n\n  # \u8a18\u9304\u89e3\n  $res << $path.dup if root.val == 7\n\n  pre_order(root.left)\n  pre_order(root.right)\n\n  # \u56de\u9000\n  $path.pop\nend\n
    preorder_traversal_ii_compact.zig
    [class]{}-[func]{preOrder}\n
    \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.as_ref());\n        pre_order(res, path, node.borrow().right.as_ref());\n        // \u56de\u9000\n        path.pop();\n    }\n}\n
    preorder_traversal_iii_compact.c
    /* \u524d\u5e8f\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
    ### \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 ###\ndef pre_order(root)\n  # \u526a\u679d\n  return if !root || root.val == 3\n\n  # \u5617\u8a66\n  $path.append(root)\n\n  # \u8a18\u9304\u89e3\n  $res << $path.dup if root.val == 7\n\n  pre_order(root.left)\n  pre_order(root.right)\n\n  # \u56de\u9000\n  $path.pop\nend\n
    preorder_traversal_iii_compact.zig
    [class]{}-[func]{preOrder}\n
    \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
    ### \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 ###\ndef backtrack(state, choices, res)\n    # \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if is_solution?(state)\n        # \u8a18\u9304\u89e3\n        record_solution(state, res)\n        return\n    end\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        end\n    end\nend\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.last().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: Option<&Rc<RefCell<TreeNode>>>) -> bool {\n    return choice.is_some() && choice.unwrap().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.pop();\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nfn backtrack(\n    state: &mut Vec<Rc<RefCell<TreeNode>>>,\n    choices: &Vec<Option<&Rc<RefCell<TreeNode>>>>,\n    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,\n) {\n    // \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.iter() {\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.unwrap().clone());\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(\n                state,\n                &vec![\n                    choice.unwrap().borrow().left.as_ref(),\n                    choice.unwrap().borrow().right.as_ref(),\n                ],\n                res,\n            );\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undo_choice(state, choice.unwrap().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
    ### \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 ###\ndef is_solution?(state)\n  !state.empty? && state.last.val == 7\nend\n\n### \u8a18\u9304\u89e3 ###\ndef record_solution(state, res)\n  res << state.dup\nend\n\n### \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 ###\ndef is_valid?(state, choice)\n  choice && choice.val != 3\nend\n\n### \u66f4\u65b0\u72c0\u614b ###\ndef make_choice(state, choice)\n  state << choice\nend\n\n### \u6062\u5fa9\u72c0\u614b ###\ndef undo_choice(state, choice)\n  state.pop\nend\n\n### \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 ###\ndef backtrack(state, choices, res)\n  # \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n  record_solution(state, res) if is_solution?(state)\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)\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    end\n  end\nend\n
    preorder_traversal_iii_template.zig
    [class]{}-[func]{isSolution}\n\n[class]{}-[func]{recordSolution}\n\n[class]{}-[func]{isValid}\n\n[class]{}-[func]{makeChoice}\n\n[class]{}-[func]{undoChoice}\n\n[class]{}-[func]{backtrack}\n
    \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

    Tip

    \u8acb\u6ce8\u610f\uff0c\u77e9\u9663\u7684\u8d77\u9ede\u4f4d\u65bc\u5de6\u4e0a\u89d2\uff0c\u5176\u4e2d\u884c\u7d22\u5f15\u5f9e\u4e0a\u5230\u4e0b\u589e\u52a0\uff0c\u5217\u7d22\u5f15\u5f9e\u5de6\u5230\u53f3\u589e\u52a0\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\u4e3b\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        return\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        res.push(state.clone());\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[row][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[row][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![vec![\"#\".to_string(); n]; 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
    ### \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1an \u7687\u540e ###\ndef 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 << state.map { |row| row.dup }\n    return\n  end\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    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\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    end\n  end\nend\n\n### \u6c42\u89e3 n \u7687\u540e ###\ndef n_queens(n)\n  # \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76e4\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n  state = Array.new(n) { Array.new(n, \"#\") }\n  cols = Array.new(n, false) # \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n  diags1 = Array.new(2 * n - 1, false) # \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n  diags2 = Array.new(2 * n - 1, false) # \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  res\nend\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.pop();\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
    ### \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I ###\ndef 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 << state.dup\n    return\n  end\n\n  # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  choices.each_with_index do |choice, i|\n    # \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n    unless selected[i]\n      # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n      selected[i] = true\n      state << 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    end\n  end\nend\n\n### \u5168\u6392\u5217 I ###\ndef permutations_i(nums)\n  res = []\n  backtrack([], nums, Array.new(nums.length, false), res)\n  res\nend\n
    permutations_i.zig
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutationsI}\n
    \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\u96c6\u5408\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\u96c6\u5408 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            backtrackII(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.pop();\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
    ### \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II ###\ndef 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 << state.dup\n    return\n  end\n\n  # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  duplicated = Set.new\n  choices.each_with_index do |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.include?(choice)\n      # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n      duplicated.add(choice)\n      selected[i] = true\n      state << 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    end\n  end\nend\n\n### \u5168\u6392\u5217 II ###\ndef permutations_ii(nums)\n  res = []\n  backtrack([], nums, Array.new(nums.length, false), res)\n  res\nend\n
    permutations_ii.zig
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutationsII}\n
    \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    state: &mut 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.clone());\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, 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 mut 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(&mut 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
    ### \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I ###\ndef backtrack(state, target, total, choices, res)\n  # \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n  if total == target\n    res << state.dup\n    return\n  end\n\n  # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  for i in 0...choices.length\n    # \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n    next if total + choices[i] > target\n    # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n    state << 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  end\nend\n\n### \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09###\ndef subset_sum_i_naive(nums, target)\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  res\nend\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    state: &mut 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.clone());\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, 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 mut 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(&mut 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
    ### \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I ###\ndef backtrack(state, target, choices, start, res)\n  # \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n  if target.zero?\n    res << state.dup\n    return\n  end\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.length\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    break if target - choices[i] < 0\n    # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n    state << 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  end\nend\n\n### \u6c42\u89e3\u5b50\u96c6\u548c I ###\ndef subset_sum_i(nums, target)\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  res\nend\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    state: &mut 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.clone());\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, 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 */\nfn subset_sum_ii(nums: &mut [i32], target: i32) -> Vec<Vec<i32>> {\n    let mut 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(&mut 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
    ### \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II ###\ndef backtrack(state, target, choices, start, res)\n  # \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n  if target.zero?\n    res << state.dup\n    return\n  end\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.length\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    break if target - choices[i] < 0\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    next if i > start && choices[i] == choices[i - 1]\n    # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n    state << 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  end\nend\n\n### \u6c42\u89e3\u5b50\u96c6\u548c II ###\ndef subset_sum_ii(nums, target)\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  res\nend\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\u96c6\u5408\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\u6642\u9593\u7684\u9577\u77ed\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\u8868\u73fe\u3002\u6bd4\u5982\u4e00\u500b\u6f14\u7b97\u6cd5\u7684\u4e26\u884c\u5ea6\u8f03\u9ad8\uff0c\u90a3\u9ebc\u5b83\u5c31\u66f4\u9069\u5408\u5728\u591a\u6838 CPU \u4e0a\u57f7\u884c\uff0c\u4e00\u500b\u6f14\u7b97\u6cd5\u7684\u8a18\u61b6\u9ad4\u64cd\u4f5c\u5bc6\u96c6\uff0c\u90a3\u9ebc\u5b83\u5728\u9ad8\u6548\u80fd\u8a18\u61b6\u9ad4\u4e0a\u7684\u8868\u73fe\u5c31\u6703\u66f4\u597d\u3002\u4e5f\u5c31\u662f\u8aaa\uff0c\u6f14\u7b97\u6cd5\u5728\u4e0d\u540c\u7684\u6a5f\u5668\u4e0a\u7684\u6e2c\u8a66\u7d50\u679c\u53ef\u80fd\u662f\u4e0d\u4e00\u81f4\u7684\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\u5e7e\u500b\u65b9\u9762\u3002

    • \u5b83\u7121\u9700\u5be6\u969b\u57f7\u884c\u7a0b\u5f0f\u78bc\uff0c\u66f4\u52a0\u7da0\u8272\u7bc0\u80fd\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\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\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\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\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\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\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\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\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\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\u5c0d\u65bc\u6b64\u985e\u60c5\u6cc1\uff0c\u6211\u5011\u6642\u5e38\u96e3\u4ee5\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)\\) \u3002\u8acb\u6ce8\u610f\uff0c\u8f38\u5165 \\(n\\) \u8868\u793a\u5206\u88c2\u8f2a\u6578\uff0c\u8fd4\u56de\u503c count \u8868\u793a\u7e3d\u5206\u88c2\u6b21\u6578\u3002

    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    # \u4e00\u5206\u70ba\u4e8c\uff0c\u5b50\u554f\u984c\u7684\u898f\u6a21\u6e1b\u5c0f\u4e00\u534a\n    count = linear_log_recur(n // 2) + linear_log_recur(n // 2)\n    # \u7576\u524d\u5b50\u554f\u984c\u5305\u542b n \u500b\u64cd\u4f5c\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 {\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\u901a\u5e38\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":"

    Tip

    \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

    \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\u4ee5 \\(n = 4\\) \u70ba\u4f8b\uff0c\u5176\u53ef\u88ab\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        // \u5927\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 - i) / 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
    ### \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) ###\ndef 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  return -1 if i > j\n\n  # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n  m = (i + j) / 2\n\n  if nums[m] < target\n    # \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n    return dfs(nums, target, m + 1, j)\n  elsif 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  end\nend\n\n### \u4e8c\u5206\u641c\u5c0b ###\ndef binary_search(nums, target)\n  n = nums.length\n  # \u6c42\u89e3\u554f\u984c f(0, n-1)\n  dfs(nums, target, 0, n - 1)\nend\n
    binary_search_recur.zig
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{binarySearch}\n
    \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
    ### \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb ###\ndef dfs(preorder, inorder_map, i, l, r)\n  # \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n  return if r - l < 0\n\n  # \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n  root = TreeNode.new(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\n  # \u8fd4\u56de\u6839\u7bc0\u9ede\n  root\nend\n\n### \u69cb\u5efa\u4e8c\u5143\u6a39 ###\ndef build_tree(preorder, inorder)\n  # \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\n  inorder_map = {}\n  inorder.each_with_index { |val, i| inorder_map[val] = i }\n  dfs(preorder, inorder_map, 0, 0, inorder.length - 1)\nend\n
    build_tree.zig
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{buildTree}\n
    \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\u5c07\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.pop().unwrap();\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
    ### \u79fb\u52d5\u4e00\u500b\u5713\u76e4 ###\ndef move(src, tar)\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 << pan\nend\n\n### \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) ###\ndef 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  end\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)\nend\n\n### \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c ###\ndef solve_hanota(_A, _B, _C)\n  n = _A.length\n  # \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n  dfs(n, _A, _B, _C)\nend\n
    hanota.zig
    [class]{}-[func]{move}\n\n[class]{}-[func]{dfs}\n\n[class]{}-[func]{solveHanota}\n
    \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
    ### \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 ###\ndef min_cost_climbing_stairs_dp(cost)\n  n = cost.length - 1\n  return cost[n] if n == 1 || n == 2\n  # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n  dp = Array.new(n + 1, 0)\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  (3...(n + 1)).each { |i| dp[i] = [dp[i - 1], dp[i - 2]].min + cost[i] }\n  dp[n]\nend\n
    min_cost_climbing_stairs_dp.zig
    // \u722c\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\u7a7a\u9593\u6700\u4f73\u5316\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\u7a7a\u9593\u6700\u4f73\u5316\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
    ### \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 ###\ndef min_cost_climbing_stairs_dp(cost)\n  n = cost.length - 1\n  return cost[n] if n == 1 || n == 2\n  # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n  dp = Array.new(n + 1, 0)\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  (3...(n + 1)).each { |i| dp[i] = [dp[i - 1], dp[i - 2]].min + cost[i] }\n  dp[n]\nend\n\n# \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\ndef min_cost_climbing_stairs_dp_comp(cost)\n  n = cost.length - 1\n  return cost[n] if n == 1 || n == 2\n  a, b = cost[1], cost[2]\n  (3...(n + 1)).each { |i| a, b = b, [a, b].min + cost[i] }\n  b\nend\n
    min_cost_climbing_stairs_dp.zig
    // \u722c\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
    ### \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 ###\ndef climbing_stairs_constraint_dp(n)\n  return 1 if n == 1 || n == 2\n\n  # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n  dp = Array.new(n + 1) { Array.new(3, 0) }\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 3...(n + 1)\n    dp[i][1] = dp[i - 1][2]\n    dp[i][2] = dp[i - 2][1] + dp[i - 2][2]\n  end\n\n  dp[n][1] + dp[n][2]\nend\n
    climbing_stairs_constraint_dp.zig
    // \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
    ### \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b ###\ndef min_path_sum_dfs(grid, i, j)\n  # \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n  return grid[i][j] if i == 0 && j == 0\n  # \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n  return Float::INFINITY if i < 0 || j < 0\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  [left, up].min + grid[i][j]\nend\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
    ### \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b ###\ndef min_path_sum_dfs_mem(grid, mem, i, j)\n  # \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n  return grid[0][0] if i == 0 && j == 0\n  # \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n  return Float::INFINITY if i < 0 || j < 0\n  # \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n  return mem[i][j] if mem[i][j] != -1\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] = [left, up].min + grid[i][j]\nend\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
    ### \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 ###\ndef min_path_sum_dp(grid)\n  n, m = grid.length, grid.first.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(n) { Array.new(m, 0) }\n  dp[0][0] = grid[0][0]\n  # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n  (1...m).each { |j| dp[0][j] = dp[0][j - 1] + grid[0][j] }\n  # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n  (1...n).each { |i| 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 1...n\n    for j in 1...m\n      dp[i][j] = [dp[i][j - 1], dp[i - 1][j]].min + grid[i][j]\n    end\n  end\n  dp[n -1][m -1]\nend\n
    min_path_sum.zig
    // \u6700\u5c0f\u8def\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\u7a7a\u9593\u6700\u4f73\u5316\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\u7a7a\u9593\u6700\u4f73\u5316\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
    ### \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 ###\ndef min_path_sum_dp_comp(grid)\n  n, m = grid.length, grid.first.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(m, 0)\n  # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n  dp[0] = grid[0][0]\n  (1...m).each { |j| dp[j] = dp[j - 1] + grid[0][j] }\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    (1...m).each { |j| dp[j] = [dp[j - 1], dp[j]].min + grid[i][j] }\n  end\n  dp[m - 1]\nend\n
    min_path_sum.zig
    // \u6700\u5c0f\u8def\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
    ### \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 ###\ndef edit_distance_dp(s, t)\n  n, m = s.length, t.length\n  dp = Array.new(n + 1) { Array.new(m + 1, 0) }\n  # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n  (1...(n + 1)).each { |i| dp[i][0] = i }\n  (1...(m + 1)).each { |j| dp[0][j] = j }\n  # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n  for i in 1...(n + 1)\n    for j in 1...(m +1)\n      if s[i - 1] == t[j - 1]\n        # \u82e5\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] = [dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]].min + 1\n      end\n    end\n  end\n  dp[n][m]\nend\n
    edit_distance.zig
    // \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\u7a7a\u9593\u6700\u4f73\u5316\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\u7a7a\u9593\u6700\u4f73\u5316\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
    ### \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 ###\ndef edit_distance_dp_comp(s, t)\n  n, m = s.length, t.length\n  dp = Array.new(m + 1, 0)\n  # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n  (1...(m + 1)).each { |j| dp[j] = j }\n  # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n  for i in 1...(n + 1)\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    leftup = dp.first # \u66ab\u5b58 dp[i-1, j-1]\n    dp[0] += 1\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n    for j in 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] = [dp[j - 1], dp[j], leftup].min + 1\n      end\n      leftup = temp # \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n    end\n  end\n  dp[m]\nend\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
    ### \u56de\u6eaf ###\ndef backtrack(choices, state, n, res)\n  # \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n  res[0] += 1 if state == 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    next if state + choice > n\n\n    # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n    backtrack(choices, state + choice, n, res)\n  end\n  # \u56de\u9000\nend\n\n### \u722c\u6a13\u68af\uff1a\u56de\u6eaf ###\ndef climbing_stairs_backtrack(n)\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  res.first\nend\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
    ### \u641c\u5c0b ###\ndef dfs(i)\n  # \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n  return i if i == 1 || i == 2\n  # dp[i] = dp[i-1] + dp[i-2]\n  dfs(i - 1) + dfs(i - 2)\nend\n\n### \u722c\u6a13\u68af\uff1a\u641c\u5c0b ###\ndef climbing_stairs_dfs(n)\n  dfs(n)\nend\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
    ### \u8a18\u61b6\u5316\u641c\u5c0b ###\ndef dfs(i, mem)\n  # \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n  return i if i == 1 || i == 2\n  # \u82e5\u5b58\u5728\u8a18\u9304 dp[i] \uff0c\u5247\u76f4\u63a5\u8fd4\u56de\u4e4b\n  return mem[i] if mem[i] != -1\n\n  # dp[i] = dp[i-1] + dp[i-2]\n  count = dfs(i - 1, mem) + dfs(i - 2, mem)\n  # \u8a18\u9304 dp[i]\n  mem[i] = count\nend\n\n### \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b ###\ndef climbing_stairs_dfs_mem(n)\n  # mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n  mem = Array.new(n + 1, -1)\n  dfs(n, mem)\nend\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
    ### \u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 ###\ndef climbing_stairs_dp(n)\n  return n  if n == 1 || n == 2\n\n  # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n  dp = Array.new(n + 1, 0)\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  (3...(n + 1)).each { |i| dp[i] = dp[i - 1] + dp[i - 2] }\n\n  dp[n]\nend\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
    ### \u722c\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 ###\ndef climbing_stairs_dp_comp(n)\n  return n if n == 1 || n == 2\n\n  a, b = 1, 2\n  (3...(n + 1)).each { a, b = b, a + b }\n\n  b\nend\n
    climbing_stairs_dp.zig
    // \u722c\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
    ### 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b ###\ndef knapsack_dfs(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  return 0 if i == 0 || c == 0\n  # \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n  return knapsack_dfs(wgt, val, i - 1, c) if wgt[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  [no, yes].max\nend\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
    ### 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b ###\ndef knapsack_dfs_mem(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  return 0 if i == 0 || c == 0\n  # \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n  return mem[i][c] if mem[i][c] != -1\n  # \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n  return knapsack_dfs_mem(wgt, val, mem, i - 1, c) if wgt[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] = [no, yes].max\nend\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
    ### 0-1 \u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 ###\ndef knapsack_dp(wgt, val, cap)\n  n = wgt.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(n + 1) { Array.new(cap + 1, 0) }\n  # \u72c0\u614b\u8f49\u79fb\n  for i in 1...(n + 1)\n    for c in 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] = [dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]].max\n      end\n    end\n  end\n  dp[n][cap]\nend\n
    knapsack.zig
    // 0-1 \u80cc\u5305\uff1a\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\u7a7a\u9593\u6700\u4f73\u5316\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\u7a7a\u9593\u6700\u4f73\u5316\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
    ### 0-1 \u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 ###\ndef knapsack_dp_comp(wgt, val, cap)\n  n = wgt.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(cap + 1, 0)\n  # \u72c0\u614b\u8f49\u79fb\n  for i in 1...(n + 1)\n    # \u5012\u5e8f\u8d70\u8a2a\n    for c in cap.downto(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] = [dp[c], dp[c - wgt[i - 1]] + val[i - 1]].max\n      end\n    end\n  end\n  dp[cap]\nend\n
    knapsack.zig
    // 0-1 \u80cc\u5305\uff1a\u7a7a\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
    ### \u5b8c\u5168\u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 ###\ndef unbounded_knapsack_dp(wgt, val, cap)\n  n = wgt.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(n + 1) { Array.new(cap + 1, 0) }\n  # \u72c0\u614b\u8f49\u79fb\n  for i in 1...(n + 1)\n    for c in 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] = [dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]].max\n      end\n    end\n  end\n  dp[n][cap]\nend\n
    unbounded_knapsack.zig
    // \u5b8c\u5168\u80cc\u5305\uff1a\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\u7a7a\u9593\u6700\u4f73\u5316\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\u7a7a\u9593\u6700\u4f73\u5316\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
    ### \u5b8c\u5168\u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 ###\ndef unbounded_knapsack_dp(wgt, val, cap)\n  n = wgt.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(n + 1) { Array.new(cap + 1, 0) }\n  # \u72c0\u614b\u8f49\u79fb\n  for i in 1...(n + 1)\n    for c in 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] = [dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]].max\n      end\n    end\n  end\n  dp[n][cap]\nend\n\n### \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 ##3\ndef unbounded_knapsack_dp_comp(wgt, val, cap)\n  n = wgt.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(cap + 1, 0)\n  # \u72c0\u614b\u8f49\u79fb\n  for i in 1...(n + 1)\n    # \u6b63\u5e8f\u8d70\u8a2a\n    for c in 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] = [dp[c], dp[c - wgt[i - 1]] + val[i - 1]].max\n      end\n    end\n  end\n  dp[cap]\nend\n
    unbounded_knapsack.zig
    // \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\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
    ### \u96f6\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 ###\ndef coin_change_dp(coins, amt)\n  n = coins.length\n  _MAX = amt + 1\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(n + 1) { Array.new(amt + 1, 0) }\n  # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n  (1...(amt + 1)).each { |a| dp[0][a] = _MAX }\n  # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n  for i in 1...(n + 1)\n    for a in 1...(amt + 1)\n      if coins[i - 1] > a\n        # \u82e5\u8d85\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 - coins[i - 1]] + 1].min\n      end\n    end\n  end\n  dp[n][amt] != _MAX ? dp[n][amt] : -1\nend\n
    coin_change.zig
    // \u96f6\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\u7a7a\u9593\u6700\u4f73\u5316\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\u7a7a\u9593\u6700\u4f73\u5316\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
    ### \u96f6\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 ###\ndef coin_change_dp_comp(coins, amt)\n  n = coins.length\n  _MAX = amt + 1\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(amt + 1, _MAX)\n  dp[0] = 0\n  # \u72c0\u614b\u8f49\u79fb\n  for i in 1...(n + 1)\n    # \u6b63\u5e8f\u8d70\u8a2a\n    for a in 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] = [dp[a], dp[a - coins[i - 1]] + 1].min\n      end\n    end\n  end\n  dp[amt] != _MAX ? dp[amt] : -1\nend\n
    coin_change.zig
    // \u96f6\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
    ### \u96f6\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 ###\ndef coin_change_ii_dp(coins, amt)\n  n = coins.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(n + 1) { Array.new(amt + 1, 0) }\n  # \u521d\u59cb\u5316\u9996\u5217\n  (0...(n + 1)).each { |i| dp[i][0] = 1 }\n  # \u72c0\u614b\u8f49\u79fb\n  for i in 1...(n + 1)\n    for a in 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      end\n    end\n  end\n  dp[n][amt]\nend\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\u7a7a\u9593\u6700\u4f73\u5316\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\u7a7a\u9593\u6700\u4f73\u5316\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
    ### \u96f6\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 ###\ndef coin_change_ii_dp_comp(coins, amt)\n  n = coins.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(amt + 1, 0)\n  dp[0] = 1\n  # \u72c0\u614b\u8f49\u79fb\n  for i in 1...(n + 1)\n    # \u6b63\u5e8f\u8d70\u8a2a\n    for a in 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      end\n    end\n  end\n  dp[amt]\nend\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

    • \u5728\u7c21\u55ae\u5716\u4e2d\uff0c\u9802\u9ede\u4e0d\u80fd\u8207\u81ea\u8eab\u76f8\u9023\uff0c\u6b64\u6642\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
    ### \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 ###\nclass GraphAdjMat\n  def initialize(vertices, edges)\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    @vertices = []\n    # \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    @adj_mat = []\n    # \u65b0\u589e\u9802\u9ede\n    vertices.each { |val| 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    edges.each { |e| add_edge(e[0], e[1]) }\n  end\n\n  ### \u7372\u53d6\u9802\u9ede\u6578\u91cf ###\n  def size\n    @vertices.length\n  end\n\n  ### \u65b0\u589e\u9802\u9ede ###\n  def add_vertex(val)\n    n = size\n    # \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n    @vertices << val\n    # \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n    new_row = Array.new(n, 0)\n    @adj_mat << new_row\n    # \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n    @adj_mat.each { |row| row << 0 }\n  end\n\n  ### \u522a\u9664\u9802\u9ede ###\n  def remove_vertex(index)\n    raise IndexError if index >= size\n\n    # \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n    @vertices.delete_at(index)\n    # \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n    @adj_mat.delete_at(index)\n    # \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n    @adj_mat.each { |row| row.delete_at(index) }\n  end\n\n  ### \u65b0\u589e\u908a ###\n  def add_edge(i, j)\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 || j < 0 || i >= size || j >= size || i == j\n      raise IndexError\n    end\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    @adj_mat[i][j] = 1\n    @adj_mat[j][i] = 1\n  end\n\n  ### \u522a\u9664\u908a ###\n  def remove_edge(i, j)\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 || j < 0 || i >= size || j >= size || i == j\n      raise IndexError\n    end\n    @adj_mat[i][j] = 0\n    @adj_mat[j][i] = 0\n  end\n\n  ### \u5217\u5370\u9130\u63a5\u77e9\u9663 ###\n  def __print__\n    puts \"\u9802\u9ede\u4e32\u5217 = #{@vertices}\"\n    puts '\u9130\u63a5\u77e9\u9663 ='\n    print_matrix(@adj_mat)\n  end\nend\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
    ### \u57fa\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 ###\nclass GraphAdjList\n  attr_reader :adj_list\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize(edges)\n    # \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    @adj_list = {}\n    # \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\n    for edge in edges\n      add_vertex(edge[0])\n      add_vertex(edge[1])\n      add_edge(edge[0], edge[1])\n    end\n  end\n\n  ### \u7372\u53d6\u9802\u9ede\u6578\u91cf ###\n  def size\n    @adj_list.length\n  end\n\n  ### \u65b0\u589e\u908a ###\n  def add_edge(vet1, vet2)\n    raise ArgumentError if !@adj_list.include?(vet1) || !@adj_list.include?(vet2)\n\n    @adj_list[vet1] << vet2\n    @adj_list[vet2] << vet1\n  end\n\n  ### \u522a\u9664\u908a ###\n  def remove_edge(vet1, vet2)\n    raise ArgumentError if !@adj_list.include?(vet1) || !@adj_list.include?(vet2)\n\n    # \u522a\u9664\u908a vet1 - vet2\n    @adj_list[vet1].delete(vet2)\n    @adj_list[vet2].delete(vet1)\n  end\n\n  ### \u65b0\u589e\u9802\u9ede ###\n  def add_vertex(vet)\n    return if @adj_list.include?(vet)\n\n    # \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n    @adj_list[vet] = []\n  end\n\n  ### \u522a\u9664\u9802\u9ede ###\n  def remove_vertex(vet)\n    raise ArgumentError unless @adj_list.include?(vet)\n\n    # \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n    @adj_list.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 vertex in @adj_list\n      @adj_list[vertex.first].delete(vet) if @adj_list[vertex.first].include?(vet)\n    end\n  end\n\n  ### \u5217\u5370\u9130\u63a5\u8868 ###\n  def __print__\n    puts '\u9130\u63a5\u8868 ='\n    for vertex in @adj_list\n      tmp = @adj_list[vertex.first].map { |v| v.val }\n      puts \"#{vertex.first.val}: #{tmp},\"\n    end\n  end\nend\n
    graph_adjacency_list.zig
    [class]{GraphAdjList}-[func]{}\n
    \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\u96c6\u5408 visited \u4f86\u8a18\u9304\u54ea\u4e9b\u7bc0\u9ede\u5df2\u88ab\u8a2a\u554f\u3002

    Tip

    \u96dc\u6e4a\u96c6\u5408\u53ef\u4ee5\u770b\u4f5c\u4e00\u500b\u53ea\u5132\u5b58 key \u800c\u4e0d\u5132\u5b58 value \u7684\u96dc\u6e4a\u8868\uff0c\u5b83\u53ef\u4ee5\u5728 \\(O(1)\\) \u6642\u9593\u8907\u96dc\u5ea6\u4e0b\u9032\u884c key \u7684\u589e\u522a\u67e5\u6539\u64cd\u4f5c\u3002\u6839\u64da key \u7684\u552f\u4e00\u6027\uff0c\u96dc\u6e4a\u96c6\u5408\u901a\u5e38\u7528\u65bc\u8cc7\u6599\u53bb\u91cd\u7b49\u5834\u666f\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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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
    ### \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a ###\ndef graph_bfs(graph, start_vet)\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\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n  visited = Set.new([start_vet])\n  # \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n  que = [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.length > 0\n    vet = que.shift # \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n    res << 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      next if visited.include?(adj_vet) # \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n      que << 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    end\n  end\n  # \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n  res\nend\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\u96c6\u5408 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\u96c6\u5408 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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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
    ### \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f ###\ndef dfs(graph, visited, res, vet)\n  res << 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 adj_vet in graph.adj_list[vet]\n    next if visited.include?(adj_vet) # \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n    # \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n    dfs(graph, visited, res, adj_vet)\n  end\nend\n\n### \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a ###\ndef graph_dfs(graph, start_vet)\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\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n  visited = Set.new\n  dfs(graph, visited, res, start_vet)\n  res\nend\n
    graph_dfs.zig
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{graphDFS}\n
    \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\u96c6\u5408 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
    ### \u7269\u54c1 ###\nclass Item\n  attr_accessor :w # \u7269\u54c1\u91cd\u91cf\n  attr_accessor :v # \u7269\u54c1\u50f9\u503c\n\n  def initialize(w, v)\n    @w = w\n    @v = v\n  end\nend\n\n### \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a ###\ndef fractional_knapsack(wgt, val, cap)\n  # \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\uff0c\u50f9\u503c\n  items = wgt.each_with_index.map { |w, i| Item.new(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.to_f / b.w) <=> (a.v.to_f / a.w) }\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.to_f / item.w) * cap\n      # \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\n      break\n    end\n  end\n  res\nend\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
    ### \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a ###\ndef coin_change_greedy(coins, amt)\n  # \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n  i = coins.length - 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 && coins[i] > amt\n      i -= 1\n    end\n    # \u9078\u64c7 coins[i]\n    amt -= coins[i]\n    count += 1\n  end\n  # \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c \u5247\u8fd4\u56de -1\n  amt == 0 ? count : -1\nend\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
    ### \u6700\u5927\u5bb9\u91cf\uff1a\u8caa\u5a6a ###\ndef max_capacity(ht)\n  # \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n  i, j = 0, ht.length - 1\n  # \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n  res = 0\n\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 = [ht[i], ht[j]].min * (j - i)\n    res = [res, cap].max\n    # \u5411\u5167\u79fb\u52d5\u77ed\u677f\n    if ht[i] < ht[j]\n      i += 1\n    else\n      j -= 1\n    end\n  end\n\n  res\nend\n
    max_capacity.zig
    [class]{}-[func]{maxCapacity}\n
    \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
    ### \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a ###\ndef max_product_cutting(n)\n  # \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n  return 1 * (n - 1) if n <= 3\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  # \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n  return (3.pow(a - 1) * 2 * 2).to_i if b == 1\n  # \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n  return (3.pow(a) * 2).to_i if b == 2\n  # \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n  3.pow(a).to_i\nend\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 **)calloc(hashMap->capacity, sizeof(Pair *));\n    hashMap->TOMBSTONE = (Pair *)malloc(sizeof(Pair));\n    hashMap->TOMBSTONE->key = -1;\n    hashMap->TOMBSTONE->val = \"-1\";\n\n    return hashMap;\n}\n\n/* \u6790\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 **)calloc(hashMap->capacity, sizeof(Pair *));\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
    ### \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d ###\ndef initialize(nums)\n  # \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n  @max_heap = nums\n  # \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n  parent(size - 1).downto(0) do |i|\n    sift_down(i)\n  end\nend\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 Comparer \u5373\u53ef\uff09\nPriorityQueue<int, int> maxHeap = new(Comparer<int>.Create((x, y) => y.CompareTo(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
    # Ruby \u672a\u63d0\u4f9b\u5167\u5efa Heap \u985e\u5225\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\u9032\u884c\u9006\u8f49\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
    ### \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 ###\ndef left(i)\n  2 * i + 1\nend\n\n### \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 ###\ndef right(i)\n  2 * i + 2\nend\n\n### \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 ###\ndef parent(i)\n  (i - 1) / 2     # \u5411\u4e0b\u6574\u9664\nend\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
    ### \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 ###\ndef peek\n  @max_heap[0]\nend\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
    ### \u5143\u7d20\u5165\u5806\u7a4d ###\ndef push(val)\n  # \u65b0\u589e\u7bc0\u9ede\n  @max_heap << val\n  # \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n  sift_up(size - 1)\nend\n\n### \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 ###\ndef sift_up(i)\n  loop do\n    # \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n    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    break if p < 0 || @max_heap[i] <= @max_heap[p]\n    # \u4ea4\u63db\u5169\u7bc0\u9ede\n    swap(i, p)\n    # \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n    i = p\n  end\nend\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.pop().unwrap();\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
    ### \u5143\u7d20\u51fa\u5806\u7a4d ###\ndef pop\n  # \u5224\u7a7a\u8655\u7406\n  raise IndexError, \"\u5806\u7a4d\u70ba\u7a7a\" if 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  swap(0, size - 1)\n  # \u522a\u9664\u7bc0\u9ede\n  val = @max_heap.pop\n  # \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n  sift_down(0)\n  # \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n  val\nend\n\n### \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 ###\ndef sift_down(i)\n  loop do\n    # \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n    l, r, ma = left(i), right(i), i\n    ma = l if l < size && @max_heap[l] > @max_heap[ma]\n    ma = r if r < size && @max_heap[r] > @max_heap[ma]\n\n    # \u82e5\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    break if ma == i\n\n    # \u4ea4\u63db\u5169\u7bc0\u9ede\n    swap(i, ma)\n    # \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n    i = ma\n  end\nend\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\u5806\u7a4d\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
    ### \u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 ###\ndef top_k_heap(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  max_heap = MaxHeap.new([])\n\n  # \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n  for i in 0...k\n    push_min_heap(max_heap, nums[i])\n  end\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.length\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] > peek_min_heap(max_heap)\n      pop_min_heap(max_heap)\n      push_min_heap(max_heap, nums[i])\n    end\n  end\n\n  get_min_heap(max_heap)\nend\n
    top_k.zig
    [class]{}-[func]{topKHeap}\n
    \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\u70ba\u8cc7\u6599\u7d50\u69cb\u6ce8\u5165\u751f\u547d\u529b\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/summary/#1-q-a","title":"1. \u00a0 Q & A","text":"

    Q\uff1a\u4f5c\u70ba\u4e00\u540d\u7a0b\u5f0f\u8a2d\u8a08\u5e2b\uff0c\u6211\u5728\u65e5\u5e38\u5de5\u4f5c\u4e2d\u5f9e\u672a\u7528\u6f14\u7b97\u6cd5\u89e3\u6c7a\u904e\u554f\u984c\uff0c\u5e38\u7528\u6f14\u7b97\u6cd5\u90fd\u88ab\u7a0b\u5f0f\u8a9e\u8a00\u5c01\u88dd\u597d\u4e86\uff0c\u76f4\u63a5\u7528\u5c31\u53ef\u4ee5\u4e86\uff1b\u9019\u662f\u5426\u610f\u5473\u8457\u6211\u5011\u5de5\u4f5c\u4e2d\u7684\u554f\u984c\u9084\u6c92\u6709\u5230\u9054\u9700\u8981\u6f14\u7b97\u6cd5\u7684\u7a0b\u5ea6\uff1f

    \u5982\u679c\u628a\u5177\u9ad4\u7684\u5de5\u4f5c\u6280\u80fd\u6bd4\u4f5c\u662f\u6b66\u529f\u7684\u201c\u62db\u5f0f\u201d\u7684\u8a71\uff0c\u90a3\u9ebc\u57fa\u790e\u79d1\u76ee\u61c9\u8a72\u66f4\u50cf\u662f\u201c\u5167\u529f\u201d\u3002

    \u6211\u8a8d\u70ba\u5b78\u6f14\u7b97\u6cd5\uff08\u4ee5\u53ca\u5176\u4ed6\u57fa\u790e\u79d1\u76ee\uff09\u7684\u610f\u7fa9\u4e0d\u662f\u5728\u65bc\u5728\u5de5\u4f5c\u4e2d\u5f9e\u96f6\u5be6\u73fe\u5b83\uff0c\u800c\u662f\u57fa\u65bc\u5b78\u5230\u7684\u77e5\u8b58\uff0c\u5728\u89e3\u6c7a\u554f\u984c\u6642\u80fd\u5920\u4f5c\u51fa\u5c08\u696d\u7684\u53cd\u61c9\u548c\u5224\u65b7\uff0c\u5f9e\u800c\u63d0\u5347\u5de5\u4f5c\u7684\u6574\u9ad4\u8cea\u91cf\u3002\u8209\u4e00\u500b\u7c21\u55ae\u4f8b\u5b50\uff0c\u6bcf\u7a2e\u7a0b\u5f0f\u8a9e\u8a00\u90fd\u5167\u5efa\u4e86\u6392\u5e8f\u51fd\u5f0f\uff1a

    • \u5982\u679c\u6211\u5011\u6c92\u6709\u5b78\u904e\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\uff0c\u90a3\u9ebc\u7d66\u5b9a\u4efb\u4f55\u8cc7\u6599\uff0c\u6211\u5011\u53ef\u80fd\u90fd\u585e\u7d66\u9019\u500b\u6392\u5e8f\u51fd\u5f0f\u53bb\u505a\u4e86\u3002\u57f7\u884c\u9806\u66a2\u3001\u6548\u80fd\u4e0d\u932f\uff0c\u770b\u4e0a\u53bb\u4e26\u6c92\u6709\u4ec0\u9ebc\u554f\u984c\u3002
    • \u4f46\u5982\u679c\u5b78\u904e\u6f14\u7b97\u6cd5\uff0c\u6211\u5011\u5c31\u6703\u77e5\u9053\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u662f \\(O(n \\log n)\\) \uff1b\u800c\u5982\u679c\u7d66\u5b9a\u7684\u8cc7\u6599\u662f\u56fa\u5b9a\u4f4d\u6578\u7684\u6574\u6578\uff08\u4f8b\u5982\u5b78\u865f\uff09\uff0c\u90a3\u9ebc\u6211\u5011\u5c31\u53ef\u4ee5\u7528\u6548\u7387\u66f4\u9ad8\u7684\u201c\u57fa\u6578\u6392\u5e8f\u201d\u4f86\u505a\uff0c\u5c07\u6642\u9593\u8907\u96dc\u5ea6\u964d\u70ba \\(O(nk)\\) \uff0c\u5176\u4e2d \\(k\\) \u70ba\u4f4d\u6578\u3002\u7576\u8cc7\u6599\u9ad4\u91cf\u5f88\u5927\u6642\uff0c\u7bc0\u7701\u51fa\u4f86\u7684\u57f7\u884c\u6642\u9593\u5c31\u80fd\u5275\u9020\u8f03\u5927\u50f9\u503c\uff08\u6210\u672c\u964d\u4f4e\u3001\u9ad4\u9a57\u8b8a\u597d\u7b49\uff09\u3002

    \u5728\u5de5\u7a0b\u9818\u57df\u4e2d\uff0c\u5927\u91cf\u554f\u984c\u662f\u96e3\u4ee5\u9054\u5230\u6700\u512a\u89e3\u7684\uff0c\u8a31\u591a\u554f\u984c\u53ea\u662f\u88ab\u201c\u5dee\u4e0d\u591a\u201d\u5730\u89e3\u6c7a\u4e86\u3002\u554f\u984c\u7684\u96e3\u6613\u7a0b\u5ea6\u4e00\u65b9\u9762\u53d6\u6c7a\u65bc\u554f\u984c\u672c\u8eab\u7684\u6027\u8cea\uff0c\u53e6\u4e00\u65b9\u9762\u4e5f\u53d6\u6c7a\u65bc\u89c0\u6e2c\u554f\u984c\u7684\u4eba\u7684\u77e5\u8b58\u5132\u5099\u3002\u4eba\u7684\u77e5\u8b58\u8d8a\u5b8c\u5099\u3001\u7d93\u9a57\u8d8a\u591a\uff0c\u5206\u6790\u554f\u984c\u5c31\u6703\u8d8a\u6df1\u5165\uff0c\u554f\u984c\u5c31\u80fd\u88ab\u89e3\u6c7a\u5f97\u66f4\u512a\u96c5\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\u7d44\u7e54\u548c\u5132\u5b58\u8cc7\u6599\u7684\u65b9\u5f0f\uff0c\u6db5\u84cb\u8cc7\u6599\u5167\u5bb9\u3001\u8cc7\u6599\u4e4b\u9593\u95dc\u4fc2\u548c\u8cc7\u6599\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5b83\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\u70ba\u8cc7\u6599\u7d50\u69cb\u6ce8\u5165\u751f\u547d\u529b\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\u5167\u5bb9\u6e05\u6670\u6613\u61c2\u3001\u5b78\u7fd2\u66f2\u7dda\u5e73\u6ed1\uff0c\u5f15\u5c0e\u521d\u5b78\u8005\u63a2\u7d22\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u77e5\u8b58\u5730\u5716\u3002
    • \u6e90\u7a0b\u5f0f\u78bc\u53ef\u4e00\u9375\u57f7\u884c\uff0c\u5e6b\u52a9\u8b80\u8005\u5728\u7df4\u7fd2\u4e2d\u63d0\u5347\u7a0b\u5f0f\u8a2d\u8a08\u6280\u80fd\uff0c\u77ad\u89e3\u6f14\u7b97\u6cd5\u5de5\u4f5c\u539f\u7406\u548c\u8cc7\u6599\u7d50\u69cb\u5e95\u5c64\u5be6\u73fe\u3002
    • \u63d0\u5021\u8b80\u8005\u4e92\u52a9\u5b78\u7fd2\uff0c\u6b61\u8fce\u5927\u5bb6\u5728\u8a55\u8ad6\u5340\u63d0\u51fa\u554f\u984c\u8207\u5206\u4eab\u898b\u89e3\uff0c\u5728\u4ea4\u6d41\u8a0e\u8ad6\u4e2d\u5171\u540c\u9032\u6b65\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\u3001coderonion\u3001Gonglja\u3001nuomi1\u3001Reanon\u3001justin-tse\u3001hpstory\u3001danielsss\u3001curtishd\u3001night-cruise\u3001S-N-O-R-L-A-X\u3001msk397\u3001gvenusleo\u3001khoaxuantu\u3001RiverTwilight\u3001rongyi\u3001gyt95\u3001zhuoqinyue\u3001K3v123\u3001Zuoxun\u3001mingXta\u3001hello-ikun\u3001FangYuan33\u3001GN-Yu\u3001yuelinxin\u3001longsizhuo\u3001Cathay-Chen\u3001guowei-gong\u3001xBLACKICEx\u3001IsChristina\u3001JoseHung\u3001qualifier1024\u3001QiLOL\u3001pengchzn\u3001Guanngxu\u3001L-Super\u3001WSL0809\u3001Slone123c\u3001lhxsm\u3001yuan0221\u3001what-is-me\u3001theNefelibatas\u3001longranger2\u3001cy-by-side\u3001xiongsp\u3001JeffersonHuang\u3001Transmigration-zhou\u3001magentaqin\u3001Wonderdch\u3001malone6\u3001xiaomiusa87\u3001gaofer\u3001bluebean-cloud\u3001a16su\u3001Shyam-Chen\u3001nanlei\u3001hongyun-robot\u3001Phoenix0415\u3001MolDuM\u3001Nigh\u3001he-weilai\u3001junminhong\u3001mgisr\u3001iron-irax\u3001yd-j\u3001XiaChuerwu\u3001XC-Zero\u3001seven1240\u3001SamJin98\u3001wodray\u3001reeswell\u3001NI-SW\u3001Horbin-Magician\u3001Enlightenus\u3001xjr7670\u3001YangXuanyi\u3001DullSword\u3001boloboloda\u3001iStig\u3001qq909244296\u3001jiaxianhua\u3001wenjianmin\u3001keshida\u3001kilikilikid\u3001lclc6\u3001lwbaptx\u3001liuxjerry\u3001lucaswangdev\u3001lyl625760\u3001hts0000\u3001gledfish\u3001fbigm\u3001echo1937\u3001szu17dmy\u3001dshlstarr\u3001Yucao-cy\u3001coderlef\u3001czruby\u3001bongbongbakudan\u3001beintentional\u3001ZongYangL\u3001ZhongYuuu\u3001luluxia\u3001xb534\u3001bitsmi\u3001ElaBosak233\u3001baagod\u3001zhouLion\u3001yishangzhang\u3001yi427\u3001yabo083\u3001weibk\u3001wangwang105\u3001th1nk3r-ing\u3001tao363\u30014yDX3906\u3001syd168\u3001steventimes\u3001sslmj2020\u3001smilelsb\u3001siqyka\u3001selear\u3001sdshaoda\u3001Xi-Row\u3001popozhu\u3001nuquist19\u3001noobcodemaker\u3001XiaoK29\u3001chadyi\u3001ZhongGuanbin\u3001shanghai-Jerry\u3001JackYang-hellobobo\u3001Javesun99\u3001lipusheng\u3001BlindTerran\u3001ShiMaRing\u3001FreddieLi\u3001FloranceYeh\u3001iFleey\u3001fanchenggang\u3001gltianwen\u3001goerll\u3001Dr-XYZ\u3001nedchu\u3001curly210102\u3001CuB3y0nd\u3001KraHsu\u3001CarrotDLaw\u3001youshaoXG\u3001bubble9um\u3001fanenr\u3001eagleanurag\u3001LifeGoesOnionOnionOnion\u300152coder\u3001foursevenlove\u3001KorsChen\u3001hezhizhen\u3001linzeyan\u3001ZJKung\u3001GaochaoZhu\u3001hopkings2008\u3001yang-le\u3001Evilrabbit520\u3001Turing-1024-Lee\u3001thomasq0\u3001Suremotoo\u3001Allen-Scai\u3001Risuntsy\u3001Richard-Zhang1019\u3001qingpeng9802\u3001primexiao\u3001nidhoggfgg\u30011ch0\u3001MwumLi\u3001martinx\u3001ZnYang2018\u3001hugtyftg\u3001logan-qiu\u3001psychelzh\u3001Keynman\u3001KeiichiKasai\u30010130w \u3002

    \u672c\u66f8\u7684\u7a0b\u5f0f\u78bc\u5be9\u95b1\u5de5\u4f5c\u7531 coderonion\u3001curtishd\u3001Gonglja\u3001gvenusleo\u3001hpstory\u3001justin-tse\u3001khoaxuantu\u3001krahets\u3001night-cruise\u3001nuomi1\u3001Reanon \u548c rongyi \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; j < size; j++ {\n            if nums[i]+nums[j] == target {\n                return []int{i, j}\n            }\n        }\n    }\n    return nil\n}\n
    two_sum.swift
    /* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\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                nums.swap(j, j + 1);\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
    ### \u6ce1\u6cab\u6392\u5e8f ###\ndef bubble_sort(nums)\n  n = nums.length\n  # \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n  for i in (n - 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        nums[j], nums[j + 1] = nums[j + 1], nums[j]\n      end\n    end\n  end\nend\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                nums.swap(j, 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}\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
    ### \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09###\ndef bubble_sort_with_flag(nums)\n  n = nums.length\n  # \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n  for i in (n - 1).downto(1)\n    flag = false # \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n\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[j], nums[j + 1] = nums[j + 1], nums[j]\n        flag = true # \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n      end\n    end\n\n    break unless flag # \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n  end\nend\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 &num in nums.iter() {\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 buckets.iter() {\n        for &num in bucket.iter() {\n            nums[i] = num;\n            i += 1;\n        }\n    }\n}\n
    bucket_sort.c
    /* \u6876\u6392\u5e8f */\nvoid bucketSort(float nums[], int n) {\n    int k = n / 2;                                 // \u521d\u59cb\u5316 k = n/2 \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
    ### \u6876\u6392\u5e8f ###\ndef bucket_sort(nums)\n  # \u521d\u59cb\u5316 k = n/2 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\u5143\u7d20\n  k = nums.length / 2\n  buckets = Array.new(k) { [] }\n\n  # 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n  nums.each do |num|\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 = (num * k).to_i\n    # \u5c07 num \u65b0\u589e\u9032\u6876 i\n    buckets[i] << num\n  end\n\n  # 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n  buckets.each do |bucket|\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  end\n\n  # 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\u679c\n  i = 0\n  buckets.each do |bucket|\n    bucket.each do |num|\n      nums[i] = num\n      i += 1\n    end\n  end\nend\n
    bucket_sort.zig
    [class]{}-[func]{bucketSort}\n
    \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\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.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.iter() {\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
    ### \u8a08\u6578\u6392\u5e8f ###\ndef counting_sort_naive(nums)\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  nums.each { |num| m = [m, num].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  counter = Array.new(m + 1, 0)\n  nums.each { |num| 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 0...(m + 1)\n    (0...counter[num]).each do\n      nums[i] = num\n      i += 1\n    end\n  end\nend\n
    counting_sort.zig
    [class]{}-[func]{countingSortNaive}\n
    \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.iter().max().unwrap() as usize;\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 + 1];\n    for &num in nums.iter() {\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 {\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    nums.copy_from_slice(&res)\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(res);\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
    ### \u8a08\u6578\u6392\u5e8f ###\ndef counting_sort(nums)\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 = 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  counter = Array.new(m + 1, 0)\n  nums.each { |num| 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  (0...m).each { |i| counter[i + 1] += counter[i] }\n  # 4. \u5012\u5e8f\u8d70\u8a2a nums, \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 = nums.length\n  res = Array.new(n, 0)\n  (n - 1).downto(0).each do |i|\n    num = nums[i]\n    res[counter[num] - 1] = num # \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  end\n  # \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n  (0...n).each { |i| nums[i] = res[i] }\nend\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)\\)\u3001\u975e\u81ea\u9069\u61c9\u6392\u5e8f \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        nums.swap(i, ma);\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).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()).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        nums.swap(0, i);\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
    ### \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 ###\ndef sift_down(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    l = 2 * i + 1\n    r = 2 * i + 2\n    ma = i\n    ma = l if l < n && nums[l] > nums[ma]\n    ma = r if r < n && nums[r] > nums[ma]\n    # \u82e5\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    break if ma == i\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  end\nend\n\n### \u5806\u7a4d\u6392\u5e8f ###\ndef heap_sort(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  (nums.length / 2 - 1).downto(0) do |i|\n    sift_down(nums, nums.length, i)\n  end\n  # \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n  (nums.length - 1).downto(1) do |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    sift_down(nums, i, 0)\n  end\nend\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 - left) / 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 - left) / 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 - left) / 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 - left) / 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 - left) / 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 - left) / 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 - left) / 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 - left) ~/ 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 - left) / 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 - left) / 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 - left) / 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
    ### \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 ###\ndef 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  tmp = Array.new(right - left + 1, 0)\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 && j <= right\n    if nums[i] <= nums[j]\n      tmp[k] = nums[i]\n      i += 1\n    else\n      tmp[k] = nums[j]\n      j += 1\n    end\n    k += 1\n  end\n  # \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  end\n  while j <= right\n    tmp[k] = nums[j]\n    j += 1\n    k += 1\n  end\n  # \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n  (0...tmp.length).each do |k|\n    nums[left + k] = tmp[k]\n  end\nend\n\n### \u5408\u4f75\u6392\u5e8f ###\ndef merge_sort(nums, left, right)\n  # \u7d42\u6b62\u689d\u4ef6\n  # \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n  return if left >= right\n  # \u5283\u5206\u968e\u6bb5\n  mid = left + (right - left) / 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)\nend\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 - left) / 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
    /* \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], nums[j]); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums[i], nums[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
    ### \u54e8\u5175\u5283\u5206 ###\ndef partition(nums, left, right)\n  # \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n  i, 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    end\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    end\n    # \u5143\u7d20\u4ea4\u63db\n    nums[i], nums[j] = nums[j], nums[i]\n  end\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  i # \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\nend\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
    ### \u5feb\u901f\u6392\u5e8f\u985e\u5225 ###\ndef quick_sort(nums, left, right)\n  # \u5b50\u9663\u5217\u9577\u5ea6\u4e0d\u70ba 1 \u6642\u905e\u8ff4\n  if left < right\n    # \u54e8\u5175\u5283\u5206\n    pivot = partition(nums, left, right)\n    # \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\n    quick_sort(nums, left, pivot - 1)\n    quick_sort(nums, pivot + 1, right)\n  end\n  nums\nend\n
    quick_sort.zig
    // \u5feb\u901f\u6392\u5e8f\nfn quickSort(nums: []i32, left: usize, right: usize) void {\n    // \u5b50\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\u975e\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], nums[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], nums[j]); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums[i], nums[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 - left) / 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
    ### \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 ###\ndef median_three(nums, left, mid, right)\n  # \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n  _l, _m, _r = nums[left], nums[mid], nums[right]\n  # m \u5728 l \u548c r \u4e4b\u9593\n  return mid if (_l <= _m && _m <= _r) || (_r <= _m && _m <= _l)\n  # l \u5728 m \u548c r \u4e4b\u9593\n  return left if (_m <= _l && _l <= _r) || (_r <= _l && _l <= _m)\n  return right\nend\n\n### \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09###\ndef partition(nums, left, right)\n  ### \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n  med = median_three(nums, left, (left + right) / 2, right)\n  # \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u65b7\n  nums[left], nums[med] = nums[med], nums[left]\n  i, j = left, right\n  while i < j\n    while i < j && nums[j] >= nums[left]\n      j -= 1 # \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n    end\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    end\n    # \u5143\u7d20\u4ea4\u63db\n    nums[i], nums[j] = nums[j], nums[i]\n  end\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  i # \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\nend\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
    ### \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09###\ndef quick_sort(nums, left, right)\n  # \u5b50\u9663\u5217\u9577\u5ea6\u4e0d\u70ba 1 \u6642\u905e\u8ff4\n  while left < right\n    # \u54e8\u5175\u5283\u5206\n    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      quick_sort(nums, left, pivot - 1)\n      left = pivot + 1 # \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n    else\n      quick_sort(nums, pivot + 1, right)\n      right = pivot - 1 # \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n    end\n  end\nend\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    nums.copy_from_slice(&res);\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    memset(counter, 0, sizeof(int) * 10); // \u521d\u59cb\u5316\u70ba 0 \u4ee5\u652f\u6301\u5f8c\u7e8c\u8a18\u61b6\u9ad4\u91cb\u653e\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    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(res);\n    free(counter);\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 (int i = 0; i < size; 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
    ### \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) ###\ndef digit(num, exp)\n  # \u8f49\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\nend\n\n### \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09###\ndef counting_sort_digit(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  counter = Array.new(10, 0)\n  n = nums.length\n  # \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n  for i in 0...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  end\n  # \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n  (1...10).each { |i| 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 = Array.new(n, 0)\n  for i in (n - 1).downto(0)\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  end\n  # \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n  (0...n).each { |i| nums[i] = res[i] }\nend\n\n### \u57fa\u6578\u6392\u5e8f ###\ndef radix_sort(nums)\n  # \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n  m = nums.max\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  end\nend\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)\\)\u3001\u975e\u81ea\u9069\u61c9\u6392\u5e8f\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
    ### \u9078\u64c7\u6392\u5e8f ###\ndef selection_sort(nums)\n  n = nums.length\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    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      end\n    end\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  end\nend\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\u80fd\u5920\u5229\u7528\u8f38\u5165\u8cc7\u6599\u5df2\u6709\u7684\u9806\u5e8f\u8cc7\u8a0a\u4f86\u6e1b\u5c11\u8a08\u7b97\u91cf\uff0c\u9054\u5230\u66f4\u512a\u7684\u6642\u9593\u6548\u7387\u3002\u81ea\u9069\u61c9\u6392\u5e8f\u6f14\u7b97\u6cd5\u7684\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6\u901a\u5e38\u512a\u65bc\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\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\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\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\ndeq: deque[int] = deque()\n\n# \u5143\u7d20\u5165\u5217\ndeq.append(2)      # \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeq.append(5)\ndeq.append(4)\ndeq.appendleft(3)  # \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeq.appendleft(1)\n\n# \u8a2a\u554f\u5143\u7d20\nfront: int = deq[0]  # \u4f47\u5217\u9996\u5143\u7d20\nrear: int = deq[-1]  # \u4f47\u5217\u5c3e\u5143\u7d20\n\n# \u5143\u7d20\u51fa\u5217\npop_front: int = deq.popleft()  # \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\npop_rear: int = deq.pop()       # \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n\n# \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\nsize: int = len(deq)\n\n# \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a\nis_empty: bool = len(deq) == 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    if num == nil {\n        return nil\n    }\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    if num == nil {\n        return nil\n    }\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\n/* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\nint *toArray(ArrayDeque *deque, int *queSize) {\n    *queSize = deque->queSize;\n    int *res = (int *)calloc(deque->queSize, sizeof(int));\n    int j = deque->front;\n    for (int i = 0; i < deque->queSize; i++) {\n        res[i] = deque->nums[j % deque->queCapacity];\n        j++;\n    }\n    return res;\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    if num == nil {\n        return nil\n    }\n\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\n/* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\nint *toArray(ArrayQueue *queue, int *queSize) {\n    *queSize = queue->queSize;\n    int *res = (int *)calloc(queue->queSize, sizeof(int));\n    int j = queue->front;\n    for (int i = 0; i < queue->queSize; i++) {\n        res[i] = queue->nums[j % queue->queCapacity];\n        j++;\n    }\n    return res;\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
    ### \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a ###\n# \u4f7f\u7528 nil \u4f86\u8868\u793a\u7a7a\u4f4d\ntree = [1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15]\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 | None:\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        self.tree.iter().filter_map(|&x| x).collect()\n    }\n\n    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n    fn dfs(&self, i: i32, order: &'static 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
    ### \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 ###\nclass ArrayBinaryTree\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize(arr)\n    @tree = arr.to_a\n  end\n\n  ### \u4e32\u5217\u5bb9\u91cf ###\n  def size\n    @tree.length\n  end\n\n  ### \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c ###\n  def val(i)\n    # \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de nil \uff0c\u4ee3\u8868\u7a7a\u4f4d\n    return if i < 0 || i >= size\n\n    @tree[i]\n  end\n\n  ### \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 ###\n  def left(i)\n    2 * i + 1\n  end\n\n  ### \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 ###\n  def right(i)\n    2 * i + 2\n  end\n\n  ### \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 ###\n  def parent(i)\n    (i - 1) / 2\n  end\n\n  ### \u5c64\u5e8f\u8d70\u8a2a ###\n  def level_order\n    @res = []\n\n    # \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\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\u512a\u5148\u8d70\u8a2a ###\n  def dfs(i, order)\n    return if val(i).nil?\n    # \u524d\u5e8f\u8d70\u8a2a\n    @res << val(i) if order == :pre\n    dfs(left(i), order)\n    # \u4e2d\u5e8f\u8d70\u8a2a\n    @res << val(i) if order == :in\n    dfs(right(i), order)\n    # \u5f8c\u5e8f\u8d70\u8a2a\n    @res << val(i) if order == :post\n  end\n\n  ### \u524d\u5e8f\u8d70\u8a2a ###\n  def pre_order\n    @res = []\n    dfs(0, :pre)\n    @res\n  end\n\n  ### \u4e2d\u5e8f\u8d70\u8a2a ###\n  def in_order\n    @res = []\n    dfs(0, :in)\n    @res\n  end\n\n  ### \u5f8c\u5e8f\u8d70\u8a2a ###\n  def post_order\n    @res = []\n    dfs(0, :post)\n    @res\n  end\nend\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 */\ntypedef 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
    ### AVL \u6a39\u7bc0\u9ede\u985e\u5225 ###\nclass TreeNode\n  attr_accessor :val    # \u7bc0\u9ede\u503c\n  attr_accessor :height # \u7bc0\u9ede\u9ad8\u5ea6\n  attr_accessor :left   # \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n  attr_accessor :right  # \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n\n  def initialize(val)\n    @val = val\n    @height = 0\n  end\nend\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
    ### \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 ###\ndef height(node)\n  # \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n  return node.height unless node.nil?\n\n  -1\nend\n\n### \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 ###\ndef update_height(node)\n  # \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n  node.height = [height(node.left), height(node.right)].max + 1\nend\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
    ### \u7372\u53d6\u5e73\u8861\u56e0\u5b50 ###\ndef balance_factor(node)\n  # \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n  return 0 if node.nil?\n\n  # \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n  height(node.left) - height(node.right)\nend\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

    Tip

    \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
    ### \u53f3\u65cb\u64cd\u4f5c ###\ndef right_rotate(node)\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  update_height(node)\n  update_height(child)\n  # \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \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
    ### \u5de6\u65cb\u64cd\u4f5c ###\ndef left_rotate(node)\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  update_height(node)\n  update_height(child)\n  # \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \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
    ### \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 ###\ndef rotate(node)\n  # \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n  balance_factor = balance_factor(node)\n  # \u5de6\u904d\u6a39\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\u5f8c\u53f3\u65cb\n      node.left = left_rotate(node.left)\n      return right_rotate(node)\n    end\n  # \u53f3\u904d\u6a39\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\u5f8c\u5de6\u65cb\n      node.right = right_rotate(node.right)\n      return left_rotate(node)\n    end\n  end\n  # \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n  node\nend\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
    ### \u63d2\u5165\u7bc0\u9ede ###\ndef insert(val)\n  @root = insert_helper(@root, val)\nend\n\n### \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09###\ndef insert_helper(node, val)\n  return TreeNode.new(val) if node.nil?\n  # 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede\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\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n  end\n  # \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n  update_height(node)\n  # 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\n  rotate(node)\nend\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
    ### \u522a\u9664\u7bc0\u9ede ###\ndef remove(val)\n  @root = remove_helper(@root, val)\nend\n\n### \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09###\ndef remove_helper(node, val)\n  return if node.nil?\n  # 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\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\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n      return if child.nil?\n      # \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\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.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\u7bc0\u9ede\u9ad8\u5ea6\n  update_height(node)\n  # 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\n  rotate(node)\nend\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
    ### \u67e5\u8a62\u7bc0\u9ede ###\ndef search(num)\n  cur = @root\n\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    # \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n    elsif cur.val > num\n      cur = cur.left\n    # \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n    else\n      break\n    end\n  end\n\n  cur\nend\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
    ### \u63d2\u5165\u7bc0\u9ede ###\ndef insert(num)\n  # \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n  if @root.nil?\n    @root = TreeNode.new(num)\n    return\n  end\n\n  # \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n  cur, pre = @root, nil\n  while !cur.nil?\n    # \u627e\u5230\u91cd\u8907\u7bc0\u9ede\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\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    end\n  end\n\n  # \u63d2\u5165\u7bc0\u9ede\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\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 tmp_val = tmp.unwrap().borrow().val;\n            // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n            self.remove(tmp_val);\n            // \u7528 tmp \u8986\u84cb cur\n            cur.borrow_mut().val = tmp_val;\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
    ### \u522a\u9664\u7bc0\u9ede ###\ndef remove(num)\n  # \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n  return if @root.nil?\n\n  # \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n  cur, pre = @root, nil\n  while !cur.nil?\n    # \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n    break if cur.val == num\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    # \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n    else\n      cur = cur.left\n    end\n  end\n  # \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n  return if cur.nil?\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    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      end\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    end\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 = cur.right\n    while !tmp.left.nil?\n      tmp = tmp.left\n    end\n    # \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n    remove(tmp.val)\n    # \u7528 tmp \u8986\u84cb cur\n    cur.val = tmp.val\n  end\nend\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
    ### \u4e8c\u5143\u6a39\u7bc0\u9ede\u985e\u5225 ###\nclass TreeNode\n  attr_accessor :val    # \u7bc0\u9ede\u503c\n  attr_accessor :left   # \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n  attr_accessor :right  # \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n\n  def initialize(val)\n    @val = val\n  end\nend\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
    # \u521d\u59cb\u5316\u4e8c\u5143\u6a39\n# \u521d\u59cb\u5316\u7bc0\u9ede\nn1 = TreeNode.new(1)\nn2 = TreeNode.new(2)\nn3 = TreeNode.new(3)\nn4 = TreeNode.new(4)\nn5 = TreeNode.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.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
    # \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede\n_p = TreeNode.new(0)\n# \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede _p\nn1.left = _p\n_p.left = n2\n# \u522a\u9664\u7bc0\u9ede\nn1.left = n2\n
    binary_tree.zig
    \n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    Tip

    \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\u8acb\u6ce8\u610f\uff0c\u5b8c\u7f8e\u4e8c\u5143\u6a39\u4e5f\u662f\u4e00\u68f5\u5b8c\u5168\u4e8c\u5143\u6a39\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
    ### \u5c64\u5e8f\u8d70\u8a2a ###\ndef level_order(root)\n  # \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n  queue = [root]\n  # \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n  res = []\n  while !queue.empty?\n    node = queue.shift # \u968a\u5217\u51fa\u968a\n    res << node.val # \u5132\u5b58\u7bc0\u9ede\u503c\n    queue << node.left unless node.left.nil? # \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n    queue << node.right unless node.right.nil? # \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n  end\n  res\nend\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    fn dfs(root: Option<&Rc<RefCell<TreeNode>>>, res: &mut Vec<i32>) {\n        if let Some(node) = root {\n            // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n            let node = node.borrow();\n            res.push(node.val);\n            dfs(node.left.as_ref(), res);\n            dfs(node.right.as_ref(), res);\n        }\n    }\n    dfs(root, &mut result);\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    fn dfs(root: Option<&Rc<RefCell<TreeNode>>>, res: &mut Vec<i32>) {\n        if let Some(node) = root {\n            // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n            let node = node.borrow();\n            dfs(node.left.as_ref(), res);\n            res.push(node.val);\n            dfs(node.right.as_ref(), res);\n        }\n    }\n    dfs(root, &mut result);\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    fn dfs(root: Option<&Rc<RefCell<TreeNode>>>, res: &mut Vec<i32>) {\n        if let Some(node) = root {\n            // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n            let node = node.borrow();\n            dfs(node.left.as_ref(), res);\n            dfs(node.right.as_ref(), res);\n            res.push(node.val);\n        }\n    }\n\n    dfs(root, &mut result);\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
    ### \u524d\u5e8f\u8d70\u8a2a ###\ndef pre_order(root)\n  return if root.nil?\n\n  # \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n  $res << root.val\n  pre_order(root.left)\n  pre_order(root.right)\nend\n\n### \u4e2d\u5e8f\u8d70\u8a2a ###\ndef in_order(root)\n  return if root.nil?\n\n  # \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n  in_order(root.left)\n  $res << root.val\n  in_order(root.right)\nend\n\n### \u5f8c\u5e8f\u8d70\u8a2a ###\ndef post_order(root)\n  return if root.nil?\n\n  # \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n  post_order(root.left)\n  post_order(root.right)\n  $res << root.val\nend\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 hash set \u54c8\u5e0c\u96c6\u5408 \u96dc\u6e4a\u96c6\u5408 bucket \u6876 \u6876 hash function \u54c8\u5e0c\u51fd\u6570 \u96dc\u6e4a\u51fd\u5f0f hash collision \u54c8\u5e0c\u51b2\u7a81 \u96dc\u6e4a\u885d\u7a81 load factor \u8d1f\u8f7d\u56e0\u5b50 \u8ca0\u8f09\u56e0\u5b50 separate chaining \u94fe\u5f0f\u5730\u5740 \u93c8\u7d50\u4f4d\u5740 open addressing \u5f00\u653e\u5bfb\u5740 \u958b\u653e\u5b9a\u5740 linear probing \u7ebf\u6027\u63a2\u6d4b \u7dda\u6027\u63a2\u67e5 lazy deletion \u61d2\u5220\u9664 \u61f6\u522a\u9664 binary tree \u4e8c\u53c9\u6811 \u4e8c\u5143\u6a39 tree node \u6811\u8282\u70b9 \u6a39\u7bc0\u9ede left-child node \u5de6\u5b50\u8282\u70b9 \u5de6\u5b50\u7bc0\u9ede right-child node \u53f3\u5b50\u8282\u70b9 \u53f3\u5b50\u7bc0\u9ede parent node \u7236\u8282\u70b9 \u7236\u7bc0\u9ede left subtree \u5de6\u5b50\u6811 \u5de6\u5b50\u6a39 right subtree \u53f3\u5b50\u6811 \u53f3\u5b50\u6a39 root node \u6839\u8282\u70b9 \u6839\u7bc0\u9ede leaf node \u53f6\u8282\u70b9 \u8449\u7bc0\u9ede edge \u8fb9 \u908a level \u5c42 \u5c64 degree \u5ea6 \u5ea6 height \u9ad8\u5ea6 \u9ad8\u5ea6 depth \u6df1\u5ea6 \u6df1\u5ea6 perfect binary tree \u5b8c\u7f8e\u4e8c\u53c9\u6811 \u5b8c\u7f8e\u4e8c\u5143\u6a39 complete binary tree \u5b8c\u5168\u4e8c\u53c9\u6811 \u5b8c\u5168\u4e8c\u5143\u6a39 full binary tree \u5b8c\u6ee1\u4e8c\u53c9\u6811 \u5b8c\u6eff\u4e8c\u5143\u6a39 balanced binary tree \u5e73\u8861\u4e8c\u53c9\u6811 \u5e73\u8861\u4e8c\u5143\u6a39 binary search tree \u4e8c\u53c9\u641c\u7d22\u6811 \u4e8c\u5143\u641c\u5c0b\u6a39 AVL tree AVL \u6811 AVL \u6a39 red-black tree \u7ea2\u9ed1\u6811 \u7d05\u9ed1\u6a39 level-order traversal \u5c42\u5e8f\u904d\u5386 \u5c64\u5e8f\u8d70\u8a2a breadth-first traversal \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a depth-first traversal \u6df1\u5ea6\u4f18\u5148\u904d\u5386 \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a binary search tree \u4e8c\u53c9\u641c\u7d22\u6811 \u4e8c\u5143\u641c\u5c0b\u6a39 balanced binary search tree \u5e73\u8861\u4e8c\u53c9\u641c\u7d22\u6811 \u5e73\u8861\u4e8c\u5143\u641c\u5c0b\u6a39 balance factor \u5e73\u8861\u56e0\u5b50 \u5e73\u8861\u56e0\u5b50 heap \u5806 \u5806\u7a4d max heap \u5927\u9876\u5806 \u5927\u9802\u5806\u7a4d min heap \u5c0f\u9876\u5806 \u5c0f\u9802\u5806\u7a4d priority queue \u4f18\u5148\u961f\u5217 \u512a\u5148\u4f47\u5217 heapify \u5806\u5316 \u5806\u7a4d\u5316 top-\\(k\\) problem Top-\\(k\\) \u95ee\u9898 Top-\\(k\\) \u554f\u984c graph \u56fe \u5716 vertex \u9876\u70b9 \u9802\u9ede undirected graph \u65e0\u5411\u56fe \u7121\u5411\u5716 directed graph \u6709\u5411\u56fe \u6709\u5411\u5716 connected graph \u8fde\u901a\u56fe \u9023\u901a\u5716 disconnected graph \u975e\u8fde\u901a\u56fe \u975e\u9023\u901a\u5716 weighted graph \u6709\u6743\u56fe \u6709\u6b0a\u5716 adjacency \u90bb\u63a5 \u9130\u63a5 path \u8def\u5f84 \u8def\u5f91 in-degree \u5165\u5ea6 \u5165\u5ea6 out-degree \u51fa\u5ea6 \u51fa\u5ea6 adjacency matrix \u90bb\u63a5\u77e9\u9635 \u9130\u63a5\u77e9\u9663 adjacency list \u90bb\u63a5\u8868 \u9130\u63a5\u8868 breadth-first search \u5e7f\u5ea6\u4f18\u5148\u641c\u7d22 \u5ee3\u5ea6\u512a\u5148\u641c\u5c0b depth-first search \u6df1\u5ea6\u4f18\u5148\u641c\u7d22 \u6df1\u5ea6\u512a\u5148\u641c\u5c0b binary search \u4e8c\u5206\u67e5\u627e \u4e8c\u5206\u641c\u5c0b searching algorithm \u641c\u7d22\u7b97\u6cd5 \u641c\u5c0b\u6f14\u7b97\u6cd5 sorting algorithm \u6392\u5e8f\u7b97\u6cd5 \u6392\u5e8f\u6f14\u7b97\u6cd5 selection sort \u9009\u62e9\u6392\u5e8f \u9078\u64c7\u6392\u5e8f bubble sort \u5192\u6ce1\u6392\u5e8f \u6ce1\u6cab\u6392\u5e8f insertion sort \u63d2\u5165\u6392\u5e8f \u63d2\u5165\u6392\u5e8f quick sort \u5feb\u901f\u6392\u5e8f \u5feb\u901f\u6392\u5e8f merge sort \u5f52\u5e76\u6392\u5e8f \u5408\u4f75\u6392\u5e8f heap sort \u5806\u6392\u5e8f \u5806\u7a4d\u6392\u5e8f bucket sort \u6876\u6392\u5e8f \u6876\u6392\u5e8f counting sort \u8ba1\u6570\u6392\u5e8f \u8a08\u6578\u6392\u5e8f radix sort \u57fa\u6570\u6392\u5e8f \u57fa\u6578\u6392\u5e8f divide and conquer \u5206\u6cbb \u5206\u6cbb hanota problem \u6c49\u8bfa\u5854\u95ee\u9898 \u6cb3\u5167\u5854\u554f\u984c backtracking algorithm \u56de\u6eaf\u7b97\u6cd5 \u56de\u6eaf\u6f14\u7b97\u6cd5 constraint \u7ea6\u675f \u7d04\u675f solution \u89e3 \u89e3 state \u72b6\u6001 \u72c0\u614b pruning \u526a\u679d \u526a\u679d permutations problem \u5168\u6392\u5217\u95ee\u9898 \u5168\u6392\u5217\u554f\u984c subset-sum problem \u5b50\u96c6\u548c\u95ee\u9898 \u5b50\u96c6\u5408\u554f\u984c \\(n\\)-queens problem \\(n\\) \u7687\u540e\u95ee\u9898 \\(n\\) \u7687\u540e\u554f\u984c dynamic programming \u52a8\u6001\u89c4\u5212 \u52d5\u614b\u898f\u5283 initial state \u521d\u59cb\u72b6\u6001 \u521d\u59cb\u72c0\u614b state-transition equation \u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b \u72c0\u614b\u8f49\u79fb\u65b9\u7a0b knapsack problem \u80cc\u5305\u95ee\u9898 \u80cc\u5305\u554f\u984c edit distance problem \u7f16\u8f91\u8ddd\u79bb\u95ee\u9898 \u7de8\u8f2f\u8ddd\u96e2\u554f\u984c greedy algorithm \u8d2a\u5fc3\u7b97\u6cd5 \u8caa\u5a6a\u6f14\u7b97\u6cd5"},{"location":"chapter_array_and_linkedlist/","title":"\u7b2c 4 \u7ae0 \u00a0 \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: [i32; 5] = [0; 5]; // [0, 0, 0, 0, 0]\nlet slice: &[i32] = &[0; 5];\n// \u5728 Rust \u4e2d\uff0c\u6307\u5b9a\u9577\u5ea6\u6642\uff08[i32; 5]\uff09\u70ba\u9663\u5217\uff0c\u4e0d\u6307\u5b9a\u9577\u5ea6\u6642\uff08&[i32]\uff09\u70ba\u5207\u7247\n// \u7531\u65bc Rust \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// Vector \u662f Rust \u4e00\u822c\u60c5\u6cc1\u4e0b\u7528\u4f5c\u52d5\u614b\u9663\u5217\u7684\u578b\u5225\n// \u70ba\u4e86\u65b9\u4fbf\u5be6\u73fe\u64f4\u5bb9 extend() \u65b9\u6cd5\uff0c\u4ee5\u4e0b\u5c07 vector \u770b\u4f5c\u9663\u5217\uff08array\uff09\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 [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 [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: &[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\u7684\u7279\u6027\u70ba\u5148\u9032\u5f8c\u51fa\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\u7684\u7279\u6027\u70ba\u5148\u9032\u5148\u51fa\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\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

    Tip

    \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\u64cd\u4f5c res = [[0]] * n \u751f\u6210\u4e86\u4e00\u500b\u4e8c\u7dad\u4e32\u5217\uff0c\u5176\u4e2d\u6bcf\u4e00\u500b [0] \u90fd\u662f\u7368\u7acb\u7684\u55ce\uff1f

    \u4e0d\u662f\u7368\u7acb\u7684\u3002\u6b64\u4e8c\u7dad\u4e32\u5217\u4e2d\uff0c\u6240\u6709\u7684 [0] \u5be6\u969b\u4e0a\u662f\u540c\u4e00\u500b\u7269\u4ef6\u7684\u5f15\u7528\u3002\u5982\u679c\u6211\u5011\u4fee\u6539\u5176\u4e2d\u4e00\u500b\u5143\u7d20\uff0c\u6703\u767c\u73fe\u6240\u6709\u7684\u5c0d\u61c9\u5143\u7d20\u90fd\u6703\u96a8\u4e4b\u6539\u8b8a\u3002

    \u5982\u679c\u5e0c\u671b\u4e8c\u7dad\u4e32\u5217\u4e2d\u7684\u6bcf\u500b [0] \u90fd\u662f\u7368\u7acb\u7684\uff0c\u53ef\u4ee5\u4f7f\u7528 res = [[0] for _ in range(n)] \u4f86\u5be6\u73fe\u3002\u9019\u7a2e\u65b9\u5f0f\u7684\u539f\u7406\u662f\u521d\u59cb\u5316\u4e86 \\(n\\) \u500b\u7368\u7acb\u7684 [0] \u4e32\u5217\u7269\u4ef6\u3002

    Q\uff1a\u64cd\u4f5c res = [0] * n \u751f\u6210\u4e86\u4e00\u500b\u4e32\u5217\uff0c\u5176\u4e2d\u6bcf\u4e00\u500b\u6574\u6578 0 \u90fd\u662f\u7368\u7acb\u7684\u55ce\uff1f

    \u5728\u8a72\u4e32\u5217\u4e2d\uff0c\u6240\u6709\u6574\u6578 0 \u90fd\u662f\u540c\u4e00\u500b\u7269\u4ef6\u7684\u5f15\u7528\u3002\u9019\u662f\u56e0\u70ba Python \u5c0d\u5c0f\u6574\u6578\uff08\u901a\u5e38\u662f -5 \u5230 256\uff09\u63a1\u7528\u4e86\u5feb\u53d6\u6c60\u6a5f\u5236\uff0c\u4ee5\u4fbf\u6700\u5927\u5316\u7269\u4ef6\u8907\u7528\uff0c\u5f9e\u800c\u63d0\u5347\u6548\u80fd\u3002

    \u96d6\u7136\u5b83\u5011\u6307\u5411\u540c\u4e00\u500b\u7269\u4ef6\uff0c\u4f46\u6211\u5011\u4ecd\u7136\u53ef\u4ee5\u7368\u7acb\u4fee\u6539\u4e32\u5217\u4e2d\u7684\u6bcf\u500b\u5143\u7d20\uff0c\u9019\u662f\u56e0\u70ba Python \u7684\u6574\u6578\u662f\u201c\u4e0d\u53ef\u8b8a\u7269\u4ef6\u201d\u3002\u7576\u6211\u5011\u4fee\u6539\u67d0\u500b\u5143\u7d20\u6642\uff0c\u5be6\u969b\u4e0a\u662f\u5207\u63db\u70ba\u53e6\u4e00\u500b\u7269\u4ef6\u7684\u5f15\u7528\uff0c\u800c\u4e0d\u662f\u6539\u8b8a\u539f\u6709\u7269\u4ef6\u672c\u8eab\u3002

    \u7136\u800c\uff0c\u7576\u4e32\u5217\u5143\u7d20\u662f\u201c\u53ef\u8b8a\u7269\u4ef6\u201d\u6642\uff08\u4f8b\u5982\u4e32\u5217\u3001\u5b57\u5178\u6216\u985e\u5225\u4f8b\u9805\u7b49\uff09\uff0c\u4fee\u6539\u67d0\u500b\u5143\u7d20\u6703\u76f4\u63a5\u6539\u8b8a\u8a72\u7269\u4ef6\u672c\u8eab\uff0c\u6240\u6709\u5f15\u7528\u8a72\u7269\u4ef6\u7684\u5143\u7d20\u90fd\u6703\u7522\u751f\u76f8\u540c\u8b8a\u5316\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.as_ref());\n        pre_order(res, node.borrow().right.as_ref());\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
    ### \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 ###\ndef pre_order(root)\n  return unless root\n\n  # \u8a18\u9304\u89e3\n  $res << root if root.val == 7\n\n  pre_order(root.left)\n  pre_order(root.right)\nend\n
    preorder_traversal_i_compact.zig
    [class]{}-[func]{preOrder}\n
    \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.as_ref());\n        pre_order(res, path, node.borrow().right.as_ref());\n        // \u56de\u9000\n        path.pop();\n    }\n}\n
    preorder_traversal_ii_compact.c
    /* \u524d\u5e8f\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
    ### \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c ###\ndef pre_order(root)\n  return unless root\n\n  # \u5617\u8a66\n  $path << root\n\n  # \u8a18\u9304\u89e3\n  $res << $path.dup if root.val == 7\n\n  pre_order(root.left)\n  pre_order(root.right)\n\n  # \u56de\u9000\n  $path.pop\nend\n
    preorder_traversal_ii_compact.zig
    [class]{}-[func]{preOrder}\n
    \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.as_ref());\n        pre_order(res, path, node.borrow().right.as_ref());\n        // \u56de\u9000\n        path.pop();\n    }\n}\n
    preorder_traversal_iii_compact.c
    /* \u524d\u5e8f\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
    ### \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 ###\ndef pre_order(root)\n  # \u526a\u679d\n  return if !root || root.val == 3\n\n  # \u5617\u8a66\n  $path.append(root)\n\n  # \u8a18\u9304\u89e3\n  $res << $path.dup if root.val == 7\n\n  pre_order(root.left)\n  pre_order(root.right)\n\n  # \u56de\u9000\n  $path.pop\nend\n
    preorder_traversal_iii_compact.zig
    [class]{}-[func]{preOrder}\n
    \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
    ### \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 ###\ndef backtrack(state, choices, res)\n    # \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if is_solution?(state)\n        # \u8a18\u9304\u89e3\n        record_solution(state, res)\n        return\n    end\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        end\n    end\nend\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.last().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: Option<&Rc<RefCell<TreeNode>>>) -> bool {\n    return choice.is_some() && choice.unwrap().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.pop();\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nfn backtrack(\n    state: &mut Vec<Rc<RefCell<TreeNode>>>,\n    choices: &Vec<Option<&Rc<RefCell<TreeNode>>>>,\n    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,\n) {\n    // \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.iter() {\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.unwrap().clone());\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(\n                state,\n                &vec![\n                    choice.unwrap().borrow().left.as_ref(),\n                    choice.unwrap().borrow().right.as_ref(),\n                ],\n                res,\n            );\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undo_choice(state, choice.unwrap().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
    ### \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 ###\ndef is_solution?(state)\n  !state.empty? && state.last.val == 7\nend\n\n### \u8a18\u9304\u89e3 ###\ndef record_solution(state, res)\n  res << state.dup\nend\n\n### \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 ###\ndef is_valid?(state, choice)\n  choice && choice.val != 3\nend\n\n### \u66f4\u65b0\u72c0\u614b ###\ndef make_choice(state, choice)\n  state << choice\nend\n\n### \u6062\u5fa9\u72c0\u614b ###\ndef undo_choice(state, choice)\n  state.pop\nend\n\n### \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 ###\ndef backtrack(state, choices, res)\n  # \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n  record_solution(state, res) if is_solution?(state)\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)\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    end\n  end\nend\n
    preorder_traversal_iii_template.zig
    [class]{}-[func]{isSolution}\n\n[class]{}-[func]{recordSolution}\n\n[class]{}-[func]{isValid}\n\n[class]{}-[func]{makeChoice}\n\n[class]{}-[func]{undoChoice}\n\n[class]{}-[func]{backtrack}\n
    \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

    Tip

    \u8acb\u6ce8\u610f\uff0c\u77e9\u9663\u7684\u8d77\u9ede\u4f4d\u65bc\u5de6\u4e0a\u89d2\uff0c\u5176\u4e2d\u884c\u7d22\u5f15\u5f9e\u4e0a\u5230\u4e0b\u589e\u52a0\uff0c\u5217\u7d22\u5f15\u5f9e\u5de6\u5230\u53f3\u589e\u52a0\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\u4e3b\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        return\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        res.push(state.clone());\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[row][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[row][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![vec![\"#\".to_string(); n]; 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
    ### \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1an \u7687\u540e ###\ndef 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 << state.map { |row| row.dup }\n    return\n  end\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    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\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    end\n  end\nend\n\n### \u6c42\u89e3 n \u7687\u540e ###\ndef n_queens(n)\n  # \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76e4\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n  state = Array.new(n) { Array.new(n, \"#\") }\n  cols = Array.new(n, false) # \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n  diags1 = Array.new(2 * n - 1, false) # \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n  diags2 = Array.new(2 * n - 1, false) # \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  res\nend\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.pop();\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
    ### \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I ###\ndef 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 << state.dup\n    return\n  end\n\n  # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  choices.each_with_index do |choice, i|\n    # \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n    unless selected[i]\n      # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n      selected[i] = true\n      state << 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    end\n  end\nend\n\n### \u5168\u6392\u5217 I ###\ndef permutations_i(nums)\n  res = []\n  backtrack([], nums, Array.new(nums.length, false), res)\n  res\nend\n
    permutations_i.zig
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutationsI}\n
    \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\u96c6\u5408\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\u96c6\u5408 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            backtrackII(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.pop();\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
    ### \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II ###\ndef 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 << state.dup\n    return\n  end\n\n  # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  duplicated = Set.new\n  choices.each_with_index do |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.include?(choice)\n      # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n      duplicated.add(choice)\n      selected[i] = true\n      state << 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    end\n  end\nend\n\n### \u5168\u6392\u5217 II ###\ndef permutations_ii(nums)\n  res = []\n  backtrack([], nums, Array.new(nums.length, false), res)\n  res\nend\n
    permutations_ii.zig
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutationsII}\n
    \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    state: &mut 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.clone());\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, 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 mut 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(&mut 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
    ### \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I ###\ndef backtrack(state, target, total, choices, res)\n  # \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n  if total == target\n    res << state.dup\n    return\n  end\n\n  # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  for i in 0...choices.length\n    # \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n    next if total + choices[i] > target\n    # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n    state << 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  end\nend\n\n### \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09###\ndef subset_sum_i_naive(nums, target)\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  res\nend\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    state: &mut 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.clone());\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, 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 mut 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(&mut 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
    ### \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I ###\ndef backtrack(state, target, choices, start, res)\n  # \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n  if target.zero?\n    res << state.dup\n    return\n  end\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.length\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    break if target - choices[i] < 0\n    # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n    state << 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  end\nend\n\n### \u6c42\u89e3\u5b50\u96c6\u548c I ###\ndef subset_sum_i(nums, target)\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  res\nend\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    state: &mut 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.clone());\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, 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 */\nfn subset_sum_ii(nums: &mut [i32], target: i32) -> Vec<Vec<i32>> {\n    let mut 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(&mut 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
    ### \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II ###\ndef backtrack(state, target, choices, start, res)\n  # \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n  if target.zero?\n    res << state.dup\n    return\n  end\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.length\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    break if target - choices[i] < 0\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    next if i > start && choices[i] == choices[i - 1]\n    # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n    state << 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  end\nend\n\n### \u6c42\u89e3\u5b50\u96c6\u548c II ###\ndef subset_sum_ii(nums, target)\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  res\nend\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\u96c6\u5408\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\u6642\u9593\u7684\u9577\u77ed\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\u8868\u73fe\u3002\u6bd4\u5982\u4e00\u500b\u6f14\u7b97\u6cd5\u7684\u4e26\u884c\u5ea6\u8f03\u9ad8\uff0c\u90a3\u9ebc\u5b83\u5c31\u66f4\u9069\u5408\u5728\u591a\u6838 CPU \u4e0a\u57f7\u884c\uff0c\u4e00\u500b\u6f14\u7b97\u6cd5\u7684\u8a18\u61b6\u9ad4\u64cd\u4f5c\u5bc6\u96c6\uff0c\u90a3\u9ebc\u5b83\u5728\u9ad8\u6548\u80fd\u8a18\u61b6\u9ad4\u4e0a\u7684\u8868\u73fe\u5c31\u6703\u66f4\u597d\u3002\u4e5f\u5c31\u662f\u8aaa\uff0c\u6f14\u7b97\u6cd5\u5728\u4e0d\u540c\u7684\u6a5f\u5668\u4e0a\u7684\u6e2c\u8a66\u7d50\u679c\u53ef\u80fd\u662f\u4e0d\u4e00\u81f4\u7684\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\u5e7e\u500b\u65b9\u9762\u3002

    • \u5b83\u7121\u9700\u5be6\u969b\u57f7\u884c\u7a0b\u5f0f\u78bc\uff0c\u66f4\u52a0\u7da0\u8272\u7bc0\u80fd\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\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\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\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\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\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\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\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\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\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\u5c0d\u65bc\u6b64\u985e\u60c5\u6cc1\uff0c\u6211\u5011\u6642\u5e38\u96e3\u4ee5\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)\\) \u3002\u8acb\u6ce8\u610f\uff0c\u8f38\u5165 \\(n\\) \u8868\u793a\u5206\u88c2\u8f2a\u6578\uff0c\u8fd4\u56de\u503c count \u8868\u793a\u7e3d\u5206\u88c2\u6b21\u6578\u3002

    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    # \u4e00\u5206\u70ba\u4e8c\uff0c\u5b50\u554f\u984c\u7684\u898f\u6a21\u6e1b\u5c0f\u4e00\u534a\n    count = linear_log_recur(n // 2) + linear_log_recur(n // 2)\n    # \u7576\u524d\u5b50\u554f\u984c\u5305\u542b n \u500b\u64cd\u4f5c\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 {\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\u901a\u5e38\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":"

    Tip

    \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

    \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\u4ee5 \\(n = 4\\) \u70ba\u4f8b\uff0c\u5176\u53ef\u88ab\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        // \u5927\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 - i) / 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
    ### \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) ###\ndef 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  return -1 if i > j\n\n  # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n  m = (i + j) / 2\n\n  if nums[m] < target\n    # \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n    return dfs(nums, target, m + 1, j)\n  elsif 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  end\nend\n\n### \u4e8c\u5206\u641c\u5c0b ###\ndef binary_search(nums, target)\n  n = nums.length\n  # \u6c42\u89e3\u554f\u984c f(0, n-1)\n  dfs(nums, target, 0, n - 1)\nend\n
    binary_search_recur.zig
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{binarySearch}\n
    \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
    ### \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb ###\ndef dfs(preorder, inorder_map, i, l, r)\n  # \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n  return if r - l < 0\n\n  # \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n  root = TreeNode.new(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\n  # \u8fd4\u56de\u6839\u7bc0\u9ede\n  root\nend\n\n### \u69cb\u5efa\u4e8c\u5143\u6a39 ###\ndef build_tree(preorder, inorder)\n  # \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\n  inorder_map = {}\n  inorder.each_with_index { |val, i| inorder_map[val] = i }\n  dfs(preorder, inorder_map, 0, 0, inorder.length - 1)\nend\n
    build_tree.zig
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{buildTree}\n
    \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\u5c07\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.pop().unwrap();\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
    ### \u79fb\u52d5\u4e00\u500b\u5713\u76e4 ###\ndef move(src, tar)\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 << pan\nend\n\n### \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) ###\ndef 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  end\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)\nend\n\n### \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c ###\ndef solve_hanota(_A, _B, _C)\n  n = _A.length\n  # \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n  dfs(n, _A, _B, _C)\nend\n
    hanota.zig
    [class]{}-[func]{move}\n\n[class]{}-[func]{dfs}\n\n[class]{}-[func]{solveHanota}\n
    \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
    ### \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 ###\ndef min_cost_climbing_stairs_dp(cost)\n  n = cost.length - 1\n  return cost[n] if n == 1 || n == 2\n  # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n  dp = Array.new(n + 1, 0)\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  (3...(n + 1)).each { |i| dp[i] = [dp[i - 1], dp[i - 2]].min + cost[i] }\n  dp[n]\nend\n
    min_cost_climbing_stairs_dp.zig
    // \u722c\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\u7a7a\u9593\u6700\u4f73\u5316\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\u7a7a\u9593\u6700\u4f73\u5316\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
    ### \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 ###\ndef min_cost_climbing_stairs_dp(cost)\n  n = cost.length - 1\n  return cost[n] if n == 1 || n == 2\n  # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n  dp = Array.new(n + 1, 0)\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  (3...(n + 1)).each { |i| dp[i] = [dp[i - 1], dp[i - 2]].min + cost[i] }\n  dp[n]\nend\n\n# \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\ndef min_cost_climbing_stairs_dp_comp(cost)\n  n = cost.length - 1\n  return cost[n] if n == 1 || n == 2\n  a, b = cost[1], cost[2]\n  (3...(n + 1)).each { |i| a, b = b, [a, b].min + cost[i] }\n  b\nend\n
    min_cost_climbing_stairs_dp.zig
    // \u722c\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
    ### \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 ###\ndef climbing_stairs_constraint_dp(n)\n  return 1 if n == 1 || n == 2\n\n  # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n  dp = Array.new(n + 1) { Array.new(3, 0) }\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 3...(n + 1)\n    dp[i][1] = dp[i - 1][2]\n    dp[i][2] = dp[i - 2][1] + dp[i - 2][2]\n  end\n\n  dp[n][1] + dp[n][2]\nend\n
    climbing_stairs_constraint_dp.zig
    // \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
    ### \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b ###\ndef min_path_sum_dfs(grid, i, j)\n  # \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n  return grid[i][j] if i == 0 && j == 0\n  # \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n  return Float::INFINITY if i < 0 || j < 0\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  [left, up].min + grid[i][j]\nend\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
    ### \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b ###\ndef min_path_sum_dfs_mem(grid, mem, i, j)\n  # \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n  return grid[0][0] if i == 0 && j == 0\n  # \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n  return Float::INFINITY if i < 0 || j < 0\n  # \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n  return mem[i][j] if mem[i][j] != -1\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] = [left, up].min + grid[i][j]\nend\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
    ### \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 ###\ndef min_path_sum_dp(grid)\n  n, m = grid.length, grid.first.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(n) { Array.new(m, 0) }\n  dp[0][0] = grid[0][0]\n  # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n  (1...m).each { |j| dp[0][j] = dp[0][j - 1] + grid[0][j] }\n  # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n  (1...n).each { |i| 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 1...n\n    for j in 1...m\n      dp[i][j] = [dp[i][j - 1], dp[i - 1][j]].min + grid[i][j]\n    end\n  end\n  dp[n -1][m -1]\nend\n
    min_path_sum.zig
    // \u6700\u5c0f\u8def\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\u7a7a\u9593\u6700\u4f73\u5316\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\u7a7a\u9593\u6700\u4f73\u5316\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
    ### \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 ###\ndef min_path_sum_dp_comp(grid)\n  n, m = grid.length, grid.first.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(m, 0)\n  # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n  dp[0] = grid[0][0]\n  (1...m).each { |j| dp[j] = dp[j - 1] + grid[0][j] }\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    (1...m).each { |j| dp[j] = [dp[j - 1], dp[j]].min + grid[i][j] }\n  end\n  dp[m - 1]\nend\n
    min_path_sum.zig
    // \u6700\u5c0f\u8def\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
    ### \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 ###\ndef edit_distance_dp(s, t)\n  n, m = s.length, t.length\n  dp = Array.new(n + 1) { Array.new(m + 1, 0) }\n  # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n  (1...(n + 1)).each { |i| dp[i][0] = i }\n  (1...(m + 1)).each { |j| dp[0][j] = j }\n  # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n  for i in 1...(n + 1)\n    for j in 1...(m +1)\n      if s[i - 1] == t[j - 1]\n        # \u82e5\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] = [dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]].min + 1\n      end\n    end\n  end\n  dp[n][m]\nend\n
    edit_distance.zig
    // \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\u7a7a\u9593\u6700\u4f73\u5316\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\u7a7a\u9593\u6700\u4f73\u5316\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
    ### \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 ###\ndef edit_distance_dp_comp(s, t)\n  n, m = s.length, t.length\n  dp = Array.new(m + 1, 0)\n  # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n  (1...(m + 1)).each { |j| dp[j] = j }\n  # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n  for i in 1...(n + 1)\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    leftup = dp.first # \u66ab\u5b58 dp[i-1, j-1]\n    dp[0] += 1\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n    for j in 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] = [dp[j - 1], dp[j], leftup].min + 1\n      end\n      leftup = temp # \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n    end\n  end\n  dp[m]\nend\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
    ### \u56de\u6eaf ###\ndef backtrack(choices, state, n, res)\n  # \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n  res[0] += 1 if state == 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    next if state + choice > n\n\n    # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n    backtrack(choices, state + choice, n, res)\n  end\n  # \u56de\u9000\nend\n\n### \u722c\u6a13\u68af\uff1a\u56de\u6eaf ###\ndef climbing_stairs_backtrack(n)\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  res.first\nend\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
    ### \u641c\u5c0b ###\ndef dfs(i)\n  # \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n  return i if i == 1 || i == 2\n  # dp[i] = dp[i-1] + dp[i-2]\n  dfs(i - 1) + dfs(i - 2)\nend\n\n### \u722c\u6a13\u68af\uff1a\u641c\u5c0b ###\ndef climbing_stairs_dfs(n)\n  dfs(n)\nend\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
    ### \u8a18\u61b6\u5316\u641c\u5c0b ###\ndef dfs(i, mem)\n  # \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n  return i if i == 1 || i == 2\n  # \u82e5\u5b58\u5728\u8a18\u9304 dp[i] \uff0c\u5247\u76f4\u63a5\u8fd4\u56de\u4e4b\n  return mem[i] if mem[i] != -1\n\n  # dp[i] = dp[i-1] + dp[i-2]\n  count = dfs(i - 1, mem) + dfs(i - 2, mem)\n  # \u8a18\u9304 dp[i]\n  mem[i] = count\nend\n\n### \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b ###\ndef climbing_stairs_dfs_mem(n)\n  # mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n  mem = Array.new(n + 1, -1)\n  dfs(n, mem)\nend\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
    ### \u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 ###\ndef climbing_stairs_dp(n)\n  return n  if n == 1 || n == 2\n\n  # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n  dp = Array.new(n + 1, 0)\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  (3...(n + 1)).each { |i| dp[i] = dp[i - 1] + dp[i - 2] }\n\n  dp[n]\nend\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
    ### \u722c\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 ###\ndef climbing_stairs_dp_comp(n)\n  return n if n == 1 || n == 2\n\n  a, b = 1, 2\n  (3...(n + 1)).each { a, b = b, a + b }\n\n  b\nend\n
    climbing_stairs_dp.zig
    // \u722c\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
    ### 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b ###\ndef knapsack_dfs(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  return 0 if i == 0 || c == 0\n  # \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n  return knapsack_dfs(wgt, val, i - 1, c) if wgt[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  [no, yes].max\nend\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
    ### 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b ###\ndef knapsack_dfs_mem(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  return 0 if i == 0 || c == 0\n  # \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n  return mem[i][c] if mem[i][c] != -1\n  # \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n  return knapsack_dfs_mem(wgt, val, mem, i - 1, c) if wgt[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] = [no, yes].max\nend\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
    ### 0-1 \u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 ###\ndef knapsack_dp(wgt, val, cap)\n  n = wgt.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(n + 1) { Array.new(cap + 1, 0) }\n  # \u72c0\u614b\u8f49\u79fb\n  for i in 1...(n + 1)\n    for c in 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] = [dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]].max\n      end\n    end\n  end\n  dp[n][cap]\nend\n
    knapsack.zig
    // 0-1 \u80cc\u5305\uff1a\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\u7a7a\u9593\u6700\u4f73\u5316\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\u7a7a\u9593\u6700\u4f73\u5316\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
    ### 0-1 \u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 ###\ndef knapsack_dp_comp(wgt, val, cap)\n  n = wgt.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(cap + 1, 0)\n  # \u72c0\u614b\u8f49\u79fb\n  for i in 1...(n + 1)\n    # \u5012\u5e8f\u8d70\u8a2a\n    for c in cap.downto(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] = [dp[c], dp[c - wgt[i - 1]] + val[i - 1]].max\n      end\n    end\n  end\n  dp[cap]\nend\n
    knapsack.zig
    // 0-1 \u80cc\u5305\uff1a\u7a7a\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
    ### \u5b8c\u5168\u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 ###\ndef unbounded_knapsack_dp(wgt, val, cap)\n  n = wgt.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(n + 1) { Array.new(cap + 1, 0) }\n  # \u72c0\u614b\u8f49\u79fb\n  for i in 1...(n + 1)\n    for c in 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] = [dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]].max\n      end\n    end\n  end\n  dp[n][cap]\nend\n
    unbounded_knapsack.zig
    // \u5b8c\u5168\u80cc\u5305\uff1a\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\u7a7a\u9593\u6700\u4f73\u5316\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\u7a7a\u9593\u6700\u4f73\u5316\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
    ### \u5b8c\u5168\u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283 ###\ndef unbounded_knapsack_dp(wgt, val, cap)\n  n = wgt.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(n + 1) { Array.new(cap + 1, 0) }\n  # \u72c0\u614b\u8f49\u79fb\n  for i in 1...(n + 1)\n    for c in 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] = [dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]].max\n      end\n    end\n  end\n  dp[n][cap]\nend\n\n### \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 ##3\ndef unbounded_knapsack_dp_comp(wgt, val, cap)\n  n = wgt.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(cap + 1, 0)\n  # \u72c0\u614b\u8f49\u79fb\n  for i in 1...(n + 1)\n    # \u6b63\u5e8f\u8d70\u8a2a\n    for c in 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] = [dp[c], dp[c - wgt[i - 1]] + val[i - 1]].max\n      end\n    end\n  end\n  dp[cap]\nend\n
    unbounded_knapsack.zig
    // \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\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
    ### \u96f6\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 ###\ndef coin_change_dp(coins, amt)\n  n = coins.length\n  _MAX = amt + 1\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(n + 1) { Array.new(amt + 1, 0) }\n  # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n  (1...(amt + 1)).each { |a| dp[0][a] = _MAX }\n  # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n  for i in 1...(n + 1)\n    for a in 1...(amt + 1)\n      if coins[i - 1] > a\n        # \u82e5\u8d85\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 - coins[i - 1]] + 1].min\n      end\n    end\n  end\n  dp[n][amt] != _MAX ? dp[n][amt] : -1\nend\n
    coin_change.zig
    // \u96f6\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\u7a7a\u9593\u6700\u4f73\u5316\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\u7a7a\u9593\u6700\u4f73\u5316\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
    ### \u96f6\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 ###\ndef coin_change_dp_comp(coins, amt)\n  n = coins.length\n  _MAX = amt + 1\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(amt + 1, _MAX)\n  dp[0] = 0\n  # \u72c0\u614b\u8f49\u79fb\n  for i in 1...(n + 1)\n    # \u6b63\u5e8f\u8d70\u8a2a\n    for a in 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] = [dp[a], dp[a - coins[i - 1]] + 1].min\n      end\n    end\n  end\n  dp[amt] != _MAX ? dp[amt] : -1\nend\n
    coin_change.zig
    // \u96f6\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
    ### \u96f6\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 ###\ndef coin_change_ii_dp(coins, amt)\n  n = coins.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(n + 1) { Array.new(amt + 1, 0) }\n  # \u521d\u59cb\u5316\u9996\u5217\n  (0...(n + 1)).each { |i| dp[i][0] = 1 }\n  # \u72c0\u614b\u8f49\u79fb\n  for i in 1...(n + 1)\n    for a in 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      end\n    end\n  end\n  dp[n][amt]\nend\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\u7a7a\u9593\u6700\u4f73\u5316\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\u7a7a\u9593\u6700\u4f73\u5316\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
    ### \u96f6\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 ###\ndef coin_change_ii_dp_comp(coins, amt)\n  n = coins.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(amt + 1, 0)\n  dp[0] = 1\n  # \u72c0\u614b\u8f49\u79fb\n  for i in 1...(n + 1)\n    # \u6b63\u5e8f\u8d70\u8a2a\n    for a in 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      end\n    end\n  end\n  dp[amt]\nend\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

    • \u5728\u7c21\u55ae\u5716\u4e2d\uff0c\u9802\u9ede\u4e0d\u80fd\u8207\u81ea\u8eab\u76f8\u9023\uff0c\u6b64\u6642\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
    ### \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 ###\nclass GraphAdjMat\n  def initialize(vertices, edges)\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    @vertices = []\n    # \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    @adj_mat = []\n    # \u65b0\u589e\u9802\u9ede\n    vertices.each { |val| 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    edges.each { |e| add_edge(e[0], e[1]) }\n  end\n\n  ### \u7372\u53d6\u9802\u9ede\u6578\u91cf ###\n  def size\n    @vertices.length\n  end\n\n  ### \u65b0\u589e\u9802\u9ede ###\n  def add_vertex(val)\n    n = size\n    # \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n    @vertices << val\n    # \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n    new_row = Array.new(n, 0)\n    @adj_mat << new_row\n    # \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n    @adj_mat.each { |row| row << 0 }\n  end\n\n  ### \u522a\u9664\u9802\u9ede ###\n  def remove_vertex(index)\n    raise IndexError if index >= size\n\n    # \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n    @vertices.delete_at(index)\n    # \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n    @adj_mat.delete_at(index)\n    # \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n    @adj_mat.each { |row| row.delete_at(index) }\n  end\n\n  ### \u65b0\u589e\u908a ###\n  def add_edge(i, j)\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 || j < 0 || i >= size || j >= size || i == j\n      raise IndexError\n    end\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    @adj_mat[i][j] = 1\n    @adj_mat[j][i] = 1\n  end\n\n  ### \u522a\u9664\u908a ###\n  def remove_edge(i, j)\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 || j < 0 || i >= size || j >= size || i == j\n      raise IndexError\n    end\n    @adj_mat[i][j] = 0\n    @adj_mat[j][i] = 0\n  end\n\n  ### \u5217\u5370\u9130\u63a5\u77e9\u9663 ###\n  def __print__\n    puts \"\u9802\u9ede\u4e32\u5217 = #{@vertices}\"\n    puts '\u9130\u63a5\u77e9\u9663 ='\n    print_matrix(@adj_mat)\n  end\nend\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
    ### \u57fa\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 ###\nclass GraphAdjList\n  attr_reader :adj_list\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize(edges)\n    # \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    @adj_list = {}\n    # \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\n    for edge in edges\n      add_vertex(edge[0])\n      add_vertex(edge[1])\n      add_edge(edge[0], edge[1])\n    end\n  end\n\n  ### \u7372\u53d6\u9802\u9ede\u6578\u91cf ###\n  def size\n    @adj_list.length\n  end\n\n  ### \u65b0\u589e\u908a ###\n  def add_edge(vet1, vet2)\n    raise ArgumentError if !@adj_list.include?(vet1) || !@adj_list.include?(vet2)\n\n    @adj_list[vet1] << vet2\n    @adj_list[vet2] << vet1\n  end\n\n  ### \u522a\u9664\u908a ###\n  def remove_edge(vet1, vet2)\n    raise ArgumentError if !@adj_list.include?(vet1) || !@adj_list.include?(vet2)\n\n    # \u522a\u9664\u908a vet1 - vet2\n    @adj_list[vet1].delete(vet2)\n    @adj_list[vet2].delete(vet1)\n  end\n\n  ### \u65b0\u589e\u9802\u9ede ###\n  def add_vertex(vet)\n    return if @adj_list.include?(vet)\n\n    # \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n    @adj_list[vet] = []\n  end\n\n  ### \u522a\u9664\u9802\u9ede ###\n  def remove_vertex(vet)\n    raise ArgumentError unless @adj_list.include?(vet)\n\n    # \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n    @adj_list.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 vertex in @adj_list\n      @adj_list[vertex.first].delete(vet) if @adj_list[vertex.first].include?(vet)\n    end\n  end\n\n  ### \u5217\u5370\u9130\u63a5\u8868 ###\n  def __print__\n    puts '\u9130\u63a5\u8868 ='\n    for vertex in @adj_list\n      tmp = @adj_list[vertex.first].map { |v| v.val }\n      puts \"#{vertex.first.val}: #{tmp},\"\n    end\n  end\nend\n
    graph_adjacency_list.zig
    [class]{GraphAdjList}-[func]{}\n
    \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\u96c6\u5408 visited \u4f86\u8a18\u9304\u54ea\u4e9b\u7bc0\u9ede\u5df2\u88ab\u8a2a\u554f\u3002

    Tip

    \u96dc\u6e4a\u96c6\u5408\u53ef\u4ee5\u770b\u4f5c\u4e00\u500b\u53ea\u5132\u5b58 key \u800c\u4e0d\u5132\u5b58 value \u7684\u96dc\u6e4a\u8868\uff0c\u5b83\u53ef\u4ee5\u5728 \\(O(1)\\) \u6642\u9593\u8907\u96dc\u5ea6\u4e0b\u9032\u884c key \u7684\u589e\u522a\u67e5\u6539\u64cd\u4f5c\u3002\u6839\u64da key \u7684\u552f\u4e00\u6027\uff0c\u96dc\u6e4a\u96c6\u5408\u901a\u5e38\u7528\u65bc\u8cc7\u6599\u53bb\u91cd\u7b49\u5834\u666f\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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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
    ### \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a ###\ndef graph_bfs(graph, start_vet)\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\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n  visited = Set.new([start_vet])\n  # \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n  que = [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.length > 0\n    vet = que.shift # \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n    res << 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      next if visited.include?(adj_vet) # \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n      que << 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    end\n  end\n  # \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n  res\nend\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\u96c6\u5408 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\u96c6\u5408 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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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\u96c6\u5408\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
    ### \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f ###\ndef dfs(graph, visited, res, vet)\n  res << 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 adj_vet in graph.adj_list[vet]\n    next if visited.include?(adj_vet) # \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n    # \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n    dfs(graph, visited, res, adj_vet)\n  end\nend\n\n### \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a ###\ndef graph_dfs(graph, start_vet)\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\u96c6\u5408\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n  visited = Set.new\n  dfs(graph, visited, res, start_vet)\n  res\nend\n
    graph_dfs.zig
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{graphDFS}\n
    \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\u96c6\u5408 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
    ### \u7269\u54c1 ###\nclass Item\n  attr_accessor :w # \u7269\u54c1\u91cd\u91cf\n  attr_accessor :v # \u7269\u54c1\u50f9\u503c\n\n  def initialize(w, v)\n    @w = w\n    @v = v\n  end\nend\n\n### \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a ###\ndef fractional_knapsack(wgt, val, cap)\n  # \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\uff0c\u50f9\u503c\n  items = wgt.each_with_index.map { |w, i| Item.new(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.to_f / b.w) <=> (a.v.to_f / a.w) }\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.to_f / item.w) * cap\n      # \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\n      break\n    end\n  end\n  res\nend\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
    ### \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a ###\ndef coin_change_greedy(coins, amt)\n  # \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n  i = coins.length - 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 && coins[i] > amt\n      i -= 1\n    end\n    # \u9078\u64c7 coins[i]\n    amt -= coins[i]\n    count += 1\n  end\n  # \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c \u5247\u8fd4\u56de -1\n  amt == 0 ? count : -1\nend\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
    ### \u6700\u5927\u5bb9\u91cf\uff1a\u8caa\u5a6a ###\ndef max_capacity(ht)\n  # \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n  i, j = 0, ht.length - 1\n  # \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n  res = 0\n\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 = [ht[i], ht[j]].min * (j - i)\n    res = [res, cap].max\n    # \u5411\u5167\u79fb\u52d5\u77ed\u677f\n    if ht[i] < ht[j]\n      i += 1\n    else\n      j -= 1\n    end\n  end\n\n  res\nend\n
    max_capacity.zig
    [class]{}-[func]{maxCapacity}\n
    \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
    ### \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a ###\ndef max_product_cutting(n)\n  # \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n  return 1 * (n - 1) if n <= 3\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  # \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n  return (3.pow(a - 1) * 2 * 2).to_i if b == 1\n  # \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n  return (3.pow(a) * 2).to_i if b == 2\n  # \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n  3.pow(a).to_i\nend\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 **)calloc(hashMap->capacity, sizeof(Pair *));\n    hashMap->TOMBSTONE = (Pair *)malloc(sizeof(Pair));\n    hashMap->TOMBSTONE->key = -1;\n    hashMap->TOMBSTONE->val = \"-1\";\n\n    return hashMap;\n}\n\n/* \u6790\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 **)calloc(hashMap->capacity, sizeof(Pair *));\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
    ### \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d ###\ndef initialize(nums)\n  # \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n  @max_heap = nums\n  # \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n  parent(size - 1).downto(0) do |i|\n    sift_down(i)\n  end\nend\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 Comparer \u5373\u53ef\uff09\nPriorityQueue<int, int> maxHeap = new(Comparer<int>.Create((x, y) => y.CompareTo(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
    # Ruby \u672a\u63d0\u4f9b\u5167\u5efa Heap \u985e\u5225\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\u9032\u884c\u9006\u8f49\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
    ### \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 ###\ndef left(i)\n  2 * i + 1\nend\n\n### \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 ###\ndef right(i)\n  2 * i + 2\nend\n\n### \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 ###\ndef parent(i)\n  (i - 1) / 2     # \u5411\u4e0b\u6574\u9664\nend\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
    ### \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 ###\ndef peek\n  @max_heap[0]\nend\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
    ### \u5143\u7d20\u5165\u5806\u7a4d ###\ndef push(val)\n  # \u65b0\u589e\u7bc0\u9ede\n  @max_heap << val\n  # \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n  sift_up(size - 1)\nend\n\n### \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 ###\ndef sift_up(i)\n  loop do\n    # \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n    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    break if p < 0 || @max_heap[i] <= @max_heap[p]\n    # \u4ea4\u63db\u5169\u7bc0\u9ede\n    swap(i, p)\n    # \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n    i = p\n  end\nend\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.pop().unwrap();\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
    ### \u5143\u7d20\u51fa\u5806\u7a4d ###\ndef pop\n  # \u5224\u7a7a\u8655\u7406\n  raise IndexError, \"\u5806\u7a4d\u70ba\u7a7a\" if 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  swap(0, size - 1)\n  # \u522a\u9664\u7bc0\u9ede\n  val = @max_heap.pop\n  # \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n  sift_down(0)\n  # \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n  val\nend\n\n### \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 ###\ndef sift_down(i)\n  loop do\n    # \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba ma\n    l, r, ma = left(i), right(i), i\n    ma = l if l < size && @max_heap[l] > @max_heap[ma]\n    ma = r if r < size && @max_heap[r] > @max_heap[ma]\n\n    # \u82e5\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    break if ma == i\n\n    # \u4ea4\u63db\u5169\u7bc0\u9ede\n    swap(i, ma)\n    # \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n    i = ma\n  end\nend\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\u5806\u7a4d\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
    ### \u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 ###\ndef top_k_heap(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  max_heap = MaxHeap.new([])\n\n  # \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n  for i in 0...k\n    push_min_heap(max_heap, nums[i])\n  end\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.length\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] > peek_min_heap(max_heap)\n      pop_min_heap(max_heap)\n      push_min_heap(max_heap, nums[i])\n    end\n  end\n\n  get_min_heap(max_heap)\nend\n
    top_k.zig
    [class]{}-[func]{topKHeap}\n
    \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\u70ba\u8cc7\u6599\u7d50\u69cb\u6ce8\u5165\u751f\u547d\u529b\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/summary/#1-q-a","title":"1. \u00a0 Q & A","text":"

    Q\uff1a\u4f5c\u70ba\u4e00\u540d\u7a0b\u5f0f\u8a2d\u8a08\u5e2b\uff0c\u6211\u5728\u65e5\u5e38\u5de5\u4f5c\u4e2d\u5f9e\u672a\u7528\u6f14\u7b97\u6cd5\u89e3\u6c7a\u904e\u554f\u984c\uff0c\u5e38\u7528\u6f14\u7b97\u6cd5\u90fd\u88ab\u7a0b\u5f0f\u8a9e\u8a00\u5c01\u88dd\u597d\u4e86\uff0c\u76f4\u63a5\u7528\u5c31\u53ef\u4ee5\u4e86\uff1b\u9019\u662f\u5426\u610f\u5473\u8457\u6211\u5011\u5de5\u4f5c\u4e2d\u7684\u554f\u984c\u9084\u6c92\u6709\u5230\u9054\u9700\u8981\u6f14\u7b97\u6cd5\u7684\u7a0b\u5ea6\uff1f

    \u5982\u679c\u628a\u5177\u9ad4\u7684\u5de5\u4f5c\u6280\u80fd\u6bd4\u4f5c\u662f\u6b66\u529f\u7684\u201c\u62db\u5f0f\u201d\u7684\u8a71\uff0c\u90a3\u9ebc\u57fa\u790e\u79d1\u76ee\u61c9\u8a72\u66f4\u50cf\u662f\u201c\u5167\u529f\u201d\u3002

    \u6211\u8a8d\u70ba\u5b78\u6f14\u7b97\u6cd5\uff08\u4ee5\u53ca\u5176\u4ed6\u57fa\u790e\u79d1\u76ee\uff09\u7684\u610f\u7fa9\u4e0d\u662f\u5728\u65bc\u5728\u5de5\u4f5c\u4e2d\u5f9e\u96f6\u5be6\u73fe\u5b83\uff0c\u800c\u662f\u57fa\u65bc\u5b78\u5230\u7684\u77e5\u8b58\uff0c\u5728\u89e3\u6c7a\u554f\u984c\u6642\u80fd\u5920\u4f5c\u51fa\u5c08\u696d\u7684\u53cd\u61c9\u548c\u5224\u65b7\uff0c\u5f9e\u800c\u63d0\u5347\u5de5\u4f5c\u7684\u6574\u9ad4\u8cea\u91cf\u3002\u8209\u4e00\u500b\u7c21\u55ae\u4f8b\u5b50\uff0c\u6bcf\u7a2e\u7a0b\u5f0f\u8a9e\u8a00\u90fd\u5167\u5efa\u4e86\u6392\u5e8f\u51fd\u5f0f\uff1a

    • \u5982\u679c\u6211\u5011\u6c92\u6709\u5b78\u904e\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\uff0c\u90a3\u9ebc\u7d66\u5b9a\u4efb\u4f55\u8cc7\u6599\uff0c\u6211\u5011\u53ef\u80fd\u90fd\u585e\u7d66\u9019\u500b\u6392\u5e8f\u51fd\u5f0f\u53bb\u505a\u4e86\u3002\u57f7\u884c\u9806\u66a2\u3001\u6548\u80fd\u4e0d\u932f\uff0c\u770b\u4e0a\u53bb\u4e26\u6c92\u6709\u4ec0\u9ebc\u554f\u984c\u3002
    • \u4f46\u5982\u679c\u5b78\u904e\u6f14\u7b97\u6cd5\uff0c\u6211\u5011\u5c31\u6703\u77e5\u9053\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u662f \\(O(n \\log n)\\) \uff1b\u800c\u5982\u679c\u7d66\u5b9a\u7684\u8cc7\u6599\u662f\u56fa\u5b9a\u4f4d\u6578\u7684\u6574\u6578\uff08\u4f8b\u5982\u5b78\u865f\uff09\uff0c\u90a3\u9ebc\u6211\u5011\u5c31\u53ef\u4ee5\u7528\u6548\u7387\u66f4\u9ad8\u7684\u201c\u57fa\u6578\u6392\u5e8f\u201d\u4f86\u505a\uff0c\u5c07\u6642\u9593\u8907\u96dc\u5ea6\u964d\u70ba \\(O(nk)\\) \uff0c\u5176\u4e2d \\(k\\) \u70ba\u4f4d\u6578\u3002\u7576\u8cc7\u6599\u9ad4\u91cf\u5f88\u5927\u6642\uff0c\u7bc0\u7701\u51fa\u4f86\u7684\u57f7\u884c\u6642\u9593\u5c31\u80fd\u5275\u9020\u8f03\u5927\u50f9\u503c\uff08\u6210\u672c\u964d\u4f4e\u3001\u9ad4\u9a57\u8b8a\u597d\u7b49\uff09\u3002

    \u5728\u5de5\u7a0b\u9818\u57df\u4e2d\uff0c\u5927\u91cf\u554f\u984c\u662f\u96e3\u4ee5\u9054\u5230\u6700\u512a\u89e3\u7684\uff0c\u8a31\u591a\u554f\u984c\u53ea\u662f\u88ab\u201c\u5dee\u4e0d\u591a\u201d\u5730\u89e3\u6c7a\u4e86\u3002\u554f\u984c\u7684\u96e3\u6613\u7a0b\u5ea6\u4e00\u65b9\u9762\u53d6\u6c7a\u65bc\u554f\u984c\u672c\u8eab\u7684\u6027\u8cea\uff0c\u53e6\u4e00\u65b9\u9762\u4e5f\u53d6\u6c7a\u65bc\u89c0\u6e2c\u554f\u984c\u7684\u4eba\u7684\u77e5\u8b58\u5132\u5099\u3002\u4eba\u7684\u77e5\u8b58\u8d8a\u5b8c\u5099\u3001\u7d93\u9a57\u8d8a\u591a\uff0c\u5206\u6790\u554f\u984c\u5c31\u6703\u8d8a\u6df1\u5165\uff0c\u554f\u984c\u5c31\u80fd\u88ab\u89e3\u6c7a\u5f97\u66f4\u512a\u96c5\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\u7d44\u7e54\u548c\u5132\u5b58\u8cc7\u6599\u7684\u65b9\u5f0f\uff0c\u6db5\u84cb\u8cc7\u6599\u5167\u5bb9\u3001\u8cc7\u6599\u4e4b\u9593\u95dc\u4fc2\u548c\u8cc7\u6599\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5b83\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\u70ba\u8cc7\u6599\u7d50\u69cb\u6ce8\u5165\u751f\u547d\u529b\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\u5167\u5bb9\u6e05\u6670\u6613\u61c2\u3001\u5b78\u7fd2\u66f2\u7dda\u5e73\u6ed1\uff0c\u5f15\u5c0e\u521d\u5b78\u8005\u63a2\u7d22\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u77e5\u8b58\u5730\u5716\u3002
    • \u6e90\u7a0b\u5f0f\u78bc\u53ef\u4e00\u9375\u57f7\u884c\uff0c\u5e6b\u52a9\u8b80\u8005\u5728\u7df4\u7fd2\u4e2d\u63d0\u5347\u7a0b\u5f0f\u8a2d\u8a08\u6280\u80fd\uff0c\u77ad\u89e3\u6f14\u7b97\u6cd5\u5de5\u4f5c\u539f\u7406\u548c\u8cc7\u6599\u7d50\u69cb\u5e95\u5c64\u5be6\u73fe\u3002
    • \u63d0\u5021\u8b80\u8005\u4e92\u52a9\u5b78\u7fd2\uff0c\u6b61\u8fce\u5927\u5bb6\u5728\u8a55\u8ad6\u5340\u63d0\u51fa\u554f\u984c\u8207\u5206\u4eab\u898b\u89e3\uff0c\u5728\u4ea4\u6d41\u8a0e\u8ad6\u4e2d\u5171\u540c\u9032\u6b65\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\u3001coderonion\u3001Gonglja\u3001nuomi1\u3001Reanon\u3001justin-tse\u3001hpstory\u3001danielsss\u3001curtishd\u3001night-cruise\u3001S-N-O-R-L-A-X\u3001msk397\u3001gvenusleo\u3001khoaxuantu\u3001RiverTwilight\u3001rongyi\u3001gyt95\u3001zhuoqinyue\u3001K3v123\u3001Zuoxun\u3001mingXta\u3001hello-ikun\u3001FangYuan33\u3001GN-Yu\u3001yuelinxin\u3001longsizhuo\u3001Cathay-Chen\u3001guowei-gong\u3001xBLACKICEx\u3001IsChristina\u3001JoseHung\u3001qualifier1024\u3001QiLOL\u3001pengchzn\u3001Guanngxu\u3001L-Super\u3001WSL0809\u3001Slone123c\u3001lhxsm\u3001yuan0221\u3001what-is-me\u3001theNefelibatas\u3001longranger2\u3001cy-by-side\u3001xiongsp\u3001JeffersonHuang\u3001Transmigration-zhou\u3001magentaqin\u3001Wonderdch\u3001malone6\u3001xiaomiusa87\u3001gaofer\u3001bluebean-cloud\u3001a16su\u3001Shyam-Chen\u3001nanlei\u3001hongyun-robot\u3001Phoenix0415\u3001MolDuM\u3001Nigh\u3001he-weilai\u3001junminhong\u3001mgisr\u3001iron-irax\u3001yd-j\u3001XiaChuerwu\u3001XC-Zero\u3001seven1240\u3001SamJin98\u3001wodray\u3001reeswell\u3001NI-SW\u3001Horbin-Magician\u3001Enlightenus\u3001xjr7670\u3001YangXuanyi\u3001DullSword\u3001boloboloda\u3001iStig\u3001qq909244296\u3001jiaxianhua\u3001wenjianmin\u3001keshida\u3001kilikilikid\u3001lclc6\u3001lwbaptx\u3001liuxjerry\u3001lucaswangdev\u3001lyl625760\u3001hts0000\u3001gledfish\u3001fbigm\u3001echo1937\u3001szu17dmy\u3001dshlstarr\u3001Yucao-cy\u3001coderlef\u3001czruby\u3001bongbongbakudan\u3001beintentional\u3001ZongYangL\u3001ZhongYuuu\u3001luluxia\u3001xb534\u3001bitsmi\u3001ElaBosak233\u3001baagod\u3001zhouLion\u3001yishangzhang\u3001yi427\u3001yabo083\u3001weibk\u3001wangwang105\u3001th1nk3r-ing\u3001tao363\u30014yDX3906\u3001syd168\u3001steventimes\u3001sslmj2020\u3001smilelsb\u3001siqyka\u3001selear\u3001sdshaoda\u3001Xi-Row\u3001popozhu\u3001nuquist19\u3001noobcodemaker\u3001XiaoK29\u3001chadyi\u3001ZhongGuanbin\u3001shanghai-Jerry\u3001JackYang-hellobobo\u3001Javesun99\u3001lipusheng\u3001BlindTerran\u3001ShiMaRing\u3001FreddieLi\u3001FloranceYeh\u3001iFleey\u3001fanchenggang\u3001gltianwen\u3001goerll\u3001Dr-XYZ\u3001nedchu\u3001curly210102\u3001CuB3y0nd\u3001KraHsu\u3001CarrotDLaw\u3001youshaoXG\u3001bubble9um\u3001fanenr\u3001eagleanurag\u3001LifeGoesOnionOnionOnion\u300152coder\u3001foursevenlove\u3001KorsChen\u3001hezhizhen\u3001linzeyan\u3001ZJKung\u3001GaochaoZhu\u3001hopkings2008\u3001yang-le\u3001Evilrabbit520\u3001Turing-1024-Lee\u3001thomasq0\u3001Suremotoo\u3001Allen-Scai\u3001Risuntsy\u3001Richard-Zhang1019\u3001qingpeng9802\u3001primexiao\u3001nidhoggfgg\u30011ch0\u3001MwumLi\u3001martinx\u3001ZnYang2018\u3001hugtyftg\u3001logan-qiu\u3001psychelzh\u3001Keynman\u3001KeiichiKasai\u30010130w \u3002

    \u672c\u66f8\u7684\u7a0b\u5f0f\u78bc\u5be9\u95b1\u5de5\u4f5c\u7531 coderonion\u3001curtishd\u3001Gonglja\u3001gvenusleo\u3001hpstory\u3001justin-tse\u3001khoaxuantu\u3001krahets\u3001night-cruise\u3001nuomi1\u3001Reanon \u548c rongyi \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; j < size; j++ {\n            if nums[i]+nums[j] == target {\n                return []int{i, j}\n            }\n        }\n    }\n    return nil\n}\n
    two_sum.swift
    /* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\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                nums.swap(j, j + 1);\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
    ### \u6ce1\u6cab\u6392\u5e8f ###\ndef bubble_sort(nums)\n  n = nums.length\n  # \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n  for i in (n - 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        nums[j], nums[j + 1] = nums[j + 1], nums[j]\n      end\n    end\n  end\nend\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                nums.swap(j, 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}\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
    ### \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09###\ndef bubble_sort_with_flag(nums)\n  n = nums.length\n  # \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n  for i in (n - 1).downto(1)\n    flag = false # \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n\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[j], nums[j + 1] = nums[j + 1], nums[j]\n        flag = true # \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n      end\n    end\n\n    break unless flag # \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n  end\nend\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 &num in nums.iter() {\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 buckets.iter() {\n        for &num in bucket.iter() {\n            nums[i] = num;\n            i += 1;\n        }\n    }\n}\n
    bucket_sort.c
    /* \u6876\u6392\u5e8f */\nvoid bucketSort(float nums[], int n) {\n    int k = n / 2;                                 // \u521d\u59cb\u5316 k = n/2 \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
    ### \u6876\u6392\u5e8f ###\ndef bucket_sort(nums)\n  # \u521d\u59cb\u5316 k = n/2 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\u5143\u7d20\n  k = nums.length / 2\n  buckets = Array.new(k) { [] }\n\n  # 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n  nums.each do |num|\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 = (num * k).to_i\n    # \u5c07 num \u65b0\u589e\u9032\u6876 i\n    buckets[i] << num\n  end\n\n  # 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n  buckets.each do |bucket|\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  end\n\n  # 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\u679c\n  i = 0\n  buckets.each do |bucket|\n    bucket.each do |num|\n      nums[i] = num\n      i += 1\n    end\n  end\nend\n
    bucket_sort.zig
    [class]{}-[func]{bucketSort}\n
    \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\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.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.iter() {\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
    ### \u8a08\u6578\u6392\u5e8f ###\ndef counting_sort_naive(nums)\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  nums.each { |num| m = [m, num].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  counter = Array.new(m + 1, 0)\n  nums.each { |num| 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 0...(m + 1)\n    (0...counter[num]).each do\n      nums[i] = num\n      i += 1\n    end\n  end\nend\n
    counting_sort.zig
    [class]{}-[func]{countingSortNaive}\n
    \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.iter().max().unwrap() as usize;\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 + 1];\n    for &num in nums.iter() {\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 {\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    nums.copy_from_slice(&res)\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(res);\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
    ### \u8a08\u6578\u6392\u5e8f ###\ndef counting_sort(nums)\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 = 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  counter = Array.new(m + 1, 0)\n  nums.each { |num| 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  (0...m).each { |i| counter[i + 1] += counter[i] }\n  # 4. \u5012\u5e8f\u8d70\u8a2a nums, \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 = nums.length\n  res = Array.new(n, 0)\n  (n - 1).downto(0).each do |i|\n    num = nums[i]\n    res[counter[num] - 1] = num # \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  end\n  # \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n  (0...n).each { |i| nums[i] = res[i] }\nend\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)\\)\u3001\u975e\u81ea\u9069\u61c9\u6392\u5e8f \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        nums.swap(i, ma);\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).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()).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        nums.swap(0, i);\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
    ### \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 ###\ndef sift_down(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    l = 2 * i + 1\n    r = 2 * i + 2\n    ma = i\n    ma = l if l < n && nums[l] > nums[ma]\n    ma = r if r < n && nums[r] > nums[ma]\n    # \u82e5\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    break if ma == i\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  end\nend\n\n### \u5806\u7a4d\u6392\u5e8f ###\ndef heap_sort(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  (nums.length / 2 - 1).downto(0) do |i|\n    sift_down(nums, nums.length, i)\n  end\n  # \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n  (nums.length - 1).downto(1) do |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    sift_down(nums, i, 0)\n  end\nend\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 - left) / 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 - left) / 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 - left) / 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 - left) / 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 - left) / 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 - left) / 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 - left) / 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 - left) ~/ 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 - left) / 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 - left) / 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 - left) / 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
    ### \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 ###\ndef 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  tmp = Array.new(right - left + 1, 0)\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 && j <= right\n    if nums[i] <= nums[j]\n      tmp[k] = nums[i]\n      i += 1\n    else\n      tmp[k] = nums[j]\n      j += 1\n    end\n    k += 1\n  end\n  # \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  end\n  while j <= right\n    tmp[k] = nums[j]\n    j += 1\n    k += 1\n  end\n  # \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n  (0...tmp.length).each do |k|\n    nums[left + k] = tmp[k]\n  end\nend\n\n### \u5408\u4f75\u6392\u5e8f ###\ndef merge_sort(nums, left, right)\n  # \u7d42\u6b62\u689d\u4ef6\n  # \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n  return if left >= right\n  # \u5283\u5206\u968e\u6bb5\n  mid = left + (right - left) / 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)\nend\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 - left) / 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
    /* \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], nums[j]); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums[i], nums[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
    ### \u54e8\u5175\u5283\u5206 ###\ndef partition(nums, left, right)\n  # \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n  i, 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    end\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    end\n    # \u5143\u7d20\u4ea4\u63db\n    nums[i], nums[j] = nums[j], nums[i]\n  end\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  i # \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\nend\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
    ### \u5feb\u901f\u6392\u5e8f\u985e\u5225 ###\ndef quick_sort(nums, left, right)\n  # \u5b50\u9663\u5217\u9577\u5ea6\u4e0d\u70ba 1 \u6642\u905e\u8ff4\n  if left < right\n    # \u54e8\u5175\u5283\u5206\n    pivot = partition(nums, left, right)\n    # \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\n    quick_sort(nums, left, pivot - 1)\n    quick_sort(nums, pivot + 1, right)\n  end\n  nums\nend\n
    quick_sort.zig
    // \u5feb\u901f\u6392\u5e8f\nfn quickSort(nums: []i32, left: usize, right: usize) void {\n    // \u5b50\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\u975e\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], nums[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], nums[j]); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums[i], nums[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 - left) / 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
    ### \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 ###\ndef median_three(nums, left, mid, right)\n  # \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n  _l, _m, _r = nums[left], nums[mid], nums[right]\n  # m \u5728 l \u548c r \u4e4b\u9593\n  return mid if (_l <= _m && _m <= _r) || (_r <= _m && _m <= _l)\n  # l \u5728 m \u548c r \u4e4b\u9593\n  return left if (_m <= _l && _l <= _r) || (_r <= _l && _l <= _m)\n  return right\nend\n\n### \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09###\ndef partition(nums, left, right)\n  ### \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n  med = median_three(nums, left, (left + right) / 2, right)\n  # \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u65b7\n  nums[left], nums[med] = nums[med], nums[left]\n  i, j = left, right\n  while i < j\n    while i < j && nums[j] >= nums[left]\n      j -= 1 # \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n    end\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    end\n    # \u5143\u7d20\u4ea4\u63db\n    nums[i], nums[j] = nums[j], nums[i]\n  end\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  i # \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\nend\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
    ### \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09###\ndef quick_sort(nums, left, right)\n  # \u5b50\u9663\u5217\u9577\u5ea6\u4e0d\u70ba 1 \u6642\u905e\u8ff4\n  while left < right\n    # \u54e8\u5175\u5283\u5206\n    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      quick_sort(nums, left, pivot - 1)\n      left = pivot + 1 # \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n    else\n      quick_sort(nums, pivot + 1, right)\n      right = pivot - 1 # \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n    end\n  end\nend\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    nums.copy_from_slice(&res);\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    memset(counter, 0, sizeof(int) * 10); // \u521d\u59cb\u5316\u70ba 0 \u4ee5\u652f\u6301\u5f8c\u7e8c\u8a18\u61b6\u9ad4\u91cb\u653e\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    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(res);\n    free(counter);\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 (int i = 0; i < size; 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
    ### \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) ###\ndef digit(num, exp)\n  # \u8f49\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\nend\n\n### \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09###\ndef counting_sort_digit(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  counter = Array.new(10, 0)\n  n = nums.length\n  # \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n  for i in 0...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  end\n  # \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n  (1...10).each { |i| 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 = Array.new(n, 0)\n  for i in (n - 1).downto(0)\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  end\n  # \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n  (0...n).each { |i| nums[i] = res[i] }\nend\n\n### \u57fa\u6578\u6392\u5e8f ###\ndef radix_sort(nums)\n  # \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n  m = nums.max\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  end\nend\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)\\)\u3001\u975e\u81ea\u9069\u61c9\u6392\u5e8f\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
    ### \u9078\u64c7\u6392\u5e8f ###\ndef selection_sort(nums)\n  n = nums.length\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    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      end\n    end\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  end\nend\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\u80fd\u5920\u5229\u7528\u8f38\u5165\u8cc7\u6599\u5df2\u6709\u7684\u9806\u5e8f\u8cc7\u8a0a\u4f86\u6e1b\u5c11\u8a08\u7b97\u91cf\uff0c\u9054\u5230\u66f4\u512a\u7684\u6642\u9593\u6548\u7387\u3002\u81ea\u9069\u61c9\u6392\u5e8f\u6f14\u7b97\u6cd5\u7684\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6\u901a\u5e38\u512a\u65bc\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\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\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\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\ndeq: deque[int] = deque()\n\n# \u5143\u7d20\u5165\u5217\ndeq.append(2)      # \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeq.append(5)\ndeq.append(4)\ndeq.appendleft(3)  # \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeq.appendleft(1)\n\n# \u8a2a\u554f\u5143\u7d20\nfront: int = deq[0]  # \u4f47\u5217\u9996\u5143\u7d20\nrear: int = deq[-1]  # \u4f47\u5217\u5c3e\u5143\u7d20\n\n# \u5143\u7d20\u51fa\u5217\npop_front: int = deq.popleft()  # \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\npop_rear: int = deq.pop()       # \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n\n# \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\nsize: int = len(deq)\n\n# \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a\nis_empty: bool = len(deq) == 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    if num == nil {\n        return nil\n    }\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    if num == nil {\n        return nil\n    }\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\n/* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\nint *toArray(ArrayDeque *deque, int *queSize) {\n    *queSize = deque->queSize;\n    int *res = (int *)calloc(deque->queSize, sizeof(int));\n    int j = deque->front;\n    for (int i = 0; i < deque->queSize; i++) {\n        res[i] = deque->nums[j % deque->queCapacity];\n        j++;\n    }\n    return res;\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    if num == nil {\n        return nil\n    }\n\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\n/* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\nint *toArray(ArrayQueue *queue, int *queSize) {\n    *queSize = queue->queSize;\n    int *res = (int *)calloc(queue->queSize, sizeof(int));\n    int j = queue->front;\n    for (int i = 0; i < queue->queSize; i++) {\n        res[i] = queue->nums[j % queue->queCapacity];\n        j++;\n    }\n    return res;\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
    ### \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a ###\n# \u4f7f\u7528 nil \u4f86\u8868\u793a\u7a7a\u4f4d\ntree = [1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15]\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 | None:\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        self.tree.iter().filter_map(|&x| x).collect()\n    }\n\n    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n    fn dfs(&self, i: i32, order: &'static 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
    ### \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 ###\nclass ArrayBinaryTree\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize(arr)\n    @tree = arr.to_a\n  end\n\n  ### \u4e32\u5217\u5bb9\u91cf ###\n  def size\n    @tree.length\n  end\n\n  ### \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c ###\n  def val(i)\n    # \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de nil \uff0c\u4ee3\u8868\u7a7a\u4f4d\n    return if i < 0 || i >= size\n\n    @tree[i]\n  end\n\n  ### \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 ###\n  def left(i)\n    2 * i + 1\n  end\n\n  ### \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 ###\n  def right(i)\n    2 * i + 2\n  end\n\n  ### \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 ###\n  def parent(i)\n    (i - 1) / 2\n  end\n\n  ### \u5c64\u5e8f\u8d70\u8a2a ###\n  def level_order\n    @res = []\n\n    # \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\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\u512a\u5148\u8d70\u8a2a ###\n  def dfs(i, order)\n    return if val(i).nil?\n    # \u524d\u5e8f\u8d70\u8a2a\n    @res << val(i) if order == :pre\n    dfs(left(i), order)\n    # \u4e2d\u5e8f\u8d70\u8a2a\n    @res << val(i) if order == :in\n    dfs(right(i), order)\n    # \u5f8c\u5e8f\u8d70\u8a2a\n    @res << val(i) if order == :post\n  end\n\n  ### \u524d\u5e8f\u8d70\u8a2a ###\n  def pre_order\n    @res = []\n    dfs(0, :pre)\n    @res\n  end\n\n  ### \u4e2d\u5e8f\u8d70\u8a2a ###\n  def in_order\n    @res = []\n    dfs(0, :in)\n    @res\n  end\n\n  ### \u5f8c\u5e8f\u8d70\u8a2a ###\n  def post_order\n    @res = []\n    dfs(0, :post)\n    @res\n  end\nend\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 */\ntypedef 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
    ### AVL \u6a39\u7bc0\u9ede\u985e\u5225 ###\nclass TreeNode\n  attr_accessor :val    # \u7bc0\u9ede\u503c\n  attr_accessor :height # \u7bc0\u9ede\u9ad8\u5ea6\n  attr_accessor :left   # \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n  attr_accessor :right  # \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n\n  def initialize(val)\n    @val = val\n    @height = 0\n  end\nend\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
    ### \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 ###\ndef height(node)\n  # \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n  return node.height unless node.nil?\n\n  -1\nend\n\n### \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 ###\ndef update_height(node)\n  # \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n  node.height = [height(node.left), height(node.right)].max + 1\nend\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
    ### \u7372\u53d6\u5e73\u8861\u56e0\u5b50 ###\ndef balance_factor(node)\n  # \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n  return 0 if node.nil?\n\n  # \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n  height(node.left) - height(node.right)\nend\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

    Tip

    \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
    ### \u53f3\u65cb\u64cd\u4f5c ###\ndef right_rotate(node)\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  update_height(node)\n  update_height(child)\n  # \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \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
    ### \u5de6\u65cb\u64cd\u4f5c ###\ndef left_rotate(node)\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  update_height(node)\n  update_height(child)\n  # \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \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
    ### \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 ###\ndef rotate(node)\n  # \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n  balance_factor = balance_factor(node)\n  # \u5de6\u904d\u6a39\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\u5f8c\u53f3\u65cb\n      node.left = left_rotate(node.left)\n      return right_rotate(node)\n    end\n  # \u53f3\u904d\u6a39\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\u5f8c\u5de6\u65cb\n      node.right = right_rotate(node.right)\n      return left_rotate(node)\n    end\n  end\n  # \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n  node\nend\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
    ### \u63d2\u5165\u7bc0\u9ede ###\ndef insert(val)\n  @root = insert_helper(@root, val)\nend\n\n### \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09###\ndef insert_helper(node, val)\n  return TreeNode.new(val) if node.nil?\n  # 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede\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\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n  end\n  # \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n  update_height(node)\n  # 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\n  rotate(node)\nend\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
    ### \u522a\u9664\u7bc0\u9ede ###\ndef remove(val)\n  @root = remove_helper(@root, val)\nend\n\n### \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09###\ndef remove_helper(node, val)\n  return if node.nil?\n  # 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\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\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n      return if child.nil?\n      # \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\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.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\u7bc0\u9ede\u9ad8\u5ea6\n  update_height(node)\n  # 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\n  rotate(node)\nend\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
    ### \u67e5\u8a62\u7bc0\u9ede ###\ndef search(num)\n  cur = @root\n\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    # \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n    elsif cur.val > num\n      cur = cur.left\n    # \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n    else\n      break\n    end\n  end\n\n  cur\nend\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
    ### \u63d2\u5165\u7bc0\u9ede ###\ndef insert(num)\n  # \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n  if @root.nil?\n    @root = TreeNode.new(num)\n    return\n  end\n\n  # \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n  cur, pre = @root, nil\n  while !cur.nil?\n    # \u627e\u5230\u91cd\u8907\u7bc0\u9ede\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\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    end\n  end\n\n  # \u63d2\u5165\u7bc0\u9ede\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\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 tmp_val = tmp.unwrap().borrow().val;\n            // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n            self.remove(tmp_val);\n            // \u7528 tmp \u8986\u84cb cur\n            cur.borrow_mut().val = tmp_val;\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
    ### \u522a\u9664\u7bc0\u9ede ###\ndef remove(num)\n  # \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n  return if @root.nil?\n\n  # \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n  cur, pre = @root, nil\n  while !cur.nil?\n    # \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n    break if cur.val == num\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    # \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n    else\n      cur = cur.left\n    end\n  end\n  # \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n  return if cur.nil?\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    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      end\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    end\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 = cur.right\n    while !tmp.left.nil?\n      tmp = tmp.left\n    end\n    # \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n    remove(tmp.val)\n    # \u7528 tmp \u8986\u84cb cur\n    cur.val = tmp.val\n  end\nend\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
    ### \u4e8c\u5143\u6a39\u7bc0\u9ede\u985e\u5225 ###\nclass TreeNode\n  attr_accessor :val    # \u7bc0\u9ede\u503c\n  attr_accessor :left   # \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n  attr_accessor :right  # \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n\n  def initialize(val)\n    @val = val\n  end\nend\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
    # \u521d\u59cb\u5316\u4e8c\u5143\u6a39\n# \u521d\u59cb\u5316\u7bc0\u9ede\nn1 = TreeNode.new(1)\nn2 = TreeNode.new(2)\nn3 = TreeNode.new(3)\nn4 = TreeNode.new(4)\nn5 = TreeNode.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.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
    # \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede\n_p = TreeNode.new(0)\n# \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede _p\nn1.left = _p\n_p.left = n2\n# \u522a\u9664\u7bc0\u9ede\nn1.left = n2\n
    binary_tree.zig
    \n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    Tip

    \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\u8acb\u6ce8\u610f\uff0c\u5b8c\u7f8e\u4e8c\u5143\u6a39\u4e5f\u662f\u4e00\u68f5\u5b8c\u5168\u4e8c\u5143\u6a39\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
    ### \u5c64\u5e8f\u8d70\u8a2a ###\ndef level_order(root)\n  # \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n  queue = [root]\n  # \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n  res = []\n  while !queue.empty?\n    node = queue.shift # \u968a\u5217\u51fa\u968a\n    res << node.val # \u5132\u5b58\u7bc0\u9ede\u503c\n    queue << node.left unless node.left.nil? # \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n    queue << node.right unless node.right.nil? # \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n  end\n  res\nend\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    fn dfs(root: Option<&Rc<RefCell<TreeNode>>>, res: &mut Vec<i32>) {\n        if let Some(node) = root {\n            // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n            let node = node.borrow();\n            res.push(node.val);\n            dfs(node.left.as_ref(), res);\n            dfs(node.right.as_ref(), res);\n        }\n    }\n    dfs(root, &mut result);\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    fn dfs(root: Option<&Rc<RefCell<TreeNode>>>, res: &mut Vec<i32>) {\n        if let Some(node) = root {\n            // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n            let node = node.borrow();\n            dfs(node.left.as_ref(), res);\n            res.push(node.val);\n            dfs(node.right.as_ref(), res);\n        }\n    }\n    dfs(root, &mut result);\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    fn dfs(root: Option<&Rc<RefCell<TreeNode>>>, res: &mut Vec<i32>) {\n        if let Some(node) = root {\n            // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n            let node = node.borrow();\n            dfs(node.left.as_ref(), res);\n            dfs(node.right.as_ref(), res);\n            res.push(node.val);\n        }\n    }\n\n    dfs(root, &mut result);\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
    ### \u524d\u5e8f\u8d70\u8a2a ###\ndef pre_order(root)\n  return if root.nil?\n\n  # \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n  $res << root.val\n  pre_order(root.left)\n  pre_order(root.right)\nend\n\n### \u4e2d\u5e8f\u8d70\u8a2a ###\ndef in_order(root)\n  return if root.nil?\n\n  # \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n  in_order(root.left)\n  $res << root.val\n  in_order(root.right)\nend\n\n### \u5f8c\u5e8f\u8d70\u8a2a ###\ndef post_order(root)\n  return if root.nil?\n\n  # \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n  post_order(root.left)\n  post_order(root.right)\n  $res << root.val\nend\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.gz b/zh-hant/sitemap.xml.gz index c404b49b7c49c1985ecbcafda48e5c46e6bee141..3550fadd161b1200fbb3c74708d643cc10a52fac 100644 GIT binary patch delta 15 Wcmeyw{)wGUzMF$XPH7|C8)g6~9|V~I delta 15 Wcmeyw{)wGUzMF$%J=;dMH_QMk`2`LD