diff --git a/static/meta.json b/static/meta.json index 1568a4344..e2b028bf5 100644 --- a/static/meta.json +++ b/static/meta.json @@ -1 +1 @@ -{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759432323535,"lastFulllyUpdateTime":1759425072169},"checkIn":{"lastUpdateTime":1759432323625},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file +{"users":{"lastUpdateTime":-1},"dailyCheck":{"lastUpdateTime":1759518710499,"lastFulllyUpdateTime":1759511554005},"checkIn":{"lastUpdateTime":1759518710584},"lectures":{"lastUpdateTime":1652878368502,"intro":{"lastUpdateTime":1732865152498},"basic":{"lastUpdateTime":1737009102103},"topic":{"lastUpdateTime":1733930885560},"advance":{"lastUpdateTime":1737009102111}},"preCard":true} \ No newline at end of file diff --git a/static/my/solutions.json b/static/my/solutions.json index d08a50b0c..d4041c188 100644 --- a/static/my/solutions.json +++ b/static/my/solutions.json @@ -1 +1 @@ -{"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[],"10":[],"11":[],"12":[],"13":[],"14":[],"15":[],"16":[],"17":[],"18":[],"19":[],"20":[],"21":[],"22":[],"23":[],"24":[],"25":[],"26":[],"27":[],"28":[],"29":[],"30":[],"31":[],"32":[],"33":[],"34":[],"35":[],"36":[],"37":[],"38":[],"39":[],"40":[],"41":[],"42":[],"43":[],"44":[],"45":[],"46":[],"47":[],"48":[],"49":[],"50":[],"51":[],"52":[],"53":[],"54":[],"55":[],"56":[],"57":[],"58":[],"59":[],"60":[],"61":[],"62":[],"63":[],"64":[],"65":[],"66":[],"67":[],"68":[],"69":[],"70":[],"71":[],"72":[],"73":[],"74":[],"75":[],"76":[],"77":[],"78":[],"79":[],"80":[],"81":[],"82":[],"83":[],"84":[],"85":[],"86":[],"87":[],"88":[],"89":[],"90":[],"91":[],"839781960":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"954545647":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"1541732340":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"michaelxi3":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"darknightwriter":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"findlayzhou":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"laofuwf":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lbc546":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zch-bit":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"frankelzeng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xingzhaodev":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joeymoso":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hackbl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"q815101630":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shiyishuoshuo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aouos":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"thinkfurther":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wengzhouyunfan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"whisht":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bzlff":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zzzkains":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chenmengyu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"uancen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nuomituxedo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhongranherz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gr52":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hydelovegood":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nikojxie":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fangxianshen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jokertzw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cyang258":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kernelsue":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"erikahuang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kuang-mou":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"iloveqier":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"duke-github":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"caterpillar-0":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ashleyyma6":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yuki-yzy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zpc7":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yujian920":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kiirii4":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ucashurui":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xixiao51":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"feikerwu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"heng518":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yaya-bb":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tlntin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"richypang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fenchuiyun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jerry-lllman":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nickyk319":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"herbertpan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wsmmxmm":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fan-svg":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yuzejia":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sunnyyujf":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"phoenixflyingsky":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nehchsuy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lzyxts":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"elainekuo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ll491119940":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"2learnsomething":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ataraxyadong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wzasd":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"miluowzt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"maylinglin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"weijie-he":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"brodxie":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"y525":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"leungogogo":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074242240","body":"## Main Idea\nFirst, it looks like we can convert the array `num` to integer and add it to `k`, but `num.length <= 1E+4` so this approach will cause integer overflow. So we will have to do the addition in array form.\n\nThen the idea is to simulate the entire process, add each digit of `num` and `k` with a `carry` bit. We will terminate the loop when we run out of digits for both `num` and `k` and `carry == 0`.\n\n## Code\n```java\nclass Solution {\n public List addToArrayForm(int[] num, int k) {\n int n = num.length, carry = 0, i = n - 1;\n List res = new ArrayList<>();\n \n while (i >= 0 || k > 0 || carry > 0) {\n int kDigit = k % 10;\n k /= 10;\n int sum = i >= 0 ? carry + kDigit + num[i] : carry + kDigit;\n res.add(sum % 10);\n carry = sum >= 10 ? 1 : 0;\n --i;\n }\n \n Collections.reverse(res);\n return res;\n }\n}\n```\n\n## Complexity Analysis\nTime: `O(2*max(N, log(K)))`\n* Given a number `K`, its length will be `O(log_{2}(K))`, the time complexity depends on the length of `N` and `K`, whichever is longer.\n* Notice we want to insert digits at the end of the array and then reverse it after we finish the addition (reverse takes `O(res.size())`). If we insert at the head of array, then it will take `O(n^2)` of time.\n\nSpace: `O(1)`, as we didn't use additional spaces except the return array.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3077454608","body":"#### Main Idea\nThe problem asks for the shortest distance from each character in a string s to a given character c. Since c may appear multiple times, we must compute the shortest distance to any occurrence of c for each index.\n\nThe key idea is to perform two passes over the string:\n\nLeft-to-right pass: Calculate distance from the nearest c to the left.\n\nRight-to-left pass: Refine the distance by checking for any closer c on the right.\n\nBy using two passes, we can efficiently compute the minimal distance to the nearest c for each character.\n\n#### Code\n\n```java\nclass Solution {\n public int[] shortestToChar(String s, char c) {\n int n = s.length();\n int[] dist = new int[n];\n Arrays.fill(dist, Integer.MAX_VALUE);\n for (int i = 0; i < n; ++i) {\n if (s.charAt(i) == c) {\n dist[i] = 0;\n } else if (i > 0 && dist[i - 1] < Integer.MAX_VALUE) {\n dist[i] = dist[i - 1] + 1;\n }\n }\n\n for (int i = n - 1; i >= 0; --i) {\n if (i < n - 1 && dist[i + 1] != Integer.MAX_VALUE) {\n dist[i] = Math.min(dist[i], dist[i + 1] + 1);\n }\n }\n\n return dist;\n }\n}\n```\n\n#### Complexity\nTime: `O(n)`\nSpace: `O(n)`","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3082949045","body":"## Main Idea\nA stack can be implemented with an array, but usually we only have access to stack top due to encapsulation, while we can actually access/modify any elements in the array internally.\n\nWe can implement the stack API with `array`:\n* `push()`: append at the end of array (`O(1)`)\n* `pop()`: remove the end of array (`O(1)`)\n* `increment()`: use a for loop to increment `array[0:k]` (`O(k)`).\n\n### Optimization. Range Update && Lazy Evaluation\nNotice the time complexity of `increment()` is too high due to range update, and we can use a difference array to optimize it.\n\nAlso we don't really care about the values of elements until we `pop` them, so we can evaluate them when we pop them out of the stack.\n\n## Code\n```java\nclass CustomStack {\n private Deque stack;\n private int[] arr;\n public CustomStack(int maxSize) {\n stack = new ArrayDeque<>();\n arr = new int[maxSize];\n }\n \n public void push(int x) {\n if (stack.size() < arr.length) {\n stack.push(x);\n } \n }\n \n public int pop() {\n if (stack.isEmpty()) {\n return -1;\n }\n int index = stack.size() - 1, ret = stack.pop() + arr[index];\n if (index > 0) {\n arr[index - 1] += arr[index];\n }\n arr[index] = 0;\n return ret;\n }\n \n public void increment(int k, int val) {\n k = Math.min(k - 1, stack.size() - 1);\n if (k >= 0) {\n arr[k] += val;\n }\n }\n}\n```\n## Complexity Analysis\nTime: `O(1)` for all operations\nSpace: `O(n)` as we used 2 arrays.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3087312725","body":"### Main Idea\n\nStoring everything in one stack will lead to so many pushes/pops, so we can use two stacks, one stack for string, one stack for number.\n\nIterate the input string:\n\n* If `str[i]` is a number, parse the number, push that number to number stack, and push current string to string stack, then empty the string to start over.\n* If `str[i]` is a closed bracket, then we pop the number stack to get `count`, pop the string stack to get `str`, then append the current string with `count` times to the `str`.\n* Else, append the character to current string.\n\n### Code\n\n* Java\n\n```java\nclass Solution {\n public String decodeString(String s) {\n int n = s.length();\n Deque strStack = new ArrayDeque<>();\n Deque numStack = new ArrayDeque<>();\n StringBuilder sb = new StringBuilder();\n \n for (int i = 0; i < n; i++) {\n if (Character.isDigit(s.charAt(i))) {\n int j = i + 1;\n while (Character.isDigit(s.charAt(j))) {\n j++;\n }\n int count = Integer.parseInt(s.substring(i, j));\n numStack.push(count);\n strStack.push(sb);\n sb = new StringBuilder();\n i = j - 1;\n } else if (s.charAt(i) == ']') {\n int count = numStack.pop();\n StringBuilder top = strStack.isEmpty() ? new StringBuilder() : strStack.pop();\n while (count-- > 0) {\n top.append(sb);\n }\n sb = top;\n } else {\n if (s.charAt(i) != '[') {\n sb.append(s.charAt(i));\n }\n }\n }\n \n return sb.toString();\n }\n}\n```\n\n### Complexity Analysis\n\nTime: `O(max(k) * n)`, each digit will be pushed/popped at most `max(k)` times","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092141722","body":"## Main Idea\nWe can use `stack1` as the input stack, and `stack2` as the output stack. \n\n* `push()`: Push to `stack1`, so this new element will be on the stack top of `stack1` (which is the end of our queue).\n* `pop()` and `peek()`: Since we use `stack2` as our output stack, when we call `pop()` or `peek()`:\n* If `stack2` is empty, we want to move all elements from `stack1` to `stack2`, and their order will be reversed, so the bottom of `stack1` will be the top of `stack2`, which is the head of our queue.\n* If not, then we have access to the top of `stack2` already.\n\n## Code\n\n```java\nclass MyQueue {\n Deque stack1;\n Deque stack2;\n \n public MyQueue() {\n stack1 = new ArrayDeque<>();\n stack2 = new ArrayDeque<>();\n }\n \n public void push(int x) {\n stack1.push(x);\n }\n \n public int pop() {\n if (stack2.isEmpty()) {\n move();\n }\n return stack2.pop();\n }\n \n public int peek() {\n if (stack2.isEmpty()) {\n move();\n }\n \n return stack2.peek();\n }\n \n public boolean empty() {\n return stack1.isEmpty() && stack2.isEmpty();\n }\n \n private void move() {\n while (!stack1.isEmpty()) {\n stack2.push(stack1.pop());\n }\n }\n}\n```\n## Complexity Analysis\nTime:\n* `push()`: `O(1)`\n* `pop()` and `peek()`: \n\t* The **worst case** of `pop()` and `peek()` will be `O(n)`, where we have to move all elements from `stack1` to `stack2`.\n\t* **Amortized Analysis**: Say we have `n` elements in `stack1`, and `0` elements in `stack2`, and we want to call `pop()` or `peek()` `n` times. The first call will take `n` operations to move all elements from `stack2` to `stack1`. But after the first call we will have at least `n - 1` elemetns in `stack2`, which makes the next `n - 1` calls `O(1)`. So the amrotized time will be `O(n + 1 + 1 +...+1 / n) = O((2n-1)/n) = O(1)`.\n\nSpace: `O(1)`, the two stacks are given and we didn't use any extra spaces.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3093992695","body":"### Main Idea\nFor chunks `[c1, c2, c3, ..., cn]`, we have to maintain the property: `max(ci) <= min(cj)` if `i < j`. So we can create a monotonously increasing stack `stack` to **keep track of the max value for each previous chunk**. \n\nIf `arr[i] >= stack.peek()`, we can greedily create a new chunk and `stack.push(arr[i])`. Else, we need to find the previous chunk with max value smaller or equal to `arr[i]`, say `ck`, and we need to merge all the chunks `[c_k+1, ... c_cur]` with `arr[i]`.\n\nTo merge chunks, we can just pop all the max values representing those chunks off the stack, and push back the max among them (in our case, it will be stack top cuz this stack is increasing) as the max of the new chunk. \n\nFinally the size of the stack will be the number of chunks.\n### Code\n```java\nclass Solution {\n public int maxChunksToSorted(int[] arr) {\n int n = arr.length;\n Deque stack = new ArrayDeque<>();\n for (int num : arr) {\n int max = num;\n while (!stack.isEmpty() && stack.peek() > num) {\n max = Math.max(max, stack.pop());\n }\n stack.push(max);\n }\n return stack.size();\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(n)`","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095444824","body":"\n### Main Idea\n1. Find the length of the linked list. If `length == 0`, return `head`.\n2. If `k >= n`, then we can do `k = k % n` which doesn't affect the final result but reduce the number of rotations.\n3. Use two pointers to traverse the linked list to find the last kth element and its previous node.\n4. Modify the linked list.\n\n\n### Code\n```java\nclass Solution {\n public ListNode rotateRight(ListNode head, int k) {\n int n = getLength(head);\n if (n == 0) return head;\n k %= n;\n \n // Find the last kth element as new head\n ListNode fast = head, slow = head;\n for (int i = 0; i < k; ++i) {\n fast = fast.next;\n }\n \n while (fast.next != null) {\n fast = fast.next;\n slow = slow.next;\n }\n \n fast.next = head;\n ListNode newHead = slow.next;\n slow.next = null;\n return newHead;\n \n }\n \n private int getLength(ListNode head) {\n int len = 0;\n while (head != null) {\n ++len;\n head = head.next;\n }\n return len;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(1)`","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100701991","body":"### Main Idea\n1. If the current list has length smaller than 2, don't need to swap.\n2. Else, recursivly swap the list `head.next.next`, and the swap function should return the `next` node.\n3. Swap the current 2 nodes, `newHead = head.next`, `newHead.next = head` and `head.next = next`.\n\n### Code\n```java\nclass Solution {\n public ListNode swapPairs(ListNode head) {\n if (head == null || head.next == null) return head;\n ListNode next = swapPairs(head.next.next);\n ListNode newHead = head.next;\n newHead.next = head;\n head.next = next;\n return newHead;\n }\n}\n```\n\n### Complexity Analysis\n* Time: `O(n)`\n* Space: `O(n)` for the recursive call.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109183645","body":"### Main Idea\n1. Define `inOrder(int i, int j)` to be the problem of the converting `list[i:j]` to BST.\n2. Base case: if `i > j`, return `null`.\n3. Calculate `mid = i + (j - i) / 2`, left subtree will be `inOrder(i, mid - 1)`, and then we create our root with the current node `cur`, then the next node to create will be `cur.next`, and we build the right sutree with `inOrder(mid + 1, j)`.\n\n### Code\n```java\nclass Solution {\n private ListNode cur;\n public TreeNode sortedListToBST(ListNode head) {\n if (head == null) return null;\n cur = head;\n int n = getLength(head);\n return inOrder(0, n - 1);\n }\n\n private TreeNode inOrder(int l, int r) {\n if (l > r) return null;\n int m = l + (r - l) / 2;\n TreeNode left = inOrder(l, m - 1);\n TreeNode root = new TreeNode(cur.val);\n cur = cur.next;\n TreeNode right = inOrder(m + 1, r);\n root.left = left;\n root.right = right;\n return root;\n }\n\n private int getLength(ListNode head) {\n int cnt = 0;\n while (head != null) {\n head = head.next;\n ++cnt;\n }\n return cnt;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(logn)` for recursive calls.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112278406","body":"Say the length of `a_1` to `a_i` is `a`, `b_1` to `b_i` is `b`, and `c_1` to `c_n` is `c`. If there is no interseciton, then `c = 0`. And `a + b = b + a`. If there is an intersection, then `a + c + b = b + c + a`, and the two pointers will meet at the intersection point.\n```\npublic ListNode getIntersectionNode(ListNode headA, ListNode headB) {\n ListNode h1 = headA, h2 = headB;\n while (h1 != h2) {\n\n h1 = h1 == null ? headB : h1.next;\n h2 = h2 == null ? headA : h2.next;\n }\n return h1; \n }\n```\n\nSo we can just go over both linked list once, and switch the pointers.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3118087746","body":"### Main Idea\nDefine two pointers `fast` and `slow`, each iteration, `fast` moves 2 steps forward while `slow` moves 1 step. If there is a cycle, then `fast` will equals `slow` eventually, and if not, we will exit the loop.\n\nIf a cycle is detected, we need to find the starting point. \n\n```\nfast = 2 * slow\n\nfast = l + n1 * c + t\nslow = l + n2 * c + t\n\n\nl + n1 * c + t = 2 * l + 2 * n2 * c + 2 * t\nl = n1 * c - 2 * n2 * c = c * (n1 - 2 * n2) = n' * c - t\n```\n\n```\n L\n-------- ----I-----\n | | D\n ----------\n```\n### Code\n```java\npublic class Solution {\n public ListNode detectCycle(ListNode head) {\n if (head == null) return null;\n ListNode fast = head, slow = head;\n while (fast != null && fast.next != null) {\n fast = fast.next.next;\n slow = slow.next;\n if (fast == slow) {\n while (slow != head) {\n slow = slow.next;\n head = head.next;\n }\n return head;\n }\n }\n return null;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(1)`","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3126063970","body":"### Main Idea\n* Base case 1, both `p` and `q` are `null`, return `true`.\n* Base case 2, else if either of them is `null` or their values are not equal, return `false`.\n* Recursive case: both left and right subtrees are equal.\n\n### Code\n```java\nclass Solution {\n public boolean isSameTree(TreeNode p, TreeNode q) {\n if (p == null && q == null) {\n return true;\n } else if (p == null || q == null || p.val != q.val) {\n return false;\n }\n return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);\n }\n}\n```\n\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(h) = O(n)`","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3136827599","body":"### Main Idea\nThis problem is asking for the leftmost node of the last layer, and when it comes to traversal by layer, BFS comes in handy.\n\nIn a standard BFS algorithm, we use a queue to keep track of the nodes on each layer, we just need to modify the algorithm to record the first node of the current layer, and if we exit the loop from the current layer, that means this is the last layer, and the node we recorded will be the one we want to find.\n\n### Code\n```java\nclass Solution {\n public int findBottomLeftValue(TreeNode root) {\n Queue q = new ArrayDeque<>();\n q.offer(root);\n int res = 0;\n while (!q.isEmpty()) {\n res = q.peek().val;\n int size = q.size();\n for (int i = 0; i < size; ++i) {\n TreeNode n = q.poll();\n if (n.left != null) q.offer(n.left);\n if (n.right != null) q.offer(n.right);\n }\n }\n return res;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(n)`","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3144871038","body":"### main Idea\n1. We store `Pair` in our pq, where `TreeNode` is the node and `int[]` is its coordinate.\n2. Since we want to maintain the row order, we compare pairs by their row order, smaller row has higher priority.\n3. If row numbers are the same, we compare values, since we don't really care about the order we process columns each row.\n4. Use a map that maps `col` to `list` to store the node values.\n\n\n### Code\n* Java\n\n```java\nclass Solution {\n public List> verticalTraversal(TreeNode root) {\n // column -> list\n Map> map = new HashMap<>();\n PriorityQueue> queue = new PriorityQueue<>((p1, p2) -> {\n int loc1[] = p1.getValue();\n int loc2[] = p2.getValue();\n if (loc1[0] == loc2[0]) {\n return p1.getKey().val - p2.getKey().val;\n } else {\n return loc1[0] - loc2[0];\n }\n });\n queue.offer(new Pair(root, new int[] {0, 0}));\n while (!queue.isEmpty()) {\n int size = queue.size();\n for (int i = 0; i < size; ++i) {\n Pair p = queue.poll();\n TreeNode node = p.getKey();\n int loc[] = p.getValue();\n List list = map.getOrDefault(loc[1], new ArrayList<>());\n list.add(node.val);\n map.put(loc[1], list);\n if (node.left != null) {\n queue.offer(new Pair(node.left, new int[] {loc[0] + 1, loc[1] - 1}));\n }\n\n if (node.right != null) {\n queue.offer(new Pair(node.right, new int[] {loc[0] + 1, loc[1] + 1}));\n }\n }\n }\n\n List> res = new ArrayList<>();\n for (int i = -1000; i <= 1000; ++i) {\n if (map.containsKey(i)) {\n res.add(map.get(i));\n }\n }\n return res;\n }\n}\n```\n### Complexity Analysis\nTime: `O(nlogn)`\nSpace: `O(n)`","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3162435845","body":"```java\nclass Solution {\n public int minSubarray(int[] nums, int p) {\n int n = nums.length;\n long arraySum = Arrays.stream(nums).asLongStream().sum(); \n int targetRemainder = (int) (arraySum % p);\n if (targetRemainder == 0) {\n return 0;\n } else if (arraySum < p) {\n return -1;\n }\n \n Map remainderToIndex = new HashMap<>();\n remainderToIndex.put(0, -1);\n \n long preSum = 0;\n int minLen = Integer.MAX_VALUE;\n for (int i = 0; i < n; ++i) {\n preSum += nums[i];\n int remainder = (int) (preSum % p);\n int remainderToCheck = (int) (remainder - targetRemainder);\n if (remainderToCheck < 0) {\n remainderToCheck += p;\n }\n \n if (remainderToIndex.containsKey(remainderToCheck)) {\n int index = remainderToIndex.get(remainderToCheck);\n minLen = Math.min(minLen, i - index);\n }\n \n remainderToIndex.put(remainder, i);\n }\n \n return minLen >= n ? -1 : minLen;\n }\n}\n\n/*\n [3, 1, 4, 2], p = 6\n \n arraySum = 10, targetRemainder = 4\n \n preSum = 3,\n\n [3, 1, 4, 2] = 10\n \n [0, 3, 4, 8, 10]\n \n [7, ]\n \n Sum: 9 p=6\n \n a mod b = (a + b) mod b\n \n (S_j - S_i) mod p == sum mod p\n \n \n x mod p = a\n y mod p = b\n \n (x - y) mod p = a - b (if a >= b)\n a - b + p (if a < b)\n*/\n```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182362544","body":"## Method 1. BFS\n### Main Idea\nBasically, this problem is asking if we can mark the graph with 2 colors, where adjacent vertices can't have the same color.\n\nSo we can apply BFS to traverse the graph, say we mark a vertex `v` with color 1, then we have to mark all its neighbors with color 2. If any of them was marked color 1, then we know it's impossible to mark the graph with 2 colors, so we can return `false`.\n\nIf no such contradictions found, that means the graph can be 2-colored, so return `true`.\n### Code\n* Java\n\n```java\nclass Solution {\n public boolean possibleBipartition(int n, int[][] dislikes) {\n List[] graph = new ArrayList[n + 1];\n for (int i = 0; i <= n; ++i) graph[i] = new ArrayList<>();\n \n for (int[] edge : dislikes) {\n graph[edge[0]].add(edge[1]);\n graph[edge[1]].add(edge[0]);\n }\n \n int[] colors = new int[n + 1];\n for (int i = 1; i <= n; ++i) {\n if (colors[i] != 0) continue;\n Queue q = new ArrayDeque<>();\n q.offer(i);\n colors[i] = 1;\n while (!q.isEmpty()) {\n int size = q.size();\n while (size-- > 0) {\n int v = q.poll(), c = colors[v];\n for (int nei : graph[v]) {\n if (colors[nei] == c) return false;\n if (colors[nei] != 0) continue;\n colors[nei] = -1 * c;\n q.offer(nei);\n }\n }\n }\n }\n return true;\n }\n}\n```\n### Complexity Analysis\nTime: `O(E + V)`\n\nSpace: `O(E + V)`","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204204644","body":"```java\nclass Solution {\n public int mySqrt(int x) {\n int left = 0, right = x;\n\n while (left < right - 1) {\n int mid = left + (right - left) / 2;\n long midSquare = 1l * mid * mid;\n if (midSquare == x) {\n return mid;\n } else if (midSquare < x) {\n left = mid;\n } else {\n right = mid - 1;\n }\n }\n long rightSqaure = 1l * right * right;\n return rightSqaure > x ? left : right;\n }\n}\n```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3222726555","body":"```java\nclass Solution {\n public int maxVowels(String s, int k) {\n String vowels = \"aeiou\";\n int n = s.length(), l = 0, r = 0, res = 0, cnt = 0;\n while (r < n) {\n while (r < n && r - l < k) {\n if (vowels.indexOf(s.charAt(r)) != -1) {\n ++cnt;\n }\n ++r;\n }\n\n res = Math.max(res, cnt);\n if (vowels.indexOf(s.charAt(l)) != -1) {\n --cnt;\n }\n ++l;\n }\n\n return res;\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3243695565","body":"```java\nclass Solution {\n public int maxAreaOfIsland(int[][] grid) {\n int m = grid.length, n = grid[0].length;\n int[][] dirs = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};\n \n int ret = 0;\n for (int i = 0; i < m; i++) {\n for (int j = 0; j < n; j++) {\n if (grid[i][j] == 0) {\n continue;\n }\n \n Queue queue = new ArrayDeque<>();\n queue.offer(new int[] {i, j});\n grid[i][j] = 0;\n int area = 1;\n while (!queue.isEmpty()) {\n int[] loc = queue.poll();\n for (int[] dir : dirs) {\n int x = loc[0] + dir[0], y = loc[1] + dir[1];\n if (x < 0 || x >= m || y < 0 || y >= n || grid[x][y] == 0) {\n continue;\n }\n queue.offer(new int[] {x, y});\n grid[x][y] = 0;\n area++;\n }\n }\n \n ret = Math.max(ret, area);\n }\n }\n \n return ret;\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3269054068","body":"## Method 1. DP + Count\n### Main Idea\nSimilar to the DP solution of the LIS problem, but we also need to count how many shorter subsequences contribute to each subsequence ending at index `i`.\n\nSo we define `dp[i][0]` to be the max len of subsequence ending at `i`, and `dp[i][1]` to be the number of shorter subsequences contributing to \n### Code\n* Java\n\n```java\nclass Solution {\n public int findNumberOfLIS(int[] nums) {\n int n = nums.length, res = 0, max = 0;\n // \n int[][] dp = new int[n][2];\n \n for (int i = 0; i < n; ++i) {\n dp[i][0] = 1;\n int cnt = 1;\n for (int j = 0; j < i; ++j) {\n if (nums[i] > nums[j]) {\n if (dp[j][0] + 1 > dp[i][0]) {\n dp[i][0] = dp[j][0] + 1;\n cnt = dp[j][1];\n } else if (dp[j][0] + 1 == dp[i][0]) {\n cnt += dp[j][1];\n }\n }\n }\n \n if (dp[i][0] > max) {\n max = dp[i][0];\n res = cnt;\n } else if (dp[i][0] == max) {\n res += cnt;\n }\n dp[i][1] = cnt;\n }\n return res;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n^2)`\n\nSpace: `O(n)`","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3295757426","body":"```java\nclass Solution {\n public int change(int amount, int[] coins) {\n int n = coins.length;\n int[] dp1 = new int[amount + 1], dp2 = new int[amount +1];\n for (int i = 0; i < n; i++) {\n for (int j = 0; j <= amount; j++) {\n if (i == 0 || j == 0) {\n if (j % coins[i] == 0) {\n dp2[j] = 1;\n }\n continue;\n }\n \n if (j - coins[i] >= 0) {\n dp2[j] = dp1[j] + dp2[j - coins[i]];\n } else {\n dp2[j] = dp1[j];\n }\n }\n \n int[] tmp = dp1;\n dp1 = dp2;\n dp2 = tmp;\n }\n return dp1[amount];\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/74#issuecomment-3322650611","body":"```java\nclass Solution {\n public int[] singleNumber(int[] nums) {\n int xor = 0;\n for (int num : nums) {\n xor ^= num;\n }\n \n\n int rightmostBit = xor & (-xor);\n \n int num1 = 0, num2 = 0;\n for (int num : nums) {\n if ((num & rightmostBit) != 0) {\n num1 ^= num;\n } else {\n num2 ^= num;\n }\n }\n \n return new int[]{num1, num2};\n }\n}\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"suukii":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mirrors-cl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xqy97":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jakkiabc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckyoneday":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chouqin99":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhaogeg111":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shawnhu23":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ye2222":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"uyplayer":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guixian001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"serena9":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"junzmer":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hx-code":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"admu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xxiaomm":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"pgquestions":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"eldinzhou":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jiangwenzhe":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shawnwu6688":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tomtao626":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aiweng1981":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"richard-lime":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"acoada":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"duanyaqi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ccslience":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kaiykk":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cachezhou0617":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangtuo1999":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cytrue":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckyryan-web":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"naomiwufzz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liuajingliu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"miss1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"johnxizhao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"incipe-win":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"revisegoal":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckysq999":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dereklisdr":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"perfqi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mryao1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"likeyousmile":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhg1992":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liquanluo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aq666888":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"samlu-ecnu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhongxiangxiang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hatorimain":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"neado":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaojunjun1110":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wxleah":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sunl1ght":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kerrhl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"orangejuz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"flyzenr":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"c1f2h3":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dlm001128":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liuxy94":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aconcert":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"linjunhe":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hyqqq22":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yibenxiao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"elon-lau":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nowkizzz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gsgtgyb":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"irenia111":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"suiyi8760":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"saltychess":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rabbit2010520":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ellie-wu05":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yopming":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckytwj":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zzz607":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zoulufeng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xxoojs":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"okkband":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wyz999":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hacker90":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ricjli":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luhaoling":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"flaming-cl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gelxgx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gaominghao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jessie725":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lsunxh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lanceli424":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qycoder":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qilin88":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hengheng-yun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"smz1995":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"size-of":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"moyuanhua":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"9vivian88":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guxuehua":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kirosola":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"biscuit279":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"maoting":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"youzhaing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jawn-ha":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hanwangxxx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dujt-x":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"degndaixingqiu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gzgzgzgzgzgz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gentleman-goodman":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xinyi-arch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zenwangzy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"andyyxw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fourierhai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yangz001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mannnn6":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"haoyangxie":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chjillout":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wenjialu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mhcn":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"coconutice":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jackgaoyuan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xingzhan0312":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yufeng727":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fontendart":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yingchehu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cobayaz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tomato-tomato":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xfliudx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"djd28176":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xilutian":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xy147":[null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091443042","body":"### js代码\n```JavaScript\n\nvar MyQueue = function() {\n this.inStack = [];\n this.outStack = [];\n};\nMyQueue.prototype.push = function(x) {\n this.inStack.push(x);\n};\n\nMyQueue.prototype.pop = function() {\n if (!this.outStack.length) {\n this.in2out();\n }\n return this.outStack.pop();\n};\n\nMyQueue.prototype.peek = function() {\n if (!this.outStack.length) {\n this.in2out();\n }\n return this.outStack[this.outStack.length - 1];\n};\n\nMyQueue.prototype.empty = function() {\n return this.outStack.length === 0 && this.inStack.length === 0;\n};\n\nMyQueue.prototype.in2out = function() {\n while (this.inStack.length) {\n this.outStack.push(this.inStack.pop());\n }\n};\n\n```\n\n### 复杂度分析\n时间复杂度:O(1)\n空间复杂度:O(n)","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3120847716","body":"```\nclass ListNode {\n constructor(key, value) {\n this.key = key\n this.value = value\n this.next = null\n this.prev = null\n }\n}\n\nclass LRUCache {\n constructor(capacity) {\n this.capacity = capacity\n this.hash = {}\n this.count = 0\n this.dummyHead = new ListNode()\n this.dummyTail = new ListNode()\n this.dummyHead.next = this.dummyTail\n this.dummyTail.prev = this.dummyHead\n }\n\n get(key) {\n let node = this.hash[key]\n if (node == null) return -1\n this.moveToHead(node)\n return node.value\n }\n\n put(key, value) {\n let node = this.hash[key]\n if (node == null) {\n if (this.count == this.capacity) {\n this.removeLRUItem()\n }\n let newNode = new ListNode(key, value)\n this.hash[key] = newNode\n this.addToHead(newNode)\n this.count++\n } else {\n node.value = value\n this.moveToHead(node)\n }\n }\n\n moveToHead(node) {\n this.removeFromList(node)\n this.addToHead(node)\n }\n \n removeFromList(node) {\n let temp1 = node.prev\n let temp2 = node.next\n temp1.next = temp2\n temp2.prev = temp1\n }\n\n addToHead(node) {\n node.prev = this.dummyHead\n node.next = this.dummyHead.next\n this.dummyHead.next.prev = node\n this.dummyHead.next = node\n }\n\n removeLRUItem() {\n let tail = this.popTail()\n delete this.hash[tail.key]\n this.count--\n }\n\n popTail() {\n let tail = this.dummyTail.prev\n this.removeFromList(tail)\n return tail\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146107002","body":"```const twoSum = (nums, target) => {\n const prevNums = {};\n\n for (let i = 0; i < nums.length; i++) {\n const curNum = nums[i];\n const targetNum = target - curNum;\n const targetNumIndex = prevNums[targetNum];\n if (targetNumIndex !== undefined) {\n return [targetNumIndex, i];\n } else {\n prevNums[curNum] = i;\n }\n }\n}```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3167532564","body":"### js代码\n```JavaScript\nvar middleNode = function(head) {\n let slow = fast = head\n while(fast && fast.next){\n slow = slow.next\n fast = fast.next.next\n }\n return slow\n};\n\n```\n\n### 复杂度分析\n时间复杂度:O(N)\n空间复杂度:O(1)","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3190926614","body":"### js代码\n```JavaScript\nvar judgeCircle = function(moves) {\n return moves.split('L').length === moves.split('R').length && moves.split('U').length === moves.split('D').length\n};\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"itsjacob":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shunanch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yppah-eb":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"raychenlei":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"woshichuanqilz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"willuuu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"christina-soda":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jia98shanliang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"user-vannnn":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tobepellucid":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"johnvsd":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yueza":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shawyuan97":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"victorhuang99":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cusanity":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jay-xzj":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shiradaone":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xinyue-ma":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"taojin1992":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joyce94":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"steven72574":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tian-pengfei":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"asuka1h":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaowangcoding":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"james0608":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kaneyang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"azl397985856":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"whgsh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chengfengfengwang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bulingbulingbuling":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"c2tr":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"eden-ye":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"codingtrains":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"starorbiting":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mo-xiaoxiu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"passengersa":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073445770","body":"思维:\n1、将数组num和k转换为字符,\n2、使用BigInt方法相加\n3、最后使用将相加得到转换为数字数组\n时间复杂度:O(n)\n代码:\n/**\n * @param {number[]} num\n * @param {number} k\n * @return {number[]}\n */\nvar addToArrayForm = function (num, k) {\n let numStr = num.join('')\n let sum = BigInt(numStr) + BigInt(k)\n return sum.toString().split('').map(Number)\n};","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3084084442","body":"时间复杂度:O(n)\n代码:\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.maxSize = maxSize;\n this.stack = [];\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if (this.stack.length < this.maxSize) {\n this.stack.push(x);\n }\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if (this.stack.length === 0) {\n return -1;\n }\n return this.stack.pop();\n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n const len = this.stack.length;\n const count = Math.min(k, len);\n for (let i = 0; i < count; i++) {\n this.stack[i] += val;\n }\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3097108121","body":"思路:\n首先,计算链表的长度 n。\n接着,将 k 对 n 取模,因为旋转 n 次后链表会回到原来的状态,所以取模可以避免不必要的旋转操作。\n然后,找到新的链表头节点和尾节点。新的链表头节点是原链表中第 n - k 个节点,新的链表尾节点是原链表的最后一个节点。\n最后,将原链表的尾节点连接到原链表的头节点,形成一个环形链表,再从新的链表头节点处断开,得到旋转后的链表。\n时间复杂度:O(n),其中 n 是链表的长度。需要遍历链表两次,第一次计算链表的长度,第二次找到新的链表头节点的前一个节点。\n代码:\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n // 定义链表节点类\nclass ListNode {\n constructor(val = 0, next = null) {\n this.val = val;\n this.next = next;\n }\n}\n/**\n * @param {ListNode} head\n * @param {number} k\n * @return {ListNode}\n */\nvar rotateRight = function(head, k) {\n if (!head || !head.next) return head;\n\n // 计算链表的长度\n let n = 1;\n let tail = head;\n while (tail.next) {\n tail = tail.next;\n n++;\n }\n\n // 对 k 取模\n k %= n;\n\n // 如果 k 为 0,说明不需要旋转,直接返回原链表\n if (k === 0) return head;\n\n // 找到新的链表头节点的前一个节点\n let newTail = head;\n for (let i = 0; i < n - k - 1; i++) {\n newTail = newTail.next;\n }\n\n // 新的链表头节点\n let newHead = newTail.next;\n\n // 断开原链表,形成新的链表\n newTail.next = null;\n tail.next = head;\n\n return newHead; \n};\n\n// 辅助函数:将数组转换为链表\nfunction arrayToList(arr) {\n if (arr.length === 0) return null;\n let head = new ListNode(arr[0]);\n let current = head;\n for (let i = 1; i < arr.length; i++) {\n current.next = new ListNode(arr[i]);\n current = current.next;\n }\n return head;\n}\n\n// 辅助函数:将链表转换为数组\nfunction listToArray(head) {\n let result = [];\n let current = head;\n while (current) {\n result.push(current.val);\n current = current.next;\n }\n return result;\n}","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shellylcooper":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"testplm":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tom-zhouch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"skylarxu214":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"taihui":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huaxueguakele":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yang-chenyu104":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mlking15":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"-3":[],"cyonline":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rzhao010":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zywang0":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jetery":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"klspta":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bookyue":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jancerwu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"buer1121":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ceramickitten":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gg925407590":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"alyenor":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chenming-cao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ggohem":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dark-volute":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ronething":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jmastella":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"paopaohua":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dd2001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mayloveless":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yuexi001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nineis7":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"abby-xu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gsw9818":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaomingshixiaotang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"snmyj":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"flipn9":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wabw1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xqmmy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"a-pricity":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sclihuiming":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"amazeding":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"astrking":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tzuikuo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ringo1597":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"brucezhang-utf-8":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luanxing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"moin-jer":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lihua1997":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cuizezhou":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xuanaxuan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tiandao043":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"restlessbreeze":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ruikiwi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huiminren":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"saitochen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wtdcai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"albert556":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wuxiaoshawn":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zrtch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhuzhu096":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"whoam-challenge":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"weisday":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"syh-coder":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaaller":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kyrie96521":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cavecrypto":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cxgbro":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"erjian96":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"a-polarbear":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"alexno1no2":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yetfan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhiyuanpeng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bwspsu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"arinzz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mdge":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"allenfeng666":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yin02":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"elsa-zhang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"asur4s":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"littlesugarman":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhihaowan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"apockira":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guowei0223":[null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3077086971","body":"```\n首先需要找到所有c出现的index,存在c_index list里为后续的pointer搜索做好准备\npointer = 0 定义好pointer的起点\n遍历s,在c_index的范围内,对比pointer和pointer + 1 和s中各个位置的绝对距离,如果发现pointer和s的距离大于pointer +1,那么说明s的index已经走到了离pointer+1更近的距离,那么这时候我们更新pointer,+ 1, 指到下一个c_index中c的位置。\nres.append()c_index中pointer和s中index的距离\n\nclass Solution:\n def shortestToChar(self, s: str, c: str) -> List[int]:\n c_index = []\n for i in range(len(s)):\n if s[i] == c:\n c_index.append(i)\n pointer = 0\n res = []\n for i in range(len(s)):\n if pointer < len(c_index) -1:\n if abs(i-c_index[pointer])> abs(i-c_index[pointer+1]):\n pointer += 1\n res.append(abs(i-c_index[pointer]))\n return res\n\n因为用了指针,所以时间复杂度 O(n)。 空间复杂度 O(n)。 \n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3087516204","body":"```\n使用栈的经典题型。遇见数字就num*10 + item处理。 遇见【 左括号说明要开始处理括号内部,用stack先存好之前已经处理的结果,遇见】后括号说明括号完成,则需要stack。pop()出保存的结果加上括号里的内容。是字母的话,则res+ item更新括号内信息。\n空间复杂度 O(n)\n时间复杂度 O(n)\n\nclass Solution:\n def decodeString(self, s: str) -> str:\n res = \"\"\n stack = []\n num = 0\n for item in s:\n if item.isdigit():\n num = num * 10 + int(item)\n elif item == \"[\":\n stack.append([num, res])\n num = 0\n res = \"\"\n elif item == \"]\":\n pre_num, pre_res = stack.pop()\n res = pre_res + pre_num * res\n else:\n res += item\n return res\n```","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3101341120","body":"还是链表的老套路,设置一个dummy head。 判断cur.next and cur.next.next: 是否存在,存在了再进行下一步。\n用tmp,tmp1 来保存cur。next和cur.next.next.next。 然后我们开始进行交换步骤。\n\n```\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:\n dummy_head = ListNode(next =head)\n cur = dummy_head\n while cur.next and cur.next.next:\n temp = cur.next\n temp1 = cur.next.next.next\n cur.next = cur.next.next\n cur.next.next = temp\n temp.next = temp1\n cur = cur.next.next\n return dummy_head.next\n\n```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125611734","body":"可以利用bfs的方法解决。 把每个点放入queue中,然后popleft()两个node进行比较。\n\n```\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:\n if not p and not q:\n return True\n if not p or not q:\n return False\n \n que = deque([p,q])\n \n while que:\n cur1 = que.popleft()\n cur2 = que.popleft()\n if not cur1 and not cur2:\n continue\n\n if not cur1 or not cur2 or cur1.val != cur2.val:\n return False\n \n que.append(cur1.left)\n que.append(cur2.left)\n que.append(cur1.right)\n que.append(cur2.right)\n return True\n\n```\n","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3148705374","body":"```\nclass Solution:\n def numberOfBoomerangs(self, points: List[List[int]]) -> int:\n ans = 0\n for x1, y1 in points:\n cnt = defaultdict(int)\n for x2, y2 in points:\n d2 = (x1 - x2) ** 2 + (y1 - y2) ** 2\n ans += cnt[d2] * 2\n cnt[d2] += 1\n return ans\n\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shuqianyang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sj941127":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zjsuper":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yongxi-zhou":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"darwintk":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"h-steven":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mischaqi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wurongronga":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"miduoliu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckyshenzhengkang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"y4h2":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yoco323":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"forschers":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shanshuiqiankun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"annabellhyx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hwfrankfung":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"frederickfan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huibinny":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ggmybro":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"myleetcodejourney":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"want2333":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"staringwhere":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"allenfeng8":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ryanbaiyansong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dou-yu-xuan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hyxupup":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cs12300":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chiehw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aesir-idun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kaldsk12":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hxj2001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"for123s":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zzhilin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yfu6":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mengsixing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"import-ant":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joriscai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wangqianqian202301":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"airwalkers":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhumengcheng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kofzhang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"leonalhq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hjy-u":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"csthaha":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zepherust":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"feefeefee":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hughlin07":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huizsh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chanceyliu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hshen11":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"horace7":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wangzh0114":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dragonfcl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huifeng248":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sarah11qing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"el1as7":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zcytm3000":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"pangjiadai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xb798298436":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ywang525":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"limbo42":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dorapocket":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zoeyzyzyzy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jasonqiu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lp1506947671":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"texamc2":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joemonkeylee":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"northseacoder":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dominique9898":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wl678":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"meisgithub":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sye9286":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fuku-l":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kangliqi1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"richardtaok":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chocolate-emperor":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lydia61":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangjiahuan17":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"seanutf":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangyong-hub":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"erquaner":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jiujingxukong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"x1aox1a":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"drinkmorekaik":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dinjufen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yuzmt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"munmust":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yan-jie":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hktangshuo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zpbc007":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"linlizzz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"krabbejing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"firehaosky":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chao-cc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jinjin680":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cruiseyugh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"quieter2018":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jadeliu13":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaoq777":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jiangyanlineu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liuxiner":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yufanzh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"franciszq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kangqinsen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"manwzy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jerry9926":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"soso1105":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"pkuphy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhenya-zhu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wty9sky":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"skyoct":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bingzxy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaodingc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jyjsunny":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aoxiangw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"enrilwang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aswrise":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aneureka":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ljqchlsw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jingyuzhou123":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dianlandu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jameswangxin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhenxied":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nuozhouzhang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shin-guid":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bochengwan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kyo-tom":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"uratora":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guitarys":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sosdogecoin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zol013":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lrwhc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wwewwt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cyk1337":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangyu1131":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"diana21170648":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"61hhh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"quaaaaaack":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"acy925":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bi9potato":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guangsizhongbin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhaoygcq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"catkathy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yqycs":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhuxinyu-znb":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"freesan44":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mo660":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sencc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"randong22":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"beginner-jamji":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yzhyzhyzh123":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sunstrongchina":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dongzegithub":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"metsystem":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"miller-em":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dorian-byte":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yizhewill":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qiaojunch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhouliuhuo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"beanza":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kingxiaozhe":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ygnauh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wzbwzt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"iambigchen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"weiboshi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"master-guang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jennyjgao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wangjay408":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chang-you":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rocjemaintiendrai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ainfinitedz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"christ36":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hengistchan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huiyingc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"andyli4":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"momogir":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jamjid":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"freeroo2":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ycan253":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"laurallalala":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"danielyan86":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rennzhang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"larscheng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qingkediguo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"adfvcdxv":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"javajianghu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chloe-c11":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"verkru":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"eggeggliu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dr-kkk":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jinhma":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"emergence23":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"0christ1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"junru281":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joe-the-plumber":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jsaki":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"witerth":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ludwig-ll":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luster-lyl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"smallppgirl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"realduxy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"awilekong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wwz223":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangjinzhepro":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"atom-set":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"coderxiaowq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hillsonziqiu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"alexzhang-mini":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xil324":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bordergong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hawkins-hjq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cathyshang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"greyqt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yanglimbo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rao-qianlin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dtjk":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"martina001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lxy1108":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"franklinsworld666":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"brainlds":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huamulanyyds":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"eclairs46":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"maike-hps":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sanjiu81":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qinmengx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yashuning":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luzhaofeng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lizhao-liu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yukibei":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hermione666":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yyyyytc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zin-next":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"pandapls":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jackinai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"godkun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dadahui":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"akxuan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fightforcoding":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jialigogogo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"celestexiong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zjy-debug":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"peggyhao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sleepydog25":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"edwineo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"panfx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liudi9047":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"allanli-lhh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xchen172":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qiaoeve":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tangyi23":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shangjiaw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tongxw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"haodongwang1995":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shuichicx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qunshanhe":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hebingliang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"baiqz":[null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092397229","body":"\n### 思路:\n通过元素在栈之间的转移来模拟队列的先进先出。\n\n\n```python\nclass MyQueue:\n \"\"\"使用两个栈实现的队列类\"\"\"\n\n def __init__(self):\n # 初始化两个栈:stack_in 用于入队操作,stack_out 用于出队操作\n self.stack_in = []\n self.stack_out = []\n\n def push(self, x: int) -> None:\n \"\"\"将元素 x 添加到队列的尾部\n 直接将元素压入 stack_in\n \"\"\"\n self.stack_in.append(x)\n\n def pop(self) -> int:\n \"\"\"移除并返回队列头部的元素\n 1. 如果 stack_out 为空,将 stack_in 中的所有元素弹出并压入 stack_out\n 2. 这样能确保元素以先进先出的顺序出栈\n 3. 弹出 stack_out 的栈顶元素\n \"\"\"\n if not self.stack_out:\n while self.stack_in:\n self.stack_out.append(self.stack_in.pop())\n return self.stack_out.pop()\n\n def peek(self) -> int:\n \"\"\"返回队列头部的元素,但不删除它\n 复用 pop 方法获取队首元素,然后将其压回 stack_out 以保持队列状态不变\n \"\"\"\n res = self.pop()\n self.stack_out.append(res)\n return res\n\n def empty(self) -> bool:\n \"\"\"检查队列是否为空\n 当且仅当两个栈都为空时,队列为空\n \"\"\"\n return not (self.stack_in or self.stack_out)\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaogaoddd":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tuuna":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lxy12l":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chxbilly":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sentiy-hub":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fea1220":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wtbkevin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"awenbocc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hallcia":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huzhipeng-hu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tongtz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lindo146":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"heye0507":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lmw6412036":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/1#issuecomment-3072932165","body":"@azl397985856 需要建day1啦","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3076893308","body":"## 思路1\n\n枚举每个普通字符,分别找到其左侧,右侧**最近**特殊字符的位置,求出距离,并取最小值。\n\n1. 预处理每个特殊字符的位置,保存至数组data;\n2. 枚举每个普通字符,在data中查找其左侧,右侧**最近**特殊字符的位置,求出距离,并取最小值。查找过程用可以**二分**实现,也可以用\n **单个指针记录最后一次位置**实现;\n3. 返回结果。\n\n## 思路1代码\n\n```javascript\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function (s, c) {\n let n = s.length, data = [];\n for (let i = 0; i < n; i++) {\n if (s[i] === c) data.push(i);\n }\n\n // 双指针\n // left 左侧最近的c索引\n // right 右侧最近的c索引 right = left + 1\n let left = -1, right = -1, m = data.length;\n let ans = new Array(n).fill(0);\n for (let i = 0; i < n; i++) {\n let char = s[i];\n if (char === c) continue;\n\n let ldis = Infinity, rdis = Infinity;\n // 在data中寻找左侧最近的c索引\n // left 指针移动的条件:data[left + 1] < i,确保data[left] 是在i的左侧,距离i更近\n while (left + 1 < m && data[left + 1] < i) left++;\n if (left >= 0) ldis = i - data[left];\n \n right = left + 1;\n if (right < m) rdis = data[right] - i;\n ans[i] = Math.min(ldis, rdis);\n }\n return ans;\n };\n```\n\n## 思路1复杂度分析\n\n- 时间复杂度:O(n + m),n为字符串s的长度,m为data的长度,遍历字符串s2次,left也只是从左往右移动一次,为O(m),所以总的时间复杂度为O(n + m)。\n- 空间复杂度:O(m),m为data的长度,不考虑返回值的话,需要一个额外的长度为m的数组来保存c的位置,所以空间复杂度为O(m);考虑返回值,需要一个额外的长度为n的数组来保存结果,间复杂度为O(n)。\n\n---\n\n## 思路2\n\n也可以枚举每个特殊字符c的位置,处理c往左、往右能覆盖的普通字符,记录每个普通字符的最小值即可。\n\n1. 预处理每个特殊字符的位置,保存至数组data;\n2. 从左往右遍历data,处理每个特殊字符c左侧的普通字符的距离,保存至数组答案ans;可以使用思路1单指针记录最后一个位置的方式,降低时间复杂度;具体可以看代码;\n3. 从右往左遍历data,处理每个特殊字符c右侧的普通字符的距离,与答案ans对应位置比较,取最小值;\n4. 返回答案ans。\n\n## 思路2代码\n```javascript\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function (s, c) {\n let n = s.length, data = [], ans = new Array(n).fill(Infinity);\n for (let i = 0; i < n; i++) {\n if (s[i] === c) {\n ans[i] = 0;\n data.push(i);\n }\n }\n\n const m = data.length;\n\n // 从左往右遍历\n let left = 0;//从左往右开始,第一个普通字符的索引\n for (let j of data) {\n while (left < n && s[left] === c) left++;\n while (left < n && s[left] !== c && left < j) {\n // console.log('处理left',left,j);\n ans[left] = Math.min(ans[left], j - left);\n left++;\n }\n }\n\n // 从右往左遍历\n let right = n - 1;// 从右往左开始,第一个普通字符的索引\n for (let i = m - 1; i >= 0; i--) {\n let j = data[i];\n while (right >= 0 && s[right] === c) right--;\n while (right >= 0 && s[right] !== c && right > j) {\n ans[right] = Math.min(ans[right], right - j);\n right--;\n }\n }\n return ans;\n };\n```\n## 思路2复杂度分析\n\n- 时间复杂度:O(n + m),n为字符串s的长度,遍历字符串s1次,遍历data两次,left、right也只是各移动一次,所以总的时间复杂度为O(n + m)。\n- 空间复杂度:O(m),m为data的长度,不考虑返回值的话,需要一个额外的长度为m的数组来保存c的位置,所以空间复杂度为O(m);考虑返回值,需要一个额外的长度为n的数组来保存结果,间复杂度为O(n)。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3082655797","body":"## 思路1\n这是一个典型的栈设计题,数据规模不大的情况下,按照常规操作即可。可以使用数组或链表来存储。\n## 代码1\n```javascript\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.data = []\n this.maxSize = maxSize;\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if(this.data.length < this.maxSize) this.data.push(x);\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if(this.data.length === 0) return -1;\n return this.data.pop(); \n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n let n = this.data.length;\n for(let i = 0;i < k;i++){\n if(i < n) this.data[i] += val;\n else break;\n }\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n```\n## 复杂度分析1\n* 时间复杂度:O(n*k)。n表示操作次数。插入和删除的时间复杂度都是O(1),每次increment都要遍历数组,时间复杂度是O(k);所以总的复杂度为O(n*k)。\n* 空间复杂度:O(n)。n为maxSize。\n---\n## 思路2\n如果k较大,increment是个非常耗时的操作,所以我们需要优化increment的操作。\n优化思路:increment是批量更新的,可以用差分数组来实现。但是又要支持高效的查询与删除操作,所以可以用树状数组来维护这个差分数组。\n## 代码2\n```javascript\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function (maxSize) {\n this.cnt = 0;\n this.data = new Array(maxSize + 1).fill(0);\n this.maxSize = maxSize;\n};\n\n/**\n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function (x) {\n if (this.cnt === this.maxSize) return;\n this.cnt++;\n this.update(this.cnt - 1, x);\n if(this.cnt <= this.maxSize - 1) this.update(this.cnt, -x);\n //console.log('push ',x,this.data);\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function () {\n if(this.cnt === 0) return -1;\n let ans = this.query(this.cnt - 1);\n this.update(this.cnt - 1, -ans);\n if(this.cnt <= this.maxSize - 1) this.update(this.cnt,ans);\n this.cnt--;\n //console.log('pop ',ans,this.data);\n return ans;\n};\n\n/**\n * @param {number} k\n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function (k, val) {\n if(this.cnt === 0) return;\n this.update(0, val);\n let r = Math.min(k,this.maxSize,this.cnt);\n if(r <= this.maxSize - 1) this.update(r,-val);\n};\n\n\nCustomStack.prototype.query = function (i) {\n i = i + 1;\n let ans = 0;\n while (i) {\n ans += this.data[i];\n i -= this.lowbit(i);\n }\n return ans;\n}\n\nCustomStack.prototype.update = function (i, val) {\n i = i + 1;\n while (i <= this.maxSize) {\n this.data[i] += val;\n i += this.lowbit(i);\n }\n}\n\n\nCustomStack.prototype.lowbit = function (i) {\n return i & (-i);\n}\n\n/**\n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n\n```\n\n## 复杂度分析2\n* 时间复杂度:O(n*log(maxSize))。n表示操作次数。插入、删除、批量更新的时间复杂度都是O(log(maxSize));所以总的复杂度为O(n*log(maxSize))。\n* 空间复杂度:O(n)。n为maxSize。\n---\n## 思路3\n有没有保持插入,删除O(1),批量更新O(1)的算法呢?官方题解给出了一个懒删除的技巧。小伙伴们可以尝试一下。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3087040795","body":"## 思路一:栈\n这是一个典型的括号匹配问题,可以用栈来解决。 \n步骤:\n1. 创建一个栈sStack,栈顶元素标示当前答案,初始元素为空字符串;\n2. 创建一个栈nStack,存储需要重复的数字k;\n3. 声明一个全局变量num,用来记录数字。遍历字符串:\n 1. 如果当前字符为数字,追加到num中;\n 2. 如果当前字符为左括号,将num压入栈nStack,将一个新的空字符串压入栈sStack,并清空num。**遇到左括号表示要开启新一轮的字符串重复过程,因此数字栈压入需要重复的数字k,字符串栈压入一个空字符串来存储本轮重复过程产生的答案**;\n 3. 如果当前字符为字母,追加到栈sStack的栈顶元素中;\n 4. 如果当前字符为右括号,取出栈sStack的栈顶元素s,取出栈nStack的栈顶元素k,s重复k次;并追加到栈sStack的栈顶元素中。**遇到右括号表示本轮重复过程结束,因此将栈sStack的栈顶元素重复k次,并追加到栈sStack的栈顶元素中,继续前一轮的重复**。\n 5. 最后栈sStack的栈顶元素即为结果。\n## 代码一\n```javascript\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n let sStack = [''],nStack = [],n = s.length;\n let num = 0;\n for(let i = 0;i < n;i++){\n let c = s[i];\n if(/\\d/.test(c)) num = num * 10 + Number(c);\n else if(c === '[') {\n nStack.push(num);\n num = 0;\n sStack.push('');\n }else if(/[a-z]/.test(c)){\n // console.log(sStack)\n sStack[sStack.length - 1] += c;\n }else{\n let s = sStack.pop(),k = nStack.pop();\n // console.log(s,k);\n if(s) s = s.repeat(k);\n sStack[sStack.length - 1] += s;\n // console.log(sStack)\n }\n }\n return sStack[0];\n };\n```\n## 复杂度分析一\n* 时间复杂度:O(n),其中n为字符串s的长度。\n* 空间复杂度:O(n),需要两个最长长度为n的栈保存答案及数字,其中n为字符串s的长度。\n--- \n## 思路二:递归\n括号匹配问题,一般可以用递归来解决。 \n步骤:\n1. 预处理字符串s,记录与每个“\\[”匹配的“\\]”的位置,保存至数组left中。\n> 预处理匹配括号位置是这类递归问题常见的技巧。\n2. 从左往右遍历字符串s: \n 1. 如果当前字符为字母,则将当前字符添加到结果res中;\n 2. 如果当前字符为数字,则将数字保存在变量num中;\n 3. 如果当前字符为左括号,递归调用f,处理\\[i + 1, left\\[i] - 1]的子串,得到的结果重复num次,并追加到结果res中;num清空;\n4. 返回res。\n\n## 代码二\n```javascript\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n let stack = [],n = s.length,left = new Array(n).fill(-1);\n for(let i = 0;i < n;i++){\n let c = s[i];\n if(c === '[') stack.push(i);\n else if(c === ']') left[stack.pop()] = i;\n }\n return f(0,n - 1);\n // -----------------------------------\n function f(l,r){\n let ans = '',num = 0;\n for(let i = l;i <= r;i++){\n let c = s[i];\n if(/\\d/.test(c)) num = num * 10 + Number(c);\n else if(c === '['){\n ans += f(i + 1,left[i] - 1).repeat(num);\n num = 0;\n i = left[i];\n }else if(/[a-z]/.test(c)) ans += c;\n }\n return ans;\n }\n};\n```\n\n## 复杂度分析二\n* 时间复杂度:O(n),其中n为字符串s的长度。\n* 空间复杂度:O(n),即递归栈深度,最大为n,其中n为字符串s的长度。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091479392","body":"## 思路\n1. 设计双栈,一个用于存放入队数据,一个用于存放出队数据。\n2. 各个操作的实现思路:\n 1. push:将数据压入pushData栈中。\n 2. pop:如果popData栈为空,则将pushData栈中的数据全部弹出并压入popData栈中。然后弹出popData栈的栈顶元素。\n 3. peek:同pop操作,最后一步返回popData栈的栈顶元素。 \n 4. empty:判断两个栈是否为空。 \n\n> js中可以用数组模拟栈。\n## 代码\n```javascript\nvar MyQueue = function() {\n this.pushData = []\n this.popData = [] \n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nMyQueue.prototype.push = function(x) {\n this.pushData.push(x) \n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.pop = function() {\n if(this.popData.length === 0 && this.pushData.length) while(this.pushData.length) this.popData.push(this.pushData.pop());\n return this.popData.pop();\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.peek = function() {\n if(this.popData.length === 0 && this.pushData.length) while(this.pushData.length) this.popData.push(this.pushData.pop());\n return this.popData[this.popData.length - 1];\n};\n\n/**\n * @return {boolean}\n */\nMyQueue.prototype.empty = function() {\n return this.pushData.length === 0 && this.popData.length === 0\n};\n\n/** \n * Your MyQueue object will be instantiated and called as such:\n * var obj = new MyQueue()\n * obj.push(x)\n * var param_2 = obj.pop()\n * var param_3 = obj.peek()\n * var param_4 = obj.empty()\n */\n```\n## 复杂度分析\n- 时间复杂度:O(1):插入、删除、查找操作的均摊时间复杂度都是O(1)\n- 空间复杂度:O(n):栈的存储空间","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094576990","body":"## 思路\n比较容易的思路是,排序后,每个块和排序前元素的种类和数量完全相同,可以用哈希表或前缀和来求解。此思路的时间复杂度是O(n),空间复杂度是O(nlog(n))。 \n后来看了看题解,发现可以用单调栈或维护前后缀的思路来求解。\n\n### 排序块性质\n**我们要想划分最多的块,并且保证排序后的结果和原数组的排序结果相同,则块中的元素必须保证,块中的最大值都比右边的元素小或者相同,块中的最小值都比左边的元素大或者相同。**\n则我们维护一个前缀最大值和后缀最小值两个数组,只要前缀的最大值,小于等于后缀的最小值,则可划分(相当于给数组划一条线)。\n## 代码\n```javascript\n/**\n * @param {number[]} arr\n * @return {number}\n */\nvar maxChunksToSorted = function(arr) {\n let n = arr.length, prefixMax = new Array(n).fill(-Infinity),suffixMin = new Array(n).fill(Infinity);\n for(let i = 0;i < n;i++){\n prefixMax[i] = Math.max(i ? prefixMax[i - 1] : -Infinity,arr[i]);\n let j = n - 1 - i;\n suffixMin[j] = Math.min(j + 1 < n ? suffixMin[j + 1] : Infinity,arr[j]);\n }\n\n let ans = 1;\n for(let i = 0;i < n - 1;i++){\n if(prefixMax[i] <= suffixMin[i + 1]) ans++;\n }\n return ans\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n)\n- 空间复杂度:O(n)\n\n## 参考题解\n[https://leetcode.cn/problems/max-chunks-to-make-sorted-ii/solutions/1/zui-duo-neng-wan-cheng-pai-xu-de-kuai-by-z0wz/](https://leetcode.cn/problems/max-chunks-to-make-sorted-ii/solutions/1/zui-duo-neng-wan-cheng-pai-xu-de-kuai-by-z0wz/)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095130877","body":"## 思路\n旋转链表的本质上是将链表尾部k个节点移动到链表头部。按照这个思路步骤如下:\n1. 计算链表长度l;\n2. 如果 k % l === 0 或者 l === 0,即k为l的整数倍,或者链表为空,则不需要旋转,直接返回head;否则 k = k % l;\n3. 声明两个指针fast、slow,fast先移动k步;\n4. fast、slow同时移动,直到fast到达链表末尾;\n5. 此时:\n 1. slow的下一个节点即为新的头结点\n 2. slow.next 指向 null\n 3. fast.next 指向 head\n 4. 返回新的头结点\n\n## JavaScript代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @param {number} k\n * @return {ListNode}\n */\nvar rotateRight = function(head, k) {\n if(!head || k === 0) return head;\n let l = 0,curr = head;\n while(curr){\n l++;\n curr = curr.next;\n }\n k = k % l;\n if(k === 0) return head;\n let fast = head,slow = head;\n while(k){\n fast = fast.next;\n k--;\n }\n\n while(fast.next){\n fast = fast.next;\n slow = slow.next;\n }\n\n let newHead = slow.next;\n slow.next = null;\n fast.next = head;\n return newHead;\n\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中n为链表的长度。\n- 空间复杂度:O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100439586","body":"## 思路\n因为是两两交换,所以可以声明四个指针记录涉及到交换的节点,修改相关指针的next指向即可。具体步骤如下:\n1. 特判:链表为空或链表只有一个节点,直接返回原链表。\n2. 为了简化代码,声明一个哨兵节点dummy,dummy.next = head,方便统一处理。\n3. 声明指针prev,指向前一次交换后的结束节点;声明指针curr,指向本次交换的开始节点。初始值prev = dummy,curr = head,开始循环:\n 1. 循环终止条件:curr为空或者curr的下一个节点为空(即curr没有可以交换的节点了)。\n 2. 声明next指针,next = curr.next;声明nextCurr指针,nextCurr = curr.next.next;\n 3. 两两交换:curr.next = nextCurr,next.next = curr;\n 4. 重新设置头尾指向,确保下一轮循环正确执行:prev.next = next;\n 5. 重新设置prev,curr:prev = curr; curr = nextCurr;继续循环,直到循环终止条件。\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar swapPairs = function(head) {\n if(!head || !head.next) return head;\n const dummy = new ListNode();\n dummy.next = head;\n \n let prev = dummy,curr = dummy.next;\n while(curr && curr.next){\n let next = curr.next,nextCurr = next.next;\n curr.next = nextCurr;\n next.next = curr;\n \n prev.next = next;\n\n prev = curr;\n curr = curr.next;\n }\n\n return dummy.next;\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是链表的长度。\n- 空间复杂度:O(1),仅使用有限个指针。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3105520636","body":"## 思路\n* 本题目标是将一个有序单链表(升序排列)转换为一棵高度平衡的二叉搜索树(Height Balanced Binary Search Tree)。\n* 核心思想是使用递归方式构建树,每次选择链表的中间节点作为当前子树的根节点,以保证左右子树的高度差不超过 1。\n* 利用快慢指针(slow 和 fast)找到链表的中间节点,并将链表分割为左子链表和右子链表,分别递归构建左右子树。\n* 实现步骤如下:\n 1. 递归终止条件:\n * 如果链表为空(!head),返回 null。\n * 如果只有一个节点(!head.next),直接构建一个 TreeNode 返回。\n 2. 寻找中间节点:\n * 使用快慢指针法,fast 每次走两步,slow 每次走一步,当 fast 到达末尾时,slow 正好指向中间节点。使用一个临时变量 prev 记录 slow 的前一个节点,方便后续断开连接。\n 3. 分割链表:\n * 将 slow 前面的节点作为左子链表,断开连接。\n * slow.next 作为右子链表继续递归处理。\n 4. 构建树节点:\n * 当前 slow.val 作为根节点,递归构建左右子树。\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {ListNode} head\n * @return {TreeNode}\n */\nvar sortedListToBST = function(head) {\n if(!head) return head;\n // display(head)\n if(!head.next) return new TreeNode(head.val);\n\n // 寻找中间节点\n let slow = head,fast = head,prev = null;\n while(fast.next && fast.next.next){\n fast = fast.next.next;\n prev = slow;\n slow = slow.next;\n }\n // 此时,slow是中间节点,slow.next是右子树的根\n let next = slow.next;\n if(prev) prev.next = null;\n slow.next = null;\n\n const root = new TreeNode(slow.val);\n root.left = sortedListToBST(prev ? head : null);\n root.right = sortedListToBST(next);\n return root;\n};\n\nfunction display(head){\n let ans = [],p = head;\n while(p){\n ans.push(p.val);\n p = p.next;\n }\n console.log('处理的树:',ans)\n}\n```\n## 复杂度分析\n* 时间复杂度:O(n log n)\n * 每一层递归都需要遍历链表的一半来找中间节点(O(n)),递归深度为 log n,因此总时间复杂度为 O(n log n)。\n* 空间复杂度:O(log n)\n * 主要是递归调用栈的空间,取决于树的高度。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3111762311","body":"## 思路\n- 定义两个指针 `pA` 和 `pB`,分别从 `headA` 和 `headB` 开始遍历。\n- 当 `pA` 和 `pB` 不相遇时,它们会继续向前移动:\n - 如果 `pA` 到达末尾 (`null`),则跳转到 `headB`。\n - 如果 `pB` 到达末尾 (`null`),则跳转到 `headA`。\n- 这样,两个指针最终会在相交点相遇,或者同时到达末尾 (`null`),从而退出循环。\n- 返回 `pA`,即相交节点或 `null`。\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} headA\n * @param {ListNode} headB\n * @return {ListNode}\n */\nvar getIntersectionNode = function (headA, headB) {\n let pA = headA, pB = headB;\n while (pA !== pB) {\n pA = pA ? pA.next : headB;\n pB = pB ? pB.next : headA;\n }\n return pA;\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n + m),其中 n 和 m 分别为链表 headA 和 headB 的长度。\n- 空间复杂度:O(1),只使用了两个指针变量,没有额外的空间。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3116200386","body":"## 思路\n- 首先处理边界情况:如果head为空,直接返回\n- 快慢指针同时遍历链表,快指针每次走两步,慢指针每次走一步\n- 当两指针相遇时停止第一阶段\n- 如果fast为null,说明无环,返回null\n- 将slow重置为head,两个指针以相同速度继续移动直到相遇\n- 相遇点即为环的起始节点\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar detectCycle = function(head) {\n if(!head) return head;\n let slow = head,fast = head;\n while(fast){\n fast = fast.next;\n if(fast) fast = fast.next;\n\n slow = slow.next;\n\n if(slow === fast) break;\n }\n\n if(!fast) return fast;\n\n slow = head;\n\n while(slow !== fast){\n slow = slow.next;\n fast = fast.next;\n }\n\n return slow\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n)\n- 空间复杂度:O(1)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3125594702","body":"## LRU Cache 算法思路分析\n\nLRU (Least Recently Used) 缓存是一种常用的缓存淘汰策略,当缓存满时,会优先淘汰最近最少使用的元素。\n\n### 核心数据结构\n\n1. **双向链表**:维护元素的访问顺序,头部是最近最少使用的元素,尾部是最近使用的元素\n2. **哈希表(Map)**:提供O(1)时间复杂度的元素查找\n\n### 主要操作实现\n\n#### 1. 初始化\n- 设置缓存容量\n- 初始化当前元素计数器\n- 创建哈希表存储键值对\n- 创建虚拟头节点和尾节点,方便操作\n\n#### 2. 获取元素get\n- 如果元素不存在,返回-1\n- 如果元素存在:\n - 将该节点从当前位置删除\n - 将该节点插入到链表尾部(标记为最近使用)\n - 返回节点值\n\n#### 3. 插入/更新元素put\n- **新元素插入**:\n - 如果缓存已满,删除链表头部节点(最近最少使用的元素)\n - 创建新节点并添加到哈希表\n - 将新节点插入链表尾部\n- **更新元素**:\n - 更新节点值\n - 将节点从当前位置删除并移到链表尾部\n\n#### 4. 辅助方法\n- insertToTail:将节点插入链表尾部\n- deleteFromHead:删除链表头部节点\n- deleteNode:删除指定节点\n\n## 代码\n```javascript\n/**\n * @param {number} capacity\n */\nvar LRUCache = function(capacity) {\n this.capacity = capacity;\n this.cnt = 0;\n this.map = new Map();\n this.head = new DoubleNode();\n this.tail = new DoubleNode();\n this.head.next = this.tail;\n this.tail.prev = this.head; \n};\n\n/** \n * @param {number} key\n * @return {number}\n */\nLRUCache.prototype.get = function(key) {\n // console.log('get',key)\n \n if(this.map.has(key) === false) return -1;\n let node = this.map.get(key);\n\n this.deleteNode(node);\n \n this.insertToTail(node);\n // this.map.set(key,node);\n \n // this.display();\n\n return node.val;\n};\n\n/** \n * @param {number} key \n * @param {number} value\n * @return {void}\n */\nLRUCache.prototype.put = function(key, value) {\n if(this.map.has(key) === false){// 插入操作\n let node = new DoubleNode(key,value);\n if(this.cnt === this.capacity) this.deleteFromHead(); \n else this.cnt++\n this.map.set(key,node);\n this.insertToTail(node);\n }else{\n let node = this.map.get(key);\n node.val = value;\n\n this.deleteNode(node);\n\n this.insertToTail(node);\n // this.map.set(key,node);\n }\n\n // console.log('put',key,value);\n // this.display();\n};\n\nLRUCache.prototype.insertToTail = function(node){\n let prev = this.tail.prev;\n \n prev.next = node;\n node.next = this.tail;\n \n this.tail.prev = node;\n node.prev = prev;\n}\n\nLRUCache.prototype.deleteFromHead = function(){\n let node = this.head.next;\n let next = node.next;\n \n this.head.next = next;\n next.prev = this.head;\n\n this.map.delete(node.key);\n}\n\nLRUCache.prototype.deleteNode = function(node){\n let prev = node.prev,next = node.next;\n prev.next = next;\n next.prev = prev;\n\n node.prev = null;\n node.next = null;\n\n // this.map.delete(node.key);\n}\n\nLRUCache.prototype.display = function(){\n let k = this.cnt,p = this.head.next;\n let ans = []\n while(k){\n ans.push(p.key + '=>' + p.val);\n k--;\n p = p.next;\n }\n console.log(ans);\n}\n\nfunction DoubleNode(key,val){\n this.key = key;\n this.val = val;\n this.next = null;\n this.prev = null;\n}\n\n\n/** \n * Your LRUCache object will be instantiated and called as such:\n * var obj = new LRUCache(capacity)\n * var param_1 = obj.get(key)\n * obj.put(key,value)\n */\n```\n## 复杂度分析\n### 时间复杂度\n- get操作:O(1)\n- put操作:O(1)\n\n### 空间复杂度\n- O(capacity),需要存储最多capacity个元素\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3123739061","body":"## 思路\n\n使用了递归的思想来解决问题:\n\n1. **基础情况(Base Case)**:如果当前节点为空(`!root`),则返回深度0,因为空节点没有深度。\n\n2. **递归关系(Recursive Relation)**:\n - 分别计算左子树和右子树的最大深度:`maxDepth(root.left)` 和 `maxDepth(root.right)`\n - 取两者中的较大值:`Math.max(maxDepth(root.left), maxDepth(root.right))`\n - 加上当前节点的1层高度:`+1`\n\n### 算法执行过程\n\n1. 对于任意节点,先递归计算其左子树的最大深度\n2. 再递归计算其右子树的最大深度\n3. 比较左右子树的深度,取较大值\n4. 将较大值加1(代表当前节点所在的层),作为以当前节点为根的子树的最大深度\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar maxDepth = function(root) {\n if(!root) return 0;\n return Math.max(maxDepth(root.left),maxDepth(root.right))+1;\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**:O(n),其中n是二叉树的节点数。因为需要遍历每个节点一次。\n- **空间复杂度**:O(h),其中h是二叉树的高度。这是由于递归调用栈的深度,最坏情况下(完全不平衡的树)可能达到O(n),最好情况下(完全平衡的树)为O(log n)。\n\n这是一个典型的分治算法应用,将问题分解为更小的子问题(左右子树的深度),然后合并结果得到最终答案。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125568669","body":"## 代码思路分析\n\n这是一个经典的二叉树递归问题,采用深度优先搜索(DFS)的方式解决:\n\n1. **基本情况处理**:\n - 如果两个节点都为null,则认为相同,返回true\n - 如果其中一个节点为null,另一个不是,则不同,返回false\n\n2. **递归比较**:\n - 比较当前节点的值是否相等\n - 递归比较左子树是否相同\n - 递归比较右子树是否相同\n - 只有当值相等且左右子树都相同时,才返回true\n\n## 代码实现\n\n```javascript\nvar isSameTree = function(p, q) {\n // 如果两个节点都为空,则相同\n if(p===null && q===null) return true;\n // 如果只有一个节点为空,则不同\n if(p===null) return false;\n if(q===null) return false;\n // 比较当前节点值,并递归比较左右子树\n return p.val===q.val && isSameTree(p.left,q.left) && isSameTree(p.right,q.right);\n};\n```\n\n\n## 复杂度分析\n\n- **时间复杂度**:O(min(m,n)),其中m和n分别是两个二叉树的节点数。在最坏情况下,需要遍历两个树中所有节点。\n- **空间复杂度**:O(min(m,n)),递归调用的层数最多为较小树的高度,最坏情况下为O(min(m,n))。\n\n这个算法通过递归方式同时遍历两棵树的相同位置节点,并比较它们的值是否相等,从而判断两棵树是否完全相同。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3130348089","body":"## 思路\n\n### 核心思路\n- 使用深度优先搜索(DFS)遍历二叉树\n- 在遍历过程中维护从根节点到当前节点形成的数字\n- 当到达叶节点时,将形成的数字加到结果中\n\n### 具体实现\n\n1. **函数定义与参数**:\n - `sumNumbers(root, prev = 0)` 接收当前节点 `root` 和之前形成的数字 `prev`\n - `prev` 参数有默认值 0,用于累积从根到当前节点的数字\n\n2. **边界条件处理**:\n ```javascript\n if(!root) return 0;\n ```\n\n - 如果当前节点为空,返回 0\n\n3. **数字累积**:\n ```javascript\n prev = prev * 10 + root.val;\n ```\n\n - 将当前节点值添加到路径数字中\n - 通过 `prev * 10 + root.val` 实现数字的逐位构建\n\n4. **叶节点判断**:\n ```javascript\n if(!root.left && !root.right) return prev;\n ```\n\n - 如果当前节点是叶节点(无左右子节点),返回累积的数字\n\n5. **递归处理**:\n ```javascript\n return sumNumbers(root.left,prev) + sumNumbers(root.right,prev);\n ```\n\n - 分别递归处理左右子树\n - 将左右子树的结果相加返回\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar sumNumbers = function(root,prev = 0) {\n if(!root) return 0;\n prev = prev * 10 + root.val;\n if(!root.left && !root.right) return prev;\n return sumNumbers(root.left,prev) + sumNumbers(root.right,prev);\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**:O(n),其中 n 是二叉树的节点数,需要遍历每个节点一次\n- **空间复杂度**:O(h),其中 h 是二叉树的高度,主要是递归调用栈的空间\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3134622736","body":"## 思路\n\n### 1. 核心思想\n使用深度优先搜索(DFS)遍历二叉树,记录每一层最左边的节点值。\n\n### 2. 关键实现点\n\n- **层级记录**:通过 `level` 参数跟踪当前节点所在的层级\n- **每层只记录一次**:利用 `level === left.length` 条件确保每层只记录第一个访问的节点值\n- **先左后右遍历**:先遍历左子树再遍历右子树,保证每层第一个访问的是最左边的节点\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n let left = [];\n dfs(root,0)\n return left[left.length - 1];\n // ----------------------\n function dfs(root,level){\n if(!root) return;\n if(level === left.length) left.push(root.val);\n dfs(root.left,level + 1);\n dfs(root.right,level + 1);\n }\n};\n```\n## 优化后的代码\n优化思路:没必要用数组保存整个左侧值,只需要记录左侧值第一次出现即可\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n let left = 0,ans;\n dfs(root,0)\n return ans;\n // ----------------------\n function dfs(root,level){\n if(!root) return;\n if(level === left) {\n left++;\n ans = root.val;\n }\n dfs(root.left,level + 1);\n dfs(root.right,level + 1);\n }\n};\n```\n\n\n## 复杂度分析\n- **时间复杂度**:O(n),其中 n 是二叉树的节点数,需要遍历每个节点一次\n- **空间复杂度**:O(h),其中 h 是二叉树的高度,主要是递归调用栈的空间开销","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3138308014","body":"## 思路\n\n### 1. 序列化 (`serialize`)\n- 使用前序遍历(根-左-右)遍历二叉树\n- 对于每个节点:\n - 如果节点为空,将 `null` 添加到结果数组\n - 如果节点不为空,将节点值添加到结果数组,然后递归处理左右子树\n- 最后将数组转换为 JSON 字符串返回\n\n### 2. 反序列化 (`deserialize`)\n- 将 JSON 字符串解析为数组\n- 使用递归方式重建二叉树:\n - 按顺序读取数组元素\n - 如果当前元素是 `null`,返回 `null`\n - 如果当前元素不是 `null`,创建新节点,并递归构建左右子树\n - 利用前序遍历的特点,按顺序处理就能重建原来的树结构\n\n## 关键特点\n\n1. **前序遍历**:保证了根节点在子节点之前被处理,便于重建时确定父子关系\n2. **空节点标记**:用 `null` 标记空节点,确保能完全还原树的结构\n3. **递归实现**:两个函数都使用递归方式实现,代码简洁清晰\n\n## 示例说明\n\n假设有一棵二叉树:\n```\n 1\n / \\\n 2 3\n / \\\n 4 5\n```\n\n\n- 序列化结果:`[1,2,null,null,3,4,null,null,5,null,null]`\n- 反序列化时按此顺序重建树结构\n\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val) {\n * this.val = val;\n * this.left = this.right = null;\n * }\n */\n\n/**\n * Encodes a tree to a single string.\n *\n * @param {TreeNode} root\n * @return {string}\n */\nvar serialize = function(root) {\n let ans = [];\n dfs(root);\n return JSON.stringify(ans);\n // -----------------\n function dfs(root){\n if(!root){\n ans.push(null);\n return;\n }\n ans.push(root.val);\n dfs(root.left);\n dfs(root.right);\n }\n};\n\n/**\n * Decodes your encoded data to tree.\n *\n * @param {string} data\n * @return {TreeNode}\n */\nvar deserialize = function(data) {\n let arr = JSON.parse(data),i = 0;\n //console.log(arr);\n return dfs();\n // if(arr.length === 0) return null;\n // ---------------------\n function dfs(){\n let node;\n // console.log(i,arr[i]);\n if(arr[i] === null) node = null;\n else node = new TreeNode(arr[i]);\n i++;\n if(node) {\n node.left = dfs();\n node.right = dfs();\n }\n return node;\n }\n};\n\n/**\n * Your functions will be called as such:\n * deserialize(serialize(root));\n */\n```\n\n## 复杂度分析\n- 时间复杂度:序列化和反序列化的时间复杂度都是 O(n),其中 n 是二叉树的节点数。\n- 空间复杂度:考虑到返回值的话,序列化和反序列化的空间复杂度都是 O(n),其中 n 是二叉树的节点数。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3141895435","body":"## 思路\n\n### 具体实现步骤\n\n1. **数据结构选择**\n - 使用一个大小为2001的数组 cols 每个元素是一个优先队列 `PriorityQueue`\n - 优先队列用于处理同一列中节点的排序问题\n\n2. **排序规则**\n - 主要按行号 row 排序(上到下)\n - 行号相同时按节点值 `node.val` 排序\n\n3. **DFS遍历**\n - 通过 dfs 函数遍历整个二叉树\n - 将每个节点按其列号存入对应的优先队列中\n - 列号通过 `col + 1000` 映射到数组索引,处理负数列号\n\n4. **结果构建**\n - 遍历 cols 数组,跳过空队列\n - 从每个非空队列中依次取出元素,构建每列的结果\n - 按列顺序组合成最终结果\n\n## 关键点\n\n- **坐标系统**:以根节点为原点(0,0),向左列号减1,向右列号加1,向下行号加1\n- **偏移处理**:通过 `col + 1000` 将可能的负数列号映射到正数索引\n- **排序逻辑**:同一位置优先按行排序,其次按值排序\n\n这种方法确保了垂直遍历的正确顺序。\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {TreeNode} root\n * @return {number[][]}\n */\nvar verticalTraversal = function(root) {\n let cols = new Array(2000 + 1).fill(0).map(()=>new PriorityQueue((a,b)=>{\n if(a[0] !== b[0]) return a[0] - b[0];\n return a[2] - b[2];\n }));\n\n dfs(root,0,0);\n let ans = [];\n for(let i = 0;i <= 2000;i++){\n let data = cols[i];\n if(data.size() === 0) continue;\n let temp = []\n while(data.size()) temp.push(data.dequeue()[2]);\n ans.push(temp);\n }\n return ans;\n\n // --------------------------------\n function dfs(node,row,col){\n if(!node) return;\n cols[col + 1000].enqueue([row,col,node.val]);\n dfs(node.left,row + 1,col - 1);\n dfs(node.right,row + 1,col + 1);\n }\n \n};\n```\n\n## 复杂度分析\n\n### 时间复杂度\n\n1. **初始化阶段**\n - 创建大小为2001的数组并初始化优先队列:O(2001) = O(1)\n\n2. **DFS遍历阶段**\n - 对每个节点执行一次 dfs 调用\n - 假设树有 N 个节点,则 DFS 总共执行 N 次\n - 每次 enqueue 操作在优先队列中的时间复杂度为 O(log M),其中 M 是队列中元素个数\n - 最坏情况下,所有节点都在同一列,M 最大为 N\n - 因此 DFS 阶段时间复杂度为 O(N log N)\n\n3. **结果构建阶段**\n - 遍历2001个位置的数组:O(2001) = O(1)\n - 从优先队列中 dequeue 所有元素:每个元素 dequeue 一次,总共 N 个元素\n - 每次 dequeue 操作为 O(log M)\n - 总时间复杂度为 O(N log N)\n\n**总时间复杂度:O(N log N)**,其中 N 是二叉树中节点的数量\n\n### 空间复杂度\n\n1. **存储结构**\n - cols 数组:大小固定为 2001,每个元素是一个优先队列\n - 所有优先队列总共存储 N 个节点信息:O(N)\n - 每个节点信息是一个包含3个元素的数组:O(1) 每节点\n\n2. **递归调用栈**\n - dfs 函数的递归深度最多为树的高度 H\n - 在最坏情况下(树退化为链表),H = N\n - 平均情况下,对于平衡二叉树,H = log N\n\n3. **结果数组**\n - ans 数组存储最终结果:O(N)\n\n**总空间复杂度:O(N)**,其中 N 是二叉树中节点的数量\n\n### 总结\n\n- **时间复杂度:O(N log N)**\n- **空间复杂度:O(N)**\n\n其中 N 为二叉树的节点总数。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146457266","body":"## 思路:\n\n1. **使用哈希表存储已遍历元素**:\n - 创建一个空对象 [map](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\454\\2.js#L5-L5) 作为哈希表\n - 用于存储已经遍历过的元素值和其对应的索引\n\n2. **一次遍历查找**:\n - 遍历数组中的每个元素 `nums[i]`,记为 [a](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\452\\1.js#L14-L14)\n - 计算目标差值 `b = target - a`\n - 检查 `b` 是否已经在哈希表中存在\n - 如果存在,说明找到了两个数,它们的和等于目标值,直接返回这两个数的索引 `[map[b], i]`\n - 如果不存在,将当前元素 [a](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\452\\1.js#L14-L14) 和它的索引 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 存入哈希表,继续遍历\n\n### 算法优势:\n1. **时间复杂度优化**:从暴力解法的 O(n²) 降低到 O(n)\n2. **空间换时间**:使用额外的哈希表存储,换取查找时间的优化\n3. **一次遍历**:只需要遍历一次数组就能得到结果\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number[]}\n */\nvar twoSum = function(nums, target) {\n let map = {}\n for(let i = 0;i < nums.length;i++){\n let a = nums[i],b = target - a;\n if(map[b] !== undefined) return [map[b],i];\n map[a] = i;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是数组的长度。\n- 空间复杂度:O(n),哈希表 map 的大小为 n。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3146924002","body":"## 思路\n### 主要步骤:\n\n1. **统计频次**:使用 [map](file:///E:/力扣刷题/algorithm_exercises/程序员面试金典/面试题04.01.节点间通路/main.js#L13-L13) 对象统计每个数字在数组中出现的频次\n ```javascript\n let map = {};\n for(let i of nums) map[i] = (map[i] || 0) + 1;\n ```\n\n\n2. **维护大小为 K 的最小堆**:使用最小堆来保存频率最高的 K 个元素\n ```javascript\n let q = new MinPriorityQueue(v=>v[1]); // 基于元素出现频次的优先队列\n ```\n\n\n遍历统计结果,将元素和其频次作为数组加入堆中,当堆的大小超过 K 时,移除堆顶(即当前堆中频次最低的元素):\n ```javascript\n for(let key in map){\n q.enqueue([+key,map[key]]);\n if(q.size() > k) q.dequeue();\n }\n ```\n\n\n3. **构建结果数组**:依次从堆中取出元素,因为是最小堆,所以频次低的先出堆,最终得到的就是频次最高的 K 个元素\n ```javascript\n let ans = [];\n while(q.size()){\n ans.push(q.dequeue()[0]);\n }\n ```\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar topKFrequent = function(nums, k) {\n let q = new MinPriorityQueue(v=>v[1]);\n let map = {};\n for(let i of nums) map[i] = (map[i] || 0) + 1;\n for(let key in map){\n q.enqueue([+key,map[key]]);\n if(q.size() > k) q.dequeue();\n } \n let ans = [];\n while(q.size()){\n ans.push(q.dequeue()[0]);\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(N log K),其中 N 是数组的长度\n- 空间复杂度:O(N),用于存储频次映射表","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3148902680","body":"## 思路\n\n### 1. 数据结构选择\n- 使用 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5) 数组存储每个点到其他点的距离统计\n- `map[i]` 是一个 Map,记录第 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 个点到其他各点的距离及出现次数\n\n### 2. 核心逻辑\n- **距离计算**:遍历所有点对,计算两点间距离的平方(避免开根号运算)\n- **距离统计**:将每对点的距离信息分别记录到两个点的统计中\n- **结果计算**:对于每个点,如果到其他点有相同距离的点超过1个,则可以组成回旋镖\n\n### 3. 关键步骤详解\n\n```javascript\n// 计算两点间距离的平方\nfunction calc(i,j){\n let a = Math.abs(points[i][0] - points[j][0]),b = Math.abs(points[i][1] - points[j][1]);\n return a * a + b * b;\n}\n```\n这段代码计算两个点之间的欧几里得距离的平方,使用平方避免浮点运算。\n\n```javascript\n// 统计每个点到其他点的距离\nfunction addMap(i,dis){\n let m = map[i];\n m.set(dis,(m.get(dis) || 0) + 1);\n}\n```\n将距离信息记录到对应点的统计Map中。\n\n### 4. 结果计算原理\n\n对于每个点 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6),如果存在 `v` 个点与它距离相同(`v>1`),则可以从这 `v` 个点中选择 2 个点与点 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 组成回旋镖,选择方式有 `v*(v-1)` 种。\n\n\n## 代码\n```javascript\n/**\n * @param {number[][]} points\n * @return {number}\n */\nvar numberOfBoomerangs = function(points) {\n let n = points.length;\n if(n < 3) return 0;\n let map = new Array(n).fill(0).map(()=>new Map());\n for(let i = 0;i < n;i++){\n for(let j = i + 1;j < n;j++){\n let dis = calc(i,j);\n addMap(i,dis);\n addMap(j,dis);\n }\n }\n let ans = 0;\n for(let i = 0;i < n;i++){\n for(let [k,v] of map[i]){\n if(v <= 1) continue;\n ans += v * (v - 1);\n }\n }\n\n return ans;\n\n \n\n\n // ------------------------------\n function calc(i,j){\n let a = Math.abs(points[i][0] - points[j][0]),b = Math.abs(points[i][1] - points[j][1]);\n return a * a + b * b;\n }\n\n function addMap(i,dis){\n let m = map[i];\n m.set(dis,(m.get(dis) || 0) + 1);\n\n }\n};\n```\n\n## 算法复杂度\n- 时间复杂度:O(n²)\n- 空间复杂度:O(n²)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3152979976","body":"## 思路\n\n### 核心思想\n使用**滑动窗口**(Sliding Window)技术配合**哈希表**来解决这个问题。\n\n### 关键变量说明\n- [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31): 滑动窗口的左边界\n- [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6): 滑动窗口的右边界(循环变量)\n- [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5): 用于记录窗口内每个字符出现的次数\n- `ans`: 记录最长无重复子串的长度\n\n### 算法步骤\n\n1. **初始化**:设置左边界 `l = 0`,创建字符计数的 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5),初始化结果 `ans = 0`\n\n2. **扩展窗口**:使用 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 从左到右遍历字符串,逐步扩展窗口右边界\n\n3. **处理重复字符**:\n - 当遇到重复字符时(`map.has(c)` 为 true),不断右移左边界 [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31)\n - 移动过程中减少对应字符的计数,如果计数为0则从 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5) 中删除\n - 直到窗口中不再包含当前字符为止\n\n4. **更新结果**:\n - 计算当前窗口长度 `i - l + 1`\n - 与历史最大值比较,更新 `ans`\n\n5. **维护窗口状态**:将当前字符加入 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5) 并增加其计数\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @return {number}\n */\nvar lengthOfLongestSubstring = function(s) {\n let l = 0, map = new Map(),n = s.length,ans = 0;\n for(let i = 0;i < n;i++){\n let c = s[i]\n while(map.has(c)){\n map.set(s[l],map.get(s[l]) - 1);\n if(map.get(s[l]) === 0) map.delete(s[l]);\n l++;\n }\n // console.log(l,i,s.slice(l,i + 1));\n ans = Math.max(i - l + 1,ans);\n map.set(c,(map.get(c) || 0 ) + 1)\n }\n return ans;\n};\n```\n\n\n## 复杂度分析\n- **时间复杂度**: O(n),其中 n 是字符串长度,每个字符最多被访问两次\n- **空间复杂度**: O(min(m,n)),其中 m 是字符集大小","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3157255368","body":"## 思路\n\n### 1. 建立单词频次映射\n```javascript\nlet map = new Map();\nwords.forEach((word,i)=>{\n map.set(word,(map.get(word) || 0) + 1);\n});\n```\n\n- 使用 `Map` 统计 `words` 数组中每个单词的出现次数\n- 处理 `words` 中可能存在重复单词的情况\n\n### 2. 初始化参数\n```javascript\nlet n = s.length,m = words.length,k = words[0].length,l = k * m;\n```\n\n- [n](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6): 字符串 [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 的长度\n- `m`: 单词数组的长度\n- `k`: 每个单词的长度(题目保证所有单词等长)\n- [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31): 所有单词连接后的总长度\n\n### 3. 遍历可能的起始位置\n```javascript\nfor(let i = 0;i <= n - l;i++){}\n```\n\n- 只需检查到 `n - l` 位置,因为更后面不可能容纳完整的连接串\n\n### 4. 检查每个窗口\n```javascript\nlet j = i,result = new Map(),total = 0;\nwhile(j < i + l){\n let c = s.slice(j,j + k);\n if(map.has(c) === false) break;\n let found = false;\n result.set(c,(result.get(c) || 0) + 1);\n if(result.get(c) <= map.get(c)) found = true;\n if(found === false) break;\n j += k;\n total++;\n}\n```\n\n- 从位置 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 开始,每次取长度为 `k` 的子串进行匹配\n- 使用 `result` 记录当前窗口中各单词的出现次数\n- 如果遇到不在 `words` 中的单词或某个单词出现次数超过要求,则提前终止\n- `total` 记录成功匹配的单词数\n\n### 5. 判断结果\n```javascript\nif(total === m) ans.push(i);\n```\n\n- 当成功匹配的单词数等于 `words` 长度时,说明找到了一个有效子串\n\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string[]} words\n * @return {number[]}\n */\nvar findSubstring = function(s, words) {\n let map = new Map();\n words.forEach((word,i)=>{\n map.set(word,(map.get(word) || 0) + 1);\n });\n let n = s.length,m = words.length,k = words[0].length,l = k * m;\n if(n < l) return [];\n let ans = [];\n for(let i = 0;i <= n - l;i++){\n let j = i,result = new Map(),total = 0;\n while(j < i + l){\n // console.log('check',s.slice(i,i + m * k));\n let c = s.slice(j,j + k);\n if(map.has(c) === false) break;\n let found = false;\n result.set(c,(result.get(c) || 0) + 1);\n if(result.get(c) <= map.get(c)) found = true;\n if(found === false) break;\n j += k;\n total++;\n }\n if(total === m) ans.push(i); \n }\n return ans;\n};\n```\n## 复杂度分析\n### 时间复杂度\n- 外层循环: O(n - l)\n- 内层循环: O(m)\n- 总体复杂度: O((n - l) × m)\n### 空间复杂度\nO(n):存储单词频次映射和结果数组\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3162347437","body":"## 思路\n\n使用前缀和 + 哈希表的方法,基于以下数学原理:\n\n1. 如果总和 `totalSum % p = delta`,我们需要找到一个子数组,其和模 `p` 也等于 `delta`\n2. 这样删除该子数组后,剩余元素和就能被 `p` 整除\n\n## 代码步骤分析\n\n### 1. 前缀和计算\n```javascript\nlet n = nums.length, sum = new Array(n + 1).fill(0);\nfor(let i = 0; i < n; i++) sum[i + 1] = sum[i] + nums[i];\n```\n\n- 构建前缀和数组 `sum`,其中 `sum[i]` 表示前 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 个元素的和\n- `sum[0] = 0`,`sum[i] = nums[0] + nums[1] + ... + nums[i-1]`\n\n### 2. 计算目标余数\n```javascript\nlet delta = sum[n] % p;\nif(delta === 0) return 0;\n```\n\n- `sum[n]` 是所有元素的总和\n- `delta` 是总和对 `p` 的余数\n- 如果 `delta` 为 0,说明总和已能被 `p` 整除,返回 0\n\n### 3. 寻找最短子数组\n```javascript\nlet ans = Infinity;\nlet map = new Map();\nfor(let i = 0; i <= n; i++){\n let b = sum[i], a = (b % p - delta % p + p) % p;\n map.set(b % p, i);\n if(map.has(a)) ans = Math.min(ans, i - map.get(a));\n}\n```\n\n\n关键数学关系:\n- 对于子数组 `nums[j...i-1]`,其和为 `sum[i] - sum[j]`\n- 我们希望 `(sum[i] - sum[j]) % p = delta`\n- 即 `sum[i] % p = (sum[j] + delta) % p`\n- 变形得:`sum[j] % p = (sum[i] % p - delta) % p`\n\n具体实现:\n- `b = sum[i]`:当前前缀和\n- `a = (b % p - delta % p + p) % p`:需要找到的前缀和余数\n- 用 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5) 记录每个余数值最后一次出现的位置\n- 如果找到对应的余数 [a](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L27-L27),则更新最短长度\n\n### 4. 返回结果\n```javascript\nreturn ans === n ? -1 : ans;\n```\n\n- 如果最短长度等于数组长度,说明需要删除整个数组,返回 -1\n- 否则返回找到的最短子数组长度\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} p\n * @return {number}\n */\nvar minSubarray = function(nums, p) {\n let n = nums.length,sum = new Array(n + 1).fill(0);\n for(let i = 0;i < n;i++) sum[i + 1] = sum[i] + (nums[i]);\n // p = BigInt(p);\n let delta = sum[n] % p;\n if(delta === 0) return 0;\n let ans = Infinity;\n let map = new Map();\n for(let i = 0;i <= n;i++){\n let b = sum[i],a = (b % p - delta % p + p) % p;\n map.set(b % p,i);\n if(map.has(a)) ans = Math.min(ans,i - map.get(a));\n }\n return ans === n ? -1 : ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),只需遍历一次数组\n- 空间复杂度:O(n),用于存储前缀和数组和哈希表","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3166424389","body":"\n## 思路\n使用了经典的**快慢指针**(龟兔赛跑)算法。\n\n1. **双指针技巧**:\n - `slow` 指针每次移动一步\n - `fast` 指针每次移动两步\n - 当 `fast` 到达链表末尾时,`slow` 正好在中间位置\n\n## 代码执行流程\n\n- **初始化**:两个指针 `slow` 和 `fast` 都指向链表头节点 [head](file://E:\\其他项目\\algorithm_exercises\\程序员面试金典\\面试题02.04.分割链表\\main.js#L50-L50)\n- **循环条件**:`while (fast && fast.next)` 确保 `fast` 可以安全地移动两步\n- **指针移动**:\n - `fast` 连续移动两步:`fast = fast.next; fast = fast.next;`\n - `slow` 移动一步:`slow = slow.next;`\n- **返回结果**:当循环结束时,`slow` 指向中间节点\n\n## 处理奇偶数节点的情况\n\n- **奇数个节点**:返回正中间的节点\n- **偶数个节点**:返回第二个中间节点(如链表有4个节点,则返回第3个节点)\n\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar middleNode = function(head) {\n let slow = head,fast = head;\n while(fast && fast.next){\n fast = fast.next;\n fast = fast.next;\n slow = slow.next;\n }\n return slow;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是链表的节点数。\n- 空间复杂度:O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3169628215","body":"## 思路\n\n1. 使用双指针技术:\n - [r](file:///E:/力扣刷题/algorithm_exercises/周赛/456/2.js#L10-L17) 指针(慢指针):指向不重复序列的最后一个元素位置\n - [i](file:///E:/力扣刷题/algorithm_exercises/程序员面试金典/面试题08.07.无重复字符串的排列组合/main.js#L9-L22) 指针(快指针):用于遍历整个数组\n\n2. 初始化:\n - [r](file:///E:/力扣刷题/algorithm_exercises/周赛/456/2.js#L10-L17) 从 0 开始,表示第一个元素肯定是要保留的\n - [i](file:///E:/力扣刷题/algorithm_exercises/程序员面试金典/面试题08.07.无重复字符串的排列组合/main.js#L9-L22) 从 1 开始遍历\n\n3. 核心逻辑:\n - 当 `nums[i] > nums[r]` 时,说明找到了一个新的不重复元素\n - 此时将 [r](file:///E:/力扣刷题/algorithm_exercises/周赛/456/2.js#L10-L17) 向前移动一位,并将 `nums[i]` 与 `nums[r]` 交换\n - 由于数组是排序的,所以只需要比较大小就能判断是否是新元素\n\n4. 返回值:\n - 返回 [r](file:///E:/力扣刷题/algorithm_exercises/周赛/456/2.js#L10-L17) + 1,即不重复元素的个数\n\n### 示例演示:\n\n假设数组为 [0, 0, 1, 1, 2, 2]:\n\n1. 初始:r = 0, i = 1,nums[1] = 0, nums[0] = 0,不满足 `nums[i] > nums[r]`\n2. i = 2,nums[2] = 1, nums[0] = 0,满足 `nums[2] > nums[0]`,r 变为 1,交换 nums[2] 和 nums[1]\n - 数组变为 [0, 1, 0, 1, 2, 2],r = 1\n3. i = 3,nums[3] = 1, nums[1] = 1,不满足 `nums[i] > nums[r]`\n4. i = 4,nums[4] = 2, nums[1] = 1,满足 `nums[4] > nums[1]`,r 变为 2,交换 nums[4] 和 nums[2]\n - 数组变为 [0, 1, 2, 1, 0, 2],r = 2\n5. i = 5,nums[5] = 2, nums[2] = 2,不满足 `nums[i] > nums[r]`\n6. 结束,返回 r + 1 = 3\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar removeDuplicates = function(nums) {\n let n = nums.length,r = 0;\n for(let i = 1;i < n;i++){\n if(nums[i] > nums[r]) {\n r++;\n swap(i,r);\n }\n //console.log(nums);\n }\n return r + 1;\n // ------------------------\n function swap(i,j){\n [nums[i],nums[j]] = [nums[j],nums[i]]\n }\n};\n```\n\n### 复杂度分析:\n\n- 时间复杂度:O(n),只需要遍历一次数组\n- 空间复杂度:O(1),只使用了常数级别的额外空间\n- 利用了数组已经排序的特性,通过比较大小判断是否重复\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172297646","body":"## 思路\n经典的二分查找算法,用于在有序数组中找到目标值的插入位置\n1. **初始化变量**:\n - `n`:数组长度\n - `l`:左边界,初始为0\n - `r`:右边界,初始为n-1\n - `ans`:结果位置,初始为n(表示插入到数组末尾)\n\n2. **二分查找逻辑**:\n - 使用标准二分查找模板,当`l <= r`时继续查找\n - `mid = (l + r) >> 1`:计算中间位置(相当于除以2取整)\n - 关键判断:`if(nums[mid] >= target)`\n - 如果中间元素大于等于目标值,说明目标值应该在左半部分(包括mid位置)\n - 更新`ans = mid`,并将右边界移动到`mid - 1`\n - 否则,目标值在右半部分,将左边界移动到`mid + 1`\n\n3. **返回结果**:\n - 返回找到的插入位置`ans`\n\n### 特殊情况处理\n\n- 如果target小于所有元素,ans保持为0(正确位置)\n- 如果target大于所有元素,ans保持为n(数组长度,正确位置)\n- 如果target等于某个元素,ans为该元素的索引\n- 如果target介于两个元素之间,ans为较大元素的位置\n\n这个实现非常优雅,通过一个变量ans记录可能的答案,避免了在循环外再进行额外判断,使得代码简洁且易于理解。\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar searchInsert = function(nums, target) {\n let n = nums.length;\n let l = 0, r = n - 1,ans = n;\n while(l <= r){\n let mid = (l + r) >> 1;\n if(nums[mid] >= target){\n ans = mid;\n r = mid - 1;\n }else l = mid + 1;\n }\n return ans;\n};\n```\n\n### 复杂度分析\n\n1. **时间复杂度**:O(log n),典型的二分查找时间复杂度\n2. **空间复杂度**:O(1),只使用了常数级别的额外空间\n3. **核心思想**:寻找第一个大于等于target的元素位置","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173065451","body":"## 思路\n\n这段代码使用**单调队列**(双端队列)来解决滑动窗口最大值问题,时间复杂度为 O(n)。\n\n### 实现步骤\n\n1. **数据结构选择**\n - 使用 `q` 数组作为双端队列,存储数组元素的**索引**\n - 队列中保持索引对应的值**单调递减**的特性\n\n2. **维护单调性**\n ```javascript\n while(q.length && back() < nums[i]) q.pop();\n q.push(i);\n ```\n\n - 在每次添加新元素前,移除队尾所有小于当前元素的索引\n - 这样保证队首始终是当前窗口的最大值索引\n\n3. **窗口处理**\n ```javascript\n if(i >= k - 1){\n ans.push(nums[q[0]]); // 队首即为窗口最大值\n if(i - q[0] + 1 === k) q.shift(); // 移除窗口外的元素\n }\n ```\n\n - 当达到窗口大小时开始记录结果\n - 及时移除超出窗口范围的索引\n\n### 关键技巧\n\n- 存储索引而非值,便于判断元素是否在窗口范围内\n- 利用单调性快速获取窗口最大值(队首元素)\n- 通过索引差值判断元素是否需要移出窗口\n\n### 缺陷\n在javascript中,使用数组模拟双端队列,队首出队、入队的时间复杂度均为O(n),性能较差,可以考虑手动实现一个双端队列,例如使用双向链表,优化性能。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar maxSlidingWindow = function(nums, k) {\n let q = [],n = nums.length;\n let ans = [];\n for(let i = 0;i < n;i++){\n while(q.length && back() < nums[i]) q.pop();\n q.push(i);\n if(i >= k - 1){\n ans.push(nums[q[0]]);\n if(i - q[0] + 1 === k) q.shift();\n }\n }\n return ans;\n // ------------------------\n function back(){\n return nums[q[q.length - 1]];\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是数组的长度。单调队列的维护时间复杂度为 O(n),窗口处理时间复杂度为 O(n),因此总时间复杂度为 O(n)。\n- 空间复杂度:O(n),单调队列最多存储 n 个元素,因此空间复杂度为 O(n)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3177500710","body":"## 思路\n\n### 1. 数据结构设计\n- 使用两个数组 `ind` 和 `outd` 分别记录每个人的入度和出度\n- 数组长度为 `n+1` 是为了方便使用1到n的索引对应人编号\n\n### 2. 统计过程\n```javascript\nfor(let [a,b] of trust){\n outd[a]++; // a相信别人,出度+1\n ind[b]++; // b被别人相信,入度+1\n}\n```\n\n- 遍历信任关系数组,统计每个人的入度和出度\n\n### 3. 法官判断\n```javascript\nfor(let i = 1;i <= n;i++){\n if(outd[i] === 0 && ind[i] === n - 1) return i;\n}\n```\n\n- 遍历所有人,寻找满足条件的人:\n - `outd[i] === 0`:不相信任何人\n - `ind[i] === n - 1`:被其他所有人相信\n\n这是典型的图论中利用入度出度解决问题的方法。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} trust\n * @return {number}\n */\nvar findJudge = function(n, trust) {\n let ind = new Array(n + 1).fill(0),// 入度\n outd = new Array(n + 1).fill(0);// 出度\n for(let [a,b] of trust){\n outd[a]++;\n ind[b]++;\n }\n for(let i = 1;i <= n;i++){\n if(outd[i] === 0 && ind[i] === n - 1) return i;\n }\n return -1;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(T + N),其中T是信任关系数,N是人数\n- 空间复杂度:O(N),用于存储入度和出度数组","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182022991","body":"## 思路\n\n### 1. 图的构建\n- 使用邻接表`g`存储不喜欢关系\n- 对于每一对`[a,b]`,在[a](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L27-L27)的邻接表中添加`b`,在`b`的邻接表中添加[a](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L27-L27)\n- 这样构建出一个无向图,表示不喜欢关系\n\n### 2. 二分图判断\n- 使用染色法判断是否为二分图\n- `color`数组记录每个节点的颜色状态:\n - `0`表示未染色\n - `1`表示第一组\n - `2`表示第二组\n\n### 3. DFS遍历\n- 遍历所有节点,对未染色节点开始DFS\n- [f(i, val)](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17)函数:\n - 将节点[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6)染成颜色[val](file://E:\\其他项目\\algorithm_exercises\\libs\\LinkedList.js#L34-L34)\n - 遍历[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6)的所有邻居节点`j`\n - 如果邻居`j`已有颜色且与[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6)相同,返回`false`\n - 如果邻居`j`未染色,递归将其染成相反颜色\n - 所有情况满足则返回`true`\n\n### 4. 核心逻辑\n- 主函数中遍历所有节点,对未染色节点调用[f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17)函数\n- 如果任何一次调用返回`false`,说明无法二分,返回`false`\n- 全部成功则返回`true`\n\n这是典型的二分图判定问题,通过图的遍历和染色来解决。\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} dislikes\n * @return {boolean}\n */\nvar possibleBipartition = function(n, dislikes) {\n let g = new Array(n + 1).fill(0).map(()=>[]);\n for(let [a,b] of dislikes){\n g[a].push(b);\n g[b].push(a);\n }\n let color = new Array(n + 1).fill(0);\n for(let i = 1;i <= n;i++){\n if(color[i] === 0 && !f(i,1)) return false;\n }\n return true;\n\n // ------------------------\n function f(i,val){\n color[i] = val;\n for(let j of g[i]){\n if(color[j] && color[j] === val) return false;\n if(!color[j] && !f(j,val === 1 ? 2 : 1)) return false; \n }\n return true;\n }\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n + dislikes.length) - 线性时间复杂度\n- 空间复杂度:O(n + dislikes.length) - 主要用于存储图结构和递归栈","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3186678361","body":"## 主要思路\n\n### 1. 预处理阶段\n- **处理未分配项目**:将 `group[i] === -1` 的项目分配给新的虚拟组\n- **构建组内项目映射**:建立 `groupItems` 数组,记录每个组包含的项目\n\n### 2. 构建依赖图\n- **项目依赖图** (`itemG`):记录项目间的依赖关系\n- **小组依赖图** (`groupG`):记录小组间的依赖关系\n- **计算入度**:\n - `inID`:每个项目的入度\n - `inGD`:每个小组的入度\n\n### 3. 双层拓扑排序\n- **组间拓扑排序**:先对小组进行拓扑排序\n- **组内拓扑排序**:对每个小组内的项目进行拓扑排序\n\n## 关键函数分析\n\n### 主函数流程\n```javascript\n// 初始化和构建图结构\n// ...\n\n// 组间拓扑排序\nfor(let i = 0;i <= m;i++){\n if(inGD[i] === 0) qG.enqueue(i);\n}\nwhile(qG.size()){\n let i = qG.dequeue();\n getItemsFromGroup(i); // 处理组内项目\n // 更新小组依赖\n}\n```\n\n\n### 组内拓扑排序函数 `getItemsFromGroup`\n```javascript\nfunction getItemsFromGroup(g){\n // 对特定组内的项目进行拓扑排序\n // 只处理组内依赖关系\n}\n```\n\n## 核心思想\n采用**分层拓扑排序**策略:\n1. 先确保小组间的依赖关系满足\n2. 再确保每个小组内部的项目依赖关系满足\n3. 通过双层 BFS 实现完整的排序逻辑\n\n这种解法有效地将复杂的依赖关系分解为两个相对简单的拓扑排序问题。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number} m\n * @param {number[]} group\n * @param {number[][]} beforeItems\n * @return {number[]}\n */\nvar sortItems = function(n, m, group, beforeItems) {\n for(let i = 0;i < n;i++){\n if(group[i] === -1) group[i] = m++;\n }\n\n let groupItems = new Array(m).fill(0).map(()=>[]);\n for(let i = 0;i < n;i++){\n groupItems[group[i]].push(i);\n }\n\n\n\n let itemG = new Array(n).fill(0).map(()=>[]);// 项目依赖关系建图\n let groupG = new Array(m).fill(0).map(()=>new Set());// 小组依赖关系建图\n let inID = new Array(n).fill(0);//每个项目的入度\n let inGD = new Array(m).fill(0);//每个小组的入度\n beforeItems.forEach((prevs,curr)=>{\n inID[curr] += prevs.length;\n for(let prev of prevs) {\n itemG[prev].push(curr);\n let u = group[prev],v = group[curr];\n if(u === v) continue;\n if(groupG[u].has(v)) continue;\n groupG[u].add(v);\n inGD[v]++;\n }\n });\n\n //console.log('小组依赖',groupG,groupItems);\n\n let ans = [],qG = new Queue();\n\n\n for(let i = 0;i <= m;i++){\n if(inGD[i] === 0) qG.enqueue(i);\n }\n while(qG.size()){\n let i = qG.dequeue();\n getItemsFromGroup(i);\n for(let j of groupG[i]){\n inGD[j]--;\n if(inGD[j] === 0) qG.enqueue(j);\n }\n }\n return ans.length === n ? ans : [];\n\n // ---------------------------------\n function getItemsFromGroup(g){\n let items = groupItems[g];\n let qI = new Queue();\n for(let i of items){\n if(inID[i] === 0) qI.enqueue(i);\n }\n while(qI.size()){\n let i = qI.dequeue();\n ans.push(i);\n for(let j of itemG[i]){\n inID[j]--;\n if(inID[j] === 0 && group[j] === g) qI.enqueue(j);\n }\n }\n }\n\n };\n```\n## 复杂度分析\n- **时间复杂度**:O(n + m + |beforeItems|) - 每个项目和依赖关系只被处理一次\n- **空间复杂度**:O(n + m) - 存储图结构和队列","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3190382685","body":"## 思路\n没啥好说的,模拟就完了\n## 代码\n```javascript\n/**\n * @param {string} moves\n * @return {boolean}\n */\nvar judgeCircle = function(moves) {\n let x = 0,y = 0;\n for(let move of moves){\n if(move === 'U') x--;\n else if(move === 'D') x++;\n else if(move === 'L') y--;\n else y++;\n } \n return x === 0 && y === 0\n};\n```\n## 复杂度分析\n- 时间复杂度O(n)\n- 空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193453621","body":"## 思路\n\n### 主要步骤:\n\n1. **数据预处理**:\n - 将原始任务数组 [enqueueTime, processingTime] 扩展为 [enqueueTime, processingTime, index],保留原始索引信息\n - 按照入队时间(enqueueTime)对任务进行排序\n\n2. **使用优先队列**:\n - 创建一个优先队列,排序规则是:\n - 首先按处理时间(processingTime)升序排列\n - 如果处理时间相同,则按下标(index)升序排列\n\n3. **任务处理逻辑**:\n - 初始化结果数组和当前时间点(end)\n - 当还有未处理任务或优先队列不为空时:\n - 如果优先队列为空,将当前时间点更新为下一个任务的入队时间\n - 将所有在当前时间点之前或刚好到达的未处理任务加入优先队列\n - 从优先队列中取出优先级最高的任务执行\n - 更新当前时间点(加上该任务的处理时间)\n - 将该任务的原始索引加入结果数组\n\n### 关键点解释:\n\n- **优先队列的作用**:确保在可执行的任务中,总是选择处理时间最短的任务执行(最短作业优先调度算法)\n- **时间管理**:通过 [end] 变量追踪当前时间点,确保任务按时间顺序被考虑\n- **边界处理**:当优先队列为空时,直接跳转到下一个任务的入队时间,避免不必要的循环\n\n## 代码\n```javascript\n/**\n * @param {number[][]} tasks\n * @return {number[]}\n */\nvar getOrder = function(tasks) {\n let data = [],n = tasks.length;\n // 按任务入队时间排序,同时不丢失下标信息。\n tasks.forEach((v,i)=>data.push([...v,i])); \n data.sort((a,b)=>a[0] - b[0]);\n // 优先队列,优先级为:先按任务时长,再按下标\n let i = 0,q = new PriorityQueue((a,b)=>{\n if(a[1] !== b[1]) return a[1] - b[1];\n return a[2] - b[2];\n });\n\n let ans = [],end = 0;\n while(i < n || q.size()){\n if(q.size() === 0) end = Math.max(end,data[i][0]);\n while(i < n && data[i][0] <= end) q.enqueue(data[i++]);\n let [_,p,index] = q.dequeue();\n ans.push(index);\n end += p;\n }\n return ans;\n};\n```\n\n## 复杂度分析\n### 时间复杂度:\n- 排序:O(n log n)\n- 优先队列操作:每个任务最多入队和出队一次,每次操作 O(log n)\n- 总体复杂度:O(n log n)\n### 空间复杂度:\n- 需要一个优先队列及一个数组保存数据,空间复杂度为 O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194152066","body":"## 思路\n\n### 主要函数功能\n\n1. [numberOfRounds](file:///E:/力扣刷题/algorithm_exercises/.md#L4-L13) - 主函数,计算从登录到登出之间的完整游戏回合数\n2. [parseTime](file:///E:/力扣刷题/algorithm_exercises/.md#L16-L18) - 辅助函数,将时间字符串解析为小时和分钟\n3. [calc](file:///E:/力扣刷题/algorithm_exercises/.md#L20-L37) - 核心计算函数,计算两个时间之间的回合数\n\n### 解题思路\n\n1. **时间解析**:首先将登录时间和登出时间解析为小时和分钟的数组\n2. **跨天处理**:如果登出时间早于登录时间,说明跨越了午夜,需要在登出时间上加24小时\n3. **回合计算**:\n - 将登录时间向上取整到最近的15分钟倍数(下一回合开始时间)\n - 计算登出时间和登录时间之间的15分钟间隔数\n - 如果结果为负数,则返回0\n\n### 代码细节\n\n```javascript\n// 时间取整逻辑\nif(m1 <= 0) m1 = 0;\nelse if(m1 <= 15) m1 = 15;\nelse if(m1 <= 30) m1 = 30;\nelse if(m1 <= 45) m1 = 45;\nelse {\n m1 = 0;\n h1++;\n}\n```\n\n这个逻辑将登录时间向上取整到下一个回合开始时间(每15分钟为一个回合)。\n\n```javascript\nlet ans = Math.floor((h2 * 60 + m2 - (h1 * 60 + m1)) / 15);\n```\n这行代码计算两个时间点之间有多少个完整的15分钟时间段。\n\n## 代码\n```javascript\n/**\n * @param {string} loginTime\n * @param {string} logoutTime\n * @return {number}\n */\nvar numberOfRounds = function(loginTime, logoutTime) {\n let [h1,m1] = parseTime(loginTime),[h2,m2] = parseTime(logoutTime);\n if(h1 < h2 || h1 === h2 && m1 < m2) return calc(h1,m1,h2,m2);\n return calc(h1,m1,h2 + 24,m2);\n // -------------------------\n function parseTime(time){\n return time.split(':').map(v=>Number(v));\n }\n\n function calc(h1,m1,h2,m2){\n if(m1 <= 0) m1 = 0;\n else if(m1 <= 15) m1 = 15;\n else if(m1 <= 30) m1 = 30;\n else if(m1 <= 45) m1 = 45;\n else {\n m1 = 0;\n h1++;\n }\n // console.log(h1,m1,h2,m2)\n let ans = Math.floor((h2 * 60 + m2 - (h1 * 60 + m1)) / 15);\n if(ans < 0) return 0;\n return ans;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(1),因为解析时间和计算都是常数时间操作。\n- 空间复杂度:O(1),因为只使用了常数个变量。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3195140726","body":"## 思路\n\n### 主函数 `minCharacters`\n- 通过比较三种情况的最小值来得到最终答案:\n - `altb(a,b)`: 使 a 中所有字符 < b 中所有字符需要的操作数\n - `altb(b,a)`: 使 b 中所有字符 < a 中所有字符需要的操作数\n - `aeqb(a,b)`: 使两个字符串都由同一字符组成需要的操作数\n\n### 辅助函数分析\n\n1. **`altb(a,b)` 函数**\n - 遍历分割点 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) (1-25,对应字符 'b'-'z')\n - 计算需要修改的字符数:\n - [a](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L27-L27) 中所有 ≥ i 的字符都需要修改\n - `b` 中所有 < i 的字符都需要修改\n - 返回最小操作数\n\n2. **`aeqb(a,b)` 函数**\n - 统计两个字符串中各字符出现次数\n - 找到出现频率最高的字符\n - 将其他所有字符都修改为该字符即为最少操作数\n\n3. **`getCharValue` 函数**\n - 将字符转换为对应的数值 (a=0, b=1, ..., z=25)\n\n## 代码\n```javascript\n/**\n * @param {string} a\n * @param {string} b\n * @return {number}\n */\nvar minCharacters = function(a, b) {\n return Math.min(altb(a,b),altb(b,a),aeqb(a,b));\n // --------------------------------------\n function altb(a,b){\n let ans = Infinity;\n for(let i = 1;i < 26;i++){\n let temp = 0;\n for(let c of a) if(getCharValue(c) >= i) temp++;\n for(let c of b) if(getCharValue(c) < i) temp++;\n ans = Math.min(ans,temp);\n }\n return ans;\n }\n\n function aeqb(a,b){\n let data = new Array(26).fill(0);\n for(let c of a) data[getCharValue(c)]++;\n for(let c of b) data[getCharValue(c)]++;\n let max = data.reduce((a,b)=>Math.max(a,b),0);\n return a.length + b.length - max;\n }\n\nfunction getCharValue(char){\n return char.charCodeAt(0) - 'a'.charCodeAt(0);\n }\n};\n```\n\n\n## 复杂度分析\n- 时间复杂度:O((m+n)×26) = O(m+n),其中 m 和 n 分别是字符串 a 和 b 的长度\n- 空间复杂度:O(1),只使用了固定大小的额外空间\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3199063845","body":"## 思路\n使用**三路快排(Three-way QuickSort)**的实现,主要通过以下步骤完成排序:\n1. **选择基准值(pivot)**:使用 `viot` 函数选择一个合适的基准值\n2. **分区操作(partition)**:将数组分为三部分:小于基准值、等于基准值、大于基准值\n3. **递归排序**:对小于和大于基准值的两个子数组递归进行快排\n\n## 关键函数分析\n\n### 1. 主排序函数 `quickSort`\n```javascript\nfunction quickSort(l,r){\n if(l >= r) return;\n let i = viot(l,r); // 选择基准值位置\n if(r - l === 1) return;\n if(i !== l) swap(i,l); // 将基准值移到最左边\n let [low,up] = partition(l,r); // 三路分区\n quickSort(l,low - 1); // 递归排序小于基准值的部分\n quickSort(up + 1,r); // 递归排序大于基准值的部分\n}\n```\n\n\n### 2. 基准值选择 `viot`\n```javascript\nfunction viot(l,r){\n // 选择左、中、右三个元素作为候选\n let a = nums[l], c = nums[r];\n let mid = (l + r) >> 1, b = nums[mid];\n \n // 通过比较这三个值选择一个较优的基准值位置\n // 实现了三数取中法的思想\n}\n```\n\n\n### 3. 三路分区 [partition](file://E:\\其他项目\\algorithm_exercises\\程序员面试金典\\面试题02.04.分割链表\\main.js#L15-L48)\n```javascript\nfunction partition(i,j){\n let viot = nums[i], l = i - 1, r = j + 1;\n for(let k = i; k < r; k++){\n let c = nums[k];\n if(c > viot){\n r--;\n swap(k,r);\n k--; // 交换后需要重新检查当前位置\n }else if(c < viot){\n l++;\n swap(k,l);\n }\n // c === viot 时,元素保持在中间区域\n }\n return [l + 1, r - 1]; // 返回等于基准值的区间边界\n}\n```\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar sortArray = function(nums) {\n quickSort(0,nums.length - 1);\n return nums;\n // -------------------------\n function quickSort(l,r){\n if(l >= r) return;\n // console.log(l,r,nums);\n // 找基准值位置\n let i = viot(l,r);\n if(r - l === 1) return;\n if(i !== l) swap(i,l);\n // console.log('viot',nums[l]);\n let [low,up] = partition(l,r);\n // console.log(mid,nums);\n quickSort(l,low - 1);\n quickSort(up + 1,r);\n }\n\n function partition(i,j){\n let viot = nums[i],l = i - 1,r = j + 1;\n for(let k = i;k < r;k++){\n let c = nums[k];\n if(c > viot){\n r--;\n swap(k,r);\n k--;\n }else if(c < viot){\n l++;\n swap(k,l);\n }\n }\n return [l + 1,r - 1];\n }\n\n function viot(l,r){\n let a = nums[l],c = nums[r];\n if(a > c){\n swap(l,r);\n a = nums[l];\n c = nums[r];\n }\n if(r - l === 1) return;\n let mid = (l + r) >> 1,b = nums[mid];\n // if(a === c && a === b) return l;\n if(a === c) return a < b ? l : mid;\n if(b === a || b === c) return l;\n else if(b < a) return l;\n else if(b > a && b < c) return mid;\n return r;\n }\n\n function swap(l,r){\n [nums[l],nums[r]] = [nums[r],nums[l]];\n }\n };\n```\n\n## 复杂度分析\n- **三路快排**:能够很好地处理有重复元素的数组,将相等元素聚集在一起\n- **优化的基准值选择**:使用三数取中法减少最坏情况的发生\n- **原地排序**:不需要额外的存储空间\n- **时间复杂度**:平均 O(n log n),最坏 O(n²)\n- **空间复杂度**:O(log n)(递归调用栈)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204104013","body":"## 思路\n\n### 2. 初始化变量\n- [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31):二分查找的左边界,初始值为 `0`。\n- `r`:二分查找的右边界,初始值为 `x`。\n- `ans`:用于记录当前找到的满足条件的最大整数平方根,初始值为 `0`。\n\n### 3. 二分查找过程\n- 循环条件为 `l <= r`,表示在左边界小于等于右边界时继续查找。\n- 计算中间值 `mid`:\n ```javascript\n let mid = l + ((r - l) >> 1);\n ```\n\n 这里使用了位运算 `>> 1` 来代替除以 `2` 的操作,目的是提高计算效率。\n- 判断逻辑:\n - 如果 `mid * mid <= x`,说明 `mid` 可能是答案,但还可能有更大的值满足条件,因此更新 `ans = mid` 并将左边界右移:`l = mid + 1`。\n - 否则,说明 `mid` 太大,需要将右边界左移:`r = mid - 1`。\n\n### 4. 返回结果\n- 最终返回 `ans`,即找到的满足条件的最大整数平方根。\n\n\n## 代码\n```javascript\n/**\n * @param {number} x\n * @return {number}\n */\nvar mySqrt = function(x) {\n let l = 0,r = x,ans = 0;\n while(l <= r){\n let mid = l + ((r - l) >> 1);\n if(mid * mid <= x){\n ans = mid\n l = mid + 1;\n }else{\n r = mid - 1;\n }\n }\n return ans;\n};\n```\n### 复杂度分析\n- 时间复杂度为 `O(log x)`,因为采用了二分查找策略。\n- 空间复杂度为 `O(1)`,只使用了常数级别的额外空间。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3208885502","body":"## 思路\n\n### 1. 二分查找策略\n- 使用 [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31) 和 `r` 维护搜索区间 `[1, n]`\n- 通过 `mid = l + ((r - l) >> 1)` 计算中点,避免整数溢出\n- 根据 `isBadVersion(mid)` 的结果调整搜索区间\n\n### 2. 搜索逻辑\n- 如果 `isBadVersion(mid)` 返回 `true`(当前版本是错误的):\n - 记录当前版本为候选答案 `ans = mid`\n - 在左半区间继续搜索 `r = mid - 1`\n- 如果返回 `false`(当前版本是正确的):\n - 在右半区间继续搜索 `l = mid + 1`\n\n\n\n## 代码\n```javascript\n/**\n * Definition for isBadVersion()\n * \n * @param {integer} version number\n * @return {boolean} whether the version is bad\n * isBadVersion = function(version) {\n * ...\n * };\n */\n\n/**\n * @param {function} isBadVersion()\n * @return {function}\n */\nvar solution = function(isBadVersion) {\n /**\n * @param {integer} n Total versions\n * @return {integer} The first bad version\n */\n return function(n) {\n let l = 1,r = n,ans = 1;\n while(l <= r){\n let mid = l + ((r - l) >> 1);\n if(isBadVersion(mid)){\n ans = mid;\n r = mid - 1;\n }else l = mid + 1;\n }\n return ans;\n };\n};\n```\n## 复杂度分析\n- 时间复杂度:O(log n)\n- 空间复杂度:O(1)\n- 通过不断缩小区间范围,最终找到第一个错误版本","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/42#issuecomment-3213065724","body":"## 思路\n\n1. **归并排序框架**:使用分治思想,将数组不断二分,递归处理左右两部分\n2. **关键逻辑**:在合并两个有序数组时,统计满足 `nums[i] > 2 * nums[j]` 条件的翻转对数量\n\n## 代码结构分析\n\n### 主函数 `reversePairs`\n- 初始化变量和临时数组\n- 调用 `sort` 函数进行归并排序\n- 返回统计结果 `ans`\n\n### 排序函数 `sort`\n- 标准的归并排序递归结构\n- 将数组 `[l, r]` 分为 `[l, mid]` 和 `[mid+1, r]` 两部分\n- 递归排序后调用 [merge](file://E:\\其他项目\\algorithm_exercises\\3.js#L27-L37) 合并\n\n### 合并函数 [merge](file://E:\\其他项目\\algorithm_exercises\\3.js#L27-L37)\n包含两个主要步骤:\n\n1. **统计翻转对**:\n ```javascript\n if(nums[i] / 2 > nums[j]){\n ans += mid - i + 1;\n j++;\n }else i++;\n ```\n\n - 利用左右两部分已排序的特性\n - 当 `nums[i] > 2 * nums[j]` 时,说明从 `i` 到 `mid` 的所有元素都与 `nums[j]` 构成翻转对\n\n2. **标准归并**:\n - 将两个有序数组合并为一个有序数组\n - 使用 `temp` 数组作为临时存储\n\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar reversePairs = function(nums) {\n let n = nums.length,ans = 0;\n let temp = new Array(n);\n sort(0,n - 1);\n return ans;\n // -----------------------\n function sort(l,r){\n if(l >= r) return;\n let mid = (l + r) >> 1;\n sort(l,mid);\n sort(mid + 1,r);\n merge(l,r,mid);\n }\n\n function merge(left,right,mid){\n let i = left,j = mid + 1,p = left;\n while(i <= mid && j <= right){\n if(nums[i] / 2 > nums[j]){\n ans += mid - i + 1;\n j++;\n }else i++;\n }\n\n i = left;\n j = mid + 1;\n while(i <= mid || j <= right){\n if(j > right || i <= mid && nums[i] < nums[j]) temp[p++] = nums[i++];\n else temp[p++] = nums[j++];\n }\n\n for(let i = left;i <= right;i++) nums[i] = temp[i];\n }\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(n log n)\n- 空间复杂度:O(n)\n- 利用归并排序过程中数组局部有序的特性,高效统计翻转对\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3216251902","body":"\n## 思路\n\n1. **排序处理**:\n - 首先对供暖器数组进行排序,这样便于后续的二分查找操作。\n\n2. **边界处理**:\n - 在供暖器数组的两端分别添加`-Infinity`和`Infinity`,这样可以简化边界条件的处理,避免在查找过程中需要特殊判断边界情况。\n\n3. **核心算法**:\n - 对每个房屋,通过[egt](file:///E:/力扣刷题/algorithm_exercises/91天学算法/day40/.md#L22-L33)函数找到第一个大于等于该房屋位置的供暖器位置\n - 然后比较该房屋与前一个供暖器和后一个供暖器的距离,取较小值作为该房屋所需的最小加热半径\n - 在所有房屋所需的最小加热半径中取最大值,就是能覆盖所有房屋的最小加热半径\n\n4. **二分查找优化**:\n - [egt](file:///E:/力扣刷题/algorithm_exercises/91天学算法/day40/.md#L22-L33)函数使用二分查找来快速定位第一个大于等于目标值的供暖器位置,时间复杂度从O(n)降低到O(log n)\n\n## 具体实现细节\n\n- `heaters[j] - house`表示房屋到右边最近供暖器的距离\n- `house - heaters[i]`表示房屋到左边最近供暖器的距离\n- `Math.min(heaters[j] - house, house - heaters[i])`得到该房屋需要的最小加热半径\n- `Math.max(ans, r)`维护所有房屋中需要的最大加热半径\n\n## 代码\n```javascript\n/**\n * @param {number[]} houses\n * @param {number[]} heaters\n * @return {number}\n */\nvar findRadius = function(houses, heaters) {\n const compare = (a,b) => a - b;\n heaters.sort(compare);\n heaters.push(Infinity);\n heaters.unshift(-Infinity);\n let ans = -Infinity;\n for(let house of houses){\n let j = egt(house),i = j - 1;\n r = Math.min(heaters[j] - house,house - heaters[i]);\n ans = Math.max(ans,r);\n }\n return ans;\n // -------------------------\n function egt(target){\n let l = 0,r = heaters.length - 1,ans = r + 1;\n while(l <= r){\n let mid = (l + r) >> 1\n if(heaters[mid] >= target){\n ans = mid;\n r = mid - 1;\n }else l = mid + 1;\n }\n return ans;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(mlogn + nlogn),其中m是房屋数量。排序的时间复杂度为O(nlogn),二分查找的时间复杂度为O(logn),因此总时间复杂度为O(nlogn + mlogn)。\n- 空间复杂度:O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3217776735","body":"## 思路\n\n使用了**二分搜索 + 双指针**的方法来解决问题:\n\n### 1. 排序\n```javascript\nnums.sort((a,b) => a - b);\n```\n\n首先对数组进行排序,这样可以方便后续计算距离和使用双指针技巧。\n\n### 2. 二分搜索框架\n```javascript\nlet n = nums.length;\nlet r = nums[n - 1] - nums[0], l = 0, ans = 0;\nwhile(l <= r){\n let mid = (l + r) >> 1;\n let cnt = calc(mid);\n if(cnt >= k){\n ans = mid;\n r = mid - 1;\n } else {\n l = mid + 1;\n }\n}\n```\n\n这里使用二分搜索来查找第k小的距离:\n- 搜索范围是 `[0, max_distance]`,其中 `max_distance = nums[n-1] - nums[0]`\n- 对于每个中间值 `mid`,计算有多少个数对的距离小于等于 `mid`\n- 如果数量大于等于 `k`,说明第k小的距离可能就是 `mid` 或者比 `mid` 更小\n- 如果数量小于 `k`,说明第k小的距离一定比 `mid` 更大\n\n### 3. 计算函数 calc\n```javascript\nfunction calc(mid){\n let l = 0, r = -1, ans = 0;\n while(l < n){\n while(r + 1 < n && nums[r + 1] - nums[l] <= mid) r++;\n if(r >= l) ans += r - l;\n l++;\n }\n return ans\n}\n```\n\n这个函数使用双指针技巧计算有多少个数对的距离小于等于给定值 [mid](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\462\\2.js#L20-L20):\n- 外层循环固定左指针 [l](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\461\\3.js#L34-L34)\n- 内层循环移动右指针 `r`,直到 `nums[r] - nums[l] > mid`\n- 此时对于固定的 [l](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\461\\3.js#L34-L34),有 `r - l` 个数对的距离小于等于 [mid](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\462\\2.js#L20-L20)\n- 累加所有可能的数对数量\n\n\n\n## 举例说明\n\n以 `nums = [1,3,1]`, `k = 1` 为例:\n1. 排序后:`[1,1,3]`\n2. 距离范围:`[0, 2]`\n3. 二分搜索过程:\n - `mid = 1`,计算距离 <= 1 的数对有 1 个(`(1,1)`)\n - 因为 1 >= k(1),所以 `ans = 1`,继续搜索左半部分\n - `mid = 0`,计算距离 <= 0 的数对有 1 个(`(1,1)`)\n - 因为 1 >= k(1),所以 `ans = 0`\n4. 返回结果 0\n\n这个解法非常巧妙地结合了二分搜索和双指针技巧,避免了直接计算所有数对距离的 O(n²) 复杂度。\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number}\n */\nvar smallestDistancePair = function(nums, k) {\n nums.sort((a,b) => a - b);\n let n = nums.length;\n let r = nums[n - 1] - nums[0],l = 0,ans = 0;\n while(l <= r){\n let mid = (l + r) >> 1;\n let cnt = calc(mid);\n if(cnt >= k){\n ans = mid;\n r = mid - 1;\n }else l = mid + 1;\n }\n return ans;\n // ----------------------\n function calc(mid){\n let l = 0,r = -1,ans = 0;\n while(l < n){\n while(r + 1 < n && nums[r + 1] - nums[l] <= mid) r++;\n if(r >= l) ans += r - l;\n l++;\n }\n return ans\n }\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(n log n + n log D),其中 n 是数组长度,D 是最大距离\n - 排序需要 O(n log n)\n - 二分搜索需要 log D 次,每次调用 calc 函数需要 O(n)\n- 空间复杂度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3218701829","body":"## 思路\n\n1. **使用优先队列的BFS**:\n - 采用 `MinPriorityQueue` 实现 Dijkstra 算法变体\n - 每个元素存储 `[行, 列, 高度]`,按高度排序\n\n2. **状态表示**:\n - `vis` 数组标记已访问的格子,防止重复访问\n - `ans` 记录到达当前位置所需的最大高度(即所需最低水位)\n\n3. **搜索过程**:\n - 从起点 `(0,0)` 开始,每次选择高度最低的相邻格子\n - 更新所需最低水位为路径上遇到的最大高度\n - 直到到达终点 `(n-1,n-1)`\n\n## 关键步骤\n\n- **初始化**:标记起点已访问,将起点加入优先队列\n- **主循环**:不断取出队列中高度最低的位置\n- **更新答案**:记录路径上的最大高度值\n- **探索邻居**:向四个方向扩展未访问的邻居节点\n- **终止条件**:到达右下角时结束搜索\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar swimInWater = function(grid) {\n let n = grid.length,vis = new Array(n).fill(0).map(()=>new Array(n).fill(0));\n vis[0][0] = 1;\n const q = new MinPriorityQueue(v=>v[2]);\n q.enqueue([0,0,grid[0][0]]);\n let ans = 0;\n const direction = [[0,1],[1,0],[0,-1],[-1,0]];\n while(q.size()){\n let [i,j,t] = q.dequeue();\n ans = Math.max(ans,t);\n if(i === n - 1 && j === n - 1) break;\n for(let d of direction){\n let x = d[0] + i,y = d[1] + j;\n if(x >= 0 && x < n && y >= 0 && y < n){\n if(vis[x][y]) continue;\n vis[x][y] = 1;\n q.enqueue([x,y,grid[x][y]]);\n }\n }\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n²logn),其中 n 是矩阵的边长。\n- 空间复杂度:O(n²),用于存储 vis 数组和优先队列。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3222257413","body":"## 思路\n\n使用**滑动窗口**(Sliding Window)技术来解决这个问题,通过维护一个固定大小为 `k` 的窗口来遍历整个字符串。\n\n## 关键变量说明\n\n- `r`: 右指针,初始化为 -1\n- [n](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6): 字符串 [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 的长度\n- `ans`: 记录找到的最大元音字母数\n- `total`: 当前窗口内元音字母的总数\n- [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6): 左指针,表示窗口的起始位置\n\n## 算法流程\n\n1. **外层循环**:[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 从 0 到 `n-k`,表示窗口的左边界\n ```javascript\n for(let i = 0; i <= n - k; i++)\n ```\n\n\n2. **扩展窗口**:使用 `while` 循环将右指针 `r` 向右扩展,直到窗口大小达到 `k`\n ```javascript\n while(r + 1 < n && r - i + 1 < k){\n r++;\n if(isYuanYin(s[r])) total++;\n }\n ```\n\n - 条件 `r + 1 < n` 确保不越界\n - 条件 `r - i + 1 < k` 确保窗口大小不超过 `k`\n - 每次扩展时检查新加入的字符是否为元音,并更新 `total`\n\n3. **更新最大值**:比较当前窗口的元音数量与历史最大值\n ```javascript\n ans = Math.max(ans, total);\n ```\n\n\n4. **收缩窗口**:移动左指针前,如果当前左边界字符是元音,则从总数中减去\n ```javascript\n if(isYuanYin(s[i])) total--;\n ```\n\n\n## 辅助函数\n\n```javascript\nfunction isYuanYin(c){\n return ['a','e','i','o','u'].includes(c);\n}\n```\n\n用于判断字符是否为元音字母。\n\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {number} k\n * @return {number}\n */\nvar maxVowels = function(s, k) {\n let r = -1, n = s.length,ans = 0,total = 0;\n for(let i = 0;i <= n - k;i++){\n while(r + 1 < n && r - i + 1 < k){\n r++;\n if(isYuanYin(s[r])) total++;\n }\n ans = Math.max(ans,total);\n if(isYuanYin(s[i])) total--;\n }\n return ans;\n // -------------------------\n function isYuanYin(c){\n return ['a','e','i','o','u'].includes(c);\n }\n };\n```\n## 复杂度分析\n\n- 时间复杂度:O(n),其中 n 是字符串长度,每个字符最多被访问两次\n- 空间复杂度:O(1),只使用了常数额外空间","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3227100052","body":"## 思路\n\n### 核心技巧\n- 维护一个大小为maxPts的滑动窗口\n- 使用`sum`变量维护当前窗口内所有可能结果的概率和\n- 通过`sum -= r`和`sum += dp[i]`维护窗口滑动\n\n### 1. 边界条件处理\n```javascript\nif(0 >= k) return 0 <= n ? 1 : 0;\n```\n\n- 当目标分数`k`为0或负数时,游戏一开始就结束\n- 如果[n](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6)非负,则概率为1,否则为0\n\n### 2. 初始化阶段\n```javascript\nlet sum = 0;\nfor(let i = k;i < k + maxPts;i++){\n if(i <= n) sum += 1;\n}\n```\n\n- 计算从刚好达到`k`分开始,可能到达的最高分数范围`[k, k+maxPts-1]`中满足≤n的数目\n- 这些状态的概率都是1(因为游戏结束)\n\n### 3. 动态规划倒推\n```javascript\nlet j = k + maxPts - 1, r = j <= n ? 1 : 0;\nlet dp = new Array(k).fill(0);\nfor(let i = k - 1;i >= 0;i--){\n dp[i] = sum / maxPts;\n sum -= r;\n sum += dp[i];\n j--;\n if(j >= k) r = j <= n ? 1 : 0;\n else r = dp[j];\n}\n```\n\n\n- 从`k-1`分开始倒推到0分\n- `dp[i]`表示从[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6)分开始游戏获胜的概率\n- 状态转移方程:`dp[i] = (dp[i+1] + dp[i+2] + ... + dp[i+maxPts]) / maxPts`\n- 使用滑动窗口优化:维护`sum`为窗口内所有概率之和\n\n\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number} k\n * @param {number} maxPts\n * @return {number}\n */\nvar new21Game = function(n, k, maxPts) {\n if(0 >= k) return 0 <= n ? 1 : 0;\n \n let sum = 0;\n for(let i = k;i < k + maxPts;i++){\n if(i <= n) sum += 1;\n }\n let j = k + maxPts - 1, r = j <= n ? 1 : 0;\n let dp = new Array(k).fill(0);\n for(let i = k - 1;i >= 0;i--){\n dp[i] = sum / maxPts;\n sum -= r;\n sum += dp[i];\n j--;\n if(j >= k) r = j <= n ? 1 : 0;\n else r = dp[j];\n }\n return dp[0];\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(k + maxPts),其中k为`k`的取值范围\n- 空间复杂度:O(k)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3231026577","body":"## 思路\n\n1. **滑动窗口 + 字符频次统计**\n - 使用两个长度为26的数组(`pMap` 和 `sMap`)分别统计模式串 `p` 和当前窗口内子串的字符频次\n - 通过滑动窗口在 [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 中寻找与 `p` 字符频次完全相同的子串\n\n2. **算法流程**\n - 首先调用 `getPmap()` 统计 `p` 中各字符出现次数\n - 初始化滑动窗口左右边界 `l=0, r=-1`\n - 在每次循环中:\n - 扩展右边界直到窗口大小等于 `p` 的长度\n - 比较当前窗口字符频次与 `p` 的字符频次是否相同\n - 如果相同,则将左边界位置加入结果数组\n - 移动左边界,更新窗口字符频次\n\n## 关键函数说明\n\n- `getPmap()`: 统计模式串 `p` 中每个字符的出现次数\n- `equal(arr1, arr2)`: 比较两个字符频次数组是否完全相同\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string} p\n * @return {number[]}\n */\nvar findAnagrams = function(s, p) {\n const pMap = new Array(26).fill(0),k = p.length;\n getPmap();\n let ans = []\n let n = s.length,l = 0,r = -1,sMap = new Array(26).fill(0);\n while(l <= n - k){\n while(r + 1 < n && r - l + 1 < k){\n r++;\n let c = s[r]\n sMap[c.charCodeAt(0) - 'a'.charCodeAt(0)]++;\n }\n if(equal(pMap,sMap)) ans.push(l);\n let c = s[l++];\n sMap[c.charCodeAt(0) - 'a'.charCodeAt(0)]--;\n }\n return ans;\n // --------------------------------------------------------\n function getPmap(){\n for(let c of p){\n pMap[c.charCodeAt(0) - 'a'.charCodeAt(0)]++;\n }\n }\n function equal(arr1,arr2){\n for(let i = 0;i < 26;i++){\n if(arr1[i] !== arr2[i]) return false;\n }\n return true;\n }\n };\n```\n## 复杂度分析\n\n- 时间复杂度:O(n),其中 n 是字符串 [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 的长度\n- 空间复杂度:O(1),只使用了固定大小的数组存储字符频次","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3235816649","body":"## 思路\n\n### 核心思想\n- 使用**滑动窗口**技术\n- 维护一个动态窗口 `[l, r]`,通过双指针扩展和收缩窗口\n- 统计窗口内字符频次,确保包含 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 中所有字符及其所需数量\n\n### 主要步骤\n\n1. **初始化阶段**\n - `tMap`:统计字符串 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 中各字符出现次数\n - `LIMIT`:记录 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 中不同字符的数量\n - `sMap`:统计当前窗口中各字符出现次数\n - `total`:记录窗口中已满足数量要求的字符种类数\n\n2. **滑动窗口主循环**\n - 外层循环移动左指针 [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31)\n - 内层循环扩展右指针 `r`,直到窗口包含 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 的所有字符\n - 当窗口满足条件时,尝试更新最优解\n\n3. **结果更新**\n - 使用 `check` 函数比较当前窗口与历史最优解\n - 选择更短的子串,长度相同时选择字典序更小的\n\n### check函数作用\n用于比较两个子串,选择更优的结果:\n- 优先选择长度更短的子串\n- 长度相同时选择字典序更小的\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string} t\n * @return {string}\n */\nvar minWindow = function(s, t) {\n let tMap = {},ans = '';\n for(let c of t) tMap[c] = (tMap[c] || 0) + 1;\n const LIMIT = Object.keys(tMap).length;\n let n = s.length,l = 0,r = -1,total = 0,sMap = {};\n while(l < n){\n while(r + 1 < n && total < LIMIT){\n r++;\n let c = s[r];\n sMap[c] = (sMap[c] || 0) + 1;\n if(sMap[c] === tMap[c]) total++;\n }\n if(total === LIMIT){\n let tmp = s.slice(l,r + 1);\n if(check(tmp)) ans = tmp;\n }\n let c = s[l];\n if(sMap[c] === tMap[c]) total--;\n sMap[c]--;\n l++;\n }\n return ans;\n // ------------------------\n function check(tmp){\n if(ans === '') return true;\n if(tmp.length < ans.length) return true;\n if(tmp.length > ans.length) return false;\n for(let i = 0;i < tmp.length;i++){\n let a = tmp.charCodeAt(i),b = ans.charCodeAt(i);\n if(a < b) return true;\n if(a === b) continue;\n if(a > b) return false;\n }\n return false;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是字符串 [s](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 的长度。\n- 空间复杂度:O(t),其中 t 是字符串 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 的字符串种类。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/50#issuecomment-3238889944","body":"## 思路\n\n1. **前缀和与后缀和预处理**:\n - [preSum](file:///E:/力扣刷题/algorithm_exercises/周赛/458/2.js#L10-L10)数组存储从左端开始的前缀和\n - [sufSum](file:///E:/力扣刷题/algorithm_exercises/周赛/458/2.js#L15-L15)数组存储从右端开始的后缀和\n\n2. **核心思想**:\n - 我们需要从两端取k张卡牌,可以是左边取i张,右边取k-i张(i从0到k)\n - 通过预处理的前缀和与后缀和数组,可以快速计算任意数量卡牌的点数和\n\n3. **遍历所有可能的组合**:\n - 遍历i从0到k,表示从左边取i张卡牌\n - 对应从右边取k-i张卡牌\n - 计算总和并更新最大值\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} cardPoints\n * @param {number} k\n * @return {number}\n */\nvar maxScore = function(cardPoints, k) {\n let n = cardPoints.length;\n const preSum = new Array(n + 1).fill(0),sufSum = new Array(n + 1).fill(0);\n for(let i = 0;i < n;i++){\n preSum[i + 1] = preSum[i] + cardPoints[i];\n sufSum[i + 1] = sufSum[i] + cardPoints[n - i - 1];\n }\n let ans = -Infinity;\n for(let i = 0;i <= k;i++){\n ans = Math.max(ans,preSum[i] + sufSum[k - i]);\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度是O(n+k),\n- 空间复杂度是O(n),其中n是数组长度。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/51#issuecomment-3239927488","body":"## 代路\n\n采用预计算和枚举的方法来解决问题:\n\n1. **预计算 *<60* 以内每个数字的二进制1的个数**:\n ```javascript\n const CNT = new Array(60).fill(0);\n for(let i = 0;i <= 59;i++){\n let n = i,t = 0;\n while(n){\n if(n & 1) t++;\n n >>= 1;\n }\n CNT[i] = t;\n }\n ```\n\n\n2. **枚举小时和分钟的分配**:\n ```javascript\n for(let i = 0;i <= 4;i++){\n let j = turnedOn - i;\n if(j > 6) continue;\n // ...\n }\n ```\n\n 这里将turnedOn个LED灯分为两部分:i个给小时部分,j个给分钟部分。由于小时最多由4个LED表示,分钟最多由6个LED表示,所以i最多为4,j最多为6。\n\n3. **获取符合条件的小时和分钟**:\n 通过`getHour(cnt)`和`getM(cnt)`函数获取二进制中恰好有cnt个1的小时数和分钟数。\n\n4. **组合时间**:\n 将符合条件的小时和分钟组合成时间字符串,格式为`H:MM`。\n\n## 代码优点\n\n1. **预计算优化**:提前计算所有0-59数字的二进制1的个数,避免重复计算\n2. **分离关注点**:将获取小时和分钟的逻辑分别封装在独立函数中\n3. **合理的边界处理**:考虑到小时(0-11)和分钟(0-59)的范围限制\n4. **正确的格式化**:分钟数始终显示为两位数\n\n\n## 代码\n```javascript\nconst CNT = new Array(60).fill(0);\nfor(let i = 0;i <= 59;i++){\n let n = i,t = 0;\n while(n){\n if(n & 1) t++;\n n >>= 1;\n }\n CNT[i] = t;\n}\n/**\n * @param {number} turnedOn\n * @return {string[]}\n */\nvar readBinaryWatch = function(turnedOn) {\n let ans = []\n for(let i = 0;i <= 4;i++){\n let j = turnedOn - i;\n if(j > 6) continue;\n for(let h of getHour(i)){\n for(let m of getM(j)){\n ans.push(`${h}:${m}`)\n }\n }\n }\n return ans;\n\n // ------------------------------\n function getHour(cnt){\n let ans = [];\n for(let i = 0;i <= 11;i++){\n if(CNT[i] === cnt) ans.push(i);\n }\n return ans\n }\n\n function getM(cnt){\n let ans = [];\n for(let i = 0;i <= 59;i++){\n if(CNT[i] === cnt) ans.push(i < 10 ? '0' + i : i);\n }\n return ans\n }\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**:O(1),因为小时和分钟的范围是固定的(12*60种组合)\n- **空间复杂度**:O(1),只使用了固定大小的额外空间\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3240725656","body":"\n## 思路\n\n### 1. 位运算优化\n- 使用位运算来表示和检查约束条件:\n - `colSet`:记录已被占用的列\n - `pieSet`:记录已被占用的主对角线(撇)\n - `naSet`:记录已被占用的副对角线(捺)\n\n### 2. 对角线编号\n- 主对角线(撇):用 `i + j` 编号\n- 副对角线(捺):用 `i - j + N` 编号(确保非负)\n\n### 3. DFS 回溯过程\n- 逐行放置皇后(第 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 行)\n- 对每行的每一列 `j` 检查是否可放置:\n - 通过位运算检查列、主对角线、副对角线是否冲突\n- 若无冲突则放置皇后并更新状态,递归处理下一行\n- 回溯时撤销状态更改\n\n### 4. 位操作技巧\n- `(x >> k) & 1`:检查第 k 位是否为 1\n- `x ^= (1 << k)`:翻转第 k 位(设置或取消占用)\n\n当成功放置完所有 n 行皇后时,返回 1(找到一种方案),最终统计所有可行方案数。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @return {number}\n */\nvar totalNQueens = function(n) {\n let colSet = 0,N = 2 * n - 1,pieSet = 0,naSet = 0;\n return dfs(0);\n // -------------------\n function dfs(i){\n if(i === n) return 1;\n let ans = 0;\n for(let j = 0;j < n;j++){\n let col = j,pie = i + j,na = (i - j + N) % N;\n if(((colSet >> col) & 1) || ((pieSet >> pie) & 1) ||((naSet >> na) & 1)) continue;\n colSet ^= (1 << col);\n pieSet ^= (1 << pie);\n naSet ^= (1 << na);\n ans += dfs(i + 1);\n colSet ^= (1 << col);\n pieSet ^= (1 << pie);\n naSet ^= (1 << na);\n }\n return ans;\n }\n};\n```\n## 复杂度分析\n- 时间复杂度:O(N!),其中 N 为输入的行数。\n- 空间复杂度:O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3243912780","body":"## 思路\n\n1. **初始化**:\n - 获取网格的行数(m)和列数(n)\n - 创建访问标记数组vis,避免重复访问\n - 初始化最大面积ans为0\n\n2. **遍历网格**:\n - 遍历每个格子,如果当前格子是0(海洋)或已被访问,则跳过\n - 否则,从当前位置开始进行BFS搜索整个岛屿\n\n3. **BFS搜索**:\n - 使用队列实现广度优先搜索\n - 从起始点开始,向四个方向扩展\n - 对于每个有效的相邻陆地格子(值为1且未访问),标记为已访问并加入队列\n - 统计当前岛屿的面积\n\n4. **更新结果**:\n - 每次BFS完成后,比较当前岛屿面积和已知最大面积,保留较大值\n\n## 具体实现细节\n\n- 使用Queue数据结构实现BFS\n- 四个方向数组dirs用于简化方向处理\n- vis数组防止重复访问同一格子\n- 边界检查确保不越界\n\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar maxAreaOfIsland = function(grid) {\n let m = grid.length,n = grid[0].length;\n let ans = 0;\n let vis = new Array(m).fill(0).map(()=>new Array(n).fill(0));\n for(let i = 0;i < m;i++){\n for(let j = 0;j = 0 && r < m && c >= 0 && c < n){\n if(grid[r][c] === 0) continue;\n if(vis[r][c]) continue;\n vis[r][c] = 1;\n q.enqueue([r,c]);\n }\n }\n }\n return ans;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度是O(m×n)\n- 空间复杂度是O(m×n)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3247579876","body":"## 思路\n\n这是一个典型的多源BFS(广度优先搜索)问题。代码采用逆向思维,不是从海洋格子找最近的陆地,而是从所有陆地格子出发,向外扩展到海洋格子,计算每个海洋格子到最近陆地的距离。\n\n## 算法步骤\n\n1. 初始化一个与原网格同样大小的距离矩阵`dis`,所有值初始化为无穷大\n2. 遍历原网格,将所有陆地格子(值为1)的坐标和距离0加入队列,作为BFS的起点\n3. 使用BFS遍历:\n - 从队列中取出一个位置\n - 如果当前位置的距离小于记录的距离,则更新距离\n - 如果当前位置是海洋,则更新最大距离\n - 向四个方向扩展,将合法的海洋格子加入队列\n4. 返回找到的最大距离,如果不存在海洋或陆地则返回-1\n\n## 代码\n\n```javascript\nvar maxDistance = function(grid) {\n let n = grid.length;\n // 创建一个距离矩阵,初始化为无穷大\n let dis = new Array(n).fill(0).map(()=>new Array(n).fill(Infinity));\n let q = new Queue();\n \n // 将所有陆地格子(值为1)作为BFS的起始点\n for(let i = 0;i < n;i++){\n for(let j = 0;j < n;j++){\n if(grid[i][j] === 0) continue;\n q.enqueue([i,j,0]); // [行, 列, 距离]\n }\n }\n\n // 四个方向的移动:右、下、左、上\n const dirs = [[0,1],[1,0],[0,-1],[-1,0]];\n let ans = -Infinity;\n \n // BFS遍历\n while(q.size()){\n let [i,j,d] = q.dequeue();\n \n // 如果当前距离大于等于已记录的距离,则跳过\n if(d >= dis[i][j]) continue;\n \n // 更新当前位置的距离\n dis[i][j] = d;\n \n // 如果当前位置是海洋(值为0),更新最大距离\n if(grid[i][j] === 0) ans = Math.max(ans,dis[i][j]);\n \n // 向四个方向扩展\n for(let [x,y] of dirs.map(v=>[v[0] + i,v[1] + j])){\n // 检查边界\n if(x < 0 || x >= n || y < 0 || y >= n) continue;\n // 如果是陆地则跳过\n if(grid[x][y] === 1) continue;\n // 如果新距离大于等于已记录距离则跳过\n if(d + 1 >= dis[x][y]) continue;\n // 将新位置加入队列\n q.enqueue([x,y,d + 1]);\n }\n }\n \n // 返回结果,如果没找到海洋格子则返回-1\n return ans === -Infinity ? -1 : ans === Infinity ? -1 : ans; \n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(n²),每个格子最多被访问一次\n- 空间复杂度:O(n²),需要存储距离矩阵和队列\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3251721463","body":"## 问题理解\n\n这个问题是一个图遍历问题,涉及以下概念:\n- 有n个盒子,每个盒子可能包含糖果、钥匙和内部盒子\n- 某些盒子是打开的(status[i] = 1),某些是关闭的(status[i] = 0)\n- 只有拿到钥匙才能打开关闭的盒子\n- 初始时有一些盒子(initialBoxes)\n- 目标是获得尽可能多的糖果\n\n## 思路\n\n### 1. 初始化阶段\n```javascript\nlet n = status.length, ans = 0,\nhas_key = new Array(n).fill(0),\nhas_box = new Array(n).fill(0);\n```\n\n- `n`: 盒子总数\n- `ans`: 最终获得的糖果总数\n- `has_key`: 标记是否拥有某个盒子的钥匙\n- `has_box`: 标记是否拥有某个盒子\n\n### 2. 设置初始状态\n```javascript\nfor(let i = 0; i < n; i++) if(status[i]) has_key[i] = 1;\nfor(let i of initialBoxes) has_box[i] = 1;\n```\n\n- 将所有本来就是打开状态的盒子(status[i] = 1)标记为拥有钥匙\n- 将初始拥有的盒子标记为已拥有\n\n### 3. DFS遍历获取糖果\n```javascript\nlet vis = new Array(n).fill(0);\nfor(let i of initialBoxes){\n if(has_box[i] && has_key[i] && !vis[i]) dfs(i);\n}\n```\n\n- `vis`: 标记盒子是否已经访问过\n- 对于每个初始盒子,如果既拥有盒子又有钥匙且未访问过,则进行DFS\n\n### 4. DFS函数实现\n```javascript\nfunction dfs(i){\n ans += candies[i]; // 收集当前盒子的糖果\n vis[i] = 1; // 标记为已访问\n for(let j of keys[i]){ // 遍历当前盒子中的钥匙\n has_key[j] = 1; // 获得钥匙\n if(has_box[j] && !vis[j]) dfs(j); // 如果拥有对应盒子且未访问,则继续DFS\n }\n for(let j of containedBoxes[i]){ // 遍历当前盒子中的内部盒子\n has_box[j] = 1; // 获得盒子\n if(has_key[j]&& !vis[j]) dfs(j); // 如果拥有对应钥匙且未访问,则继续DFS\n }\n}\n```\n\n\n## 算法流程总结\n\n1. **初始化状态**:记录每个盒子的初始状态(是否打开)和初始拥有的盒子\n2. **深度优先搜索**:从初始盒子开始,只有当同时拥有盒子和钥匙时才能打开盒子\n3. **收集资源**:打开盒子后获得糖果、钥匙和内部盒子\n4. **继续探索**:利用新获得的钥匙或盒子继续打开新的盒子\n5. **避免重复**:使用vis数组确保每个盒子只被访问一次\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} status\n * @param {number[]} candies\n * @param {number[][]} keys\n * @param {number[][]} containedBoxes\n * @param {number[]} initialBoxes\n * @return {number}\n */\nvar maxCandies = function(status, candies, keys, containedBoxes, initialBoxes) {\n let n = status.length,ans = 0,\n has_key = new Array(n).fill(0),\n has_box = new Array(n).fill(0);\n for(let i = 0;i < n;i++) if(status[i]) has_key[i] = 1;\n for(let i of initialBoxes) has_box[i] = 1;\n let vis = new Array(n).fill(0);\n for(let i of initialBoxes){\n if(has_box[i] && has_key[i] && !vis[i]) dfs(i);\n }\n return ans;\n // ----------------------------------------\n function dfs(i){\n ans += candies[i];\n vis[i] = 1;\n for(let j of keys[i]){\n has_key[j] = 1;\n if(has_box[j] && !vis[j]) dfs(j);\n }\n for(let j of containedBoxes[i]){\n has_box[j] = 1;\n if(has_key[j]&& !vis[j]) dfs(j);\n }\n }\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度为O(N + E),其中N是盒子数量,E是钥匙和内部盒子的总数。\n- 空间复杂度为O(N)。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/56#issuecomment-3257477257","body":"\n## 思路\n\n1. **坐标系统设定**:\n - 为每个节点分配坐标,根节点为原点(0, 0)\n - 向左子树移动时,列坐标减1;向右子树移动时,列坐标加1\n - 行坐标随着深度增加而增加(向下为正方向)\n\n2. **DFS遍历收集信息**:\n - 使用深度优先搜索遍历所有节点\n - 记录每个节点的值、行坐标、列坐标\n\n3. **自定义排序**:\n - 按列坐标升序排列(从左到右)\n - 列相同时按行坐标升序(从上到下)\n - 行列都相同时按节点值升序\n\n4. **分组输出**:\n - 将相同列坐标的节点值归为一组\n - 每组构成结果数组中的一个子数组\n\n## 代码:\n\n```javascript\nvar verticalTraversal = function(root) {\n let ans = [] // 存储[节点值, 行, 列]信息\n \n // DFS遍历,收集每个节点的值和坐标\n dfs(root,0,0);\n \n // 自定义排序:先按列,再按行,最后按值\n ans.sort((a,b)=>a[2] - b[2] || a[1] - b[1] || a[0] - b[0]);\n \n let col = Infinity, res = [];\n // 按列分组,将相同列的节点值组成子数组\n for(let [v,r,c] of ans){\n if(col === c) res[res.length - 1].push(v);\n else{\n res.push([v]);\n col = c;\n }\n }\n return res;\n \n // 辅助函数:深度优先遍历并记录坐标\n function dfs(root,row,col){\n if(!root) return;\n ans.push([root.val,row,col]);\n dfs(root.left,row + 1,col - 1) // 左子树:行+1,列-1\n dfs(root.right,row + 1,col + 1) // 右子树:行+1,列+1\n }\n};\n```\n## 复杂度分析\n### 时间复杂度:\n- DFS遍历:O(N),N为节点数\n- 排序:O(N log N)\n- 分组:O(N)\n- 总体:O(N log N)\n\n### 空间复杂度:\n- 存储信息:O(N)\n- 递归栈:O(H),H为树高度\n- 总体:O(N)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/57#issuecomment-3260240769","body":"\n\n## 思路\n\n使用了动态规划的思想,并进行了空间优化:\n\n## 具体分析\n\n1. **状态定义**:\n - `prevprev` 表示到达第 i-2 个位置的最小花费\n - `prev` 表示到达第 i-1 个位置的最小花费\n - `curr` 表示到达当前位置的最小花费\n\n2. **状态转移方程**:\n - `curr = v + Math.min(prevprev, prev)`\n - 其中 v 是当前位置的花费(顶部为0)\n\n3. **优化点**:\n - 使用滚动数组优化空间复杂度,从O(n)降到O(1)\n - 只保存前两个状态值,而不是整个dp数组\n\n4. **边界处理**:\n - 当 i < n 时,v = cost[i](正常台阶费用)\n - 当 i = n 时,v = 0(到达楼顶,没有费用)\n - 最后的返回值根据数组长度做了特殊处理\n\n\n这是一个经典的空间优化动态规划解法,通过只保留必要的状态值来减少空间使用。\n## 代码\n```javascript\nvar minCostClimbingStairs = function(cost) {\n let n = cost.length,\n prevprev = cost[0], // 表示到达第0个台阶的最小花费\n prev = cost[1], // 表示到达第1个台阶的最小花费\n curr;\n \n // 从第2个台阶开始遍历到楼梯顶部\n for(let i = 2;i <= n;i++){\n let v = 0;\n // 当i[1,1]);\n```\n\n\n1. 创建一个二维DP数组`dp`,其中`dp[i][0]`表示以`nums[i]`结尾的最长递增子序列的长度,`dp[i][1]`表示以`nums[i]`结尾的最长递增子序列的个数。\n2. 初始时,每个元素自身构成一个长度为1的递增子序列,所以都初始化为`[1,1]`。\n\n```javascript\n for(let i = 1; i < n; i++){\n for(j = i - 1; j >= 0; j--){\n if(nums[i] > nums[j]){\n if(dp[j][0] + 1 > dp[i][0]){\n dp[i][0] = dp[j][0] + 1;\n dp[i][1] = dp[j][1];\n }else if(dp[j][0] + 1 === dp[i][0]){\n dp[i][1] += dp[j][1];\n }\n }\n }\n }\n```\n\n\n3. 对于每个位置[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6),遍历它之前的所有位置`j`:\n - 如果`nums[i] > nums[j]`,说明可以将`nums[i]`接在以`nums[j]`结尾的递增子序列后面\n - 如果通过`j`得到的子序列长度(`dp[j][0] + 1`)比当前记录的长度(`dp[i][0]`)更长,则更新长度和数量\n - 如果长度相等,则将通过`j`得到的子序列数量加到当前的数量上\n\n```javascript\n let ans = 0, max = -Infinity;\n for(let [len,cnt] of dp){\n if(len > max){\n max = len;\n ans = cnt;\n }else if(max === len){\n ans += cnt;\n }\n }\n return ans;\n```\n\n\n4. 最后遍历整个DP数组,找出最长的递增子序列长度,并累加所有具有该长度的子序列的数量。\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar findNumberOfLIS = function(nums) {\n let n = nums.length,dp = new Array(n).fill(0).map(()=>[1,1]);\n for(let i = 1;i < n;i++){\n for(j = i - 1;j >= 0;j--){\n if(nums[i] > nums[j]){\n if(dp[j][0] + 1 > dp[i][0]){\n dp[i][0] = dp[j][0] + 1;\n dp[i][1] = dp[j][1];\n }else if(dp[j][0] + 1 === dp[i][0]){\n dp[i][1] += dp[j][1];\n }\n }\n }\n }\n let ans = 0,max = -Infinity;\n for(let [len,cnt] of dp){\n if(len > max){\n max = len;\n ans = cnt;\n }else if(max === len){\n ans += cnt;\n }\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度是O(n²),\n- 空间复杂度是O(n)。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3269148142","body":"\n## 思路\n\n### 1. 问题定义\n最长公共子序列是找出两个字符串中最长的共同子序列(不要求连续,但要保持相对顺序)。\n\n### 2. 动态规划状态定义\n```javascript\nlet m = text1.length, n = text2.length, dp = new Array(m).fill(0).map(() => new Array(n).fill(0));\n```\n\n创建一个二维数组 `dp[i][j]`,表示 `text1[0...i]` 和 `text2[0...j]` 的最长公共子序列长度。\n\n### 3. 初始化边界条件\n```javascript\nif(text1[0] === text2[0]) dp[0][0] = 1;\n\nfor(let i = 1;i < m;i++) {\n dp[i][0] = text1[i] === text2[0] ? 1 : dp[i - 1][0];\n}\nfor(let i = 1;i < n;i++) {\n dp[0][i] = text1[0] === text2[i] ? 1 : dp[0][i - 1];\n}\n```\n\n- 首先处理两个字符串的第一个字符,如果相同则 `dp[0][0] = 1`\n- 分别初始化第一列和第一行:\n - 如果当前字符匹配,则值为1\n - 否则继承前一个位置的值\n\n### 4. 状态转移方程\n```javascript\nfor(let i = 1;i < m;i++){\n for(let j = 1;j < n;j++){\n if(text1[i] === text2[j]) dp[i][j] = dp[i - 1][j - 1] + 1;\n else dp[i][j] = Math.max(\n dp[i - 1][j],\n dp[i][j - 1],\n dp[i - 1][j - 1]\n );\n }\n}\n```\n\n对于每个位置 `(i,j)`:\n- 如果 `text1[i] === text2[j]`,说明当前字符匹配,则 `dp[i][j] = dp[i-1][j-1] + 1`\n- 否则取三种情况的最大值:\n - `dp[i-1][j]`:text1[0...i-1] 与 text2[0...j] 的LCS长度\n - `dp[i][j-1]`:text1[0...i] 与 text2[0...j-1] 的LCS长度\n - `dp[i-1][j-1]`:text1[0...i-1] 与 text2[0...j-1] 的LCS长度\n\n### 5. 返回结果\n```javascript\nreturn dp[m - 1][n - 1];\n```\n\n返回 `dp[m-1][n-1]` 即为两个完整字符串的最长公共子序列长度。\n\n\n## 代码\n```javascript\n/**\n * @param {string} text1\n * @param {string} text2\n * @return {number}\n */\nvar longestCommonSubsequence = function(text1, text2) {\n let m = text1.length,n = text2.length,dp = new Array(m).fill(0).map(() => new Array(n).fill(0));\n if(text1[0] === text2[0]) dp[0][0] = 1;\n\n for(let i = 1;i < m;i++) {\n dp[i][0] = text1[i] === text2[0] ? 1 : dp[i - 1][0];\n }\n for(let i = 1;i < n;i++) {\n dp[0][i] = text1[0] === text2[i] ? 1 : dp[0][i - 1];\n }\n for(let i = 1;i < m;i++){\n for(let j = 1;j < n;j++){\n if(text1[i] === text2[j]) dp[i][j] = dp[i - 1][j - 1] + 1;\n else dp[i][j] = Math.max(\n dp[i - 1][j],\n dp[i][j - 1],\n dp[i - 1][j - 1]\n );\n }\n }\n return dp[m - 1][n - 1];\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(m×n),其中 m 和 n 分别是两个字符串的长度\n- 空间复杂度:O(m×n),用于存储 dp 数组","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/61#issuecomment-3273217746","body":"## 思路\n使用了组合数学的方法来解决不同路径问题:\n\n1. **问题转换**:\n - 机器人需要从左上角走到右下角,总共需要向右走 (n-1) 步,向下走 (m-1) 步\n - 总共需要走 (m-1)+(n-1) = m+n-2 步\n - 问题转化为:在这 m+n-2 步中,如何选择 m-1 步向下走(或 n-1 步向右走)\n\n2. **数学公式**:\n - 这是一个组合问题,答案是 C(m+n-2, m-1) 或 C(m+n-2, n-1)\n - 组合数公式:C(n,k) = n! / (k! * (n-k)!)\n - 为了避免计算阶乘导致的溢出,代码采用了逐步相乘的方式\n\n3. **实现细节**:\n - `k = m + n - 2` 表示总步数\n - `t = m - 1` 表示需要选择的步数(向下走的步数)\n - 通过循环计算组合数,每次将 `k/t` 的值乘到结果中,并递减 k 和 t\n - 最后使用 `Math.round()` 是为了处理浮点数计算可能产生的精度误差\n\n\n\n\n## 代码\n```javascript\n/**\n * @param {number} m\n * @param {number} n\n * @return {number}\n */\nvar uniquePaths = function(m, n) {\n let k = m + n - 2;\n if(k === 0) return 1;\n let t = Math.min(m - 1,n - 1), ans = 1;\n while (t){\n ans *= k / t;\n k--;\n t--;\n }\n return Math.round(ans);\n};\n```\n\n## 复杂度分析\n- 时间复杂度为 O(min(m,n)),\n- 空间复杂度为 O(1)。\n相比动态规划方法,这种方法更加高效。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/62#issuecomment-3277237117","body":"## 思路\n\n### 问题理解\n1. 骑士按照象棋规则移动(日字形,8个方向)\n2. 骑士从 (row, column) 位置开始\n3. 骑士进行 K 次随机移动\n4. 求骑士最终仍在棋盘上的概率\n\n### 解决方案\n使用记忆化递归(动态规划):\n\n1. **状态定义**:f(i, j, k) 表示骑士在位置 (i, j) 并且还能移动 k 步时,在棋盘上的概率\n\n2. **边界条件**:\n - 当 k = 0 时,如果位置在棋盘内则返回 1,否则返回 0\n - 当位置超出棋盘边界时,返回 0\n\n3. **状态转移**:\n - 对于骑士的 8 个可能移动方向,递归计算每个方向移动后的情况\n - 结果为所有可能移动结果的平均值(除以 8)\n\n4. **记忆化优化**:\n - 使用 memo 三维数组存储已经计算过的结果,避免重复计算\n\n## 代码\n\n```javascript\nvar knightProbability = function(n, k, row, column) {\n // 骑士的8个移动方向\n const dirs = [[1,2],[2,1],[1,-2],[2,-1],[-1,2],[-2,1],[-1,-2],[-2,-1]];\n \n // 记忆化数组,存储 (i,j,k) 状态下的结果\n const memo = new Array(n + 1).fill(0).map(()=>{\n return new Array(n + 1).fill(0).map(()=>{\n return new Array(k + 1).fill(-1);\n })\n })\n \n // 调用递归函数\n return f(row, column, k);\n \n function f(i, j, k) {\n // 基础情况:没有移动次数了\n if (k === 0) return i >= 0 && i < n && j >= 0 && j < n ? 1 : 0;\n \n // 超出边界\n if (i < 0 || i >= n || j < 0 || j >= n) return 0;\n \n // 已经计算过该状态\n if (memo[i][j][k] !== -1) return memo[i][j][k];\n \n let ans = 0;\n // 遍历8个方向\n for (let d of dirs) {\n let x = d[0] + i, y = d[1] + j;\n ans += f(x, y, k - 1);\n }\n \n // 每个方向的概率是 1/8,所以取平均值\n memo[i][j][k] = ans / 8;\n return ans / 8;\n } \n};\n```\n\n\n### 复杂度分析\n- 时间复杂度:O(N²×K),因为有 N×N 个位置和 K 步\n- 空间复杂度:O(N²×K),用于存储记忆化数组\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/63#issuecomment-3283550644","body":"## 思路\n\n### 1. 初始判断\n```javascript\nif((1 + maxChoosableInteger) * maxChoosableInteger / 2 < desiredTotal) return false;\n```\n\n首先计算所有可选数字的总和,如果总和小于目标值,则无论如何都无法达到目标,返回false。\n\n### 2. 核心递归函数f\n```javascript\nfunction f(type,total,state){}\n```\n\n- `type`: 当前玩家类型(0表示我方,1表示对方)\n- `total`: 剩余需要达到的目标值\n- `state`: 用位掩码表示的已选择数字状态\n\n### 3. 记忆化搜索\n使用`memo`来存储已经计算过的状态结果,避免重复计算。通过`query`和[add](file://E:\\其他项目\\algorithm_exercises\\9.js#L13-L21)函数来操作这个多层Map结构。\n\n### 4. 状态转移\n对于每个未选择的数字:\n- 如果选择该数字可以直接获胜(`i + 1 >= total`),则当前玩家获胜\n- 否则,递归调用[f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17)计算对手在新状态下的结果\n- 如果存在一种选择使得对手必败,则当前玩家必胜\n\n### 5. 博弈论思想\n这是一个典型的极小化极大算法应用:\n- 当前玩家希望找到至少一种选择使得对手必败(返回false)\n- 如果所有选择都导致对手必胜(都返回false),则当前玩家必败\n\n## 代码\n```javascript\n/**\n * @param {number} maxChoosableInteger\n * @param {number} desiredTotal\n * @return {boolean}\n */\nvar canIWin = function(maxChoosableInteger, desiredTotal) {\n let memo = new Map();\n if((1 + maxChoosableInteger) * maxChoosableInteger / 2 < desiredTotal) return false;\n return f(0,desiredTotal,0);\n // -------------------------------\n function f(type,total,state){\n let params = [state];\n if(query(params) !== -1) return query(params);\n let ans = false;\n for(let i = 0;i < maxChoosableInteger;i++){\n if(state & (1 << i)) continue;\n if(i + 1 >= total) {\n ans = true;\n break;\n }\n let a = f(type === 0 ? 1 : 0,total - i - 1, state | (1 << i));\n if(a === false) {\n ans = true;\n break;\n }\n }\n add(params,ans)\n return ans;\n }\n\n function query(params){\n let ans = memo;\n for(let param of params){\n if(ans.has(param) === false) return -1;\n ans = ans.get(param);\n }\n return ans;\n }\n\n function add(params,val){\n let m = memo,n = params.length, rest = params.slice(0,n - 1),last = params[n - 1];\n for(let param of rest){\n if(m.has(param) === false) m.set(param,new Map());\n m = m.get(param);\n }\n m.set(last,val);\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:$O(n*2^{n})$\n- 空间复杂度:$O(n)$","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/64#issuecomment-3287375518","body":"## 思路\n\n\n1. **预处理**:\n - 计算数组总和,如果为奇数则直接返回false\n - 确定目标值target为总和的一半\n\n2. **初始化DP数组**:\n - dp[j]表示是否可以用数组中的元素组成和为j的子集\n - 初始时只考虑第一个元素nums[0],只有当j等于nums[0]时才为true\n\n3. **状态转移**:\n - 对于每个元素nums[i],更新dp数组\n - 从target到0逆序遍历,避免重复使用同一元素\n - 状态转移方程:`dp[j] = dp[j] || dp[j - nums[i]]`\n - 要么不使用当前元素,保持原来的状态dp[j]\n - 要么使用当前元素,前提是dp[j - nums[i]]为true\n\n4. **返回结果**:\n - 如果dp[target]为true,表示可以组成和为target的子集,返回true\n - 否则返回false\n\n\n## 代码\n```javascript\nvar canPartition = function(nums) {\n // 获取数组长度和总和\n let n = nums.length,sum = nums.reduce((a,b)=>a + b,0);\n \n // 如果总和是奇数,则无法分成两个相等的子集\n if(sum & 1) return false;\n \n // 目标是找到和为总和一半的子集\n const target = sum / 2;\n \n // 创建dp数组,dp[j]表示是否可以用前面的数字组成和为j的子集\n const dp = new Array(target + 1).fill(false);\n \n // 初始化:第一个数字能否组成和为j的子集\n for(let j = 0;j <= target;j++) dp[j] = nums[0] === j;\n \n // 从第二个数字开始遍历\n for(let i = 1;i < n;i++){\n // 从target到0逆序遍历(避免重复使用同一元素)\n for(let j = target;j >= 0;j--){\n // 状态转移方程:\n // dp[j] = dp[j] || dp[j - nums[i]]\n // 要么之前就能组成j,要么使用当前数字nums[i]组成j\n dp[j] = dp[j] || (j - nums[i] >= 0 ? dp[j - nums[i]] : false);\n }\n }\n \n // 返回是否能组成和为target的子集\n return dp[target];\n};\n```\n\n## 时间和空间复杂度\n\n- 时间复杂度:O(n × target),其中n是数组长度,target是数组元素和的一半\n- 空间复杂度:O(target),只使用了一维dp数组\n\n这是一个经典的0-1背包问题的应用,通过动态规划解决了分割等和子集问题。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289197873","body":"\n## 思路\n\n\n1. **递归函数 [f(i, total)](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\452\\2.js#L16-L29)**:\n - [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 表示当前处理到数组中的第 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 个元素\n - [total](file://E:\\力扣刷题\\algorithm_exercises\\双周赛\\165\\3.js#L5-L5) 表示前 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 个元素通过添加 '+' 或 '-' 符号后得到的总和\n - 函数返回从第 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 个元素开始到最后一个元素,能够得到目标值的方案数\n\n2. **边界条件**:\n - 当 `i === n` 时,表示已经处理完所有元素,如果 `total === target` 则找到一种有效方案,返回 1,否则返回 0\n\n3. **状态转移**:\n - 对于当前元素 `nums[i]`,可以选择加上它或减去它\n - 所以递归调用 `f(i+1, total-nums[i]) + f(i+1, total+nums[i])`\n\n4. **记忆化优化**:\n - 使用 [memo](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\430\\2.js#L7-L7) 数组存储已经计算过的状态,避免重复计算\n - `memo[i][total + abs_sum]` 中使用 `total + abs_sum` 是为了避免负数索引\n\n## 代码亮点\n\n1. 计算 `abs_sum` 来确定可能的和的范围,这样可以正确地映射负数到数组索引\n2. 使用记忆化递归避免重复计算,提高效率\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar findTargetSumWays = function(nums, target) {\n let n = nums.length;\n let abs_sum = nums.reduce((prev,curr)=>{\n if(curr >= 0) return curr + prev;\n return prev - curr;\n },0)\n // console.log(abs_sum);\n let memo = new Array(n + 1).fill(0).map(()=>new Array(2 * abs_sum + 1).fill(-1));\n return f(0,0);\n // ---------------------------\n function f(i,total){\n if(i === n) return target === total ? 1 : 0;\n let t = memo[i][total + abs_sum];\n // console.log(i,target,target + abs_sum,t);\n if(t !== -1) return t;\n let ans = f(i + 1,total - nums[i]) + f(i + 1,total + nums[i]);\n memo[i][total + abs_sum] = ans; \n return ans;\n }\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**:O(n × S),其中 n 是数组长度,S 是数组元素绝对值之和\n- **空间复杂度**:O(n × S),主要由 memo 数组占用","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/66#issuecomment-3290259438","body":"## 思路\n\n这是一个典型的完全背包问题:\n1. **状态定义**:`dp[i][j]` 表示使用前 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 种硬币凑成金额 `j` 所需的最少硬币数\n2. **状态转移**:对于第 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 种硬币,我们有两种选择:\n - 不使用该硬币:`dp[i-1][j]`\n - 使用该硬币:`1 + dp[i][j-coins[i-1]]`(因为硬币可以重复使用,所以是`dp[i]`而不是`dp[i-1]`)\n3. **边界条件**:`dp[0][0] = 0`,表示不使用任何硬币凑成金额0需要0个硬币\n## 代码\n\n```javascript\nvar coinChange = function(coins, amount) {\n let n = coins.length;\n // 创建二维DP数组,dp[i][j]表示使用前i种硬币凑成金额j的最少硬币数\n let dp = new Array(n + 1).fill(0).map(()=>new Array(amount + 1).fill(Infinity));\n // 初始状态:使用0种硬币凑成金额0需要0个硬币\n dp[0][0] = 0;\n \n // 遍历每种硬币\n for(let i = 1; i <= n; i++){\n // 遍历所有可能的金额\n for(let j = 0; j <= amount; j++){\n // 状态转移方程:\n // 1. 不使用第i种硬币:dp[i - 1][j]\n // 2. 使用第i种硬币:1 + dp[i][j - coins[i - 1]] (前提是j - coins[i - 1] >= 0)\n dp[i][j] = Math.min(\n dp[i - 1][j],\n j - coins[i - 1] >= 0 ? 1 + dp[i][j - coins[i - 1]] : Infinity\n );\n }\n }\n \n // 返回结果,如果为无穷大说明无法凑成,返回-1\n return dp[n][amount] === Infinity ? -1 : dp[n][amount]\n};\n```\n\n## 时间和空间复杂度\n- 时间复杂度:O(n × amount),其中 n 是硬币种类数\n- 空间复杂度:O(n × amount)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3295404263","body":"## 思路\n\n### 状态定义\n\n- `dp[i][j]` 表示使用前 i 种硬币凑成金额 j 的组合数\n\n### 初始化\n\n- `dp[0][0] = 1`:使用 0 种硬币凑成金额 0 的方法数为 1(即什么都不选)\n\n### 状态转移方程\n\n对于第 i 种硬币(面值为 c):\n\n- `dp[i][j] = dp[i-1][j] + (j-c >= 0 ? dp[i][j-c] : 0)`\n- 其中:\n - `dp[i-1][j]`:不使用第 i 种硬币,仅使用前 i-1 种硬币凑成金额 j 的组合数\n - `dp[i][j-c]`:使用第 i 种硬币,即在凑成金额 j-c 的基础上再加一个第 i 种硬币\n\n### 关键点\n\n1. 这是一个\"完全背包\"问题:每种硬币可以使用无限次\n2. 使用的是二维DP,其中行代表硬币种类,列代表金额\n3. 转移方程中 `dp[i][j-c]`(而非 `dp[i-1][j-c]`)体现了每种硬币可重复使用的特性\n\n## 代码\n\n```javascript\n/**\n * @param {number} amount\n * @param {number[]} coins\n * @return {number}\n */\nvar change = function (amount, coins) {\n let n = coins.length, dp = new Array(n + 1).fill(0).map(() => new Array(amount + 1).fill(0));\n dp[0][0] = 1;\n for (let i = 1; i <= n; i++) {\n let c = coins[i - 1]\n for (let j = 0; j <= amount; j++) dp[i][j] = dp[i - 1][j] + (j - c >= 0 ? dp[i][j - c] : 0);\n }\n return dp[n][amount];\n };\n```\n### 时间和空间复杂度\n\n- 时间复杂度:O(n × amount),其中 n 是硬币种类数\n- 空间复杂度:O(n × amount)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/68#issuecomment-3300884457","body":"## 思路\n\n1. **排序策略**:将孩子贪心值数组`g`和饼干尺寸数组[s](file://E:\\其他项目\\algorithm_exercises\\1.js)都按降序排列\n2. **贪心策略**:用最大的饼干去满足贪心值最大的孩子(即最难以满足的孩子)\n3. **双指针遍历**:使用两个指针分别遍历孩子和饼干数组\n4. **匹配逻辑**:如果当前饼干能满足当前孩子,则两个指针都前进;否则只移动孩子指针(尝试用同一块饼干满足贪心值更低的孩子)\n\n这种从最大到最小的分配方式体现了贪心思想:优先满足需求大的孩子,这样能保证整体效果最优。\n\n## 代码\n```javascript\n/**\n * @param {number[]} g\n * @param {number[]} s\n * @return {number}\n */\nvar findContentChildren = function(g, s) {\n const compare = (a,b)=>b - a;\n g.sort(compare);\n s.sort(compare);\n let i = 0,j = 0,m = g.length,n = s.length;\n let ans = 0;\n while(i < m && j < n){\n if(s[j] >= g[i]){\n ans++;\n j++;\n i++;\n }else i++;\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度为O(m log m + n log n),主要消耗在排序上,\n- 空间复杂度为O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/69#issuecomment-3305173933","body":"\n## 思路\n\n贪心策略是:**尽可能选择结束时间早的区间,这样能为后续区间留出更多空间**。\n\n\n1. **按结束时间排序**:\n ```javascript\n intervals.sort((a,b)=>a[1] - b[1]);\n ```\n\n 将所有区间按照结束时间升序排列,优先考虑结束早的区间。\n\n2. **贪心选择**:\n ```javascript\n let lastEnd = -Infinity;\n for(let [s,e] of intervals){\n if(s >= lastEnd) {\n ans++;\n lastEnd = e;\n }\n }\n ```\n\n 遍历排序后的区间,如果当前区间的开始时间不早于上一个选中区间的结束时间,就选择这个区间。这确保了选中的区间互不重叠。\n\n3. **计算结果**:\n ```javascript\n return n - ans;\n ```\n\n 返回总区间数减去可以保留的区间数,即需要移除的区间数。\n\n\n\n## 代码\n```javascript\n/**\n * @param {number[][]} intervals\n * @return {number}\n */\nvar eraseOverlapIntervals = function(intervals) {\n intervals.sort((a,b)=>a[1] - b[1]);\n let ans = 0,n = intervals.length;\n let lastEnd = -Infinity;\n for(let [s,e] of intervals){\n if(s >= lastEnd) {\n ans++;\n lastEnd = e;\n }\n }\n return n - ans;\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(n log n),主要消耗在排序上\n- 空间复杂度:O(1)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/70#issuecomment-3312499521","body":"## 思路-:动态规划\n\n1. **问题目标**:判断是否能从数组的第一个位置跳到最后一个位置\n2. **解法**:使用动态规划从后往前推导\n3. **状态定义**:`dp[i]` 表示从位置 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 是否能到达最后一个位置\n4. **状态转移**:\n - 从倒数第二个位置开始往前推导\n - 对于每个位置 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22),检查能否通过跳跃到达后续的某个可达位置\n - 如果能跳到某个 `dp[j]` 为 `true` 的位置,则 `dp[i]` 也为 `true`\n\n```javascript\n/**\n * @param {number[]} nums\n * @return {boolean}\n */\nvar canJump = function(nums) {\n let n = nums.length, dp = new Array(n).fill(false);\n dp[n - 1] = true;\n \n // 从倒数第二个位置开始向前遍历\n for(let i = n - 2; i >= 0; i--){\n let steps = nums[i];\n \n // 检查从当前位置 i 能否跳到某个可达的位置\n for(let delta = 1; delta <= steps && i + delta < n; delta++){\n let j = i + delta;\n if(dp[j]) {\n dp[i] = true;\n break;\n }\n }\n }\n \n return dp[0];\n};\n```\n\n\n## 思路总结\n\n1. **初始化**:创建一个布尔数组 [dp](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\467\\3.js#L22-L22),长度与输入数组相同,所有元素初始化为 `false`\n2. **边界条件**:最后一个位置默认为 `true`(已经在最后一个位置了)\n3. **状态转移**:从倒数第二个位置开始,对每个位置检查:\n - 根据当前位置的值,确定可以跳跃的步数范围\n - 在这个范围内,检查是否存在某个可达的位置(`dp[j]` 为 `true`)\n - 如果存在,则当前位置也是可达的\n4. **结果**:返回 `dp[0]`,即从起始位置是否可达\n\n## 复杂度分析\n这是一种典型的动态规划解法,\n- 时间复杂度为 O(n²),\n- 空间复杂度为 O(n)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/71#issuecomment-3314420253","body":"## 思路:\n\n1. **状态定义**:`dp[i]` 表示由 i 个不同节点能构成的不同二叉搜索树的数量\n\n2. **状态转移方程**:\n - 对于 i 个节点,我们可以让其中任意一个节点 j (1 ≤ j ≤ i) 作为根节点\n - 当节点 j 作为根时:\n - 左子树包含比 j 小的 j-1 个节点,能构成 `dp[j-1]` 种不同的二叉搜索树\n - 右子树包含比 j 大的 i-j 个节点,能构成 `dp[i-j]` 种不同的二叉搜索树\n - 根据乘法原理,以 j 为根的二叉搜索树总数为 `dp[j-1] * dp[i-j]`\n - 遍历所有可能的根节点,将结果累加得到 `dp[i]`\n\n3. **边界条件**:\n - `dp[0] = 1`:空树也算一种情况\n - `dp[1] = 1`:只有一个节点时,只能构成一种二叉搜索树\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @return {number}\n */\nvar numTrees = function(n) {\n // 创建dp数组,dp[i]表示由i个不同节点能构成的不同二叉搜索树的数量\n let dp = new Array(n + 1).fill(0);\n \n // 边界条件:0个节点可以构成1棵空树,1个节点只能构成1种二叉搜索树\n dp[0] = 1;\n dp[1] = 1;\n \n // 计算2到n个节点能构成的不同二叉搜索树数量\n for(let i = 2; i <= n; i++){\n // 对于i个节点,尝试让每个节点作为根节点\n for(let j = 1; j <= i; j++){\n // 当第j个节点作为根时:\n // 左子树有j-1个节点,可以构成dp[j-1]种不同的二叉搜索树\n // 右子树有i-j个节点,可以构成dp[i-j]种不同的二叉搜索树\n // 根据乘法原理,以j为根的二叉搜索树数量为dp[j-1] * dp[i-j]\n dp[i] += dp[j - 1] * dp[i - j]\n }\n }\n \n // 返回n个节点能构成的不同二叉搜索树数量\n return dp[n]\n};\n```\n\n\n\n\n\n## 复杂度分析\n- 时间复杂度为 O(n²),\n- 空间复杂度为 O(n)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/72#issuecomment-3315877464","body":"\n## 思路\n\n使用了**最小优先队列**来解决合并K个有序链表的问题,这是一种非常高效的解决方案。\n\n### 核心思想\n\n1. **使用最小优先队列维护所有链表的头部节点**:\n - 将K个链表的头节点都放入最小优先队列中\n - 优先队列会根据节点值进行排序,确保队首始终是最小值节点\n\n2. **逐步构建结果链表**:\n - 每次从优先队列中取出值最小的节点\n - 将该节点连接到结果链表末尾\n - 如果该节点还有后续节点,则将后续节点加入优先队列\n\n3. **重复过程直到优先队列为空**:\n - 当优先队列为空时,说明所有节点都已处理完毕\n\n### 代码详解\n\n```javascript\nvar mergeKLists = function(lists) {\n // 创建虚拟头节点,便于操作\n let dummy = new ListNode(), dh = dummy;\n \n // 创建最小优先队列,比较函数是基于节点值\n let q = new MinPriorityQueue(v => v.val);\n \n // 将所有非空链表的头节点加入优先队列\n for(let i = 0; i < lists.length; i++) \n if(lists[i]) q.enqueue(lists[i]);\n \n // 当优先队列不为空时继续处理\n while(q.size()){\n // 取出值最小的节点\n let n = q.dequeue();\n \n // 将该节点连接到结果链表\n dh.next = n;\n dh = dh.next;\n \n // 如果该节点有后续节点,将其加入优先队列\n if(n.next) q.enqueue(n.next);\n }\n \n // 返回合并后的链表\n return dummy.next;\n};\n```\n\n\n## 复杂度分析\n\n1. **时间复杂度优化**:\n - 时间复杂度为 O(N log K),其中 N 是所有节点总数,K 是链表数量\n\n2. **空间复杂度**:\n - 空间复杂度为 O(K),只需要存储K个链表的头部节点\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/73#issuecomment-3322038797","body":"## 思路:\n\n1. **分治思想**:\n - 将问题分解为两个子问题:分别处理奇数和偶数\n - `oushu = n >> 1` 计算偶数的个数(相当于 n/2 的整数部分)\n - `jishu = n - oushu` 计算奇数的个数\n\n2. **递归处理**:\n - `l1 = beautifulArray(jishu)` 递归生成奇数个数对应的漂亮数组\n - `l2 = beautifulArray(oushu)` 递归生成偶数个数对应的漂亮数组\n\n3. **映射构造**:\n - 对于奇数部分:`for(let i of l1) ans.push(2 * i - 1)` 将每个元素映射为奇数\n - 对于偶数部分:`for(let i of l2) ans.push(2 * i)` 将每个元素映射为偶数\n\n4. **核心思想**:\n - 通过将数组分为奇数和偶数两部分,确保不会在奇数和偶数之间形成等差数列\n - 因为如果一个数是奇数,另一个是偶数,那么它们的平均数不可能是整数,也就不可能在数组中找到第三个数构成等差数列\n\n## 关键点:\n\n- 基础情况:当 n=1 时,直接返回 [1]\n- 使用位运算 `>>` 实现整数除法,提高效率\n- 通过分别处理奇数和偶数部分,巧妙地避免了等差数列的形成\n\n\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @return {number[]}\n */\nvar beautifulArray = function(n) {\n if(n === 1) return [1];\n let oushu = n >> 1,jishu = n - oushu;\n let l1 = beautifulArray(jishu),l2 = beautifulArray(oushu);\n let ans = [];\n for(let i of l1) ans.push(2 * i - 1);\n for(let i of l2) ans.push(2 * i);\n return ans\n};\n```\n\n## 复杂度分析\n- 时间复杂度为 O(n log n)。\n- 空间复杂度为 O(n log n)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/74#issuecomment-3322078023","body":"## 思路:\n\n1. **异或运算的性质**:\n - 相同数字异或结果为0:`a ^ a = 0`\n - 任何数字与0异或等于自身:`a ^ 0 = a`\n - 异或运算满足交换律和结合律\n\n2. **第一步:计算所有数字的异或结果**:\n ```javascript\n let xor = 0;\n nums.forEach(n=>xor = xor ^ n);\n ```\n\n 这一步得到的是两个只出现一次的数字的异或结果,因为出现两次的数字都会相互抵消。\n\n3. **第二步:找到区分两个目标数字的位**:\n ```javascript\n let type = xor & (-xor);\n ```\n\n 这一步很关键,通过 `xor & (-xor)` 找到 `xor` 中最右边的1位。这个位必定在两个目标数字中一个为1,一个为0,因为只有这样它们的异或结果才会是1。\n\n4. **第三步:根据该位将数组分为两组**:\n ```javascript\n let a = 0, b = 0;\n for(let num of nums){\n if(type & num) a = a ^ num; // 该位为1的数字分为一组\n else b ^= num; // 该位为0的数字分为一组\n }\n ```\n\n 通过这种方式,将两个目标数字分到不同的组中,而相同的数字由于该位相同会被分到同一组,在组内异或后会被抵消,最终每组只剩下各自的目标数字。\n\n## 复杂度分析\n\n- 时间复杂度是 O(n),\n- 空间复杂度是 O(1),非常高效。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar singleNumber = function(nums) {\n let xor = 0;\n nums.forEach(n=>xor = xor ^ n);\n let type = xor & (-xor);\n let a = 0,b = 0;\n for(let num of nums){\n if(type & num) a = a ^ num;\n else b ^= num;\n }\n return [a,b];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/75#issuecomment-3326222352","body":"## 思路\n\n1. `let n = 1 << (nums.length)`:通过左移运算计算出子集的总数。对于长度为n的数组,其子集总数为2^n。这里使用位运算`1 << nums.length`等价于2的nums.length次方。\n\n2. 外层循环`for(let i = 0;i < n;i++)`:遍历从0到2^n-1的每个数字,每个数字代表一个子集。\n\n3. 对于每个数字i(用变量j来操作):\n - 使用`j & 1`检查j的最低位是否为1\n - 如果是1,则将nums[k]加入当前子集temp中\n - 然后将j右移一位(`j >>= 1`),检查下一位\n - 同时k递增,指向nums中的下一个元素\n\n4. 内层while循环结束后,将生成的子集temp添加到结果数组ans中。\n\n## 复杂度分析\n使用位运算生成所有子集的方法,\n- 时间复杂度为O(n*2^n),\n- 空间复杂度为O(n*2^n)。\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number[][]}\n */\nvar subsets = function(nums) {\n let n = 1 << (nums.length),ans = [];\n for(let i = 0;i < n;i++){\n let temp = [],j = i,k = 0;\n while(j){\n if(j & 1) temp.push(nums[k]);\n j >>= 1;\n k++;\n }\n ans.push(temp);\n }\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/76#issuecomment-3331626491","body":"## 思路\n\n1. **TrieNode(Trie节点)**\n - `isEnd`:标记该节点是否为某个单词的结尾\n - `children`:大小为26的数组,存储指向子节点的指针(对应26个小写字母)\n\n2. **辅助函数**\n - `getCharIndex(c)`:将字符转换为其在字母表中的索引(0-25)\n\n### 1. 初始化(`Trie`构造函数)\n- 创建一个根节点 `root`,作为整个Trie树的起点\n\n### 2. 插入单词(`insert`方法)\n- 从根节点开始,逐字符遍历要插入的单词\n- 对于每个字符:\n - 计算其在字母表中的索引\n - 如果对应子节点不存在,则创建新节点\n - 移动到该子节点\n- 遍历完所有字符后,将最后一个节点标记为单词结尾(`isEnd = true`)\n\n### 3. 搜索单词(`search`方法)\n- 从根节点开始,逐字符遍历要搜索的单词\n- 对于每个字符:\n - 计算索引并检查对应子节点是否存在\n - 如果不存在,返回 `false`\n - 如果存在,移动到该子节点\n- 遍历完所有字符后,检查最后一个节点是否为单词结尾(`isEnd`为`true`)\n\n### 4. 前缀匹配(`startsWith`方法)\n- 与`search`类似,但不检查最后一个节点是否为单词结尾\n- 只要能完整遍历前缀中的所有字符,就返回`true`\n\n## 时间复杂度\n- 插入和搜索操作的时间复杂度均为O(m),其中m为单词或前缀的长度\n\n## 空间复杂度\n- O(ALPHABET_SIZE × N × M),其中N为插入的单词数,M为平均单词长度\n\n## 代码\n```javascript\nfunction TrieNode(){\n this.isEnd = false;\n this.children = new Array(26);\n}\n\nfunction getCharIndex(c){\n return c.charCodeAt(0) - 'a'.charCodeAt(0);\n}\n\nvar Trie = function() {\n this.root = new TrieNode();\n};\n\n/** \n * @param {string} word\n * @return {void}\n */\nTrie.prototype.insert = function(word) {\n let root = this.root;\n for(let c of word){\n let i = getCharIndex(c);\n if(!root.children[i]) root.children[i] = new TrieNode();\n root = root.children[i];\n }\n root.isEnd = true;\n};\n\n/** \n * @param {string} word\n * @return {boolean}\n */\nTrie.prototype.search = function(word) {\n let root = this.root;\n for(let c of word){\n let i = getCharIndex(c);\n if(!root.children[i]) return false;\n root = root.children[i];\n }\n return root.isEnd;\n};\n\n/** \n * @param {string} prefix\n * @return {boolean}\n */\nTrie.prototype.startsWith = function(prefix) {\n let root = this.root;\n for(let c of prefix){\n let i = getCharIndex(c);\n if(!root.children[i]) return false;\n root = root.children[i];\n }\n return !!root\n};\n\n/** \n * Your Trie object will be instantiated and called as such:\n * var obj = new Trie()\n * obj.insert(word)\n * var param_2 = obj.search(word)\n * var param_3 = obj.startsWith(prefix)\n */\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/77#issuecomment-3336492052","body":"## 思路\n\n### 1. TrieNode 结构\n- `TrieNode` 是一个前缀树节点结构。\n- 每个节点包含:\n - `value`: 当前节点对应的值总和。\n - [end](file://E:\\其他项目\\algorithm_exercises\\程序员面试金典\\面试题05.08.绘制直线\\main.js#L14-L14): 标记该节点是否为某个单词的结尾。\n - `children`: 长度为26的数组,存储子节点(对应字母a-z)。\n\n### 2. MapSum 类\n- 使用前缀树(Trie)和哈希表(Map)实现键值映射与前缀求和功能。\n- `root`: Trie树的根节点。\n- [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5): 存储已插入的键值对。\n\n## 核心方法\n\n### insert(key, val)\n- 插入或更新键值对:\n - 如果键已存在,更新所有相关节点的值(先减去旧值,再加上新值)。\n - 如果是新键,则在Trie中创建路径,并在路径上的每个节点累加值。\n - 最后更新哈希表中的键值对。\n\n### sum(prefix)\n- 查询指定前缀的所有键值总和:\n - 遍历前缀,在Trie中查找对应的节点。\n - 若找不到完整前缀则返回0。\n - 返回前缀末尾节点的 `value` 值(即以该前缀开头的所有键的值总和)。\n\n## 工具函数\n\n### getCharIndex(char)\n- 将字符转换为其在字母表中的索引(0-25)。\n\n\n\n\n## 代码\n```javascript\nfunction TrieNode(){\n this.value = 0;\n this.end = false;\n this.children = new Array(26);\n}\n\nfunction getCharIndex(a){return a.charCodeAt(0) - 'a'.charCodeAt(0)}\nvar MapSum = function() {\n this.root = new TrieNode();\n this.map = new Map();\n};\n\n/** \n * @param {string} key \n * @param {number} val\n * @return {void}\n */\nMapSum.prototype.insert = function(key, val) {\n if(this.map.has(key)){\n let root = this.root;\n for(let c of key){\n let i = getCharIndex(c);\n root.children[i].value -= this.map.get(key);\n root.children[i].value += val;\n root = root.children[i];\n }\n }else{\n let root = this.root;\n for(let c of key){\n let i = getCharIndex(c);\n if(!root.children[i]) root.children[i] = new TrieNode();\n root = root.children[i];\n root.value += val;\n }\n root.end = true;\n }\n this.map.set(key,val);\n};\n\n/** \n * @param {string} prefix\n * @return {number}\n */\nMapSum.prototype.sum = function(prefix) {\n let root = this.root;\n let ans = 0\n for(let c of prefix){\n let i = getCharIndex(c);\n if(!root.children[i]) return 0;\n root = root.children[i];\n }\n return root.value;\n};\n\n/** \n * Your MapSum object will be instantiated and called as such:\n * var obj = new MapSum()\n * obj.insert(key,val)\n * var param_2 = obj.sum(prefix)\n */\n```\n\n\n## 复杂度分析\n- 时间复杂度:O(n),n位单词的长度。\n- 空间复杂度:O(m * n),m为单词个数,n为单词长度。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/78#issuecomment-3340984021","body":"## 算法思路\n\n1. **构建 Trie 树**:\n - 将 `smalls` 数组中的所有字符串插入到 Trie 树中\n - 每个节点记录是否为单词结尾([end](file://E:\\力扣刷题\\algorithm_exercises\\程序员面试金典\\面试题05.08.绘制直线\\main.js#L14-L14) 标志)以及对应的索引位置([i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22))\n\n2. **搜索过程**:\n - 遍历 `big` 字符串的每个位置作为起始点\n - 对每个起始点,使用 [dfs](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\465\\2.js#L9-L25) 函数在 Trie 树中进行匹配\n - 当匹配到完整单词时,将起始位置记录到对应的结果数组中\n\n3. **Trie 树结构**:\n - `TrieNode`:包含 [end](file://E:\\力扣刷题\\algorithm_exercises\\程序员面试金典\\面试题05.08.绘制直线\\main.js#L14-L14) 标志、子节点数组和索引 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22)\n - `Trie`:提供插入方法,将单词和其索引存储到树中\n\n## 关键函数分析\n\n- **`multiSearch` 主函数**:\n - 初始化 Trie 树并插入所有 smalls 单词\n - 遍历 big 字符串每个位置进行搜索\n\n- **[dfs](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\465\\2.js#L9-L25) 辅助函数**:\n - 从当前 Trie 节点继续匹配字符\n - 找到匹配单词时记录位置信息\n\n## 时间复杂度\n\n- **构建 Trie**:O(∑|smalls[i]|),即所有 smalls 字符串长度之和\n- **搜索过程**:O(|big| × max_match_length)\n - 外层循环遍历 `big` 字符串:O(|big|)\n - 每次 dfs 最坏情况遍历到最长匹配:O(max_match_length)\n- **总体复杂度**:O(∑|smalls[i]| + |big| × max_match_length)\n\n## 空间复杂度\n\n- **Trie 树存储**:O(∑|smalls[i]| × 26) = O(∑|smalls[i]|)\n- **结果数组**:O(∑结果数量)\n- **总体空间复杂度**:O(∑|smalls[i]| + 结果数量)\n\n## 代码\n```javascript\n/**\n * @param {string} big\n * @param {string[]} smalls\n * @return {number[][]}\n */\nvar multiSearch = function(big, smalls) {\n let trie = new Trie(),n = smalls.length;\n for(let i = 0;i < n;i++) trie.insert(smalls[i],i);\n let ans = new Array(n).fill(0).map(()=>[]);\n for(let i = 0;i < big.length;i++){\n let root = trie.root;\n let c = big[i],j = getCharIndex(c);\n if(!root.children[j]) continue;\n dfs(root,i,i);\n }\n\n return ans;\n\n // --------------------------\n function dfs(root,index,j){\n if(index === big.length) return;\n let c = big[index],i = getCharIndex(c);\n if(!root.children[i]) return;\n root = root.children[i];\n if(root.end) ans[root.i].push(j);\n dfs(root,index + 1,j);\n }\n};\n\n\n\n\nfunction Trie(){\n this.root = new TrieNode();\n}\n\nTrie.prototype.insert = function(word,i){\n let root = this.root;\n for(let c of word){\n let j = getCharIndex(c);\n if(!root.children[j]) root.children[j] = new TrieNode();\n root = root.children[j]\n }\n root.i = i;\n root.end = true;\n}\n\n\nfunction TrieNode(){\n this.end = false;\n this.children = new Array(26);\n this.i = -1;\n}\n\nfunction getCharIndex(c){\n return c.charCodeAt(0) - 'a'.charCodeAt(0);\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/79#issuecomment-3342189359","body":"## 思路\n\n1. **并查集初始化**:\n - 创建一个长度为 [n](file://E:\\其他项目\\algorithm_exercises\\11.js#L6-L6) 的数组 [f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17),其中 [n](file://E:\\其他项目\\algorithm_exercises\\11.js#L6-L6) 是城市数量\n - 初始化时,每个城市都指向自己,即 `f[i] = i`,表示每个城市初始时都是独立的集合\n\n2. **连接城市**:\n - 遍历 `isConnected` 矩阵,对于每一对相连的城市 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 和 `j`\n - 调用 [merge(i, j)](file://E:\\其他项目\\algorithm_exercises\\libs\\UnionFind.js#L19-L28) 函数将它们合并到同一个集合中\n\n3. **并查集操作**:\n - [find(i)](file://E:\\其他项目\\algorithm_exercises\\3.js#L19-L24) 函数:查找城市 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 所属集合的根节点,并进行路径压缩优化\n - [merge(i, j)](file://E:\\其他项目\\algorithm_exercises\\libs\\UnionFind.js#L19-L28) 函数:将城市 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 和 `j` 所在的集合合并\n\n## 关键点分析\n\n- **路径压缩**:在 [find](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\2.js#L26-L29) 函数中使用了 `f[i] = find(f[i])` 来压缩路径,提高查找效率\n- **集合合并**:每次成功合并两个不同的集合时,省份数量 [ans](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6) 减一\n- **初始值**:[ans](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6) 初始化为 [n](file://E:\\其他项目\\algorithm_exercises\\11.js#L6-L6),表示最坏情况下每个城市都是一个独立省份\n\n## 代码\n```javascript\n/**\n * @param {number[][]} isConnected\n * @return {number}\n */\nvar findCircleNum = function(isConnected) {\n let n = isConnected.length,f = new Array(n).fill(0).map((_,i)=>i);\n let ans = n;\n for(let i = 0;i < n;i++){\n for(let j = 0;j < n;j++){\n if(isConnected[i][j]) merge(i,j);\n }\n }\n return ans;\n // ------------------------\n function find(i){\n if(i !== f[i]) f[i] = find(f[i]);\n return f[i];\n }\n\n function merge(i,j){\n let fi = find(i),fj = find(j);\n if(fi === fj) return;\n f[fi] = fj;\n ans--;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n^2),其中 n 是城市数量\n- 空间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/80#issuecomment-3344661787","body":"## 思路\n\n1. **并查集初始化**\n - 使用并查集(Union-Find)数据结构来管理节点连接关系\n - [f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17) 数组存储每个节点的父节点,初始时每个节点的父节点是自身\n - [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 数组存储每个连通分量的大小,初始时每个分量大小为1\n\n2. **构建连通分量**\n - 遍历 `graph` 矩阵,对于每条边 `graph[i][j]`,将节点 i 和 j 合并到同一连通分量中\n - 通过 [merge](file://E:\\其他项目\\algorithm_exercises\\3.js#L27-L37) 函数实现节点合并,并更新连通分量大小\n\n3. **统计初始感染节点**\n - 使用 `initialMap` 统计每个连通分量中有多少个初始感染节点\n - 通过 [find](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\2.js#L26-L29) 函数找到每个初始感染节点所属的连通分量\n\n4. **选择最优移除节点**\n - 遍历所有初始感染节点,寻找满足以下条件的节点:\n - 所在连通分量只有1个初始感染节点(否则移除该节点无法减少传播)\n - 能够拯救最多节点的连通分量\n - 如果拯救数量相同,选择索引最小的节点\n\n5. **边界情况处理**\n - 如果所有初始感染节点所在的连通分量都包含多个感染节点,则返回 `initial` 中的最小索引\n\n## 关键函数\n\n- [find(i)](file://E:\\其他项目\\algorithm_exercises\\3.js#L19-L24): 查找节点 i 的根节点(带路径压缩优化)\n- [merge(i,j)](file://E:\\其他项目\\algorithm_exercises\\libs\\UnionFind.js#L19-L28): 合并节点 i 和 j 所在的连通分量\n\n\n\n## 代码\n```javascript\n/**\n * @param {number[][]} graph\n * @param {number[]} initial\n * @return {number}\n */\nvar minMalwareSpread = function(graph, initial) {\n let n = graph.length;\n let f = new Array(n).fill(0).map((_,i)=>i);\n let s = new Array(n).fill(1);\n for(let i = 0;i < n;i++){\n for(let j = 0;j < n;j++){\n if(graph[i][j]) merge(i,j);\n }\n }\n\n\n let initialMap = new Map();\n for(let i of initial){\n let fi = find(i);\n initialMap.set(fi,initialMap.has(fi) ? initialMap.get(fi) + 1 : 1);\n }\n let ans = n,max = 0;\n for(let i of initial){\n let fi = find(i);\n if(initialMap.get(fi) > 1) continue;\n if(s[fi] > max || s[fi] === max && i < ans) {\n max = s[fi];\n ans = i\n }\n }\n\n return ans === n ? initial.reduce((prev,curr)=>Math.min(prev,curr),n) : ans;\n\n\n\n // -----------------------\n function find(i){\n if(i !== f[i]) f[i] = find(f[i]);\n return f[i];\n }\n\n function merge(i,j){\n let fi = find(i),fj = find(j);\n if(fi === fj) return;\n f[fi] = fj;\n s[fj] += s[fi];\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n^2),\n- 空间复杂度:O(n),其中 n 是节点数。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/81#issuecomment-3349592362","body":"\n\n## 思路\n\n1. **并查集数据结构**:\n - 使用数组 [f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17) 实现并查集,初始化时每台计算机的父节点是自身\n - [size](file://E:\\其他项目\\algorithm_exercises\\libs\\Stack.js#L19-L21) 记录当前连通分量的数量,初始为 [n](file://E:\\其他项目\\algorithm_exercises\\11.js#L6-L6)\n\n2. **可行性判断**:\n - 如果连接数 `cnt` 小于 `n-1`,则无法连接所有计算机,返回 `-1`\n\n3. **连通分量合并**:\n - 遍历所有连接关系,通过 [merge](file://E:\\其他项目\\algorithm_exercises\\3.js#L27-L37) 函数合并对应的计算机\n - 每次成功合并都会减少连通分量数量\n\n4. **结果计算**:\n - 最终需要的操作次数等于连通分量数减一(`size - 1`)\n\n## 关键函数\n\n- [find(i)](file://E:\\其他项目\\algorithm_exercises\\3.js#L19-L24):查找计算机 [i](file://E:\\其他项目\\algorithm_exercises\\周赛\\469\\2.js#L23-L23) 所在集合的根节点(带路径压缩优化)\n- [merge(i,j)](file://E:\\其他项目\\algorithm_exercises\\libs\\UnionFind.js#L19-L28):合并计算机 [i](file://E:\\其他项目\\algorithm_exercises\\周赛\\469\\2.js#L23-L23) 和 `j` 所在的集合\n\n\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} connections\n * @return {number}\n */\nvar makeConnected = function(n, connections) {\n const cnt = connections.length;\n if(cnt < n - 1) return -1;\n const f = new Array(n).fill(0).map((_,i)=>i);\n let size = n;\n for(let [i,j] of connections) merge(i,j);\n return size - 1;\n\n // ----------------------------\n function find(i){\n if(i !== f[i]) f[i] = find(f[i]);\n return f[i];\n }\n\n function merge(i,j){\n const fi = find(i),fj = find(j);\n if(fi === fj) return;\n f[fi] = fj;\n size--;\n }\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(m×α(n)),其中 m 是连接数,α 是阿克曼函数的反函数\n- 空间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/82#issuecomment-3354314699","body":"## 思路\n\n使用**后序遍历**的方式递归处理二叉树,删除所有值为0的叶子节点及其所属的全0子树。\n\n## 具体实现分析\n\n1. **基础情况处理**\n - `if(!root) return root;` - 空节点直接返回\n - `if(root && !root.left && !root.right) return root.val === 0 ? null : root;` - 叶子节点判断:如果是值为0的叶子节点则删除\n\n2. **递归处理**\n - `let l = pruneTree(root.left), r = pruneTree(root.right);` - 递归处理左右子树\n - 处理后的左右子树结果保存在 [l](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\468\\2.js#L7-L7) 和 [r](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\447\\1.js#L31-L31) 中\n\n3. **当前节点判断**\n - `if(!l && !r && root.val === 0) return null;` - 如果左右子树都被删除且当前节点值为0,则删除当前节点\n - 否则更新当前节点的左右子树引用并返回当前节点\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {TreeNode} root\n * @return {TreeNode}\n */\nvar pruneTree = function(root) {\n if(!root) return root;\n if(root && !root.left && !root.right) return root.val === 0 ? null : root;\n\n let l = pruneTree(root.left),r = pruneTree(root.right);\n if(!l && !r && root.val === 0) return null;\n root.left = l;\n root.right = r;\n return root;\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**: O(n),需要访问每个节点一次\n- **空间复杂度**: O(h),h为树的高度,递归调用栈的深度\n- **关键点**: 后序遍历确保了从叶子节点开始处理,逐步向上删除符合条件的节点","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/83#issuecomment-3358681420","body":"## 思路\n\n- 使用**回溯算法**(Backtracking)来遍历所有可能的组合\n- 对于每个元素,有两种选择:选择它(可重复选择)或不选择它\n\n## 代码结构分析\n\n1. **初始化**\n - [ans](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\436\\2.js#L7-L7):存储所有符合条件的组合结果\n - `result`:存储当前正在构建的组合\n - [n](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\437\\2.js#L5-L5):`candidates` 数组的长度\n\n2. **递归函数 [f(i, target)](file://E:\\力扣刷题\\algorithm_exercises\\19.js#L10-L17)**\n - [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22):当前考虑的元素索引\n - [target](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\453\\1.js#L8-L8):剩余需要达到的目标值\n\n3. **递归终止条件**\n - `target === 0`:找到一个有效组合,将其加入结果集\n - `i === n || target < 0`:超出数组范围或目标值为负,直接返回\n\n4. **递归逻辑**\n - **选择当前元素**:如果 `target >= candidate`,将当前元素加入 `result`,然后递归调用 [f(i, target - candidate)](file://E:\\力扣刷题\\algorithm_exercises\\19.js#L10-L17)(注意这里是 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 而不是 `i+1`,允许重复选择同一元素)\n - **不选择当前元素**:递归调用 [f(i + 1, target)](file://E:\\力扣刷题\\algorithm_exercises\\19.js#L10-L17),考虑下一个元素\n\n## 关键特点\n\n- 通过 [f(i, target - candidate)](file://E:\\力扣刷题\\algorithm_exercises\\19.js#L10-L17) 而不是 `f(i + 1, target - candidate)` 实现元素的重复使用\n- 使用 `result.push()` 和 `result.pop()` 维护当前组合状态,体现回溯思想\n\n## 代码\n```javascript\n/**\n * @param {number[]} candidates\n * @param {number} target\n * @return {number[][]}\n */\nvar combinationSum = function(candidates, target) {\n let ans = [],n = candidates.length;\n let result = []\n f(0,target);\n return ans;\n // ----------------------------\n function f(i,target){\n if(target === 0) {\n ans.push([...result]);\n return\n }\n if(i === n || target < 0) return;\n\n let candidate = candidates[i];\n\n if(target >= candidate){\n result.push(candidate);\n f(i,target - candidate);\n result.pop();\n } \n\n f(i + 1,target);\n } \n};\n```\n\n## 时间复杂度分析\n\n- **最坏情况时间复杂度**: `O(N^(T/M))`\n - 其中 `N` 是 `candidates` 数组的长度\n - `T` 是目标值 [target](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\453\\1.js#L8-L8)\n - `M` 是 `candidates` 中的最小值\n - 在最坏情况下,递归树的深度为 `T/M`,每层最多有 `N` 个分支\n\n- **实际时间复杂度**: 会比上述上界小很多,因为剪枝操作(`target < 0`时提前返回)会减少大量无效搜索\n\n## 空间复杂度分析\n\n- **递归栈空间**: `O(T/M)`\n - 最坏情况下递归深度为 `T/M`(当一直选择最小元素时)\n\n- **存储结果空间**: `O(K × X)`\n - `K` 是平均每个组合的长度\n - `X` 是符合条件的组合数量\n - 这部分空间用于存储最终结果 [ans](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\436\\2.js#L7-L7)\n\n- **临时存储空间**: `O(T/M)`\n - 用于存储当前路径 `result` 的最大长度\n\n因此,总体空间复杂度为 `O(T/M + K × X)`。","onTime":true},null,null,null,null,null,null,null,null,null,null,null],"haoyuliaocurb":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073435345","body":"```\n// Time Complexity: O(max(num.length, k))\n// Space Complexity: O(max(num.length, k))\n\n/**\n * @param {number[]} num\n * @param {number} k\n * @return {number[]}\n */\nvar addToArrayForm = function(num, k) {\n const num1 = num;\n const num2 = String(k).split('').map(v => Number(v));\n const sum = [];\n\n for (let i = 0; i < Math.max(num1.length, num2.length); i += 1) {\n const s = (num1[num1.length - 1 - i] ?? 0) + (num2[num2.length - 1 - i] ?? 0) + (sum[i] ?? 0);\n\n sum[i] = s % 10;\n sum[i + 1] = (s - (s % 10)) / 10;\n }\n\n if (sum[sum.length - 1] === 0) sum.pop();\n sum.reverse();\n\n return sum;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3078842293","body":"【解題方向】\n\n第一想法:對於每一個 s[i] 都遍歷一次找最近的 c,Time Complexity 為 O(n^2) \n\n第二想法:先遍歷一遍 s 找到所有的 c,然後從所有的 c 開始向兩邊走\n\t=> 不過想到如何記錄狀態就覺得太複雜,而且可能最糟情況還是 Time Complexity 為 O(n^2) \n\n第三想法:看了提示,想到正向遍歷、反向遍歷一次,記錄 s[i] 與左右兩邊的 c 的最小距離\n\t=> 由於題目保證至少有一個 s 中至少有一個 c,對於每個 s[i],其左或右必然會有一個 c\n\n【程式碼】\n```\n// Time Complexity: O(n), n = s.length;\n// Space Complexity: O(n), n = s.length;\n\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function(s, c) {\n const chars = s.split('');\n const res = new Array(chars.length).fill(Infinity);\n\n let leftTargetCharIndex = -1;\n for (let i = 0; i < chars.length; i += 1) {\n if (chars[i] === c) leftTargetCharIndex = i;\n if (leftTargetCharIndex > -1) {\n res[i] = Math.min(res[i], Math.abs(leftTargetCharIndex - i));\n }\n }\n\n let rightTargetCharIndex = -1;\n for (let i = chars.length - 1; i > -1; i -= 1) {\n if (chars[i] === c) rightTargetCharIndex = i;\n if (rightTargetCharIndex > -1) {\n res[i] = Math.min(res[i], Math.abs(rightTargetCharIndex - i));\n }\n }\n\n return res;\n};\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3089452516","body":"1. 第一個直覺是用 recursion 來解題,不過過程中會遇到很多 edge case 沒有考慮到而 error thrown\n2. 後來改用 stack 來實踐,也很清楚,不過需要搞懂什麼應該被放進 stack,以及 pop and push 的時機\n\n```\n// Time Complexity: O(n)\n// Space Complexity: O(n)\n\n/**\n * Recursive version of decodeString\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n const helper = (str, index) => {\n let result = '';\n let num = 0;\n \n while (index < str.length) {\n const char = str[index];\n \n if (char >= '0' && char <= '9') {\n num = num * 10 + parseInt(char);\n index++;\n } else if (char === '[') {\n // Recursively decode the content inside brackets\n const [decodedStr, newIndex] = helper(str, index + 1);\n result += decodedStr.repeat(num);\n num = 0; // Reset number after using it\n index = newIndex;\n } else if (char === ']') {\n // End of current bracket section - return result and current index\n return [result, index + 1];\n } else {\n // Regular character\n result += char;\n index++;\n }\n }\n \n return [result, index];\n };\n \n return helper(s, 0)[0];\n};\n\n// Time Complexity: O(n)\n// Space Complexity: O(n)\n\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n const stack = [];\n let currentStr = '';\n let currentNum = 0;\n \n for (let i = 0; i < s.length; i++) {\n const char = s[i];\n \n if (char >= '0' && char <= '9') {\n currentNum = currentNum * 10 + parseInt(char);\n } else if (char === '[') {\n // Push current state to stack\n stack.push([currentStr, currentNum]);\n currentStr = '';\n currentNum = 0;\n } else if (char === ']') {\n // Pop from stack and decode\n const [prevStr, num] = stack.pop();\n currentStr = prevStr + currentStr.repeat(num);\n } else {\n // Regular character\n currentStr += char;\n }\n }\n \n return currentStr;\n};\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091467280","body":"透過第二個 stack 倒轉第一個 in-stack 的順序,以達到 FIFO 的效果\n```\n// Time Complexity: O(1) for push, pop, peek, empty;\n// Space Complexity: O(n)\n\nclass MyQueue {\n constructor() {\n this.inStack = [];\n this.outStack = [];\n }\n\n /** \n * @param {number} x\n * @return {void}\n */\n push(x) {\n this.inStack.push(x);\n }\n\n /**\n * @return {number}\n */\n pop() {\n if (!this.outStack.length) {\n this.pushToOutStack();\n }\n\n return this.outStack.pop();\n }\n\n /**\n * @return {number}\n */\n peek() {\n if (!this.outStack.length) {\n this.pushToOutStack();\n }\n\n return this.outStack[this.outStack.length - 1];\n }\n\n /**\n * @return {boolean}\n */\n empty() {\n return this.peek() === undefined;\n }\n\n pushToOutStack() {\n while (this.inStack.length) {\n this.outStack.push(this.inStack.pop());\n }\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094426027","body":"// Time Complexity: O(n);\n// Space Complexity: O(n);\n\n```\n/**\n * @param {number[]} arr\n * @return {number}\n */\nvar maxChunksToSorted = function(arr) {\n const sortedArr = [...arr].sort((a, b) => a - b);\n let counts = {};\n let chunkAmount = 0;\n\n for (let i = 0; i < arr.length; i += 1) {\n counts[arr[i]] = (counts[arr[i]] ?? 0) + 1;\n counts[sortedArr[i]] = (counts[sortedArr[i]] ?? 0) - 1;\n\n if (Object.values(counts).every((value) => value === 0)) {\n chunkAmount += 1;\n }\n }\n\n return chunkAmount;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095908728","body":"```\n// Time Complexity: O(n);\n// Space Complexity: O(1);\n\nvar rotateRight = function (head, k) {\n if (!head || !head.next) return head;\n\n let length = 0;\n let cur = head;\n\n while (cur) {\n cur = cur.next;\n length += 1;\n }\n\n k = k % length;\n let left = head;\n let right = head;\n\n while (right.next) {\n if (k <= 0) left = left.next;\n right = right.next;\n k -= 1;\n }\n\n right.next = head; // Handle the case when left and right point to the same node.\n let res = left.next;\n left.next = null;\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3102283858","body":"建立一個 dummy 連結在 head 之前,便可以將 head 當作中間節點處理。每次互換節點會牽涉四個節點,pre, cur, next, next.next,其中 pre 的初始值為 dummy,因此在每個迴圈保證有值,而真正要互換的 cur, next,其兩有值為 while 迴圈繼續的必要條件,next.next 為 null 則沒關係。\n\n```\n// Time Complexity: O(n);\n// Space Complexity: O(1);\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar swapPairs = function(head) {\n const dummy = { val: 0, next: head };\n\n let pre = dummy;\n let cur = pre.next;\n let next = cur?.next;\n\n while (cur && next) {\n pre.next = next;\n cur.next = next.next;\n next.next = cur;\n\n [pre, cur, next] = [cur, cur.next, cur.next?.next];\n }\n\n return dummy.next;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3105649705","body":"# 想法\n轉換成 Height Balanced Binary Search Tree 會需要進行 Binary Search,考慮到單向鏈錶不方便直接存取 node,因此直接將鏈錶轉成數組,並直接以數組配合 Binary Search 遞迴建立樹。\n\n```\n\n// Time Complexity: O(n);\n// Space Complexity: O(n);\n\n/**\n * @param {ListNode} head\n * @return {TreeNode}\n */\nvar sortedListToBST = function(head) {\n if (head === null) return null;\n\n const dummy = new ListNode(0, head);\n const arr = [];\n\n let tail = dummy;\n\n while (tail) {\n const next = tail.next;\n next && arr.push(next.val);\n tail = next;\n }\n\n const inner = (l, r) => {\n if (l > r) return null;\n if (l === r) return new TreeNode(arr[r]);\n\n const m = Math.ceil((l + r) / 2);\n\n return new TreeNode(arr[m], inner(l, m - 1), inner(m + 1, r));\n };\n\n return inner(0, arr.length - 1);\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112936097","body":"## 思考方向\n### 雙指針\n用兩個指針分別從 headA, headB 開始走,走到盡頭換到另一個 head。過程中若指向同一個點則為兩鏈錶的交點,若皆遍歷一遍後無交點,則兩鏈錶無相交。\n\n```\n// Time Complexity: O(n);\n// Space Complexity: O(1);\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} headA\n * @param {ListNode} headB\n * @return {ListNode}\n */\nvar getIntersectionNode = function(headA, headB) {\n let pointerA = headA;\n let pointerB = headB;\n let switchCounts = 0;\n\n while (switchCounts < 3) {\n if (pointerA === pointerB) return pointerA;\n\n if (pointerA?.next) {\n pointerA = pointerA.next;\n } else {\n switchCounts += 1;\n pointerA = headB;\n }\n\n if (pointerB?.next) {\n pointerB = pointerB.next;\n } else {\n switchCounts += 1;\n pointerB = headA;\n }\n }\n\n return null;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3116343077","body":"## 解題方向\n- 快慢指針法\n\n## Edge Cases\n- 當快指針走到 null 代表沒有環\n\n```\n// Time Complexity: O(n);\n// Space Complexity: O(1);\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar detectCycle = function(head) {\n let fast = head;\n let slow = head;\n\n do {\n if (fast === null) return null;\n\n fast = fast?.next?.next ?? null;\n slow = slow?.next ?? null;\n } while (fast !== slow);\n\n fast = head;\n\n while (fast !== slow) {\n fast = fast?.next ?? null;\n slow = slow?.next ?? null;\n }\n\n return fast;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3121584769","body":"## 解題方向\n- 看到 FISO 的第一個想法是用 Queue,搭配 hash 也可以達到 get O(1) 的要求,不過 put 更新既有的值,就沒辦法 O(1)。\n若是 put 更新既有的值要 O(1),還是需要使用鏈表。\n- 中間有一度 debug 卡關,主要是原本在 put 時無論如何都先把既有的 node 刪掉再新增,但這可能造成一些 state 更新上的錯誤,後來簡化為直接移動 node 才 AC。\n\n```\n// Time Complexity: O(1) for LRUCache.prototype.get, put\n// Space Complexity: O(n)\n\nfunction ListNode(key, val) {\n this.key = key;\n this.val = val;\n this.next = null;\n this.pre = null;\n }\n\n/**\n * @param {number} capacity\n */\nvar LRUCache = function(capacity) {\n this.capacity = capacity;\n this.length = 0;\n this.head = new ListNode();\n this.tail = new ListNode();\n this.head.next = this.tail;\n this.tail.pre = this.head;\n this.map = {};\n};\n\n/** \n * @param {number} key\n * @return {number}\n */\nLRUCache.prototype.get = function(key) {\n const node = this.map[key];\n\n if (node !== undefined) {\n this.appendToTail(this.remove(node));\n return node.val\n };\n\n return -1;\n};\n\n/** \n * @param {number} key \n * @param {number} val\n * @return {void}\n */\nLRUCache.prototype.put = function(key, val) {\n const node = this.map[key];\n\n if (node !== undefined) {\n node.val = val;\n this.appendToTail(this.remove(node));\n } else {\n if (this.length === this.capacity) {\n const old = this.head.next;\n delete this.map[old.key];\n this.length -= 1;\n this.remove(old);\n }\n\n const node = new ListNode(key, val);\n this.map[key] = node;\n this.length += 1;\n this.appendToTail(node);\n }\n};\n\nLRUCache.prototype.appendToTail = function(node) {\n if (node.pre) node.pre.next = node.next;\n if (node.next) node.next.pre = node.pre;\n this.tail.pre.next = node;\n node.pre = this.tail.pre;\n node.next = this.tail;\n this.tail.pre = node;\n}\n\nLRUCache.prototype.remove = function(node) {\n node.pre.next = node.next;\n node.next.pre = node.pre;\n node.pre = null;\n node.next = null;\n\n return node;\n}\n\n/** \n * Your LRUCache object will be instantiated and called as such:\n * var obj = new LRUCache(capacity)\n * var param_1 = obj.get(key)\n * obj.put(key,value)\n */\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3123752698","body":"## 解題方向\n### DFS\n- 需注意當 helper 的 params root 為 null 時,應回傳 0\n\n```\n// Time Complexity: O(n), n for numbers of nodes.\n// Space Complexity: O(h), h for the max depth of tree.\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(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\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar maxDepth = function(root) {\n const helper = (root) => {\n if (!root) return 0;\n if (!root.left && !root.right) return 1;\n return Math.max(helper(root.left), helper(root.right)) + 1;\n };\n\n return helper(root);\n};\n```\n\n### Layer Iteration\n- 由於 stack 的起始值就有一個 root node,因此要先處理 root 為 null 的狀況\n\n```\n// Time Complexity: O(n), n for numbers of nodes.\n// Space Complexity: O(w), w for the max numbers of nodes in the same layer of tree.\n\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar maxDepth = function(root) {\n if (!root) return 0;\n\n const stack = [{ node: root, depth: 1 }];\n let maxDepth = 0;\n\n while (stack.length) {\n const { node, depth } = stack.shift();\n if (node.left) stack.push({ node: node.left, depth: depth + 1 });\n if (node.right) stack.push({ node: node.right, depth: depth + 1 });\n maxDepth = Math.max(maxDepth, depth);\n }\n\n return maxDepth;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125050709","body":"## 解題方向\n- 須理解兩棵樹一樣的意思是,其遍歷的結果會一樣,又題目有提到左右節點位置不同也不行,因此可以用多個遍歷結果來確認,或者可以將中間的空節點印出。可優化空間是不需要若於遍歷過程比較兩棵樹的節點,就不需要儲存遍歷結果。\n\n```javascript\n// Time Complexity: O(m + n), m, n are numbers of two tree nodes respectively.\n// Space Complexity: O(m + n)\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {TreeNode} p\n * @param {TreeNode} q\n * @return {boolean}\n */\nvar isSameTree = function(p, q) {\n const iterate = (root) => {\n const arr = [];\n const stack = [root];\n\n while (stack.length) {\n const node = stack.shift();\n\n arr.push(node?.val);\n\n if (node?.left || node?.right) {\n stack.push(node?.left);\n stack.push(node?.right);\n }\n }\n\n return arr;\n };\n\n return JSON.stringify(iterate(p)) === JSON.stringify(iterate(q));\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3131156971","body":"## 解題方向\n- 需要計算所有從 root 走到 leaf 的路線,這可以用 Recursion 來完成(回溯)\n- 用一個數字來紀錄 state:增加位數為「runningNumber * 10 + node.val」,減去位數為「Math.floor(runningNumber / 10)」\n\n```javascript\n// Time Complexity: O(n), n is the number of the tree nodes\n// Space Complexity: O(d), d is the depth of the tree\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar sumNumbers = function(root) {\n let sum = 0;\n let runningNumber = 0;\n\n const inner = (root) => {\n if (root) {\n runningNumber = runningNumber * 10 + root.val;\n\n if (!root.left && !root.right) {\n sum += runningNumber;\n } else {\n inner(root.left);\n inner(root.right);\n }\n\n runningNumber = Math.floor(runningNumber / 10);\n }\n };\n\n inner(root);\n\n return sum;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3134845036","body":"## 解題方向\n- 可以使用 DFS 或 BFS 來解題\n- DFS 記錄最深深度的第一個節點數值,深度可作為參數於每次遞迴時傳遞\n- BFS 紀錄每層第一個節點數值\n- 題目保證 root 一定不為 null\n\n### DFS\n```javascript\n// Time Complexity: O(n), n is the number of tree nodes.\n// Space Complexity: O(d), d is the max depth of tree.\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n let maxDepth = 0;\n let res = null;\n\n const dfs = (root, depth) => {\n if (depth > maxDepth) {\n maxDepth = depth;\n res = root.val;\n }\n\n root.left && dfs(root.left, depth + 1);\n root.right && dfs(root.right, depth + 1);\n };\n\n dfs(root, 1);\n\n return res;\n};\n```\n\n### BFS\n```javascript\n// Time Complexity: O(n), n is the number of tree nodes.\n// Space Complexity: O(w), w is the max width of tree.\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n const stack = [[root]];\n let res = null;\n\n while (stack.length) {\n const nodes = stack.pop();\n\n res = nodes[0].val;\n\n const nextNodes = [];\n\n for (const node of nodes) {\n node.left && nextNodes.push(node.left);\n node.right && nextNodes.push(node.right);\n }\n\n nextNodes.length && stack.push(nextNodes);\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3138426787","body":"## 解題方向\n* 使用 DNS 前序遍歷,在 deserialize 時透過遞迴建立樹會較 BFS 容易。\n* 使用原生的 JSON.stringify and JSON.parse 來轉換 array 及 string\n* 優化方向:優化 Space Complexity 至 O(h),h 為樹的高度\n * 能直接產生 serialized string 而非在最後轉化\n * 一邊 deserialize 需要的 string 部分,而不需要在一開始開一個 array 儲存\n\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val) {\n * this.val = val;\n * this.left = this.right = null;\n * }\n */\n\n// Time Complexity: O(n), n is number of tree nodes.\n// Space Complexity: O(n), n is number of tree nodes.\n\n/**\n * Encodes a tree to a single string.\n *\n * @param {TreeNode} root\n * @return {string}\n */\nvar serialize = function(root) {\n const preOrder = [];\n const dns = (root) => {\n preOrder.push(root?.val);\n if (root) {\n dns(root.left);\n dns(root.right);\n }\n };\n dns(root);\n\n return JSON.stringify(preOrder);\n};\n\n// Time Complexity: O(n), n is number of tree nodes.\n// Space Complexity: O(n), n is number of tree nodes.\n\n/**\n * Decodes your encoded data to tree.\n *\n * @param {string} data\n * @return {TreeNode}\n */\nvar deserialize = function(data) {\n const preOrder = JSON.parse(data);\n\n if (preOrder[0] === null || preOrder[0] === undefined) return preOrder[0];\n\n const createNode = () => {\n const val = preOrder.shift();\n\n if (val === null) return null;\n\n const node = new TreeNode(val);\n node.left = createNode();\n node.right = createNode();\n return node;\n };\n\n return createNode();\n};\n\n/**\n * Your functions will be called as such:\n * deserialize(serialize(root));\n */\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3144639245","body":"## 解題方向\n- 不一樣的遍歷方式會有差嗎? => 由於打算取值後再排序,因此沒差\n- 如何儲存最後的輸出最省力 => 用 hashmap\n\n```javascript\n// Time Complexity: O(nlogn), n is the number of tree.\n// Space Complexity: O(n), n is the number of tree.\n\n// /**\n// * Definition for a binary tree node.\n// * function TreeNode(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// /**\n// * @param {TreeNode} root\n// * @return {number[][]}\n// */\nvar verticalTraversal = function(root) {\n const map = {};\n\n const traverse = (root, row, col) => {\n if (!root) return;\n\n if (!map[col]) {\n map[col] = [];\n }\n\n map[col].push([row, root.val]);\n traverse(root.left, row + 1, col - 1);\n traverse(root.right, row + 1, col + 1);\n };\n\n traverse(root, 0, 0);\n\n const keys = Object.keys(map).sort((a, b) => a - b);\n\n const res = keys.map((k) => {\n const arr = map[k];\n\n return arr.sort(([rowA, valA], [rowB, valB]) => {\n if (rowA === rowB) return valA - valB;\n return rowA - rowB;\n }).map(([,val]) => val);\n });\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146092009","body":"## 解題方向\n- 遍歷 nums 時使用 hashmap 來記錄曾出現過的數字及其 index,並看 hashmap 是否記錄 target - nums[i] 是否曾出現過\n- 可以特別注意題目要求同個元素不能被使用兩次,所以應將配對到的元素移出 hashmap(不過因為題目也說只有一組數字為答案,所以不做也沒關係)\n\n```javascript\n// Time Complexity: O(n), n is nums.length.\n// Space Complexity: O(1) \n\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number[]}\n */\nvar twoSum = function(nums, target) {\n const map = {};\n const res = [];\n\n for (let i = 0; i < nums.length; i += 1) {\n const num = nums[i];\n\n if (map[target - num] !== undefined) {\n res.push(i, map[target - num]);\n delete map[target - num];\n } else {\n map[num] = i;\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3146907342","body":"## 解法\n- 第一個想法是遍歷後得到 num 與其 frequency 的 hashmap,將其轉成 array 後排序並取前 k 者\n- 看了題解後可優化部分是,由於題目允許回傳值不需要依據 frequency 排序,因此可將原解法 sort 的部分改成 quick selection,將平均時間複查度從 O(nlogn) 將至 O(n)\n```javascript\n// Time Complexity: O(nlogn), n is nums.length.\n// Space Complexity: O(n), n is nums.length.\n\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar topKFrequent = function (nums, k) {\n const map = {};\n\n for (const num of nums) {\n map[num] = (map[num] ?? 0) + 1;\n }\n\n return Object.entries(map)\n .sort(([numA, freqA], [numB, freqB]) => {\n return freqB - freqA;\n })\n .filter((_, i) => i < k)\n .map(([num]) => Number(num));\n};\n```\n\n## 解法\n- 找 max frequent num\n- 回傳 left, right index range\n- 需要考慮當兩個 num frequency 相等時,應保留 range 較小者!\n```javascript\n// Time Complexity: O(n), n is nums.length.\n// Space Complexity: O(n), n is nums.length.\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar findShortestSubArray = function (nums) {\n let maxFreqNum = nums[0];\n const map = {};\n\n for (let i = 0; i < nums.length; i += 1) {\n const num = nums[i];\n const { freq, left, right } = map[num] ?? { freq: 0, left: i, right: i };\n map[num] = {\n freq: freq + 1,\n left: i < left ? i : left,\n right: i > right ? i : right,\n };\n\n if (map[num].freq > map[maxFreqNum].freq) {\n maxFreqNum = num;\n } else if (map[num].freq === map[maxFreqNum].freq) {\n if (\n map[num].right - map[num].left <\n map[maxFreqNum].right - map[maxFreqNum].left\n ) {\n maxFreqNum = num;\n }\n }\n }\n\n const { left, right } = map[maxFreqNum];\n\n return right - left + 1;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3149617346","body":"```javascript\n// Time Complexity: O(n^2), n is points.length.\n// Space Complexity: O(n), n is points.length.\n\n/**\n * @param {number[][]} points\n * @return {number}\n */\nfunction numberOfBoomerangs(points) {\n const n = points.length;\n let ans = 0;\n \n for (let i = 0; i < n; i++) {\n const distanceMap = {};\n \n for (let j = 0; j < n; j++) {\n const dist = Math.pow(points[i][0] - points[j][0], 2) + Math.pow(points[i][1] - points[j][1], 2);\n distanceMap[dist] = (distanceMap[dist] ?? 0) + 1;\n }\n \n for (const count of Object.values(distanceMap)) {\n ans += count * (count - 1);\n }\n }\n \n return ans;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3153048738","body":"## 解法\n- 經典的滑動視窗題目,與用 hashmap 紀錄字元的出現次數,並於迴圈中判斷下個字元是否已出現過,無則加入,有則刪除。\n- 需要特別注意\n- (1) 迴圈的邊界條件應為 right < s.length - 1,不然會讓 right 跑到 s.length\n- (2) 應先刪掉 map[s[left]] 再 left++\n\n```javascript\n// Time Complexity: O(n), n is s.length.\n// Space Complexity: O(m), m is types of characters in s.\n\n/**\n * @param {string} s\n * @return {number}\n */\nvar lengthOfLongestSubstring = function(s) {\n if (!s.length) return 0;\n \n const chars = new Map();\n chars.set(s[0], 1);\n\n let max = 1;\n let left = 0;\n let right = 0;\n\n while (right < s.length - 1) {\n const cond = !chars.has(s[right + 1]);\n if (!chars.has(s[right + 1])) {\n right++;\n chars.set(s[right], 1);\n } else {\n chars.delete(s[left]);\n left++;\n }\n\n const number = right - left + 1;\n if (number > max) max = number;\n }\n\n return max;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3160434225","body":"## 解法\n- 一開始分析方向錯了,以為每個 substring 間不可重疊\n- 之後想到的是用 hashmap 存可能 substring 的結果,再遍歷一次,但是時間複雜度為階乘\n- 最後則是直接遍歷,再驗證 substring 是否正確,然而需考慮 words 的 element 是否會重複\n\n```javascript\n// Time Complexity: O(n * m * k), n is s.length, m is words[0].length, k is words.lenght.\n// Space Complexity: O(m).\n\n/**\n * @param {string} s\n * @param {string[]} words\n * @return {number[]}\n */\nvar findSubstring = function(s, words) {\n const defaultMap = (() => {\n const m = {};\n for (const word of words) {\n m[word] = (m[word] ?? 0) + 1;\n }\n return m;\n })();\n let map = JSON.parse(JSON.stringify(defaultMap));\n const wordLength = words[0].length;\n const substringLength = wordLength * words.length;\n\n const validate = (substring) => {\n let cur = 0;\n map = JSON.parse(JSON.stringify(defaultMap));\n\n while (cur < substring.length) {\n const target = substring.substring(cur, cur + wordLength);\n if (map[target]) {\n map[target] -= 1;\n cur += wordLength;\n } else return false;\n }\n\n return true;\n };\n\n const res = []\n\n for (let i = 0; i < s.length - substringLength + 1; i++) {\n const substring = s.substring(i, i + substringLength);\n if (validate(substring)) res.push(i);\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3164019442","body":"## 解法\n- 一開始漏看了連續短數組的條件,之後想到暴力法,也有個感覺優化必定涉及數學技巧,因此直接看題解\n- 需要理解兩個技巧:負數取模 floorMod 和 map.set(0, -1) 以處理欲從 sum[i] - sum[j] 計算 i 至 j 範圍時,當 j 為 0 遇到的計算問題\n\n```javasciprt\n// Time Complexity: O(n), n is nums.length.\n// Space Complexity: O(min(n, k))\n\n/**\n * @param {number[]} nums\n * @param {number} p\n * @return {number}\n */\nvar floorMod = function (a, b) {\n return ((a % b) + b) % b;\n};\n\nfunction minSubarray(nums, k) {\n var map = new Map();\n map.set(0, -1);\n var res = nums.length;\n var target = 0;\n var currSum = 0;\n for (let i = 0; i < nums.length; i++) {\n target += nums[i];\n }\n target = target % k;\n if (target === 0) return 0;\n for (let i = 0; i < nums.length; i++) {\n currSum = (nums[i] + currSum) % k;\n\n var prevSum = floorMod(currSum - target, k);\n if (map.has(prevSum)) {\n res = Math.min(res, i - map.get(prevSum));\n }\n map.set(currSum, i);\n }\n return res === nums.length ? -1 : res;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3168248088","body":"## 解法\n- 窮舉前面的例子就可以得到規律:先處理只有一個 node 的 edge case,當 fast.next?.next 不為 null,即存在下下個 node 的情況下移動快慢指針,不然慢指針的下個 node 即是中間節點。\n```javascript\n// 1 => 1\n\n// 1, 2 => 2 => slow 1, fast 2\n// 1, 2, 3 => 2 => slow 1, fast 2\n\n// 1, 2, 3, 4 => 3 => slow 2, fast 4\n// 1, 2, 3, 4, 5 => 3 => slow 2, fast 4\n\n// 1, 2, 3, 4, 5, 6 => 4\n// 1, 2, 3, 4, 5, 6, 7 => 4\n\n// 1, 2, 3, 4, 5, 6, 7, 8 => 5\n// 1, 2, 3, 4, 5, 6, 7, 8, 9 => 5\n```\n\n```javascript\n// Time Complexity: O(n), n is linked list length,\n// Space Complexity: O(1)\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar middleNode = function(head) {\n if (!head.next) return head;\n\n let slow = head;\n let fast = head.next;\n\n while (fast.next?.next) {\n slow = slow.next;\n fast = fast.next.next;\n };\n\n return slow.next;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3170547569","body":"## 解法\n- 一開始沒注意到 Space Complexity O(1) 的要求,因此用 map 來記錄曾遍歷過的數字,並使用 nums.splice 來原地刪除重複元素\n- 若限制 Space Complexity 為 O(1),則需要如題解用快慢指針來做\n\n```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar removeDuplicates = function(nums) {\n let slow = 0;\n let fast = 0;\n\n while (fast < nums.length) {\n if (nums[fast] !== nums[slow]) {\n slow++;\n nums[slow] = nums[fast];\n }\n \n fast++;\n }\n\n return slow + 1;\n};\n\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar removeDuplicates = function(nums) {\n const map = {};\n let res = 0;\n let i = nums.length - 1;\n\n while (i >= 0) {\n const num = nums[i];\n\n if (map[num]) {\n nums.splice(i, 1);\n } else {\n map[num] = 1;\n res += 1;\n };\n\n i--;\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172259657","body":"## 解法\n- 經典的二分查找,需注意沒有找到 target 的 edge case\n\n```javascript\n// Time Complexity: O(logn), n is nums.length\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar searchInsert = function(nums, target) {\n let l = 0;\n let r = nums.length - 1;\n let m = -1;\n\n while (l <= r) {\n m = l + Math.floor((r - l) / 2);\n\n if (nums[m] === target) return m;\n else if (nums[m] > target) r = m - 1;\n else l = m + 1;\n }\n\n return l;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173778506","body":"## 解法\n- 第一泡茶的確是暴力解,之後會想到 max heap,但每次 push 仍需要耗費 O(logn)\n- 有想過使用 monotonic stack 來做,但卡沒仔細想就覺得可能無法正確排除 sliding window 外的元素而作罷,而這其實可以靠題解中的 shift 來完成,又因為不是嚴格遞增棧,所以遇到相等數值時,前者仍會被保留,而確保 shift 的操作都是正確的\n\n```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(k)\n\nvar maxSlidingWindow = function (nums, k) {\n const res = [];\n const dequeue = new Dequeue([]);\n\n for (let i = 0; i < k - 1; i++) {\n dequeue.push(nums[i]);\n }\n\n for (let i = k - 1; i < nums.length; i++) {\n dequeue.push(nums[i]);\n res.push(dequeue.max());\n dequeue.shift(nums[i - k + 1]);\n }\n\n return res;\n};\n\nclass Dequeue {\n constructor(nums) {\n this.list = nums; // Should be implemented as a linked list to make time complexity of dequeue.shift() as O(1).\n }\n\n push(val) {\n const nums = this.list;\n\n while (nums[nums.length - 1] < val) {\n nums.pop();\n }\n\n nums.push(val);\n }\n\n shift(val) {\n let nums = this.list;\n\n if (nums[0] === val) {\n nums.shift();\n }\n }\n\n max() {\n return this.list[0];\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3178234382","body":"## 解法\n- 第一泡茶,可以透過紀錄一個人信任及被信任的人數來解題。其中可以不斷紀錄目前被信任人數最高者方便最後判斷是否為法官\n- 看了題解後發現可以用圖來解,之後補上\n\n```javascript\n// Time Complexity: O(n)\n// Space Complexity: O(n)\n\n/**\n * @param {number} n\n * @param {number[][]} trust\n * @return {number}\n */\nvar findJudge = function(n, trust) {\n const trustFroms = new Array(n).fill(0);\n const trustTos = new Array(n).fill(0);\n let maybeJudge = { index: 0, trustTo: 0 };\n\n for (const t of trust) {\n const [from, to] = [t[0] - 1, t[1] - 1];\n trustFroms[from]++;\n trustTos[to]++;\n if (trustTos[to] > maybeJudge.trustTo) maybeJudge = { index: to, trustTo: trustTos[to] };\n }\n\n if (maybeJudge.trustTo === n - 1) {\n if (trustFroms[maybeJudge.index] === 0) return maybeJudge.index + 1;\n }\n\n return -1;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3184149014","body":"```javascript\n// Time Complexity: O(v + e)\n// Space Complexity: O(v + e)\n\n/**\n * @param {number} n\n * @param {number[][]} dislikes\n * @return {boolean}\n */\nconst possibleBipartition = (n, dislikes) => {\n const graph = new Array(n + 1).fill().map(() => new Array())\n const colors = new Array(n + 1).fill(-1);\n\n for (const [a, b] of dislikes) {\n graph[a].push(b);\n graph[b].push(a);\n }\n\n const dfs = (cur, color = 0) => {\n colors[cur] = color;\n\n for (const nxt of graph[cur]) {\n if (colors[nxt] !== -1 && colors[nxt] === color) return false;\n if (colors[nxt] === -1 && !dfs(nxt, color ^ 1)) return false;\n }\n\n return true;\n };\n\n for (let i = 0; i < n + 1; i++) {\n if (colors[i] === -1 && !dfs(i, 0)) return false;\n }\n\n return true;\n};\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3186799518","body":"```javascript\n// Time Complexity: O(n + e), e is sum of beforeItems.flat().length\n// Space Complexity: O(n + e)\n\n/**\n * @param {number} n\n * @param {number} m\n * @param {number[]} group\n * @param {number[][]} beforeItems\n * @return {number[]}\n */\nvar sortItems = function(n, m, group, beforeItems) {\n const topologicalSort = (items, indegree, neighbors) => {\n const queue = [];\n const result = [];\n \n for (const item of items) {\n if (indegree[item] === 0) {\n queue.push(item);\n }\n }\n \n while (queue.length > 0) {\n const current = queue.shift();\n result.push(current);\n \n const currentNeighbors = neighbors[current] || [];\n for (const neighbor of currentNeighbors) {\n indegree[neighbor]--;\n if (indegree[neighbor] === 0) {\n queue.push(neighbor);\n }\n }\n }\n \n return result;\n };\n \n let maxGroupId = m;\n for (let item = 0; item < n; item++) {\n if (group[item] === -1) {\n group[item] = maxGroupId;\n maxGroupId++;\n }\n }\n \n const itemIndegree = Array.from({length: n}, () => 0);\n const groupIndegree = Array.from({length: maxGroupId}, () => 0);\n const itemNeighbors = Array.from({length: n}, () => []);\n const groupNeighbors = Array.from({length: maxGroupId}, () => []);\n const groupItems = Array.from({length: maxGroupId}, () => []);\n \n for (let item = 0; item < n; item++) {\n groupItems[group[item]].push(item);\n }\n \n for (let item = 0; item < n; item++) {\n const dependencies = beforeItems[item] || [];\n \n for (const dependency of dependencies) {\n if (group[dependency] !== group[item]) {\n groupIndegree[group[item]]++;\n groupNeighbors[group[dependency]].push(group[item]);\n } else {\n itemIndegree[item]++;\n itemNeighbors[dependency].push(item);\n }\n }\n }\n \n const groups = Array.from({length: maxGroupId}, (_, i) => i);\n const sortedGroups = topologicalSort(groups, groupIndegree, groupNeighbors);\n \n if (sortedGroups.length !== maxGroupId) {\n return [];\n }\n \n const result = [];\n \n for (const groupId of sortedGroups) {\n const items = groupItems[groupId];\n const sorteditems = topologicalSort(items, itemIndegree, itemNeighbors);\n \n if (sorteditems.length !== items.length) {\n return [];\n }\n \n result.push(...sorteditems);\n }\n \n return result;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3190479297","body":"```javascript\n// Time Complexity: O(n), n is moves.length\n// Space Complexity: O(1)\n\n/**\n * @param {string} moves\n * @return {boolean}\n */\nvar judgeCircle = function(moves) {\n let [x, y] = [0, 0];\n\n for (let i = 0; i < moves.length; i++) {\n const action = moves.substring(i, i + 1);\n if (action === 'R') x++;\n if (action === 'L') x--;\n if (action === 'U') y++;\n if (action === 'D') y--;\n }\n\n return x === 0 && y === 0;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193447956","body":"## 題解\n- 一開始使用 Array + Sort 的方法實作,不過由於 Time Complexity 為 O(n^2logn),在資料量 1 <= n <= 10^5 的條件下,會沒辦法 AC\n- 需要將資料結構改成 Min Heap 來降低時間複雜度\n\n```javascript\n// Min Heap\n// Time Complexity: O(nlogn)\n// Space Complexity: O(logn)\n\n/**\n * @param {number[][]} tasks\n * @return {number[]}\n */\nvar getOrder = function (tasks) {\n const indices = Array.from({ length: tasks.length }, (_, i) => i);\n\n indices.sort((a, b) => { return tasks[a][0] - tasks[b][0] });\n\n const minHeap = new PriorityQueue((a, b) => {\n if (tasks[a][1] !== tasks[b][1]) {\n return tasks[a][1] - tasks[b][1];\n }\n return a - b;\n });\n\n const res = [];\n let time = 0;\n let i = 0;\n\n while (!minHeap.isEmpty() || i < tasks.length) {\n while (i < tasks.length && tasks[indices[i]][0] <= time) {\n minHeap.enqueue(indices[i]);\n i++;\n }\n\n if (minHeap.size() === 0) {\n time = tasks[indices[i]][0];\n } else {\n const nextIndex = minHeap.dequeue();\n time += tasks[nextIndex][1];\n res.push(nextIndex);\n }\n }\n\n return res;\n};\n\n// Array + Sort\n// Time Complexity: O(n^2logn)\n// Space Complexity: O(n)\n\n/**\n * @param {number[][]} tasks\n * @return {number[]}\n */\nvar getOrder = function(tasks) {\n tasks = tasks.map((t, i) => [...t, i]);\n tasks.sort((a, b) => a[0] === b[0] ? a[2] - b[2] : a[0] - b[0]);\n\n let i = 0;\n let curTime = 0;\n const queue = [];\n const res = [];\n\n while (i < tasks.length || queue.length) {\n while (i < tasks.length && tasks[i][0] <= curTime) {\n queue.push(tasks[i]);\n queue.sort((a, b) => a[1] === b[1] ? a[2] - b[2] : a[1] - b [1]);\n i++;\n }\n\n if (!queue.length) {\n curTime = tasks[i][0];\n } else {\n const curTask = queue.shift();\n res.push(curTask[2]);\n curTime += curTask[1];\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194091917","body":"```javascript\n// Time Complexity: O(1)\n// Space Complexity: O(1)\n\n/**\n * @param {string} loginTime\n * @param {string} logoutTime\n * @return {number}\n */\nvar numberOfRounds = function(loginTime, logoutTime) {\n const getMinSum = (time, carry) => {\n let [hour, min] = time.split(':').map(s => Number(s));\n const remainer = min % 15;\n const q = (min - remainer) / 15;\n\n if (!carry) {\n return (hour * 60) + min;\n } else if (remainer && carry === 'ceil') {\n return (hour * 4 + q + 1) * 15;\n } else {\n return (hour * 4 + q) * 15;\n }\n };\n\n let [loginMinSum, logoutMinSum] = [getMinSum(loginTime, 'ceil'), getMinSum(logoutTime, 'floor')];\n\n if (getMinSum(loginTime) > getMinSum(logoutTime)) {\n logoutMinSum += 24 * 60;\n }\n\n return Math.max((logoutMinSum - loginMinSum) / 15, 0)\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3196057927","body":"## 題解\n- 原本想針對三種狀況,直接找 a 和 b 中最符合的 char 來做計算,但會發現很多 edge case 要考量,要一直修正\n- 看題解之後,在有限的解空間中(頂多常數 26),枚舉的確是一個簡單、可讀性更好的做法\n\n```javascript\n// Time Complexity: O(n + m), n is a.length, m is b.length\n// Space Complexity: O(26)\n\n/**\n * @param {string} a\n * @param {string} b\n * @return {number}\n */\nvar minCharacters = function(a, b) {\n const createCounter = (str) => {\n const counter = {};\n\n for (let i = 0; i < 26; i++) {\n counter[String.fromCharCode(97 + i)] = 0;\n }\n\n for (const char of str) {\n counter[char]++;\n }\n return counter;\n };\n \n const ca = createCounter(a);\n const cb = createCounter(b);\n\n const greaterCost = (ca, cb) => {\n let ans = Infinity;\n\n for (let i = 1; i < 26; i++) {\n let count = 0;\n \n for (let j = 0; j < i; j++) {\n count += ca[String.fromCharCode(97 + j)];\n }\n \n for (let j = i; j < 26; j++) {\n count += cb[String.fromCharCode(97 + j)];\n }\n ans = Math.min(ans, count);\n }\n return ans;\n };\n \n const equalCost = (ca, cb) => {\n let ans = Infinity;\n for (let i = 0; i < 26; i++) {\n const char = String.fromCharCode(97 + i);\n ans = Math.min(ans, a.length + b.length - ca[char] - cb[char]);\n }\n return ans;\n };\n \n return Math.min(\n greaterCost(ca, cb),\n greaterCost(cb, ca),\n equalCost(ca, cb)\n );\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3199125049","body":"## 題解\n- 直覺就是用快速排序來做,不過實踐上,這次發現 partition 有兩種方法可以做:hoarePartition、lomutoPartition。其中 lomutoPartition 普遍認為較簡單,但因為交換數值的次數較多,會遇到 TLE,因此此題需用 hoarePartition 來做。\n\n```javascript\nconst lomutoPartition = (nums, left, right) => {\n const pivot = nums[right];\n let i = left - 1;\n\n for (let j = left; j < right; j++) {\n if (nums[j] <= pivot) {\n i++;\n [nums[i], nums[j]] = [nums[j], nums[i]];\n }\n }\n\n i++;\n [nums[i], nums[right]] = [nums[right], nums[i]];\n\n return i;\n};\n\nconst hoarePartition = (nums, left, right) => {\n const p = left + ((right - left) >>> 1);\n const pivot = nums[p];\n let [i, j] = [left, right];\n\n while (i <= j) {\n while (nums[i] < pivot) i++;\n while (nums[j] > pivot) j--;\n if (i <= j) {\n [nums[i], nums[j]] = [nums[j], nums[i]];\n i++;\n j--;\n }\n }\n\n return [i, j];\n};\n\nconst quickSort = (nums, left, right) => {\n // if (left < right) {\n // const p = lomutoPartition(nums, left, right);\n // quickSort(nums, left, p - 1);\n // quickSort(nums, p + 1, right);\n // }\n\n if (left < right) {\n const [i, j] = hoarePartition(nums, left, right);\n quickSort(nums, left, j);\n quickSort(nums, i, right);\n }\n};\n\n// Time Complexity: O(nlogn), n is nums.length\n// Space Complexity: O(logn)\n\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar sortArray = function (nums) {\n quickSort(nums, 0, nums.length - 1);\n return nums;\n};\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204182883","body":"```javascript\n// Time Complexity: O(logn)\n// Space Complexity: O(1)\n\n/**\n * @param {number} x\n * @return {number}\n */\nvar mySqrt = function(x) {\n let res = 0;\n let l = 0;\n let r = x;\n\n while (l <= r) {\n const m = l + ((r - l) >>> 2);\n\n if (m * m > x) {\n r = m - 1;\n } else {\n res = m;\n l = m + 1;\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3209343494","body":"## 題解\n- 可以將這題轉化成「尋找最左邊符合條件者」,即可套入模板\n\n```javascript\n// Time Complexity: O(logn)\n// Space Complexity: O(1)\n\n/**\n * Definition for isBadVersion()\n * \n * @param {integer} version number\n * @return {boolean} whether the version is bad\n * isBadVersion = function(version) {\n * ...\n * };\n */\n\n/**\n * @param {function} isBadVersion()\n * @return {function}\n */\nvar solution = function(isBadVersion) {\n /**\n * @param {integer} n Total versions\n * @return {integer} The first bad version\n */\n return function(n) {\n let [l, r] = [1, n];\n\n while (l <= r) {\n const m = l + ((r - l) >>> 2);\n\n if (isBadVersion(m)) {\n r = m - 1;\n } else {\n l = m + 1;\n }\n }\n\n return l;\n };\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/42#issuecomment-3212999531","body":"## 題解\n- 二分:對於每一個元素前者排序,並找到大於 a * 2 者(重複 a * 2 的右界)。需注意是,應在每次加入新元素時,直接尋找其應該插入的位置,而非將整個陣列排序,不然會 TLE。\n\n```javascript\nclass SortedList {\n constructor() {\n this.arr = [];\n }\n\n bisectRight(target) {\n let [l, r] = [0, this.arr.length - 1];\n\n while (l <= r) {\n const mid = l + ((r - l) >>> 1);\n\n if (this.arr[mid] <= target) {\n l = mid + 1;\n } else {\n r = mid - 1;\n }\n }\n\n return l;\n }\n \n push(value) {\n const pos = this.bisectRight(value);\n this.arr.splice(pos, 0, value);\n }\n \n get length() {\n return this.arr.length;\n }\n}\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar reversePairs = function(nums) {\n const sortedRunningNums = new SortedList();\n sortedRunningNums.push(nums[0]);\n let ans = 0;\n\n for (let i = 1; i < nums.length; i++) {\n ans += (i - sortedRunningNums.bisectRight(nums[i] * 2));\n sortedRunningNums.push(nums[i]);\n }\n\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3216534944","body":"## 題解\n- 依序遍歷 houses,尋找每個 house 與 heater 最近距離,最大者為答案。其中尋找最近距離的實踐,可以使用 bisectRight 來做\n\n```javascript\n// Time Complexity: O(nlog m + mlog m), n is houses.length, m is heaters.length\n// Space Complexity: O(1)\n\nconst getHouseHeaterMinDistance = (house, heaters) => {\n if (heaters.length === 0) return Infinity;\n if (heaters.length === 1) return Math.abs(house - heaters[0]);\n\n let [l, r] = [0, heaters.length - 1];\n\n while (l <= r) {\n const m = l + ((r - l) >>> 1);\n\n if (house === heaters[m]) {\n return 0;\n } else if (house > heaters[m]) {\n l = m + 1;\n } else {\n r = m - 1;\n };\n }\n\n const leftDistance = l === 0 ? Infinity : house - heaters[l - 1];\n const rightDistance = r === heaters.length - 1 ? Infinity : heaters[l] - house;\n\n return Math.min(leftDistance, rightDistance);\n};\n\n/**\n * @param {number[]} houses\n * @param {number[]} heaters\n * @return {number}\n */\nvar findRadius = function(houses, heaters) {\n heaters.sort((a, b) => a - b);\n\n let maxRadius = 0;\n\n for (const house of houses) {\n const minDistance = getHouseHeaterMinDistance(house, heaters);\n maxRadius = Math.max(maxRadius, minDistance);\n }\n\n return maxRadius;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3217908480","body":"## 題解\n- 計數二分經典的題目,排序後解空間為 0 至 nums[lnums.ength - 1] - nums[0]\n\n```javascript\n// Time Complexity: O(nlogn)\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number}\n */\nvar smallestDistancePair = function(nums, k) {\n nums.sort((a, b) => a - b);\n\n const countDistanceNotGreaterThan = (maxDistance) => {\n let count = 0;\n let l = 0;\n\n for (let r = 1; r < nums.length; r++) {\n while (nums[r] - nums[l] > maxDistance) {\n l++;\n }\n\n count += r - l;\n }\n\n return count;\n };\n\n let [l, r] = [0, nums[nums.length - 1] - nums[0]];\n\n while (l <= r) {\n const m = l + ((r - l) >>> 1);\n\n if (countDistanceNotGreaterThan(m) >= k) {\n r = m - 1;\n } else {\n l = m + 1;\n }\n }\n\n return l;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3218836123","body":"## 題解\n- 用二分在解空間 [0, maxElevation] 中尋找答案,對於每個可能的 m,再 dns 尋找可能路徑\n- 需注意因為 dns 時多了 grid[ni][nj] <= elevation 的條件,不需重置 visited[i][j],因為就算從其他點進來該點,依舊會沒辦法繼續走下去,與尋找所有路徑的 dns 略有不同\n\n```javascript\n// Time Complexity: O(n^2logn)\n// Space Complexity: O(n^2)\n\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar swimInWater = function(grid) {\n const n = grid.length;\n\n const maxElevation = (() => {\n let e = 0;\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n e = Math.max(e, grid[i][j]);\n }\n }\n return e;\n })();\n\n const canReachBottomRight = (elevation) => {\n const visited = Array.from({ length: n}).map(() => Array.from({ length: n }).map(() => false));\n\n const dns = (i, j) => {\n if (i === n - 1 && j === n - 1) return true;\n\n visited[i][j] = true;\n\n const directions = [[0, 1], [1, 0], [0, -1], [-1, 0]];\n\n for (const [di, dj] of directions) {\n const ni = i + di;\n const nj = j + dj;\n\n if (ni >= 0 && ni < n && nj >= 0 && nj < n) {\n if (!visited[ni][nj] && grid[ni][nj] <= elevation) {\n if (dns(ni, nj)) return true;\n }\n }\n }\n\n // visited[i][j] = false;\n\n return false;\n };\n\n if (grid[0][0] <= elevation) return dns(0, 0);\n else return false;\n };\n\n let l = 0;\n let r = maxElevation;\n\n while (l <= r) {\n const m = l + ((r - l) >>> 1);\n\n if (canReachBottomRight(m)) {\n r = m - 1;\n } else {\n l = m + 1;\n }\n }\n\n return l;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3222489820","body":"## 題解\n- 典型的 sliding window 題型\n\n```javascript\n// Time Complexity: O(n)\n// Space Complexity: O(1)\n\n/**\n * @param {string} s\n * @param {number} k\n * @return {number}\n */\nvar maxVowels = function(s, k) {\n const vowel = 'aeiou';\n let l = 0;\n let r = 0;\n let cur = 0;\n let max = cur;\n\n while (r < s.length) {\n if (vowel.includes(s.charAt(r))) cur++;\n r++;\n\n if (r - l > k) {\n if (vowel.includes(s.charAt(l))) cur--;\n l++;\n }\n\n max = Math.max(max, cur);\n }\n\n return max;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3226683449","body":"```javascript\n// Time Complexity: O(k + maxPts)\n// Space Complexity: O(k + maxPts)\n\n/**\n * @param {number} n\n * @param {number} k\n * @param {number} maxPts\n * @return {number}\n */\nvar new21Game = function(n, k, maxPts) {\n const dp = Array.from({ length: k + maxPts }).map(() => 0);\n let sum = 0;\n\n for (let i = k; i < k + maxPts; i++) {\n if (i <= n) dp[i] = 1;\n sum += dp[i];\n }\n\n for (let j = k - 1; j >= 0; j--) {\n dp[j] = sum / maxPts;\n sum -= dp[j + maxPts];\n sum += dp[j];\n }\n\n return dp[0];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3234016259","body":"```javascript\n// Time Complexity: O(n), n is s.length\n// Space COmplexity: O(1)\n\n/**\n * @param {string} s\n * @param {string} p\n * @return {number[]}\n */\nfunction findAnagrams(s, p) {\n function arraysEqual(arr1, arr2) {\n for (let i = 0; i < 26; i++) {\n if (arr1[i] !== arr2[i]) return false;\n }\n return true;\n }\n\n const result = [];\n const sLen = s.length;\n const pLen = p.length;\n \n if (sLen < pLen) return result;\n \n const pCount = new Array(26).fill(0);\n const windowCount = new Array(26).fill(0);\n \n for (let i = 0; i < pLen; i++) {\n pCount[p.charCodeAt(i) - 97]++;\n }\n \n let left = 0;\n \n for (let right = 0; right < sLen; right++) {\n const rightIndex = s.charCodeAt(right) - 97;\n windowCount[rightIndex]++;\n \n if (right - left + 1 > pLen) {\n const leftIndex = s.charCodeAt(left) - 97;\n windowCount[leftIndex]--;\n left++;\n }\n \n if (right - left + 1 === pLen) {\n if (arraysEqual(windowCount, pCount)) {\n result.push(left);\n }\n }\n }\n \n return result;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3237104151","body":"```javascript\n// Time Complexity: O(n + m), n is s.length, m is t.length\n// Space Complexity: O(k), k is different char count in t\n\n/**\n * @param {string} s\n * @param {string} t\n * @return {string}\n */\nfunction minWindow(s, t) {\n let l = 0;\n const counter = {};\n const N = s.length;\n const ct = {};\n \n for (let char of t) {\n ct[char] = (ct[char] || 0) + 1;\n }\n \n let k = 0;\n let ret = Infinity;\n let ans = \"\";\n \n for (let r = 0; r < N; r++) {\n counter[s[r]] = (counter[s[r]] || 0) + 1;\n \n if (s[r] in ct && counter[s[r]] === ct[s[r]]) {\n k++;\n }\n \n while (k === Object.keys(ct).length) {\n if (r - l + 1 < ret) {\n ans = s.substring(l, r + 1);\n ret = r - l + 1;\n }\n \n counter[s[l]]--;\n if (s[l] in ct && counter[s[l]] === ct[s[l]] - 1) {\n k--;\n }\n l++;\n }\n }\n \n return ans;\n}\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/51#issuecomment-3239924106","body":"```javascript\n// Time Complexity: O(1)\n// Space Complexity: O(1)\n\n/**\n * @param {number} turnedOn\n * @return {string[]}\n */\nvar readBinaryWatch = function(turnedOn) {\n const countBits = (num) => {\n let count = 0;\n while (num) {\n count += num & 1;\n num >>= 1;\n }\n return count;\n };\n\n const res = [];\n\n for (let hour = 0; hour < 12; hour++) {\n for (let minute = 0; minute < 60; minute++) {\n if ((countBits(hour) + countBits(minute)) === turnedOn) {\n const formattedMinute = minute < 10 ? `0${minute}` : `${minute}`\n res.push(`${hour}:${formattedMinute}`);\n }\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3240825737","body":"```javascript\n// Time Complexity: O(n!)\n// Space Complexity: O(n)\n\n/**\n * @param {number} n\n * @return {number}\n */\nvar totalNQueens = function(n) {\n let count = 0;\n\n const backtrack = (row, cols, dias1, dias2) => {\n if (row === n) {\n count++;\n return;\n }\n\n let availablePostions = ((1 << n) - 1) & (~(cols | dias1 | dias2));\n\n while (availablePostions) {\n const position = availablePostions & (-availablePostions);\n availablePostions &= availablePostions - 1;\n\n backtrack(\n row + 1,\n cols | position,\n (dias1 | position) << 1,\n (dias2 | position) >> 1,\n );\n }\n };\n\n backtrack(0, 0, 0, 0);\n\n return count;\n};\n\n// Time Complexity: O(n!)\n// Space Complexity: O(n)\n\n/**\n * @param {number} n\n * @return {number}\n */\nvar totalNQueens = function(n) {\n let count = 0;\n const cols = new Array(n).fill(false);\n const dias1 = new Array(2 * n - 1).fill(false); // row - col\n const dias2 = new Array(2 * n - 1).fill(false); // row + col\n\n const backtrack = (row) => {\n if (row === n) {\n count++;\n return;\n }\n\n for (let col = 0; col < n; col++) {\n const d1 = row - col + n - 1;\n const d2 = row + col;\n\n if (cols[col] || dias1[d1] || dias2[d2]) continue;\n\n cols[col] = dias1[d1] = dias2[d2] = true;\n backtrack(row + 1);\n cols[col] = dias1[d1] = dias2[d2] = false;\n }\n };\n\n backtrack(0);\n\n return count;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3245083899","body":"## 題解\n- 遍歷每個 (i, j) 進行 dfs,遇到邊界或 grid[i][j] === 0 者即返回 0,反之則返回 1 加四個方向 dns 的結果\n- 優化:訪問過者可將原 grid[i][j] 改成 0,如此便不需要重新宣告一個空間來存取\n\n```javascript\n// Time Complexity: O(m * n)\n// Space Complexity: O(m * n)\n\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar maxAreaOfIsland = function(grid) {\n const [m, n] = [grid.length, grid[0].length];\n const direction = [[1, 0], [-1, 0], [0, 1], [0, -1]];\n let max = 0;\n\n const dfs = (x, y) => {\n if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y]) {\n grid[x][y] = 0;\n\n let area = 1;\n\n for (const [dx, dy] of direction) {\n area += dfs(x + dx, y + dy);\n }\n\n return area;\n }\n\n return 0;\n };\n\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n max = Math.max(max, dfs(i, j));\n }\n }\n\n return max;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3249843138","body":"```javascript\n// Time Complexity: O(n^2)\n// Space Complexity: O(n^2)\n\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nfunction maxDistance(grid) {\n const n = grid.length;\n const queue = [];\n \n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n if (grid[i][j] === 1) {\n queue.push([i, j, 0]);\n }\n }\n }\n \n if (queue.length === 0 || queue.length === n * n) {\n return -1;\n }\n \n const directions = [[0, 1], [1, 0], [0, -1], [-1, 0]];\n let maxDist = 0;\n \n while (queue.length > 0) {\n const [x, y, dist] = queue.shift();\n maxDist = Math.max(maxDist, dist);\n \n for (const [dx, dy] of directions) {\n const nx = x + dx;\n const ny = y + dy;\n \n if (nx >= 0 && nx < n && ny >= 0 && ny < n && grid[nx][ny] === 0) {\n grid[nx][ny] = 1;\n queue.push([nx, ny, dist + 1]);\n }\n }\n }\n \n return maxDist;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3251291240","body":"```javascript\n// Time Complexity: O(n + k), n is candies.length, k is number of keys\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} status\n * @param {number[]} candies\n * @param {number[][]} keys\n * @param {number[][]} containedBoxes\n * @param {number[]} initialBoxes\n * @return {number}\n */\nvar maxCandies = function(status, candies, keys, containedBoxes, initialBoxes) {\n const boxes = new Set(initialBoxes);\n const q = [];\n \n for (const i of boxes) {\n if (status[i]) {\n q.push(i);\n }\n }\n \n for (let idx = 0; idx < q.length; idx++) {\n const i = q[idx];\n \n for (const j of containedBoxes[i]) {\n boxes.add(j);\n if (status[j]) {\n q.push(j);\n }\n }\n \n for (const j of keys[i]) {\n if (status[j] === 0 && boxes.has(j)) {\n q.push(j);\n }\n status[j] = 1;\n }\n }\n \n return q.reduce((sum, i) => sum + candies[i], 0);\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/56#issuecomment-3258808498","body":"```javascript\n// Time Complexity: O(nlogn), n is the number of tree.\n// Space Complexity: O(n), n is the number of tree.\n\n// /**\n// * Definition for a binary tree node.\n// * function TreeNode(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// /**\n// * @param {TreeNode} root\n// * @return {number[][]}\n// */\nvar verticalTraversal = function(root) {\n const map = {};\n\n const traverse = (root, row, col) => {\n if (!root) return;\n\n if (!map[col]) {\n map[col] = [];\n }\n\n map[col].push([row, root.val]);\n traverse(root.left, row + 1, col - 1);\n traverse(root.right, row + 1, col + 1);\n };\n\n traverse(root, 0, 0);\n\n const keys = Object.keys(map).sort((a, b) => a - b);\n\n const res = keys.map((k) => {\n const arr = map[k];\n\n return arr.sort(([rowA, valA], [rowB, valB]) => {\n if (rowA === rowB) return valA - valB;\n return rowA - rowB;\n }).map(([,val]) => val);\n });\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/57#issuecomment-3262161616","body":"## 題解\n- 重點是找到 dp 的關鍵核心 d[i] = Math.min(d[i - 1] + cost[i], d[i - 2] + cost[i]);\n- 需注意 cost[i] 為空值的情況\n\n```javascript\n// Time Complexity: O(n)\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} cost\n * @return {number}\n */\nvar minCostClimbingStairs = function(cost) {\n const n = cost.length;\n const d = [];\n\n d[0] = cost[0];\n d[1] = Math.min(d[0] + cost[1], cost[1]);\n\n for (let i = 2; i <= n; i++) {\n const c = cost[i] ?? 0;\n d[i] = Math.min(d[i - 1] + c, d[i - 2] + c);\n }\n\n return d[n];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/58#issuecomment-3263843103","body":"## 解題\n- 一樣需要去辨認 dp 的關係式,d[i] = Math.max(d[i - 1], d[i - 2] + nums[i])\n- 需要特別注意 n 為 1, 2 的 edge case \n\n```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar rob = function(nums) {\n const n = nums.length;\n\n if (n === 1) return nums[0];\n if (n === 2) return Math.max(nums[0], nums[1]);\n\n const d = [];\n\n d[0] = nums[0];\n d[1] = Math.max(nums[0], nums[1]);\n\n for (i = 2; i < n; i++) {\n d[i] = Math.max(d[i - 1], d[i - 2] + nums[i])\n }\n\n return d[n - 1];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/59#issuecomment-3266927805","body":"```javascript\n// Time Complexity: O(n^2), n is nums.length\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar findNumberOfLIS = function(nums) {\n const n = nums.length;\n const dp = Array(n).fill(null).map(() => [1, 1]);\n let longest = 1;\n \n for (let i = 0; i < n; i++) {\n for (let j = i + 1; j < n; j++) {\n if (nums[j] > nums[i]) {\n if (dp[i][0] + 1 > dp[j][0]) {\n dp[j][0] = dp[i][0] + 1;\n dp[j][1] = dp[i][1];\n longest = Math.max(longest, dp[j][0]);\n } else if (dp[i][0] + 1 === dp[j][0]) {\n dp[j][1] += dp[i][1];\n }\n }\n }\n }\n \n return dp.reduce((sum, [length, count]) => {\n return length === longest ? sum + count : sum;\n }, 0);\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3270111521","body":"```javascript\n// Time Complexity: O(n^2)\n// Space Complexity: O(n)\n\n/**\n * @param {string} text1\n * @param {string} text2\n * @return {number}\n */\nvar longestCommonSubsequence = function(text1, text2) {\n const [n, m] = [text1.length, text2.length];\n const dp = Array.from({ length: n + 1 }).map(() => new Array(m + 1).fill(0));\n let res = 0;\n\n for (let i = 1; i <= n; i++) {\n for (let j = 1; j <= m; j++) {\n if (text1.charAt(i - 1) === text2.charAt(j - 1)) {\n dp[i][j] = dp[i - 1][j - 1] + 1;\n res = Math.max(res, dp[i][j]);\n } else {\n dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);\n }\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/61#issuecomment-3273250794","body":"## 題解\n- dp 的遞增式為 `d[i][j] = d[i - 1][j] + d[i][j - 1];`,意思是,dp[i][j] 表示能到達該格子的路線數量,其為 d[i - 1][j] 和 d[i][j - 1] 的總和(從其左或其上格子來)\n- 其中需注意當 i 或 j 為 0,即最上或最左列的格子,其 d[i][j] 值為 1,因為只可能從其上或其左格子而來\n\n```javascript\n// Time Complexity: O(m * n)\n// Space Complexity: O(m * n)\n\n/**\n * @param {number} m\n * @param {number} n\n * @return {number}\n */\nvar uniquePaths = function(m, n) {\n const d = Array.from({ length: m }).map(() => new Array(n).fill(1));\n\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n if (i !== 0 && j !== 0) {\n d[i][j] = d[i - 1][j] + d[i][j - 1];\n }\n }\n }\n\n return d[m - 1][n - 1];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/62#issuecomment-3279921315","body":"```javascript\n// Time Complexity: O(n^2 * k)\n// Space Complexity: O(n^2)\n\n/**\n * @param {number} n\n * @param {number} k\n * @param {number} row\n * @param {number} column\n * @return {number}\n */\nvar knightProbability = function(n, k, row, column) {\n let dp = Array.from({ length: n }, () => new Array(n).fill(0));\n const directions = [[2, 1], [1, 2], [-1, 2], [-2, 1], [-2, -1], [-1, -2], [1, -2], [2, -1]];\n\n dp[row][column] = 1;\n\n for (let step = 0; step < k; step++) {\n let dpTemp = Array.from({ length: n }, () => new Array(n).fill(0));\n\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n for (const [dx, dy] of directions) {\n const [px, py] = [i - dx, j - dy];\n\n if (px >= 0 && px < n && py >= 0 && py < n) {\n dpTemp[i][j] += dp[px][py] * 0.125;\n }\n }\n }\n }\n\n dp = dpTemp;\n }\n\n let sumProp = 0;\n\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n sumProp += dp[i][j];\n }\n }\n\n return sumProp;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/63#issuecomment-3285364984","body":"```javascript\n/**\n * @param {number} maxChoosableInteger\n * @param {number} desiredTotal\n * @return {boolean}\n */\nvar canIWin = function(maxChoosableInteger, desiredTotal) {\n if (maxChoosableInteger >= desiredTotal) {\n return true;\n }\n \n const totalSum = (maxChoosableInteger * (maxChoosableInteger + 1)) / 2;\n if (totalSum < desiredTotal) {\n return false;\n }\n \n const memo = new Map();\n \n const dfs = (used, currentSum) => {\n if (memo.has(used)) {\n return memo.get(used);\n }\n \n for (let i = 1; i <= maxChoosableInteger; i++) {\n const bit = 1 << (i - 1);\n \n if ((used & bit) === 0) {\n if (currentSum + i >= desiredTotal) {\n memo.set(used, true);\n return true;\n }\n \n if (!dfs(used | bit, currentSum + i)) {\n memo.set(used, true);\n return true;\n }\n }\n }\n \n memo.set(used, false);\n return false;\n };\n \n return dfs(0, 0);\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/64#issuecomment-3288487076","body":"```javascript\n// Time Complexity: O(n * k), n is nums.length, k is sum of nums / 2\n// Space Complexity: O(n * k)\n\n/**\n * @param {number[]} nums\n * @return {boolean}\n */\nvar canPartition = function (nums) {\n let sum = nums.reduce((acc, num) => acc + num, 0);\n\n if (sum % 2) return false;\n else sum = sum / 2;\n\n const dp = Array.from(nums).map(() => Array.from({ length: sum + 1 }).fill(false));\n\n for (let i = 0; i < nums.length; i++) {\n dp[i][0] = true;\n }\n\n for (let i = 0; i < dp.length - 1; i++) {\n for (let j = 0; j < dp[0].length; j++) {\n dp[i + 1][j] = j - nums[i] >= 0 ? dp[i][j] || dp[i][j - nums[i]] : dp[i][j];\n }\n }\n\n return dp[nums.length - 1][sum];\n};\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289632643","body":"```javascript\n// Time Complexity: O(n * k), n is nums.length, k is sum of nums\n// Space Complexity: O(k)\n\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar findTargetSumWays = function(nums, target) {\n const total = nums.reduce((sum, num) => sum + num, 0);\n \n if (Math.abs(target) > total || (total + target) % 2 !== 0) {\n return 0;\n }\n \n const sum = (total + target) / 2;\n const dp = new Array(sum + 1).fill(0);\n dp[0] = 1;\n \n for (const num of nums) {\n for (let j = sum; j >= num; j--) {\n dp[j] += dp[j - num];\n }\n }\n \n return dp[sum];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/66#issuecomment-3292845699","body":"```javascript\n/**\n * @param {number[]} coins\n * @param {number} amount\n * @return {number}\n */\nvar coinChange = function(coins, amount) {\n const dp = new Array(amount + 1).fill(Infinity);\n\n dp[0] = 0;\n\n for (i = 1; i <= amount; i += 1) {\n for (const coin of coins) {\n if (i - coin >= 0 && dp[i - coin] !== Infinity) {\n dp[i] = Math.min(dp[i - coin] + 1, dp[i]);\n }\n }\n }\n\n return dp[amount] === Infinity ? -1 : dp[amount];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3297467048","body":"```javascript\n// Time Complexity: O(n * m), n is amount, m is coins.length\n// Space Complexity: O(n)\n\n/**\n * @param {number} amount\n * @param {number[]} coins\n * @return {number}\n */\nvar change = function(amount, coins) {\n const dp = new Array(amount + 1).fill(0);\n dp[0] = 1;\n\n for (const coin of coins) {\n for (let i = coin; i <= amount; i++) {\n dp[i] += dp[i - coin];\n }\n }\n \n return dp[amount];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/68#issuecomment-3303059077","body":"## 題解\n- 先排序,以 g[j] 為主,遍歷符合的 s[i]\n```javascript\n// Time Complexity: O(nlogn + mlogm), n is g.length, m is s.length\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} g\n * @param {number[]} s\n * @return {number}\n */\nvar findContentChildren = function(g, s) {\n g.sort((a, b) => a - b);\n s.sort((a, b) => a - b);\n\n let [i, j] = [0, 0];\n let ans = 0;\n\n while (i < s.length && j < g.length) {\n if (s[i] >= g[j]) {\n ans++;\n j++;\n }\n\n i++;\n }\n\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/69#issuecomment-3307711246","body":"```javascript\n// Time Complexity: O(nlogn)\n// Space Complexity: O(1)\n\n/**\n * @param {number[][]} intervals\n * @return {number}\n */\nfunction eraseOverlapIntervals(intervals) {\n if (intervals.length <= 1) return 0;\n \n intervals.sort((a, b) => a[1] - b[1]);\n \n let count = 0;\n let end = intervals[0][1];\n \n for (let i = 1; i < intervals.length; i++) {\n if (intervals[i][0] < end) {\n count++;\n } else {\n end = intervals[i][1];\n }\n }\n \n return count;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/70#issuecomment-3311687568","body":"```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(1)\n/**\n * @param {number[]} nums\n * @return {boolean}\n */\nvar canJump = function (nums) {\n let max = 0;\n\n for (let i = 0; i < nums.length; i++) {\n if (max < i) return false;\n\n max = Math.max(nums[i] + i, max);\n }\n\n return max >= nums.length - 1;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/71#issuecomment-3314986282","body":"```javascript\n// Time Complexity: O(n^2)\n// Space Complexity: O(n)\n\n/**\n * @param {number} n\n * @return {number}\n */\nconst memories = {};\nvar numTrees = function(n) {\n if (memories[n] !== undefined) return memories[n];\n if (n <= 1) return 1;\n\n let ans = 0;\n\n for (let i = 1; i <= n; i++) {\n ans += numTrees(i - 1) * numTrees(n - i);\n }\n\n memories[n] = ans;\n\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/72#issuecomment-3316043984","body":"```javascript\n// Time Complexity: O(nlogk), n is total number of nodes across all lists, k is number of lists\n// Space Complexity: O(1)\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode[]} lists\n * @return {ListNode}\n */\nvar mergeKLists = function(lists) {\n if (!lists || lists.length === 0) return null;\n \n while (lists.length > 1) {\n let mergedLists = [];\n \n for (let i = 0; i < lists.length; i += 2) {\n let l1 = lists[i];\n let l2 = i + 1 < lists.length ? lists[i + 1] : null;\n mergedLists.push(mergeTwoLists(l1, l2));\n }\n \n lists = mergedLists;\n }\n \n return lists[0];\n};\n\nfunction mergeTwoLists(l1, l2) {\n let dummy = new ListNode(0);\n let current = dummy;\n \n while (l1 && l2) {\n if (l1.val <= l2.val) {\n current.next = l1;\n l1 = l1.next;\n } else {\n current.next = l2;\n l2 = l2.next;\n }\n current = current.next;\n }\n \n current.next = l1 || l2;\n return dummy.next;\n}\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/74#issuecomment-3324003764","body":"```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar singleNumber = function(nums) {\n let bitmask = 0;\n\n for (let n of nums) {\n bitmask ^= n;\n }\n\n bitmask &= -bitmask;\n\n const ans = [0, 0];\n\n for (let n of nums) {\n if ((n & bitmask) === 0) ans[0] ^= n;\n else ans[1] ^= n;\n }\n\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/75#issuecomment-3327535650","body":"```javascript\n// Time Complexity: O(n * 2^n)\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} nums\n * @return {number[][]}\n */\nfunction subsets(nums) {\n const result = [];\n \n function backtrack(start, current) {\n result.push([...current]);\n \n for (let i = start; i < nums.length; i++) {\n current.push(nums[i]);\n backtrack(i + 1, current);\n current.pop();\n }\n }\n \n backtrack(0, []);\n return result;\n}\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/77#issuecomment-3338173897","body":"```javascript\n// Time Complexity\n// - insert: O(k), k is key.length\n// - searchValue: O(k), k is key.length\n// - sum: O(p), p is prefix.length\n\n// Space Complexity: O(n * m), n is the number of unique keys inserted, m is the average length of the keys\n\nclass MapSum {\n constructor() {\n this.root = new TrieNode();\n }\n \n insert(key, val) {\n let temp = this.root;\n \n let oldVal = this.searchValue(key);\n \n for (let i = 0; i < key.length; i++) {\n if (temp.children[key.charCodeAt(i) - 97] == null)\n temp.children[key.charCodeAt(i) - 97] = new TrieNode();\n \n temp = temp.children[key.charCodeAt(i) - 97];\n \n temp.count = temp.count - oldVal + val;\n }\n \n temp.val = val;\n temp.isWord = true;\n }\n\n searchValue(key) {\n let temp = this.root;\n for (let i = 0; i < key.length; i++) {\n if (temp.children[key.charCodeAt(i) - 97] == null)\n return 0;\n \n temp = temp.children[key.charCodeAt(i) - 97];\n }\n \n return temp.isWord ? temp.val : 0;\n }\n\n sum(prefix) {\n let temp = this.root;\n \n for (let i = 0; i < prefix.length; i++) {\n if (temp.children[prefix.charCodeAt(i) - 97] == null)\n return 0;\n \n temp = temp.children[prefix.charCodeAt(i) - 97];\n }\n \n return temp.count;\n }\n}\n\nclass TrieNode {\n constructor() {\n this.count = 0;\n this.children = new Array(26);\n this.isWord = false;\n this.val = 0;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/78#issuecomment-3341802963","body":"```javascript\n// Time Complexity: O(n*m + b*b + n)\n// - Building Trie: O(n*m) where n = number of smalls, m = average length of smalls\n// - Searching: O(b*b) where b = length of big string (worst case: check every position against every possible substring)\n// - Converting result: O(n)\n\n// Space Complexity: O(n*m + n*k)\n// - Trie storage: O(n*m) for storing all small strings\n// - Result storage: O(n*k) where k = average number of matches per small string\n\n\nclass Node {\n constructor() {\n this.children = new Array(26).fill(null);\n this.isWord = false;\n this.id = 0;\n }\n}\n\nclass Solution {\n constructor() {\n this.root = new Node();\n }\n\n multiSearch(big, smalls) {\n const n = smalls.length;\n const res = Array(n).fill().map(() => []);\n \n for (let i = 0; i < smalls.length; i++) {\n this.insert(smalls[i], i);\n }\n\n for (let i = 0; i < big.length; i++) {\n let tmp = this.root;\n\n for (let j = i; j < big.length; j++) {\n if (tmp.children[big.charCodeAt(j) - 97] === null) {\n break;\n }\n\n tmp = tmp.children[big.charCodeAt(j) - 97];\n\n if (tmp.isWord) {\n res[tmp.id].push(i);\n }\n }\n }\n\n const ret = new Array(n);\n\n for (let i = 0; i < n; i++) {\n ret[i] = new Array(res[i].length);\n for (let j = 0; j < ret[i].length; j++) {\n ret[i][j] = res[i][j];\n }\n }\n\n return ret;\n }\n\n insert(word, id) {\n let tmp = this.root;\n\n for (let i = 0; i < word.length; i++) {\n if (tmp.children[word.charCodeAt(i) - 97] === null) {\n tmp.children[word.charCodeAt(i) - 97] = new Node();\n }\n\n tmp = tmp.children[word.charCodeAt(i) - 97];\n }\n\n tmp.isWord = true;\n tmp.id = id;\n }\n}\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wutxuan":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073568207","body":"第一次思路:将num数组转换为int数字A,计算A+K,将A+K结果转换为List类型,但没有观察数据范围,导致int类型溢出,没有通过全部样例\n第二次思路:从后往前,逐位相加K%10,直到遍历完全部数组,再判断K是否还有,通过全部样例\n第三次思路:看完题解后,学习到了可以将k和某一位看作一个整体,不用每次计算k%10,而是k+num[i]","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3078154786","body":"第一次思路:遍历每个字符,在每个字符上向左向右移动,直到找到字符c,继续遍历下一个字符,但想到时间复杂度一定很高,因此继续想其他方法\n\n第二次思路:先遍历字符串,用List先记录每个字符c的索引。然后遍历字符串每个字符,计算这个字符的位置距离List中位置的最小距离,通过全部用例,时间复杂度O(N*K) N为字符串长度,K为c在字符串中出现的次数\n\n```java\nclass Solution {\n public int[] shortestToChar(String s, char c) {\n List indexList = new ArrayList<>();\n for(int i = 0;i < s.length();i++){\n if(s.charAt(i) == c){\n indexList.add(i);\n }\n }\n\n int[] res = new int[s.length()];\n Arrays.fill(res,10001);\n for(int i = 0;i < res.length;i++){\n for(int index : indexList){\n res[i] = Math.min(res[i],Math.abs(i - index));\n }\n \n }\n return res;\n }\n}\n\n```\n第三次思路:看完题解后,学习到了两次遍历求解,从左到右记录每个字符左侧最近的字符c的距离,记为left数组,从右到左记录每个字符右侧最近的字符c的距离,记为right数组。再遍历一遍整个字符串,在left数组和right数组中取最小值为最终结果。在代码实现时,省去了记录right数组再比较,而是直接比较。时间复杂度O(N)\n```java\nclass Solution {\n public int[] shortestToChar(String s, char c) {\n int index = -s.length();\n int[] left = new int[s.length()];\n for(int i = 0;i < s.length();i++){\n if(s.charAt(i) == c){\n index = i;\n }\n left[i] = i - index;\n }\n\n index = 2 * s.length();\n for(int i = s.length() - 1;i >= 0;i--){\n if(s.charAt(i) == c){\n index = i;\n }\n left[i] = Math.min(left[i],index - i);\n }\n return left;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3083567541","body":"因为要设计的栈有最大长度,因此使用数组来模拟栈。否则使用栈或List来模拟。\n使用数组模拟:使用一个指针变量,指向当前栈顶。入栈时,val存入栈顶处,指针++,出栈时,指针- -,返回栈顶元素。实现inc函数时,只需要对数组中0-k位置的数每个+val即可。通过全部样例\n```java\nclass CustomStack {\n int size = 0; // 指向第一个空位置\n int[] arr;\n\n public CustomStack(int maxSize) {\n arr = new int[maxSize];\n }\n \n public void push(int x) {\n if(size < arr.length){\n arr[size] = x;\n size++;\n }\n }\n \n public int pop() {\n if(size > 0){\n size--;\n return arr[size];\n }else{\n return -1;\n }\n }\n \n public void increment(int k, int val) {\n int cut = Math.min(k,size);\n\n for(int i = 0;i < cut;i++){\n arr[i] += val;\n }\n }\n}\n```\n\n看完题解后学会了前缀和方法:- 因为每次的increment函数都会对栈底[0,k]的数据val操作,而是否val操作了只有在pop时才会体现。所以我们可以通过一个数组incremental记录每个val,即第i位置下面的元素都要加incremental[i]。在pop第i个数的时候加上它需要加的所有val,即incremental[i]。 所以increment函数只需要维护incremental数组。但要记得记得pop后,incremental函数用过的地方要清零,并且得累加到前面一位\n\n```java\nclass CustomStack {\n\n Stack stack;\n int[] incremental;\n\n public CustomStack(int maxSize) {\n stack = new Stack();\n incremental = new int[maxSize];\n }\n \n public void push(int x) {\n if(stack.size() < incremental.length){\n stack.push(x);\n }\n }\n \n public int pop() {\n int cut = stack.size() - 1;\n if(cut < 0) return -1;\n\n int res = stack.pop() + incremental[cut];\n\n if(cut > 0){\n incremental[cut-1] += incremental[cut]; \n }\n incremental[cut] = 0;\n return res;\n\n }\n \n public void increment(int k, int val) {\n int cut = Math.min(k,stack.size())-1;\n if(cut >= 0){\n incremental[cut] += val;\n }\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3089071815","body":"看到有括号,需要对括号匹配,则优先想到栈。遍历字符串,当遇到非】字符时,全部入栈。当遇到】字符时,开始向回看,取出字符c,构成字符串s。再向回看,取出数字x,重复x次字符串s得到字符串ss,再将ss入栈,继续遍历,直到遍历结束。\n \n最后得到的栈,就是存储了最终解码后的字符串。取出栈后记得反转字符串\n```java\nclass Solution {\n public String decodeString(String s) {\n Stack stack = new Stack<>();\n for(int i = 0;i < s.length();i++){\n if(s.charAt(i) == ']'){\n StringBuilder sb = new StringBuilder();\n StringBuilder count = new StringBuilder();\n\n while(!stack.isEmpty() && stack.peek() != '['){\n sb.append(stack.pop());\n } \n sb.reverse();\n stack.pop();\n while(!stack.isEmpty() && stack.peek() >= '0' && stack.peek() <= '9'){\n count.append(stack.pop());\n }\n count.reverse();\n int t = Integer.valueOf(count.toString());\n StringBuilder res = new StringBuilder();\n res.repeat(sb,t);\n\n for(char c : res.toString().toCharArray()){\n stack.push(c);\n }\n \n }else{\n stack.push(s.charAt(i));\n }\n }\n StringBuilder re = new StringBuilder();\n while(!stack.isEmpty()){\n re.append(stack.pop());\n }\n re.reverse();\n return re.toString();\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3095194789","body":"- push操作:输入栈入栈\n- pop操作:如果输出栈不为空,则直接输出输出栈的元素。如果输出栈为空,则把输入栈的数据全部导入到输出栈中\n- peek操作:如果输出栈不为空,则直接peek输出栈的元素。如果输出栈为空,则把输入栈的数据全部导出到输入栈中\n```java\nclass MyQueue {\n Stack stackIn;\n Stack stackOut;\n\n public MyQueue() {\n stackIn = new Stack<>();\n stackOut = new Stack<>();\n }\n \n public void push(int x) {\n stackIn.push(x);\n }\n \n public int pop() {\n refresh();\n return stackOut.pop();\n }\n \n public int peek() {\n refresh();\n return stackOut.peek();\n }\n \n public boolean empty() {\n return stackIn.isEmpty() && stackOut.isEmpty();\n }\n\n public void refresh(){\n if(!stackOut.isEmpty()){\n return;\n }\n while(!stackIn.isEmpty()){\n stackOut.push(stackIn.pop());\n }\n }\n}\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094513644","body":"想象成将原始数组和排序后的数组并列排在一起,切一刀。如果这刀的左侧两个数组的数字出现的频次相同,那么右侧的频次也一定相同。这里就是一个分割点。\n继续向右,有同样情况就切一刀。直到走到最后,一定会切最后一刀。记录的每一个分割点,就是分的组数。\n```java\nclass Solution {\n public int maxChunksToSorted(int[] arr) {\n Map map = new HashMap<>();\n int[] sortedArr = new int[arr.length];\n for(int i = 0;i < arr.length;i++){\n sortedArr[i] = arr[i];\n }\n Arrays.sort(sortedArr);\n\n int res = 0;\n for(int i = 0;i < arr.length;i++){\n map.put(arr[i],map.getOrDefault(arr[i],0) + 1);\n if(map.get(arr[i]) == 0){\n map.remove(arr[i]);\n }\n map.put(sortedArr[i],map.getOrDefault(sortedArr[i],0) - 1);\n if(map.get(sortedArr[i]) == 0){\n map.remove(sortedArr[i]);\n }\n if(map.isEmpty()){\n res++;\n }\n }\n return res;\n }\n}\n```\n因为存在sort排序,时间复杂度O(NlogN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095217604","body":"先将链表连成一个环,再找到需要断开的位置断开即可\n```java\nclass Solution {\n public ListNode rotateRight(ListNode head, int k) {\n if(head == null) return null;\n ListNode dummy = head;\n int count = 1;\n while(dummy.next != null){\n count++;\n dummy = dummy.next;\n }\n dummy.next = head;\n\n k = k % count;\n dummy = head;\n count = count - k;\n for(int i = 1;i < count;i++){\n dummy = dummy.next;\n }\n ListNode res = dummy.next;\n dummy.next = null;\n return res;\n }\n}\n```\n\n因为遍历了链表,时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100949135","body":"因为要交换两个节点,所以需要记录两个节点+两个节点前的节点+两个节点后的节点,一共四个节点。分别用cur,one,two,three记录\n交换完后,cur指向下一组需要交换节点的前一个节点\n```java\nclass Solution {\n public ListNode swapPairs(ListNode head) {\n ListNode dummy = new ListNode(0);\n dummy.next = head;\n ListNode cur = dummy;\n ListNode one = null;\n ListNode two = null;\n ListNode three = null;\n while(cur.next != null && cur.next.next != null)\n {\n one = cur.next;\n two = cur.next.next;\n three = cur.next.next.next;\n cur.next = two;\n cur.next.next = one;\n cur.next.next.next = three;\n cur = cur.next.next;\n }\n return dummy.next;\n }\n}\n```\n遍历了链表,时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3105789931","body":"考验的是二分查找和分治构建二叉树,中间大小的数构成root根节点,左侧的数组部分分治构成左节点,右侧的数组部分分治构成右节点。这里用的是链表,只需要额外增加一些链表的操作(getMid函数)。也可以将链表转化为数组,再构造,查找起来就很快。以空间换时间\n```java\nclass Solution {\n public TreeNode sortedListToBST(ListNode head) {\n ListNode dummy = head;\n int end = 0;\n while(head != null){\n end++;\n head = head.next;\n }\n\n return dfs(dummy,0,end);\n }\n\n public TreeNode dfs(ListNode head,int start,int end){\n if(start >= end) return null;\n int mid = start + (end - start) / 2;\n ListNode midNode = getMid(head,mid);\n TreeNode node = new TreeNode(midNode.val);\n node.left = dfs(head,start,mid);\n node.right = dfs(head,mid+1,end);\n\n return node;\n }\n \n public ListNode getMid(ListNode head,int mid){\n while(mid > 0){\n mid--;\n head = head.next;\n }\n return head;\n }\n}\n```\n时间复杂度O(NlogN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3111943009","body":"两个指针从head出发同时往前移动,当某一个指针指向null的时候,使其指向另一个head。直至两个指针相遇,该节点为相遇节点。直到相遇,第一个指针走了A+C+B的路程,另一个指针走了B+C+A的路程\n```java\npublic class Solution {\n public ListNode getIntersectionNode(ListNode headA, ListNode headB) {\n ListNode A = headA;\n ListNode B = headB;\n while(A != B)\n {\n if(A == null) A = headB;\n else A = A.next;\n if(B == null) B = headA;\n else B = B.next;\n }\n return A;\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3116973002","body":"- 判断是否有环:两个快慢指针分别从头节点出发,慢指针一次走一格,快指针一次走两个,如果有环,则二者一定会在环内相遇,如果没环,则快指针会先到达null处。可以类比于跑步,跑得快的会套跑的慢的一圈\n- 判断环入口:快指针和慢指针相遇的时候,慢指针走了x+y步,快指针走了x+y+n*(y+z)步骤,n为圈数,大于等于1,如图所示,图片节选自代码随想录。因为快指针是慢指针的两倍速,所以2x+2y=x+y+n*(y+z)。化简后发现当n=1时,x=z,当n大于1时,x=z+(n-1)(y+z)。也就是说,头节点到环入口的距离等于z或z+多圈。因此,用两个指针,一个从头节点出发,一个从相遇节点出发,最终一定会相遇在环入口,无论第二个指针在环里绕了多少圈\n```java\npublic class Solution {\n public ListNode detectCycle(ListNode head) {\n ListNode fast = head;\n ListNode slow = head;\n while(fast != null && fast.next != null)\n {\n slow = slow.next;\n fast = fast.next.next;\n if(slow == fast){\n ListNode index1 = head;\n ListNode index2 = slow;\n while(index1 != index2)\n {\n index1 = index1.next;\n index2 = index2.next;\n }\n return index1;\n }\n }\n return null;\n }\n}\n```\n时间复杂度O(N) 空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3121046113","body":"Java可以使用LinkedHashMap实现LRU,内置的函数就可以实现按插入顺序排列的hashmap,手动实现LinkedHashMap代码如下:\n```java\npublic class LRUCache {\n class DLinkedNode {\n int key;\n int value;\n DLinkedNode prev;\n DLinkedNode next;\n public DLinkedNode() {}\n public DLinkedNode(int _key, int _value) {key = _key; value = _value;}\n }\n\n private Map cache = new HashMap();\n private int size;\n private int capacity;\n private DLinkedNode head, tail;\n\n public LRUCache(int capacity) {\n this.size = 0;\n this.capacity = capacity;\n head = new DLinkedNode();\n tail = new DLinkedNode();\n head.next = tail;\n tail.prev = head;\n }\n\n public int get(int key) {\n DLinkedNode node = cache.get(key);\n if (node == null) {\n return -1;\n }\n moveToHead(node);\n return node.value;\n }\n\n public void put(int key, int value) {\n DLinkedNode node = cache.get(key);\n if (node == null) {\n DLinkedNode newNode = new DLinkedNode(key, value);\n cache.put(key, newNode);\n addToHead(newNode);\n ++size;\n if (size > capacity) {\n DLinkedNode tail = removeTail();\n cache.remove(tail.key);\n --size;\n }\n }\n else {\n node.value = value;\n moveToHead(node);\n }\n }\n\n private void addToHead(DLinkedNode node) {\n node.prev = head;\n node.next = head.next;\n head.next.prev = node;\n head.next = node;\n }\n\n private void removeNode(DLinkedNode node) {\n node.prev.next = node.next;\n node.next.prev = node.prev;\n }\n\n private void moveToHead(DLinkedNode node) {\n removeNode(node);\n addToHead(node);\n }\n\n private DLinkedNode removeTail() {\n DLinkedNode res = tail.prev;\n removeNode(res);\n return res;\n }\n}\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3123845190","body":"递归,每一层返回max(左子树深度,右子树深度)+1\n```java\nclass Solution {\n public int maxDepth(TreeNode root) {\n if (root == null) {\n return 0;\n }\n int leftDepth = maxDepth(root.left);\n int rightDepth = maxDepth(root.right);\n return Math.max(leftDepth, rightDepth) + 1;\n }\n}\n```\n层序遍历,使用队列。每遍历一层,深度+1,直到遍历到最下面一层\n\n```java\nclass Solution {\n public int maxDepth(TreeNode root) {\n if(root == null) return 0;\n Queue queue = new LinkedList<>();\n queue.add(root);\n int depth = 0;\n while(!queue.isEmpty())\n {\n int size = queue.size();\n for(int i = 0;i < size;i++){\n TreeNode node = queue.poll();\n if(node.left != null) queue.add(node.left);\n if(node.right != null) queue.add(node.right);\n }\n depth++;\n }\n\n return depth;\n }\n}\n```\n时间复杂度O(N) N为二叉树节点个数","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125223416","body":"先判断当前两个节点是否相同,如果不同,直接返回false。如果相同无法得出最终结论,需要递归进入下一层继续判断子树\n```java\nclass Solution {\n public boolean isSameTree(TreeNode p, TreeNode q) {\n if(p == null && q != null) return false;\n if(p != null && q == null) return false;\n if(p == null && q == null) return true;\n if(p.val != q.val) return false;\n\n boolean l = isSameTree(p.left,q.left);\n boolean r = isSameTree(p.right,q.right);\n\n return l && r;\n }\n}\n```\n时间复杂度O(N) N为树的节点数量","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3130457949","body":"回溯维护一个List,当递归到叶子节点时,List中保存的数字就是一路从root到当前根节点的所有数字。使用StringBbuilder拼接所有数字,即是当前路径表示的数字\n\n```java\nclass Solution {\n List path = new ArrayList<>();\n int res = 0;\n public int sumNumbers(TreeNode root) {\n path.add(root.val);\n recursion(root);\n return res;\n }\n\n public void recursion(TreeNode root){\n if(root.left == null && root.right == null){\n StringBuilder sb = new StringBuilder();\n for(int num : path){\n sb.append(num);\n }\n res += Integer.parseInt(sb.toString());\n return;\n }\n\n if(root.left != null){\n path.add(root.left.val);\n recursion(root.left);\n path.remove(path.size() - 1);\n }\n\n if(root.right != null){\n path.add(root.right.val);\n recursion(root.right);\n path.remove(path.size() - 1);\n }\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3134853681","body":"层序遍历,记录每一层的最左侧的值,不断覆盖变量,最终记录的是最深一层的最左侧的值\n```java\nclass Solution {\n public int findBottomLeftValue(TreeNode root) {\n Queue queue = new LinkedList<>();\n queue.add(root);\n int res = 0;\n while(!queue.isEmpty())\n {\n int size = queue.size();\n for(int i = 0;i < size;i++){\n TreeNode node = queue.poll();\n if(i == 0){\n res = node.val;\n }\n if(node.left != null) queue.add(node.left);\n if(node.right != null) queue.add(node.right);\n }\n }\n\n return res;\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3138992061","body":"序列化时:前序遍历记录每个节点用逗号分开,空节点记为#\n反序列化:将序列化结果以逗号分开,存储进队列,用队列递归构造树\n```java\npublic class Codec {\n StringBuilder sb = new StringBuilder();\n int count = 1;\n\n public String serialize(TreeNode root) {\n if(root == null){\n sb.append(\"#\").append(\",\");\n return sb.toString();\n }\n\n sb.append(root.val).append(\",\");\n serialize(root.left);\n serialize(root.right);\n return sb.toString();\n }\n\n public TreeNode deserialize(String data) {\n Queue queue = new LinkedList<>();\n String[] pre = data.split(\",\");\n for(String s : pre){\n queue.offer(s);\n }\n return build(queue);\n }\n\n public TreeNode build(Queue queue){\n if(queue.isEmpty()) return null;\n String rootStringVal = queue.poll();\n if(rootStringVal.equals(\"#\")) return null;\n int rootVal = Integer.parseInt(rootStringVal);\n \n TreeNode root = new TreeNode(rootVal);\n root.left = build(queue);\n root.right = build(queue);\n\n return root;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3142198278","body":"遍历二叉树,记录一个三元组,分别表示列、行和节点的值。再按照要求进行排序,列升序,行升序,值升序。最后按规则放入List\n```java\nclass Solution {\n public List> verticalTraversal(TreeNode root) {\n List nodes = new ArrayList();\n dfs(root, 0, 0, nodes);\n Collections.sort(nodes, new Comparator() {\n public int compare(int[] tuple1, int[] tuple2) {\n if (tuple1[0] != tuple2[0]) {\n return tuple1[0] - tuple2[0];\n } else if (tuple1[1] != tuple2[1]) {\n return tuple1[1] - tuple2[1];\n } else {\n return tuple1[2] - tuple2[2];\n }\n }\n });\n List> ans = new ArrayList>();\n int size = 0;\n int lastcol = Integer.MIN_VALUE;\n for (int[] tuple : nodes) {\n int col = tuple[0], row = tuple[1], value = tuple[2];\n if (col != lastcol) {\n lastcol = col;\n ans.add(new ArrayList());\n size++;\n }\n ans.get(size - 1).add(value);\n }\n return ans;\n }\n\n public void dfs(TreeNode node, int row, int col, List nodes) {\n if (node == null) {\n return;\n }\n nodes.add(new int[]{col, row, node.val});\n dfs(node.left, row + 1, col - 1, nodes);\n dfs(node.right, row + 1, col + 1, nodes);\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146508830","body":"先将数组中所有值和其对应索引存入hashmap,再遍历一遍数组,如果遍历到的num对应的target-num在map中,即是找到的两个索引。注意要避免一个数算两次\n```java\nclass Solution {\n public int[] twoSum(int[] nums, int target) {\n Map map = new HashMap<>();\n for(int i = 0;i < nums.length;i++){\n map.put(nums[i],i);\n }\n\n for(int i = 0;i < nums.length;i++){\n if(map.containsKey(target - nums[i]) && map.get(target - nums[i]) != i){\n int[] res = new int[2];\n res[0] = i;\n res[1] = map.get(target - nums[i]);\n return res;\n }\n }\n return null;\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148286271","body":"遍历数组,先用hashmap记录每个数字出现的次数。用优先队列定义好排序规则,将map中的内容放入优先队列中,再按照要求从队列中取\n```java\nclass Solution {\n public int[] topKFrequent(int[] nums, int k) {\n Map map = new HashMap<>();\n for(int num : nums){\n map.put(num,map.getOrDefault(num,0)+1);\n }\n PriorityQueue p = new PriorityQueue<>((a,b) -> (b[1]-a[1]));\n for(Map.Entry m : map.entrySet()){\n p.add(new int[]{m.getKey(),m.getValue()});\n }\n int[] result = new int[k];\n for(int i = 0;i < k;i++){\n result[i] = p.poll()[0];\n }\n return result;\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3149131512","body":"二层遍历,第一层遍历i,第二层遍历,使用map记录每个元组与第一层的i的距离dis出现的次数time。最终由i组成的回旋镖数量为time*(time-1)\n```java\nclass Solution {\n public int numberOfBoomerangs(int[][] points) {\n int res = 0;\n for(int[] a : points){\n Map map = new HashMap<>();\n for(int[] b : points){\n int dis = (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]);\n map.put(dis,map.getOrDefault(dis,0) + 1);\n }\n for(int key : map.keySet()){\n int val = map.get(key);\n res += val * (val - 1);\n }\n }\n return res;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3153104469","body":"滑动窗口,定义left指针和right指针,两个指针窗口内即是符合题目要求的子串。不断向右移right指针,如果窗口内的子串不符合题目要求了,就右移left指针缩小窗口直到符合题目要求。\n在遍历过程中,记录窗口长度最大值\n使用hashSet判断窗口内是否符合题目要求\n```java\nclass Solution {\n public int lengthOfLongestSubstring(String s) {\n Set set = new HashSet<>();\n int left = 0;\n int res = 0;\n for(int right = 0;right < s.length();right++){\n char c = s.charAt(right);\n while(set.contains(c)){\n set.remove(s.charAt(left));\n left++;\n }\n\n set.add(c);\n res = Math.max(res,right - left + 1); \n }\n return res;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3157250607","body":"滑动窗口\n```java\nclass Solution {\n public List findSubstring(String s, String[] words) {\n int wordLen = words[0].length(); \n int windowLen = wordLen * words.length; \n\n Map targetCnt = new HashMap<>();\n for (String w : words) {\n targetCnt.put(w,targetCnt.getOrDefault(w,0) + 1);\n }\n\n List ans = new ArrayList<>();\n for (int start = 0; start < wordLen; start++) {\n Map cnt = new HashMap<>();\n int overload = 0;\n for (int right = start + wordLen; right <= s.length(); right += wordLen) {\n String inWord = s.substring(right - wordLen, right);\n if (cnt.getOrDefault(inWord, 0).equals(targetCnt.getOrDefault(inWord, 0))) {\n overload++;\n }\n cnt.merge(inWord, 1, Integer::sum); \n\n int left = right - windowLen;\n if (left < 0) { \n continue;\n }\n if (overload == 0) {\n ans.add(left);\n }\n\n String outWord = s.substring(left, left + wordLen);\n cnt.merge(outWord, -1, Integer::sum); \n if (cnt.get(outWord).equals(targetCnt.getOrDefault(outWord, 0))) {\n overload--;\n }\n }\n }\n\n return ans;\n }\n}\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3162563860","body":"前缀和\n```java\nclass Solution {\n public int minSubarray(int[] nums, int p) {\n int n = nums.length;\n int[] s = new int[n + 1];\n for (int i = 0; i < n; i++) {\n s[i + 1] = (s[i] + nums[i]) % p;\n }\n int x = s[n];\n if (x == 0) {\n return 0; \n }\n\n int ans = n;\n Map last = new HashMap<>();\n for (int i = 0; i <= n; i++) {\n last.put(s[i], i);\n int j = last.getOrDefault((s[i] - x + p) % p, -n);\n ans = Math.min(ans, i - j);\n }\n return ans < n ? ans : -1;\n }\n}\n\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3170443755","body":"双指针,慢指针用于存数字,快指针用于检验数字是否重复\n```java\nclass Solution {\n public int removeDuplicates(int[] nums) {\n if(nums.length == 1) return 1;\n int slow = 0;\n for(int fast = 1;fasttarget){\n right = middle;\n }else if(nums[middle] queue;\n public MyQueue(){\n queue = new LinkedList<>();\n } \n\n public void add(int val){\n while(!queue.isEmpty() && val > queue.getLast()){\n queue.removeLast();\n }\n queue.add(val);\n }\n\n public void poll(int val){\n if(queue.peek() == val){\n queue.poll();\n }\n }\n\n public int max(){\n return queue.peek();\n }\n}\n```\n时间复杂度O(nlogn)\n优先队列插入的复杂度是logn","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3177951924","body":"两个数组计算每个人的入度和出度\n```java\nclass Solution {\n public int findJudge(int n, int[][] trust) {\n int[] inDegrees = new int[n + 1];\n int[] outDegrees = new int[n + 1];\n for (int[] edge : trust) {\n int x = edge[0], y = edge[1];\n ++inDegrees[y];\n ++outDegrees[x];\n }\n for (int i = 1; i <= n; ++i) {\n if (inDegrees[i] == n - 1 && outDegrees[i] == 0) {\n return i;\n }\n }\n return -1;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182597716","body":"染色法,如果染色过程冲突,则无法实现、返回false\n```java\nclass Solution {\n boolean[] visited;\n boolean[] color;\n boolean flag = false;\n public boolean possibleBipartition(int n, int[][] dislikes) {\n List[] graph = build(dislikes,n);\n visited = new boolean[graph.length];\n color = new boolean[graph.length];\n for(int i = 1;i < graph.length;i++){\n if(visited[i] == false){\n traverse(graph,i);\n }\n }\n return !flag;\n }\n\n public List[] build(int[][] dislikes,int n){\n List[] graph = new List[n + 1];\n for(int i = 0;i < n + 1;i++){\n graph[i] = new LinkedList<>();\n }\n\n for(int[] edge : dislikes){\n int x = edge[0];\n int y = edge[1];\n graph[x].add(y);\n graph[y].add(x);\n }\n return graph;\n }\n\n public void traverse(List[] graph,int s){\n if(flag) return;\n visited[s] = true;\n for(int x : graph[s]){\n if(visited[x] == false){\n color[x] = !color[s];\n traverse(graph,x);\n }else{\n if(color[x] == color[s]) flag = true;\n }\n }\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3186848399","body":"拓扑排序\n```java\nclass Solution {\n public int[] sortItems(int n, int m, int[] group, List> beforeItems) {\n List> groupItem = new ArrayList>();\n for (int i = 0; i < n + m; ++i) {\n groupItem.add(new ArrayList());\n }\n\n // 组间和组内依赖图\n List> groupGraph = new ArrayList>();\n for (int i = 0; i < n + m; ++i) {\n groupGraph.add(new ArrayList());\n }\n List> itemGraph = new ArrayList>();\n for (int i = 0; i < n; ++i) {\n itemGraph.add(new ArrayList());\n }\n\n // 组间和组内入度数组\n int[] groupDegree = new int[n + m];\n int[] itemDegree = new int[n];\n \n List id = new ArrayList();\n for (int i = 0; i < n + m; ++i) {\n id.add(i);\n }\n\n int leftId = m;\n // 给未分配的 item 分配一个 groupId\n for (int i = 0; i < n; ++i) {\n if (group[i] == -1) {\n group[i] = leftId;\n leftId += 1;\n }\n groupItem.get(group[i]).add(i);\n }\n // 依赖关系建图\n for (int i = 0; i < n; ++i) {\n int curGroupId = group[i];\n for (int item : beforeItems.get(i)) {\n int beforeGroupId = group[item];\n if (beforeGroupId == curGroupId) {\n itemDegree[i] += 1;\n itemGraph.get(item).add(i); \n } else {\n groupDegree[curGroupId] += 1;\n groupGraph.get(beforeGroupId).add(curGroupId);\n }\n }\n }\n\n // 组间拓扑关系排序\n List groupTopSort = topSort(groupDegree, groupGraph, id); \n if (groupTopSort.size() == 0) {\n return new int[0];\n }\n int[] ans = new int[n];\n int index = 0;\n // 组内拓扑关系排序\n for (int curGroupId : groupTopSort) {\n int size = groupItem.get(curGroupId).size();\n if (size == 0) {\n continue;\n }\n List res = topSort(itemDegree, itemGraph, groupItem.get(curGroupId));\n if (res.size() == 0) {\n return new int[0];\n }\n for (int item : res) {\n ans[index++] = item;\n }\n }\n return ans;\n }\n\n public List topSort(int[] deg, List> graph, List items) {\n Queue queue = new LinkedList();\n for (int item : items) {\n if (deg[item] == 0) {\n queue.offer(item);\n }\n }\n List res = new ArrayList();\n while (!queue.isEmpty()) {\n int u = queue.poll(); \n res.add(u);\n for (int v : graph.get(u)) {\n if (--deg[v] == 0) {\n queue.offer(v);\n }\n }\n }\n return res.size() == items.size() ? res : new ArrayList();\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3190861492","body":"模拟机器人移动\n```java\nclass Solution {\n public boolean judgeCircle(String moves) {\n int x = 0, y = 0;\n int length = moves.length();\n for (int i = 0; i < length; i++) {\n char move = moves.charAt(i);\n if (move == 'U') {\n y--;\n } else if (move == 'D') {\n y++;\n } else if (move == 'L') {\n x--;\n } else if (move == 'R') {\n x++;\n }\n }\n return x == 0 && y == 0;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193745750","body":"模拟\n```java\nclass Solution {\n public int[] getOrder(int[][] ts) {\n int n = ts.length;\n // 将 ts 转存成 nts,保留任务编号\n int[][] nts = new int[n][3];\n for (int i = 0; i < n; i++) nts[i] = new int[]{ts[i][0], ts[i][1], i};\n // 根据任务入队时间进行排序\n Arrays.sort(nts, (a,b)->a[0]-b[0]);\n // 根据题意,先按照「持续时间」排序,再根据「任务编号」排序\n PriorityQueue q = new PriorityQueue<>((a,b)->{\n if (a[1] != b[1]) return a[1] - b[1];\n return a[2] - b[2];\n });\n int[] ans = new int[n];\n for (int time = 1, j = 0, idx = 0; idx < n; ) {\n \t// 如果当前任务可以添加到「队列」中(满足入队时间)则进行入队\n while (j < n && nts[j][0] <= time) q.add(nts[j++]);\n if (q.isEmpty()) {\n\t // 如果当前「队列」没有任务,直接跳到下个任务的入队时间\n time = nts[j][0];\n } else {\n \t// 如果有可执行任务的话,根据优先级将任务出队(记录下标),并跳到该任务完成时间点\n int[] cur = q.poll();\n ans[idx++] = cur[2];\n time += cur[1];\n }\n }\n return ans;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194379645","body":"转化为分钟\n```java\nclass Solution {\n public int numberOfRounds(String loginTime, String logoutTime) {\n int loginHour = Integer.parseInt(loginTime.substring(0, 2));\n int loginMinute = Integer.parseInt(loginTime.substring(3));\n int logoutHour = Integer.parseInt(logoutTime.substring(0, 2));\n int logoutMinute = Integer.parseInt(logoutTime.substring(3));\n int loginTotalMinute = loginHour * 60 + loginMinute;\n int logoutTotalMinute = logoutHour * 60 + logoutMinute;\n if (loginTotalMinute > logoutTotalMinute) {\n logoutTotalMinute += 1440;\n }\n if (loginTotalMinute % 15 != 0) {\n loginTotalMinute += 15 - loginTotalMinute % 15;\n }\n logoutTotalMinute -= logoutTotalMinute % 15;\n return Math.max((logoutTotalMinute - loginTotalMinute) / 15, 0);\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3195332635","body":"分别模拟三个情况\n```java\nclass Solution {\n public int minCharacters(String a, String b) {\n int n = a.length(), m = b.length(), ans = 0x3f3f3f3f;\n int[] c1 = new int[26], c2 = new int[26];\n for (char c : a.toCharArray()) c1[c - 'a']++;\n for (char c : b.toCharArray()) c2[c - 'a']++;\n for (int i = 0; i < 26 && ans != 0; i++) {\n // 3\n int ca = n - c1[i], cb = m - c2[i];\n ans = Math.min(ans, ca + cb);\n if (i == 0) continue;\n int r1 = 0, r2 = 0;\n // 1\n for (int j = i; j < 26; j++) r1 += c1[j];\n for (int j = 0; j < i; j++) r1 += c2[j];\n // 2\n for (int j = i; j < 26; j++) r2 += c2[j];\n for (int j = 0; j < i; j++) r2 += c1[j];\n ans = Math.min(ans, Math.min(r1, r2));\n }\n return ans;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3199298563","body":"归并排序\n\n```java\nclass Solution {\n public int[] sortArray(int[] nums) {\n sort(nums,0,nums.length - 1);\n return nums;\n }\n\n public void sort(int[] nums,int start,int end){\n if(start >= end) return;\n int p = para(nums,start,end);\n\n sort(nums,start,p - 1);\n sort(nums,p + 1,end);\n }\n\n public int para(int[] nums,int l,int h){\n\n int x = nums[l];\n int i = l,j = h;\n while(i < j)\n {\n while(i < j && nums[j] >= x) j--;\n if(i < j) nums[i++] = nums[j];\n\n while(i < j && nums[i] < x) i++;\n if(i < j) nums[j--] = nums[i];\n }\n\n nums[i] = x;\n return i;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204106258","body":"二分查找\n```java\nclass Solution {\n public int mySqrt(int x) {\n if(x == 0) return 0;\n if(x == 1) return 1;\n int left = 0;\n int right = x;\n while(left < right)\n {\n int middle = left + (right - left) / 2;\n if(middle > x / middle){\n right = middle;\n }else if(middle < x / middle){\n left = middle + 1;\n }else{\n return middle;\n }\n }\n if(right == x / right){\n return right;\n }else{\n return right - 1;\n }\n\n \n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3208985528","body":"二分查找\n```java\npublic class Solution extends VersionControl {\n public int firstBadVersion(int n) {\n int left = 1, right = n;\n while (left < right) { \n int mid = left + (right - left) / 2; \n if (isBadVersion(mid)) {\n right = mid; \n } else {\n left = mid + 1; \n }\n }\n return left;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/42#issuecomment-3213255556","body":"```java\nclass Solution {\n public int reversePairs(int[] nums) {\n if (nums.length == 0) {\n return 0;\n }\n return reversePairsRecursive(nums, 0, nums.length - 1);\n }\n\n public int reversePairsRecursive(int[] nums, int left, int right) {\n if (left == right) {\n return 0;\n } else {\n int mid = (left + right) / 2;\n int n1 = reversePairsRecursive(nums, left, mid);\n int n2 = reversePairsRecursive(nums, mid + 1, right);\n int ret = n1 + n2;\n\n // 首先统计下标对的数量\n int i = left;\n int j = mid + 1;\n while (i <= mid) {\n while (j <= right && (long) nums[i] > 2 * (long) nums[j]) {\n j++;\n }\n ret += j - mid - 1;\n i++;\n }\n\n // 随后合并两个排序数组\n int[] sorted = new int[right - left + 1];\n int p1 = left, p2 = mid + 1;\n int p = 0;\n while (p1 <= mid || p2 <= right) {\n if (p1 > mid) {\n sorted[p++] = nums[p2++];\n } else if (p2 > right) {\n sorted[p++] = nums[p1++];\n } else {\n if (nums[p1] < nums[p2]) {\n sorted[p++] = nums[p1++];\n } else {\n sorted[p++] = nums[p2++];\n }\n }\n }\n for (int k = 0; k < sorted.length; k++) {\n nums[left + k] = sorted[k];\n }\n return ret;\n }\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3216192351","body":"```java\nclass Solution {\n public int findRadius(int[] houses, int[] heaters) {\n int ans = 0;\n Arrays.sort(heaters);\n for (int house : houses) {\n int i = binarySearch(heaters, house);\n int j = i + 1;\n int leftDistance = i < 0 ? Integer.MAX_VALUE : house - heaters[i];\n int rightDistance = j >= heaters.length ? Integer.MAX_VALUE : heaters[j] - house;\n int curDistance = Math.min(leftDistance, rightDistance);\n ans = Math.max(ans, curDistance);\n }\n return ans;\n }\n\n public int binarySearch(int[] nums, int target) {\n int left = 0, right = nums.length - 1;\n if (nums[left] > target) {\n return -1;\n }\n while (left < right) {\n int mid = (right - left + 1) / 2 + left;\n if (nums[mid] > target) {\n right = mid - 1;\n } else {\n left = mid;\n }\n }\n return left;\n }\n}\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"falsity":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073705405","body":"# 思路\n\n从低位往高位计算, 每次计算保留进位数据,本位留下余数\n\n```python\nclass Solution(object):\n def addToArrayForm(self, num, k):\n \"\"\"\n :type num: List[int]\n :type k: int\n :rtype: List[int]\n \"\"\"\n result = []\n i = len(num) - 1\n while i >=0 or k > 0:\n if i >= 0:\n k += num[i]\n i -= 1\n result.append(k % 10)\n k = k // 10\n return result[::-1]\n```\n\n时间复杂度: O(n)\n\n空间复杂度: O(n)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3079013152","body":"# 【Day 2】821. 字符的最短距离\n\n## 思路\n\n先遍历一遍获取c的位置列表, 再遍历每个位置计算最近的距离\n\n```python\nclass Solution(object):\n def shortestToChar(self, s, c):\n \"\"\"\n :type s: str\n :type c: str\n :rtype: List[int]\n \"\"\"\n locations = []\n result = []\n for i, char in enumerate(s):\n if char == c:\n locations.append(i)\n \n for i in range(len(s)):\n shortest = min(abs(i - location) for location in locations)\n result.append(shortest)\n return result\n```\n\n时间复杂度: O(n*m), m为字符c出现次数,最差为O(n^2)\n\n空间复杂度: O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3084580543","body":"**【Day 3】1381. 设计一个支持增量操作的栈**\n\n*** 思路***\n\n用数组模拟栈\n\n```python\nclass CustomStack(object):\n\n # 时间复杂度: O(1)\n # 空间复杂度: O(n)\n def __init__(self, maxSize):\n \"\"\"\n :type maxSize: int\n \"\"\"\n self.stack = [0] * maxSize\n self.top = -1\n \n # 时间复杂度: O(1)\n # 空间复杂度: O(n)\n def push(self, x):\n \"\"\"\n :type x: int\n :rtype: None\n \"\"\"\n if self.top < len(self.stack) - 1:\n self.top += 1\n self.stack[self.top] = x\n \n # 时间复杂度: O(1)\n # 空间复杂度: O(n)\n def pop(self):\n \"\"\"\n :rtype: int\n \"\"\"\n if self.top == -1:\n return -1\n value = self.stack[self.top]\n self.top -= 1\n return value\n \n # 时间复杂度: O(k)\n # 空间复杂度: O(n)\n def increment(self, k, val):\n \"\"\"\n :type k: int\n :type val: int\n :rtype: None\n \"\"\"\n lim = min(k, self.top + 1)\n for i in range(lim):\n self.stack[i] += val\n \n\n\n# Your CustomStack object will be instantiated and called as such:\n# obj = CustomStack(maxSize)\n# obj.push(x)\n# param_2 = obj.pop()\n# obj.increment(k,val)\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3089882117","body":"**【Day 4】394. 字符串解码**\n\n**思路**\n\n参照[Krahets的字符串解码题解](https://leetcode.cn/problems/decode-string/solutions/19447/decode-string-fu-zhu-zhan-fa-di-gui-fa-by-jyd/)中的辅助栈解法,利用栈来存储每一层[]中的字符串和需要重复的次数逐层拼接字符串,最后得到结果.\n\n**代码**\n\n```python\nclass Solution(object):\n def decodeString(self, s):\n \"\"\"\n :type s: str\n :rtype: str\n \"\"\"\n stack, res, multi = [], \"\", 0\n for c in s:\n if c == '[':\n stack.append([multi, res])\n res, multi = \"\", 0\n elif c == ']':\n cur_multi, last_res = stack.pop()\n res = last_res + cur_multi * res\n elif '0' <= c <= '9':\n multi = multi * 10 + int(c)\n else:\n res += c\n return res \n```\n\n**复杂度分析**\n\n时间复杂度: O(N)\n空间复杂度: O(N)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092420487","body":"**【Day 5】232. 用栈实现队列**\n\n**思路**\n\n利用栈先进后出的性质,通过stack1完成元素的倒序放置,再将stack1的元素放入stack2中,前面的元素就放在了栈顶. 此时经过两次入栈出栈的操作stack2中的元素就满足了先进先出的要求.\n\n但是要注意以下问题:\n\n1. 只有在stack2中元素为空时才能将stack1中的元素放入stack2中,这样才能保证有序性\n2. 遍历list元素要使用while, 不能用for,否则会有元素被跳过\n\n**代码**\n\n```python\nclass MyQueue(object):\n\n def __init__(self):\n self.stack1, self.stack2 = [], []\n \n\n def push(self, x):\n \"\"\"\n :type x: int\n :rtype: None\n \"\"\"\n self.stack1.append(x)\n \n\n def pop(self):\n \"\"\"\n :rtype: int\n \"\"\"\n res = self.peek()\n return self.stack2.pop()\n \n\n def peek(self):\n \"\"\"\n :rtype: int\n \"\"\"\n if self.stack2:\n return self.stack2[-1]\n elif self.stack1:\n while self.stack1:\n self.stack2.append(self.stack1.pop())\n return self.stack2[-1]\n else:\n return -1\n \n\n def empty(self):\n \"\"\"\n :rtype: bool\n \"\"\"\n return not self.stack1 and not self.stack2\n \n\n\n# Your MyQueue object will be instantiated and called as such:\n# obj = MyQueue()\n# obj.push(x)\n# param_2 = obj.pop()\n# param_3 = obj.peek()\n# param_4 = obj.empty()\n```\n\n**复杂度分析**\n\n时间复杂度: push, empty 是O(1), pop, peek是O(N)\n空间复杂度: O(N)\n\n","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3097331008","body":"**【Day 7】61. 旋转链表**\n\n**思路**\n\nk可能会大于链表长度导致循环遍历链表. 所以真实的旋转偏移是k%n,n为链表长度. 使用双指针找到需要断开的节点位置,将链表进行断开和重新拼接即可得到结果\n\n```pyth\nclass Solution(object):\n def rotateRight(self, head, k):\n \"\"\"\n :type head: Optional[ListNode]\n :type k: int\n :rtype: Optional[ListNode]\n \"\"\"\n if k == 0 or not head or not head.next:\n return head\n\n node = head\n l = 0\n while node:\n l += 1\n node = node.next\n \n if k % l == 0:\n return head\n k = k % l\n slow = fast = head\n for i in range(k):\n fast = fast.next\n \n while fast.next:\n slow = slow.next\n fast = fast.next\n\n new_head = slow.next\n slow.next = None\n fast.next = head\n return new_head\n```\n\n**复杂度分析**\n\n时间复杂度: O(N)\n空间复杂度: O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3103411213","body":"**【Day 8】24. 两两交换链表中的节点**\n\n**思路**\n\n类似于反转链表, 用两个指针来对链表指向进行修改,唯一的区别是cur需要间隔一个进行遍历,而不是逐个遍历\n\n```python\nclass Solution(object):\n def swapPairs(self, head):\n \"\"\"\n :type head: Optional[ListNode]\n :rtype: Optional[ListNode]\n \"\"\"\n dummy = ListNode()\n dummy.next = head\n pre = dummy\n cur = head\n while cur and cur.next:\n nxt = cur.next\n cur.next = nxt.next\n nxt.next = cur\n pre.next = nxt\n pre = cur\n cur = cur.next\n \n return dummy.next\n```\n\n**复杂度分析**\n\n时间复杂度: O(N)\n空间复杂度: O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109176294","body":"**【Day 9】109. 有序链表转换二叉搜索树**\n\n**思路**\n\n首先获取链表的长度,再根据二叉树的中序遍历方式递归构建BST, 根节点的值在遍历完左子树后刚好移动了m次到达中间节点,即根节点位置\n\n\n\n```python\nclass Solution:\n def sortedListToBST(self, head: Optional[ListNode]) -> Optional[TreeNode]:\n def getLength(head: ListNode) -> int:\n count = 0\n while head:\n count += 1\n head = head.next\n return count\n\n def buildBST(left: int, right: int) -> TreeNode:\n if left > right:\n return None\n m = (left + right) // 2\n root = TreeNode()\n left_node = buildBST(left, m - 1)\n nonlocal head\n root.val = head.val\n head = head.next\n \n right_node = buildBST(m+1, right)\n root.left = left_node\n root.right = right_node\n return root\n\n l = getLength(head)\n return buildBST(0, l - 1)\n```\n\n**复杂度分析**\n\n时间复杂度: O(n)\n空间复杂度: O(log n)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3122088595","body":"**【Day 12】146. LRU 缓存机制**\n\n**思路**\n\n`get` 和 `put` 必须以 `O(1)` 的平均时间复杂度运行, 说明需要使用到map. 需要记录关键字使用过的顺序需要使用到链表\n\nget方法需要查询map, 如果key存在则返回值,如果不存在则返回-1. 查询完成后,需要把该节点移动到队首(删除后再插入队首)\n\nput方法需要先查询map容量,如果容量已满,需要通过list找到队尾元素删除, 并将新元素插入队首\n\nnode需要知道前后节点,所以使用双向链表,map和node之间建立映射方便查询数据\n\n\n\n需要的内部函数: 删除元素, 将元素插入队首\n\n```python\nclass LRUCache:\n class Node:\n def __init__(self, key: int, val: int):\n self.key = key\n self.val = val\n self.pre = pre\n self.next = next\n\n def __init__(self, capacity: int):\n self.capacity = capacity\n self.dummy = self.Node(-1, -1)\n self.dummy.pre = self.dummy\n self.dummy.next = self.dummy\n self.map = {}\n\n def add_node_to_head(self, node: Node):\n node.pre = self.dummy\n node.next = self.dummy.next\n self.dummy.next.pre = node\n self.dummy.next = node\n\n def remove_node(self, node: Node):\n node.pre.next = node.next\n node.next.pre = node.pre\n\n def get(self, key: int) -> int:\n if key not in self.map:\n return -1\n\n node = self.map[key]\n self.remove_node(node)\n self.add_node_to_head(node)\n return node.val\n\n def put(self, key: int, value: int) -> None:\n if key in self.map:\n node = self.map[key]\n node.val = value\n self.remove_node(node)\n self.add_node_to_head(node)\n return\n\n new_node = self.Node(key, value)\n self.map[key] = new_node\n self.add_node_to_head(new_node)\n\n if len(self.map) > self.capacity:\n tail = self.dummy.pre\n del self.map[tail.key]\n self.remove_node(tail)\n\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124440801","body":"**【Day 13】104. 二叉树的最大深度**\n\n**思路**\n\n二叉树的最大深度为max(左子树深度, 右子树深度) + 1, 这就变成了一个递归问题\n\n```python\nclass Solution(object):\n def maxDepth(self, root):\n \"\"\"\n :type root: Optional[TreeNode]\n :rtype: int\n \"\"\"\n if root is None:\n return 0\n if root is not None and root.left is None and root.right is None:\n return 1\n return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1\n\n```\n\n**复杂度分析**\n\n时间复杂度: O(N)\n空间复杂度: O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3127200969","body":"**【Day 14】100. 相同的树**\n\n**思路**\n\n相同的树一定根节点相同,并且左子树和右子树都相同, 可以进行递归判断所有子树是否相同\n\n```python\nclass Solution:\n def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:\n if p is None or q is None:\n return p is q\n \n if p.val == q.val:\n return self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)\n else:\n return False\n```\n\n**复杂度分析**\n\n时间复杂度: O(min(m,n)) m为p节点个数,n为q节点个数\n空间复杂度: O(min(m,n)) m为p节点个数,n为q节点个数","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3136787502","body":"**【Day 16】513. 找树左下角的值**\n\n**思路**\n\n从右往左层序遍历,最后一个节点就是左下角的点\n\n```python\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n q = deque([root])\n while q:\n node = q.popleft()\n if node.right: q.append(node.right)\n if node.left: q.append(node.left)\n return node.val\n```\n\n**复杂度分析**\n\n时间复杂度: O(n) \n空间复杂度: O(n)\n\n","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3151014729","body":"**【Day 21】447. 回旋镖的数量**\n\n**思路**\n\n首先计算距离相等的点的数量,在计算相同距离点之间的排列组合数量\n\n```python\nclass Solution:\n def numberOfBoomerangs(self, points: List[List[int]]) -> int:\n res = 0\n n = len(points)\n if n < 3:\n return 0\n \n for i in range(n):\n x0, y0 = points[i]\n dist_count = {}\n \n for j in range(n):\n if i == j:\n continue\n \n x1, y1 = points[j]\n dx = x1 - x0\n dy = y1 - y0\n dist_sq = dx * dx + dy * dy\n \n dist_count[dist_sq] = dist_count.get(dist_sq, 0) + 1\n \n for cnt in dist_count.values():\n res += cnt * (cnt - 1)\n \n return res\n```\n\n时间复杂度: O(n ^ 2)\n\n","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3175046868","body":"**【Day 28】239. 滑动窗口最大值**\n\n```python\nclass Solution:\n def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:\n n = len(nums)\n if n == 0 or k == 0:\n return []\n \n res = []\n q = deque() \n for i in range(n):\n while q and q[0] < i - k + 1:\n q.popleft()\n while q and nums[q[-1]] < nums[i]:\n q.pop()\n q.append(i)\n if i >= k - 1:\n res.append(nums[q[0]])\n return res\n```\n\n时间复杂度: O(n)\n\n空间复杂度: O(k)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3179722453","body":"\n\n```python\nclass Solution:\n def findJudge(self, n: int, trust: List[List[int]]) -> int:\n in_list = [0] * (n + 1)\n out_list = [0] * (n + 1)\n for i in trust:\n in_list[i[1]] += 1\n out_list[i[0]] += 1\n\n for i in range(1, n+1):\n if in_list[i] == n - 1 and out_list[i] == 0:\n return i\n\n return -1\n```\n\n时间复杂度: O(n + m), m为trust列表长度\n\n空间复杂度: O(n)","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194443006","body":"```python\nclass Solution:\n def numberOfRounds(self, loginTime: str, logoutTime: str) -> int:\n start = 60 * int(loginTime[:2]) + int(loginTime[3:])\n end = 60 * int(logoutTime[:2]) + int(logoutTime[3:])\n if start > end:\n end += 24 * 60\n start = math.ceil(start / 15) * 15\n end = end // 15 * 15\n return max(0, (end - start) // 15)\n```\n\n时间复杂度: O(1)\n\n空间复杂度: O(1)\n\n","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3200900420","body":"快排\n```java\n class Solution {\n public int[] sortArray(int[] nums) {\n quickSort(nums, 0, nums.length - 1);\n return nums;\n }\n\n private void quickSort(int[] nums, int low, int high){\n if(low < high){\n int mid = partition(nums, low, high);\n quickSort(nums, low, mid - 1);\n quickSort(nums, mid + 1, high);\n }\n }\n\n private int partition(int[] nums, int low, int high){\n int pivot = low + (int) (Math.random() * (high - low + 1));\n swap(nums, pivot, low);\n int i = low, j = low + 1;\n while (j <= high){\n if(nums[j] < nums[low]){\n swap(nums, j, ++i);\n }\n j++;\n }\n swap(nums, low, i);\n return i;\n }\n\n private void swap(int[] nums, int i, int j){\n int tmp = nums[i];\n nums[i] = nums[j];\n nums[j] = tmp;\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3224529913","body":"思路: 采用定长滑动窗口的做法, 先初始化定长窗口,再移动更新结果\n\n```python\nclass Solution:\n def maxVowels(self, s: str, k: int) -> int:\n ans = count = 0\n vowels = set(['a', 'e', 'i', 'o', 'u'])\n chars = list(s)\n n = len(chars)\n left = right = 0\n while right < k:\n if chars[right] in vowels:\n count += 1\n right += 1\n ans = count\n while right < n:\n if chars[right] in vowels:\n count += 1\n if chars[left] in vowels:\n count -= 1\n ans = max(count, ans)\n left += 1\n right += 1\n return ans\n```\n\n时间复杂度: O(n)\n\n空间复杂度: O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3228513919","body":"\n\n```java\nclass Solution {\n public double new21Game(int n, int k, int maxPts) {\n if( k > n){\n return 0;\n }\n if((k == 0 && n >= 0) && n > k + maxPts){\n return 1;\n }\n\n int len = k + maxPts;\n double[] dp = new double[len];\n double sum = 0;\n\n for(int i = k; i < len && i <= n; i++){\n dp[i] = 1;\n sum++;\n }\n\n for(int i = k - 1; i >= 0; i--){\n dp[i] = sum / maxPts;\n sum = sum - dp[i + maxPts] + dp[i];\n }\n return dp[0];\n }\n}\n```\n\n时间复杂度: O(n)\n\n空间复杂度: O(n)","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/51#issuecomment-3240213950","body":"**\n\n```python\nclass Solution:\n def readBinaryWatch(self, turnedOn: int) -> List[str]:\n ans = []\n for h in range(12):\n for m in range(60):\n if bin(h).count('1') + bin(m).count('1') == turnedOn:\n ans.append(f\"{h}:{m:02d}\")\n \n return ans\n```\n\n时间复杂度: O(1)\n\n空间复杂度: O(1)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3245665636","body":"\n\n```python\nclass Solution:\n def maxAreaOfIsland(self, grid: List[List[int]]) -> int:\n # 时间复杂度: O(mn)\n # 空间复杂度: O(mn)\n ans = 0\n m, n = len(grid), len(grid[0])\n\n def dfs(i: int, j: int) -> int:\n count = 1\n grid[i][j] = 0\n for x, y in (i-1, j), (i+1, j), (i, j-1), (i, j+1):\n if 0<= x < m and 0 <= y < n and grid[x][y]:\n count += dfs(x, y)\n return count\n\n for i, row in enumerate(grid):\n for j, x in enumerate(row):\n if x:\n ans = max(ans, dfs(i, j))\n\n return ans\n \n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3253854706","body":"\n```python\nclass Solution:\n def maxCandies(self, status: List[int], candies: List[int], keys: List[List[int]], containedBoxes: List[List[int]], initialBoxes: List[int]) -> int:\n # 时间复杂度: O(n)\n # 空间复杂度: O(n)\n ans = 0\n q = initialBoxes\n while q:\n p = []\n for i in q:\n if status[i] == 0:\n p.append(i)\n continue\n ans += candies[i]\n for key in keys[i]:\n status[key] = 1\n for c in containedBoxes[i]:\n p.append(c)\n if p == q or not p:\n break\n q = p\n return ans\n```","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3271174778","body":"\n\n```java\nclass Solution {\n public int longestCommonSubsequence(String text1, String text2) {\n # 时间复杂度: O(mn)\n # 空间复杂度: O(mn)\n int m = text1.length(), n = text2.length();\n int[][] dp = new int[m+1][n+1];\n for (int i = 1; i <= m; i++) {\n char c1 = text1.charAt(i - 1);\n for (int j = 1; j <= n; j++) {\n char c2 = text2.charAt(j - 1);\n if (c1 == c2){\n dp[i][j] = dp[i - 1][j-1] + 1;\n }else{\n dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);\n }\n\n }\n }\n return dp[m][n];\n }\n}\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/61#issuecomment-3275118967","body":"时间复杂度: O(m * n)\n\n空间复杂度: ~~O(n)~~ 题解指正行列可以交换, 所以为O(min(m, n))\n\n```python\nclass Solution:\n def uniquePaths(self, m: int, n: int) -> int:\n f = [1] * n\n\n for i in range(1, m):\n for j in range(1, n):\n f[j] += f[j - 1]\n return f[n - 1]\n \n```","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289638493","body":"```python\nclass Solution:\n def findTargetSumWays(self, nums: List[int], target: int) -> int:\n # 时间复杂度: O(n * target)\n # 空间复杂度: O(n * target)\n @cache\n def dfs(i: int, c: int) -> int:\n if i < 0:\n return 1 if c == 0 else 0\n \n return dfs(i - 1, c - nums[i]) + dfs(i - 1, c + nums[i])\n \n return dfs(len(nums) - 1, target)\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3298968000","body":"```python\nclass Solution:\n def change(self, amount: int, coins: List[int]) -> int:\n \t# 时间复杂度(n * amount)\n # 空间复杂度(amount)\n f = [1] + [0] * amount\n for x in coins:\n for c in range(x, amount + 1):\n f[c] += f[c - x]\n return f[-1]\n```","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/72#issuecomment-3316065059","body":"```python\nclass Solution:\n def mergeTwoLists(self, list1:Optional[ListNode], list2:Optional[ListNode]) -> Optional[ListNode]:\n cur = dummy = ListNode()\n while list1 and list2:\n if list1.val < list2.val:\n cur.next = list1\n list1 = list1.next\n else:\n cur.next = list2\n list2 = list2.next\n cur = cur.next\n cur.next = list1 if list1 else list2\n return dummy.next\n\n def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:\n # 时间复杂度: O(L * logm) m 为 lists 的长度,L 为所有链表的长度之和\n # 空间复杂度: O(1)\n m = len(lists)\n if m == 0:\n return None\n step = 1\n while step < m:\n for i in range(0, m - step, step * 2):\n lists[i] = self.mergeTwoLists(lists[i], lists[i + step])\n step *= 2\n return lists[0]\n```","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/76#issuecomment-3334653673","body":"思路: 用Node来创建一个树, 每个node下面可以存下一个字母的node, 并且每个node有个end标志位,用来表示单词结尾\n\n```python\nclass Node:\n __slots__ = \"son\", \"end\"\n\n def __init__(self):\n self.son = {}\n self.end = False\n\n\nclass Trie:\n def __init__(self):\n self.root = Node()\n\n # 时间复杂度: O(n)\n def insert(self, word: str) -> None:\n cur = self.root\n for c in word:\n if c not in cur.son:\n cur.son[c] = Node()\n cur = cur.son[c]\n cur.end = True\n\n # 时间复杂度: O(n)\n def find(self, word: str) -> int:\n cur = self.root\n for c in word:\n if c not in cur.son:\n return 0\n cur = cur.son[c]\n return 2 if cur.end else 1\n \n # 时间复杂度: O(n)\n def search(self, word: str) -> bool:\n return self.find(word) == 2\n\n # 时间复杂度: O(n)\n def startsWith(self, prefix: str) -> bool:\n return self.find(prefix) != 0\n```\n\n空间复杂度: O(m * n) m为insert次数, n为单词长度","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/83#issuecomment-3361126397","body":"回溯算法\n\n剪枝优化: 先对candidates进行排序, 再进行回溯, 当left - candidates[i] < 0后不需要再遍历后续结果\n\n时间复杂度: O( n*logn + n^(target/min(candidates))), n为candidates长度\n\n空间复杂度: O(target)\n\n```python\nclass Solution:\n def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:\n candidates.sort()\n ans = list()\n path = list()\n\n def dfs(i: int, left) -> None:\n if left == 0:\n ans.append(path.copy())\n return\n \n if i == len(candidates) or left < candidates[i]:\n return\n\n dfs(i + 1, left)\n\n path.append(candidates[i])\n dfs(i, left - candidates[i])\n path.pop()\n\n dfs(0, target)\n return ans\n\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null],"yuetong3yu":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073754281","body":"```js\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar addToArrayForm = function(nums, k) {\n let str1 = '', str2 = String(k)\n for(let i = 0; i < nums.length; i++) {\n str1 += nums[i];\n }\n // swap to make sure str1 is longer than str2\n if (str1.length < str2.length) {\n const t = str1;\n str1 = str2;\n str2 = t;\n }\n const res = new Array(str1.length).fill(0);\n let p1 = str1.length - 1, p2 = str2.length - 1;\n while(p1 >= 0) {\n res[p1] = Number(str1[p1]) + Number(str2[p2] ?? 0);\n p1 --, p2 --;\n }\n const len = res.length\n let need_shift = false\n for (let i = len - 1; i >= 0; i--) {\n if (res[i] >= 10) {\n if (i === 0) {\n need_shift = true\n } else {\n res[i - 1] = res[i - 1] + 1;\n }\n res[i] = res[i] % 10\n }\n }\n if (need_shift) res.unshift(1)\n return res;\n};\n```\n\n尝试了几个不同的方法。。。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3078802551","body":"模拟题意AC,但感觉第二遍 for 循环没必要循环整个 indexes 数组,indexes 数组是天然有序的,应该可以用双指针优化\n\n```js\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function(s, c) {\n const indexes = []\n for(let i = 0; i < s.length; i++) {\n if (s[i] === c) indexes.push(i);\n }\n const res = [];\n for(let i = 0; i < s.length; i++) {\n let min = Infinity\n for(let j = 0; j < indexes.length; j++) {\n min = Math.min(min, Math.abs(i - indexes[j]));\n }\n res.push(min)\n }\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3082104676","body":"思路一直接模拟题意,increment 操作循环遍历一遍让元素自增:\n\n```js\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.stack = []\n this.size = 0\n this.maxSize = maxSize\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if (this.size === this.maxSize) return;\n this.stack.push(x);\n this.size ++\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if (this.size === 0) return -1\n const res = this.stack.pop();\n this.size --\n return res;\n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n for(let i = 0; i < this.size;i ++) {\n if (i < k) {\n this.stack[i] += val;\n }\n }\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n```\n\n---\n\n\n思路二使用一个 hashmap 维护自增量,只有在 pop 操作的时候才去运算:\n\n```js\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.stack = []\n this.size = 0\n this.maxSize = maxSize\n this.map = {}\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if (this.size === this.maxSize) return;\n this.stack.push(x);\n this.size ++\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if (this.size === 0) return -1\n const inc = this.map[this.size - 1] || 0;\n const res = this.stack.pop();\n // update inc\n if (inc) {\n this.map[this.size - 1] = 0;\n this.map[this.size - 2] = this.map[this.size - 2] ? this.map[this.size - 2] + inc : inc;\n }\n this.size --\n\n return res + inc;\n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n const key = Math.min(k - 1, this.size - 1);\n this.map[key] = this.map[key] ? this.map[key] + val : val;\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n```\n\n🥲 结果跑出来只打败了 18% 的人,应该是题目给的数据量量太小了 <= 1000,操作 hashmap 的 cost 超过了循环 stack 的时间,不如方法一暴力循环。。。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3089570929","body":"用栈秒了\n\n```js\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n const stack = [];\n let i = 0;\n while(i < s.length) {\n const char = s[i];\n if (char !== ']') {\n stack.push(char)\n i ++\n } else {\n let repeatStr = ''\n while(stack[stack.length - 1] !== '[') {\n const new_char = stack.pop();\n repeatStr = new_char + repeatStr;\n }\n // pop '['\n stack.pop()\n // get number \n let repeat_times = ''\n while(/[0-9]/.test(stack[stack.length - 1])) {\n repeat_times = stack.pop() + repeat_times\n }\n repeat_times = Number(repeat_times)\n stack.push(repeatStr.repeat(repeat_times));\n i ++\n }\n }\n let res = ''\n while(stack.length) {\n res = stack.pop() + res;\n }\n return res\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091373955","body":"思路:用两个栈模拟操作,在 peek 的时候出第二个栈的顶部即可\n\n\n```js\nvar MyQueue = function() {\n this.a = [];\n this.b = [];\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nMyQueue.prototype.push = function(x) {\n this.a.push(x);\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.pop = function() {\n this.peek();\n return this.b.pop();\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.peek = function() {\n if (this.b.length) {\n return this.b[this.b.length - 1]\n } else {\n while(this.a.length) {\n this.b.push(this.a.pop())\n }\n return this.peek()\n }\n};\n\n/**\n * @return {boolean}\n */\nMyQueue.prototype.empty = function() {\n return !this.a.length && !this.b.length\n};\n\n/** \n * Your MyQueue object will be instantiated and called as such:\n * var obj = new MyQueue()\n * obj.push(x)\n * var param_2 = obj.pop()\n * var param_3 = obj.peek()\n * var param_4 = obj.empty()\n */\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094511265","body":"用了一个简单的前缀和 AC 了,时间复杂度也是 NlogN\n\n```js\n/**\n * @param {number[]} arr\n * @return {number}\n */\nvar maxChunksToSorted = function(arr) {\n const sorted_arr = [...arr].sort((a, b) => a - b);\n let count_a = count_b = res = 0;\n\n for(let i = 0; i < arr.length;i ++) {\n count_a += sorted_arr[i];\n count_b += arr[i];\n\n if (count_a === count_b) res ++ \n }\n\n return res\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3096927980","body":"```js\nvar rotateRight = function(head, k) {\n if (!head || !head.next || k === 0) return head;\n\n // Count the length of the list\n let length = 1;\n let tail = head;\n while (tail.next) {\n tail = tail.next;\n length++;\n }\n\n // Normalize k\n k %= length;\n if (k === 0) return head;\n\n // Find the new tail: (length - k - 1)th node\n let newTail = head;\n for (let i = 0; i < length - k - 1; i++) {\n newTail = newTail.next;\n }\n\n // Rotate\n let newHead = newTail.next;\n newTail.next = null;\n tail.next = head;\n\n return newHead;\n};\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100186608","body":"考察交换链表节点的基本操作,需要注意的是“什么时候使用 dummy 节点”的技巧。我的理解是在需要涉及到头节点操作的时候,就创建 dummy 节点。比如这一题 - 交换头两个节点的时候就会涉及到头节点的变更。\n\n\n```js\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar swapPairs = function(head) {\n const dummy = new ListNode(null, head);\n let p = dummy;\n while(p.next && p.next.next) {\n const p1 = p.next, p2 = p.next.next;\n p.next = p2;\n p1.next = p2.next;\n p2.next = p1;\n p = p1\n }\n return dummy.next;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3108866758","body":"Same solution with Problem108. But this problem is giving List instead plain array. So will need to use the trick of two pointers to get the mid node of a Single List.\n\n```js\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {ListNode} head\n * @return {TreeNode}\n */\nvar sortedListToBST = function(head) {\n if (!head) return null\n return helper(head, null)\n\n function helper(head, tail) {\n if (head === tail) return null;\n let fast = head;\n let slow = head;\n while(fast !== tail && fast.next !== tail) {\n fast = fast.next.next;\n slow = slow.next;\n }\n const root = new TreeNode(slow.val);\n root.left = helper(head, slow);\n root.right = helper(slow.next, tail);\n return root\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3111667789","body":"A small trick here is `pa !== pb` and `return pa`. For negative scenarios, if given Lists were not intersected, then one of the Lists must be pointing to `null`, and then returning `null` is expected answer. \n\n```js\nvar getIntersectionNode = function(headA, headB) {\n let pa = headA, pb = headB;\n while(pa !== pb) {\n pa = pa ? pa.next : headB;\n pb = pb ? pb.next : headA;\n }\n return pa\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3115364562","body":"Find the intersection node first, and move the slow pointer to the head, and slowly move both of the pointers till they meet each other(can be proved)\n\n```js\nvar detectCycle = function(head) {\n if (!head) return head;\n let fast = head, slow = head;\n // step1: find the intersection node\n while(fast && fast.next) {\n fast = fast.next.next;\n slow = slow.next;\n // step2: find the entry of the cycle\n if (fast === slow) {\n slow = head;\n while(fast !== slow) {\n fast = fast.next\n slow = slow.next\n }\n return slow;\n }\n }\n return null;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3120830111","body":"In JS, we need to build a double linked list data structure by our own. The rest of the logic is quite straight forward - which use hashmap to save key-node, and use linked list to store access frequency. \n\n```js\nclass DoubleLinkedListNode {\n constructor(key, value) {\n this.key = key;\n this.value = value;\n this.prev = null;\n this.next = null;\n }\n}\n\nclass LRUCache {\n constructor(capacity) {\n this.capacity = capacity;\n this.usedSpace = 0;\n\n this.hashmap = {};\n this.dummyHead = new DoubleLinkedListNode(null, null);\n this.dummyTail = new DoubleLinkedListNode(null, null);\n this.dummyHead.next = this.dummyTail;\n this.dummyTail.prev = this.dummyHead;\n }\n\n _isFull() {\n return this.usedSpace === this.capacity;\n }\n _addToHead(node) {\n const currentHead = this.dummyHead.next;\n\n node.next = currentHead;\n node.prev = this.dummyHead;\n currentHead.prev = node;\n this.dummyHead.next = node;\n\n return node;\n }\n _removeNode(node) {\n node.prev.next = node.next;\n node.next.prev = node.prev;\n node.next = null\n node.prev = null\n return node\n }\n\n get(key) {\n if (this.hashmap[key] !== undefined) {\n const node = this.hashmap[key];\n this._addToHead(this._removeNode(node));\n return node.value\n } else {\n return -1\n }\n }\n put(key, value) {\n if (this.hashmap[key] !== undefined) {\n const node = this.hashmap[key];\n node.value = value;\n this._addToHead(this._removeNode(node))\n } else {\n if (this._isFull()) {\n const nodeNeedToEvict = this.dummyTail.prev;\n delete this.hashmap[nodeNeedToEvict.key];\n this._removeNode(nodeNeedToEvict);\n this.usedSpace --\n }\n const node = new DoubleLinkedListNode(key, value);\n this.hashmap[key] = node;\n this._addToHead(node);\n this.usedSpace ++\n }\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3123671763","body":"Easy\n\n```js\nvar maxDepth = function(root) {\n if (!root) return 0\n return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3124879038","body":"DFS\n\n```js\nvar isSameTree = function(p, q) {\n if (!p && !q) return true\n if (!p || !q) return false\n return p.val === q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right)\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3130312988","body":"DFS will be much simpler. BFS will need to pass a lot of context(params) into helper function which I don't like and not maintainable as well.\n\n\n```js\nvar sumNumbers = function(root) {\n const res = [];\n dfs(root, '')\n return res.reduce((prev, cur) => prev + cur, 0);\n\n\n function dfs(node, str) {\n if (!node.left && !node.right) {\n res.push(+`${str}${node.val}`);\n return;\n }\n if (node.left) dfs(node.left, `${str}${node.val}`);\n if (node.right) dfs(node.right, `${str}${node.val}`);\n } \n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3135220392","body":"Using BFS when accessing the first in the queue, that's the leftest node. And because BFS is looping thru by level, so the last time going thru the queue is the most bottom level. \n\n```js\nvar findBottomLeftValue = function(root) {\n const queue = [root];\n let min = null;\n while(queue.length) {\n const size = queue.length;\n for(let i = 0; i < size; i++) {\n const node = queue.shift();\n if (i === 0) min = node.val\n \n\n if (node.left) queue.push(node.left);\n if (node.right) queue.push(node.right);\n }\n }\n return min;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3138261960","body":"Can use either `DFS` or `BFS` to solve the problem. DFS is more simple to me: \n\n```js\n/**\n * Encodes a tree to a single string.\n *\n * @param {TreeNode} root\n * @return {string}\n */\nvar serialize = function(root) {\n let res = [];\n function dfs(node) {\n if (!node) {\n res.push('null');\n return;\n }\n res.push(String(node.val));\n dfs(node.left)\n dfs(node.right)\n }\n dfs(root);\n console.log(res.join(','))\n return res.join(',')\n};\n\n/**\n * Decodes your encoded data to tree.\n *\n * @param {string} data\n * @return {TreeNode}\n */\nvar deserialize = function(data) {\n const datas = data.split(',');\n let i = 0;\n return dfs()\n\n function dfs() {\n const char = datas[i];\n if (char === 'null') {\n i ++\n return null\n }\n const node = new TreeNode(+char);\n i ++\n node.left = dfs()\n node.right = dfs()\n return node;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3144933267","body":"Use BFS to save the row and column as index, and then sort these indexes. I think the complexity of this problem is how to mange those keys, 2 dimensions keys are quite intricate. \n\nRuntime complexity: O(nlogn), looping over the nodes is O(n), and using `sort` functions are O(nlogn), the bottle neck is sorting functions\nMemory complexity: O(n), use a hashmap to store all nodes\n\n```js\nvar verticalTraversal = function(root) {\n const map = {}\n const queue = [{\n node: root,\n col: 0,\n }];\n let row = 0;;\n while(queue.length) {\n const size = queue.length;\n for(let i = 0; i < size; i++) {\n const cur = queue.shift();\n const node = cur.node;\n if (map[cur.col]?.[row] === undefined) {\n map[cur.col] = {\n ...map[cur.col],\n [row]: [node.val]\n }\n } else {\n map[cur.col][row].push(node.val);\n }\n if (node.left) queue.push({\n node: node.left, \n col: cur.col - 1,\n })\n if (node.right) queue.push({\n node: node.right,\n col: cur.col + 1\n })\n }\n row ++\n }\n const orderByColumn = Object.entries(map).sort(([key1, _], [key2, __]) => Number(key1) - Number(key2));\n const flatternByColumn = orderByColumn.map(i => {\n const column = i[1];\n const arr = [];\n Object.entries(column).sort(([row1], [row2]) => row1 - row2).forEach(([_row, nodes]) => {\n const orderedNodes = nodes.sort((a, b) => a - b);\n arr.push(...orderedNodes)\n })\n return arr\n })\n return flatternByColumn\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146516199","body":"```js\nvar twoSum = function(nums, target) {\n const map = {}\n for(let i = 0; i < nums.length; i ++) {\n const num = nums[i];\n const diff = target - num\n if (map[diff] !== undefined) {\n return [map[diff], i];\n } else {\n map[num] = i;\n }\n }\n return [-1, -1]\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148419003","body":"```js\nvar topKFrequent = function(nums, k) {\n const map = {};\n for(let i = 0; i < nums.length; i++) {\n map[nums[i]] = map[nums[i]] ? map[nums[i]] + 1 : 1;\n }\n const maxCnt = Math.max(...Object.values(map));\n\n const buckets = Array.from({length: maxCnt + 1}, () => []);\n for(let [num, count] of Object.entries(map)) {\n buckets[count].push(num);\n }\n\n const res = [];\n for(let i = maxCnt; i >= 0 && res.length < k; i--) {\n res.push(...buckets[i])\n }\n \n return res.map(i => +i)\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3149124973","body":"Using brute force at the beginning, and didn't think of can use map to reduce runtime: \n\n```js\nvar numberOfBoomerangs = function(points) {\n let res = 0;\n let map = {}\n for(let [x1, y1] of points) {\n map = {}\n for(let [x2, y2] of points) {\n const distance = (x1 - x2) ** 2 + (y1 - y2) ** 2;\n const count = map[distance] ?? 0;\n res += count * 2;\n map[distance] = count + 1 \n }\n }\n return res\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3155367267","body":"Two pointers classic problem (sliding window): \n\n```js\nvar lengthOfLongestSubstring = function(s) {\n let left = 0, right = 0, res = 0\n const window = {};\n while(right < s.length) {\n const right_char = s[right ++];\n window[right_char] = window[right_char] ? window[right_char] + 1 : 1;\n while (window[right_char] > 1) {\n let remove_char = s[left ++];\n window[remove_char] --;\n }\n res = Math.max(right - left, res);\n }\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3160227870","body":"so hard: \n\n\n```js\nvar findSubstring = function(s, words) {\n\n const wordLen = words[0].length;\n const numWords = words.length;\n const totalLen = wordLen * numWords;\n const n = s.length;\n const res = [];\n\n if (n < totalLen) return [];\n\n const wordCount = new Map();\n for (let word of words) {\n wordCount.set(word, (wordCount.get(word) || 0) + 1);\n }\n\n // we loop over wordLen offsets\n for (let offset = 0; offset < wordLen; offset++) {\n let left = offset, count = 0;\n const seen = new Map();\n\n for (let right = offset; right + wordLen <= n; right += wordLen) {\n const word = s.slice(right, right + wordLen);\n\n if (wordCount.has(word)) {\n seen.set(word, (seen.get(word) || 0) + 1);\n count++;\n\n // we shrink window if word is overused\n while (seen.get(word) > wordCount.get(word)) {\n const leftWord = s.slice(left, left + wordLen);\n seen.set(leftWord, seen.get(leftWord) - 1);\n left += wordLen;\n count--;\n }\n\n // Valid window\n if (count === numWords) {\n res.push(left);\n const firstWord = s.slice(left, left + wordLen);\n seen.set(firstWord, seen.get(firstWord) - 1);\n left += wordLen;\n count--;\n }\n } else {\n seen.clear();\n count = 0;\n left = right + wordLen;\n }\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3164450266","body":"```js\nvar minSubarray = function(nums, p) {\n let totalSum = nums.reduce((a, b) => a + b, 0);\n\n // Find the remainder when total sum is divided by p\n let rem = totalSum % p;\n if (rem === 0) return 0; // If the remainder is 0, no subarray needs to be removed\n\n let prefixMod = new Map();\n prefixMod.set(0, -1); // Initialize to handle full prefix\n let prefixSum = 0;\n let minLength = nums.length;\n\n for (let i = 0; i < nums.length; i++) {\n prefixSum += nums[i];\n let currentMod = prefixSum % p;\n let targetMod = (currentMod - rem + p) % p;\n\n if (prefixMod.has(targetMod)) {\n minLength = Math.min(minLength, i - prefixMod.get(targetMod));\n }\n\n prefixMod.set(currentMod, i);\n }\n\n return minLength === nums.length ? -1 : minLength;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3168150001","body":"```js\nvar middleNode = function(head) {\n if (!head || !head.next) return head;\n let fast = head, slow = head;\n while(fast && fast.next) {\n fast = fast.next.next;\n slow = slow.next\n } \n return slow;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3170748221","body":"```js\nvar removeDuplicates = function(nums) {\n let fast = 0, slow = 0;\n while(fast < nums.length) {\n if (nums[slow] !== nums[fast]) {\n nums[++slow] = nums[fast];\n }\n fast ++\n }\n return slow + 1\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172646559","body":"Binary Search\n\n```js\nvar searchInsert = function(nums, target) {\n let left = 0, right = nums.length;\n while(left < right) {\n const mid = left + Math.floor((right - left) / 2);\n if (nums[mid] >= target) {\n right = mid\n } else {\n left = mid + 1\n }\n }\n return left;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173319860","body":" Too long to put down DeQueue implementation in JS. Don't think this will be asked in an interview: \n\n```js\nvar maxSlidingWindow = function (nums, k) {\n const res = [];\n const dequeue = new Dequeue([]);\n // 前 k - 1 个数入队\n for (let i = 0; i < k - 1; i++) {\n dequeue.push(nums[i]);\n }\n\n // 滑动窗口\n for (let i = k - 1; i < nums.length; i++) {\n dequeue.push(nums[i]);\n res.push(dequeue.max());\n dequeue.shift(nums[i - k + 1]);\n }\n return res;\n};\n\nclass Dequeue {\n constructor(nums) {\n this.list = nums;\n }\n\n push(val) {\n const nums = this.list;\n // 保证数据从队头到队尾递减\n while (nums[nums.length - 1] < val) {\n nums.pop();\n }\n nums.push(val);\n }\n\n // 队头出队\n shift(val) {\n let nums = this.list;\n if (nums[0] === val) {\n // 这里的js实现shift()理论上复杂度应该是O(k), 就不去真实实现一个O(1)出队的队列了,意思到位即可\n nums.shift();\n }\n }\n\n max() {\n return this.list[0];\n }\n}\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3179501468","body":"```js\nvar findJudge = function (n, trust) {\n const count = new Array(n + 1).fill(0);\n for (const edge of trust) {\n const x = edge[0];\n const y = edge[1];\n count[y]++;\n count[x]--;\n }\n for (let i = 1; i <= n; ++i) {\n if (count[i] === n - 1) {\n return i;\n }\n }\n return -1;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3184086046","body":"```js\nvar possibleBipartition = function(N, dislikes) {\n const graph = [...Array(N+1)].map(() => []);\n const visited = Array(N+1).fill(false);\n const color = Array(N+1).fill(0);\n\n for(let [u, v] of dislikes) {\n graph[u].push(v);\n graph[v].push(u);\n }\n\n for(let i = 1; i <= N; i++) {\n if(!colorNodes(i)) return false;\n }\n return true;\n\n function colorNodes(node) {\n if(visited[node]) return true;\n const currColor = new Set([1, 2]);\n\n\t\t// remove colors used by neighbors\n for(let child of graph[node]) {\n if(color[child] === 1) currColor.delete(1);\n if(color[child] === 2) currColor.delete(2);\n }\n\n\t\t// no color is available return false\n if(currColor.size === 0) return false;\n\t\t\n\t\t// assign the smallest available color\n color[node] = Math.min(...currColor);\n visited[node] = true; \n\n for(let child of graph[node]) {\n if(!colorNodes(child)) return false; \n }\n return true;\n }\n};\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"stonehl":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073791924","body":"C++代码:\n`class Solution {\npublic:\n vector addToArrayForm(vector& num, int k) {\n vector res;\n int n = num.size();\n for (int i=n-1; i>=0; --i) {\n int sum = num[i] + k % 10;\n k /= 10;\n if (sum >= 10) {\n k++;\n sum -= 10;\n }\n res.push_back(sum);\n }\n for (; k > 0; k /= 10) {\n res.push_back(k % 10);\n }\n reverse(res.begin(), res.end());\n return res;\n }\n};`","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3097159903","body":"### 思路:\n1. 异常情况判断;\n2. 统计链表长度, 同时将链表的收尾相连;\n3. 将k对链表长度取余,余数为0表示刚好旋转了链表长度的整数倍,链表节点位置不变;\n4. 新的链表头节点是原链表中第 n - k 个节点。\n### C++代码\n```\nclass Solution {\npublic:\n ListNode* rotateRight(ListNode* head, int k) {\n if (head == nullptr || head->next == nullptr || k == 0)\n return head;\n int count = 1; // 用来统计链表长度\n ListNode* tmp = head;\n while (tmp->next != nullptr) {\n count++;\n tmp = tmp->next; // 滑动到链表尾部\n }\n k %= count;\n //如果刚好是链表长度的倍数,则不进行旋转\n if (k == 0)\n return head;\n tmp->next = head;\n // \n for (int i=0; i < count - k; i++) {\n tmp = tmp->next;\n }\n ListNode* newHead = tmp->next;\n tmp->next = nullptr;\n return newHead;\n }\n};\n```\n### 时间复杂度\nO(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3103550594","body":"### 思路:\n使用递归的方法解题\n1. 找递归终止条件,当链表为空或链表只有一个元素时,没法交换,终止递归,返回当前节点;\n2. 每一次递归需要返回的值是交换后的子链表的头节点;\n\n### 代码:\n```\nclass Solution {\npublic:\n ListNode* swapPairs(ListNode* head) {\n if (head == nullptr || head->next == nullptr) {\n return head;\n }\n ListNode* next = head->next;\n head->next = swapPairs(next->next);\n next->next = head;\n return next;\n }\n};\n\n```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3127754666","body":"### 思路:\n使用深度优先搜索的方法,\n1. 先找返回条件, 如果两个节点都为空,则返回true;\n2. 如果两个节点都不为空,并且这两个节点的值相等则分别递归判断这两个节点的左子树和右子树的值是否相等,如果相等,则返回true, 否则返回false。\n\n### 代码:\n```\nclass Solution {\npublic:\n bool isSameTree(TreeNode* p, TreeNode* q) {\n if(p==nullptr && q==nullptr) {\n return true;\n }\n if (p && q && (p->val == q->val)) {\n return isSameTree(p->right, q->right) && isSameTree(p->left, q->left);\n }\n return false;\n\n }\n};\n```\n### 复杂度分析:\n时间复杂度O(N),N为两棵树节点的最小值","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3151160755","body":"### 思路:\n将每个距离的出现次数记录在哈希表中,然后遍历哈希表,计算并累加回旋镖的个数。\n\n### 代码:\n```\nclass Solution {\npublic:\n int numberOfBoomerangs(vector>& points) {\n int n = points.size();\n int res = 0;\n if (n < 3)\n return res;\n\n int ans = 0;\n for (auto &p : points) {\n unordered_map cnt;\n for (auto &q : points) {\n int dis = (p[0] - q[0]) * (p[0] - q[0]) + (p[1] - q[1]) * (p[1] - q[1]);\n ++cnt[dis];\n }\n for (auto &[_, m] : cnt) {\n ans += m * (m - 1);\n }\n }\n return ans;\n\n }\n};\n```\n时间复杂度:O(n2)","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3174960911","body":"### 思路:\n使用双端队列来维护滑动窗口内的最大值\n### 代码:\n```\nclass Solution {\npublic:\n vector maxSlidingWindow(vector& nums, int k) {\n deque q;\n int n = nums.size();\n vector res;\n for(int i = 0; i < n; i++) {\n if(q.size() && i - q.front() >= k)\n q.pop_front();\n while(q.size() && nums[q.back()] <= nums[i]) q.pop_back();\n q.push_back(i);\n if(i >= k - 1) {\n res.push_back(nums[q.front()]);\n }\n }\n return res;\n }\n};\n```\n### 复杂度:\n时间复杂度:O(n)","onTime":true},null,null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3201130868","body":"### 思路:\n基数排序\n### 代码:\n```\nclass Solution {\npublic:\n vector sortArray(vector& nums) {\n const int NUM = 50000;\n int arr[NUM*10+10];\n bzero(arr,sizeof(arr));\n for(int&num:nums){\n num+=NUM;\n arr[num]+=1;\n }\n int cur = 0;\n for(int i = 0;i<(NUM*10+10);++i){\n int tmp = arr[i];\n while(tmp--){\n nums[cur++] = i-NUM;\n }\n }\n return nums;\n }\n};\n```\n### 时间复杂度: O(N)","onTime":true},null,null,null,null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3234026083","body":"### 思路:\n1. 先统计t中每个字符出现的次数;\n2. 初始化左右指针,以及记录答案的变量;\n3. 右指针移动,更新计数。如果当前字符是t中的字符(即计数大于0),则减小cntT;\n4. 当cntT为0时,说明当前窗口包含了t的所有字符,然后尝试移动左指针缩小窗口;\n5. 在缩小窗口时,如果移除了t中的字符,则增加cntT,并更新答案;\n6. 最后根据是否找到答案返回相应的子串。\n### 代码:\n```\nclass Solution {\npublic:\n string minWindow(string s, string t) {\n vector cnt(128, 0);\n for (char c : t) {\n cnt[c]++;\n }\n \n int l = 0, r = 0, ansL = 0, ansR = 0, ans = INT_MAX, cntT = t.length();\n \n while (r < s.length()) {\n if (cnt[s[r]]-- > 0) {\n cntT--;\n }\n r++;\n \n while (cntT == 0) {\n if (r - l < ans) {\n ans = r - l;\n ansL = l;\n ansR = r;\n }\n if (cnt[s[l]]++ == 0) {\n cntT++;\n }\n l++;\n }\n }\n \n return ans == INT_MAX ? \"\" : s.substr(ansL, ansR - ansL);\n }\n};\n```\n### 时间复杂度:O(n)","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3245701951","body":"### 思路:\n1. 初始化标记数组 visited,避免重复访问;\n2. 遍历每个格子,使用DFS搜索整个岛屿。\n\n### 代码:\n```\nclass Solution {\nprivate:\n int count;\n int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向\n void dfs(vector>& grid, vector>& visited, int x, int y) {\n for (int i = 0; i < 4; i++) {\n int nextx = x + dir[i][0];\n int nexty = y + dir[i][1];\n if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过\n if (!visited[nextx][nexty] && grid[nextx][nexty] == 1) { // 没有访问过的 同时 是陆地的\n\n visited[nextx][nexty] = true;\n count++;\n dfs(grid, visited, nextx, nexty);\n }\n }\n }\n\npublic:\n int maxAreaOfIsland(vector>& grid) {\n int n = grid.size(), m = grid[0].size();\n vector> visited = vector>(n, vector(m, false));\n\n int result = 0;\n for (int i = 0; i < n; i++) {\n for (int j = 0; j < m; j++) {\n if (!visited[i][j] && grid[i][j] == 1) {\n count = 1;\n visited[i][j] = true;\n dfs(grid, visited, i, j); // 将与其链接的陆地都标记上 true\n result = max(result, count);\n }\n }\n }\n return result;\n }\n};\n```\n### 时间复杂度: O(MN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3249613575","body":"### 思路:\n使用多源广度优先搜索,先找到所有陆地放入队列,然后从陆地开始向外搜索,最后被触及的海洋就是离所有陆地最远的海洋。\n### 代码:\n```\nclass Solution {\npublic:\n int maxDistance(vector>& grid) {\n int n = grid.size();\n vector> directions = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};\n queue> q;\n \n for (int i = 0; i < n; i++) {\n for (int j = 0; j < n; j++) {\n if (grid[i][j] == 1) {\n q.push({i, j});\n }\n }\n }\n \n // 如果全是海洋或者全是陆地\n if (q.empty() || q.size() == n * n) return -1;\n \n int distance = -1;\n \n // 2. 多源 BFS\n while (!q.empty()) {\n int size = q.size();\n distance++;\n \n for (int s = 0; s < size; s++) {\n auto [x, y] = q.front();\n q.pop();\n \n for (auto [dx, dy] : directions) {\n int nx = x + dx, ny = y + dy;\n if (nx >= 0 && nx < n && ny >= 0 && ny < n && grid[nx][ny] == 0) {\n grid[nx][ny] = 1; // 标记为已访问(变为陆地)\n q.push({nx, ny});\n }\n }\n }\n }\n \n return distance;\n }\n};\n```\n### 时间复杂度: O(N²)","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3271218211","body":"### 代码:\n```\nclass Solution {\npublic:\n int longestCommonSubsequence(string text1, string text2) {\n int m = text2.length();\n vector f(m + 1);\n for (char x : text1) {\n for (int j = 0, pre = 0; j < m; j++) {\n int tmp = f[j + 1];\n f[j + 1] = x == text2[j] ? pre + 1 : max(f[j + 1], f[j]);\n pre = tmp;\n }\n }\n return f[m];\n }\n};\n```\n### 时间复杂度:O(nm)","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289595360","body":"\n### 代码:\n```\nclass Solution {\npublic:\n int findTargetSumWays(vector& nums, int target) {\n int s = reduce(nums.begin(), nums.end()) - abs(target);\n if (s < 0 || s % 2) {\n return 0;\n }\n\n int m = s / 2; // 背包容量\n int n = nums.size();\n vector memo(n, vector(m + 1, -1)); // -1 表示没有计算过\n\n // lambda 递归函数\n auto dfs = [&](this auto&& dfs, int i, int c) -> int {\n if (i < 0) {\n return c == 0;\n }\n int& res = memo[i][c]; // 注意这里是引用\n if (res != -1) { // 之前计算过\n return res;\n }\n if (c < nums[i]) {\n return res = dfs(i - 1, c); // 只能不选\n }\n return res = dfs(i - 1, c) + dfs(i - 1, c - nums[i]); // 不选 + 选\n };\n\n return dfs(n - 1, m);\n }\n};\n```\n时间复杂度:O(nm)","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/72#issuecomment-3316013499","body":"### 代码:\n```\nclass Solution {\npublic:\n ListNode* mergeKLists(vector& lists) {\n auto cmp = [](const ListNode* a, const ListNode* b) {\n return a->val > b->val; // 最小堆\n };\n priority_queue, decltype(cmp)> pq;\n for (auto head : lists) {\n if (head) {\n pq.push(head); // 把所有非空链表的头节点入堆\n }\n }\n\n ListNode dummy{}; // 哨兵节点,作为合并后链表头节点的前一个节点\n auto cur = &dummy;\n while (!pq.empty()) { // 循环直到堆为空\n auto node = pq.top(); // 剩余节点中的最小节点\n pq.pop();\n if (node->next) { // 下一个节点不为空\n pq.push(node->next); // 下一个节点有可能是最小节点,入堆\n }\n cur->next = node; // 把 node 添加到新链表的末尾\n cur = cur->next; // 准备合并下一个节点\n }\n return dummy.next; // 哨兵节点的下一个节点就是新链表的头节点\n }\n};\n```\n### 时间复杂度:\nO(Llogm),其中 m 为 lists 的长度,L 为所有链表的长度之和。","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shuyuanzhang118":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074090351","body":"## 算法思路分析\n\n这是一个将数组形式的整数与普通整数相加的算法,采用了模拟手工加法的思路:\n\n### 核心思路\n1. **从右到左逐位相加**:模拟手工加法,从最低位开始处理\n2. **处理进位**:当两位数字相加结果 ≥ 10 时,产生进位\n3. **处理不同长度**:通过 `num[len-1] || 0` 处理数组已遍历完的情况\n4. **逆序构建结果**:由于是从低位到高位计算,最后需要反转数组\n\n```JavaScript\n/**\n * @param {number[]} num\n * @param {number} k\n * @return {number[]}\n */\nvar addToArrayForm = function(num, k) {\n let res = []\n let len = num.length\n let carry = 0\n while(len > 0 || k > 0) {\n let a = num[len - 1] || 0\n let b = k % 10\n let sum = a + b + carry\n res.push(sum % 10)\n carry = sum >= 10 ? 1 : 0\n len--\n k = Math.floor(k / 10)\n }\n if (carry) {\n res.push(1)\n }\n return res.reverse()\n};\n```\n\n### 时间复杂度\n**O(max(N, log K))**\n- N 是数组 `num` 的长度\n- log K 是整数 k 的位数\n- 循环次数取决于较长的那个数\n\n### 空间复杂度\n**O(max(N, log K))**\n- 结果数组 `res` 的长度最多为 max(N, log K) + 1\n- 其他变量占用常数空间","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3079209775","body":"## 算法思路分析\n核心思想:双向遍历\n\n这个算法使用了一种巧妙的双向遍历方法来解决问题:\n\n1. 第一次遍历(从左到右) :\n \n - 记录每个位置到其左边最近字符c的距离\n - 使用变量 prev 记录上一个字符c的位置\n - 对于每个位置i,距离为 i - prev\n2. 第二次遍历(从右到左) :\n \n - 计算每个位置到其右边最近字符c的距离\n - 与第一次遍历的结果取最小值,得到最终答案\n - 对于每个位置i,距离为 prev - i\n\n## 代码\n```Javascript\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function(s, c) {\n const n = s.length;\n const answer = new Array(n).fill(Infinity);\n \n // 第一次遍历:从左到右,记录每个位置到左边最近字符c的距离\n let prev = -Infinity;\n for (let i = 0; i < n; i++) {\n if (s[i] === c) {\n prev = i;\n }\n answer[i] = i - prev;\n }\n \n // 第二次遍历:从右到左,更新每个位置到右边最近字符c的距离\n prev = Infinity;\n for (let i = n - 1; i >= 0; i--) {\n if (s[i] === c) {\n prev = i;\n }\n answer[i] = Math.min(answer[i], prev - i);\n }\n \n return answer;\n};\n```\n\n## 复杂度分析\n\n时间复杂度:O(n)\n- 需要遍历字符串两次,每次遍历都是O(n)\n- 总时间复杂度为O(n) + O(n) = O(n)\n- 这是最优的时间复杂度,因为至少需要访问每个字符一次\n\n空间复杂度:O(n)\n- 需要创建一个长度为n的结果数组 answer\n- 除了结果数组外,只使用了常数个额外变量( prev , i , n )\n- 如果不计算返回值所需的空间,额外空间复杂度为O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3084609047","body":"### 算法设计思路\n\n**核心数据结构:**\n- 使用数组 `stack` 作为底层存储结构\n- 使用 `maxSize` 记录栈的最大容量\n- 数组索引 0 为栈底,数组末尾为栈顶\n\n### 代码\n\n```JavaScript\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.maxSize = maxSize;\n this.stack = [];\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if (this.stack.length < this.maxSize) {\n this.stack.push(x);\n }\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if (this.stack.length === 0) {\n return -1;\n }\n return this.stack.pop();\n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n // 对栈底的k个元素进行增量操作\n // 如果栈中元素总数小于k,则对所有元素进行增量操作\n const elementsToIncrement = Math.min(k, this.stack.length);\n for (let i = 0; i < elementsToIncrement; i++) {\n this.stack[i] += val;\n }\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n```\n\n### 时间复杂度分析\n\n| 方法 | 时间复杂度 | 分析 |\n|------|------------|------|\n| **构造函数** | O(1) | 仅初始化两个变量 |\n| **push(x)** | O(1) | 数组末尾添加元素,均摊时间复杂度为 O(1) |\n| **pop()** | O(1) | 数组末尾删除元素 |\n| **increment(k, val)** | O(min(k, n)) | 需要遍历栈底的 k 个元素,n 为当前栈大小 |\n\n### 空间复杂度分析\n\n| 方面 | 空间复杂度 | 分析 |\n|------|------------|------|\n| **整体空间** | O(maxSize) | 最坏情况下数组存储 maxSize 个元素 |\n| **辅助空间** | O(1) | 除了存储栈元素外,只使用常数额外空间 |\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3092430277","body":"### 算法思路分析\n\n**核心思想:使用栈处理嵌套结构**\n\n这是一个典型的括号匹配问题,需要处理嵌套的编码结构。算法的关键在于:\n1. **识别模式** - `k[encoded_string]` 表示重复 k 次\n2. **处理嵌套** - 可能存在多层嵌套,如 `3[a2[c]]`\n3. **状态管理** - 需要记录当前的数字、字符串和历史状态\n\n**算法步骤:**\n1. 遍历字符串的每个字符\n2. 遇到数字:累积构建重复次数(支持多位数)\n3. 遇到 `[`:将当前状态(字符串和数字)压入栈,重置当前状态\n4. 遇到 `]`:从栈中弹出之前的状态,重复当前字符串并拼接\n5. 遇到字母:直接添加到当前字符串\n\n### 代码实现\n\n```javascript\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n const stack = [];\n let currentNum = 0;\n let currentStr = '';\n \n for (let i = 0; i < s.length; i++) {\n const char = s[i];\n \n if (char >= '0' && char <= '9') {\n // 构建数字(可能是多位数)\n currentNum = currentNum * 10 + parseInt(char);\n } else if (char === '[') {\n // 遇到左括号,将当前状态入栈\n stack.push([currentStr, currentNum]);\n currentStr = '';\n currentNum = 0;\n } else if (char === ']') {\n // 遇到右括号,出栈并重复字符串\n const [prevStr, num] = stack.pop();\n currentStr = prevStr + currentStr.repeat(num);\n } else {\n // 普通字符,直接添加到当前字符串\n currentStr += char;\n }\n }\n \n return currentStr;\n};\n```\n\n### 复杂度分析\n\n**时间复杂度:O(n + m)**\n- n:输入字符串长度\n- m:输出字符串长度\n- 每个字符最多被处理一次\n- 字符串重复操作的总时间与最终输出长度成正比\n\n**空间复杂度:O(n + m)**\n- **栈空间**:O(d) - d 为最大嵌套深度,最坏情况 O(n)\n- **字符串存储**:O(m) - 存储中间结果和最终结果\n- **总空间**:O(n + m)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092434643","body":"## 核心算法思路\n\n使用两个栈实现队列:\n- `inStack`: 用于接收新元素的输入\n- `outStack`: 用于输出元素\n\n当需要 pop 或 peek 时,如果 outStack 为空,就将 inStack 中的所有元素转移到 outStack 中,这样就实现了先入先出的特性。\n\n## 代码实现\n\n```javascript\n\nvar MyQueue = function() {\n this.inStack = []; // 用于输入的栈\n this.outStack = []; // 用于输出的栈\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nMyQueue.prototype.push = function(x) {\n this.inStack.push(x);\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.pop = function() {\n if (this.outStack.length === 0) {\n // 将inStack中的所有元素转移到outStack\n while (this.inStack.length > 0) {\n this.outStack.push(this.inStack.pop());\n }\n }\n return this.outStack.pop();\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.peek = function() {\n if (this.outStack.length === 0) {\n // 将inStack中的所有元素转移到outStack\n while (this.inStack.length > 0) {\n this.outStack.push(this.inStack.pop());\n }\n }\n return this.outStack[this.outStack.length - 1];\n};\n\n/**\n * @return {boolean}\n */\nMyQueue.prototype.empty = function() {\n return this.inStack.length === 0 && this.outStack.length === 0;\n};\n\n/** \n * Your MyQueue object will be instantiated and called as such:\n * var obj = new MyQueue()\n * obj.push(x)\n * var param_2 = obj.pop()\n * var param_3 = obj.peek()\n * var param_4 = obj.empty()\n */\n```\n\n## 复杂度分析\n\n**时间复杂度**:\n- push: O(1)\n- pop: 均摊 O(1)\n- peek: 均摊 O(1) \n- empty: O(1)\n\n**空间复杂度**: O(n)\n\n**均摊 O(1) 的原理**:虽然单次 pop 或 peek 操作在最坏情况下可能需要 O(n) 时间,但每个元素最多只会被转移一次,所以 n 个操作的总时间复杂度为 O(n),均摊下来每个操作为 O(1)。\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094581867","body":"## 算法思路\n- 关键观察:如果前缀[0...i]的最大值 ≤ 后缀[i+1...n-1]的最小值,则可以在位置i处分块\n- 这保证了前面块的所有元素都不大于后面块的任何元素,分别排序后连接仍然有序\n\n## 代码\n```javascript\n/**\n * @param {number[]} arr\n * @return {number}\n */\nvar maxChunksToSorted = function(arr) {\n const n = arr.length;\n if (n <= 1) return n;\n \n // 计算前缀最大值数组\n const prefixMax = new Array(n);\n prefixMax[0] = arr[0];\n for (let i = 1; i < n; i++) {\n prefixMax[i] = Math.max(prefixMax[i-1], arr[i]);\n }\n \n // 计算后缀最小值数组\n const suffixMin = new Array(n);\n suffixMin[n-1] = arr[n-1];\n for (let i = n-2; i >= 0; i--) {\n suffixMin[i] = Math.min(suffixMin[i+1], arr[i]);\n }\n \n let chunks = 1; // 至少有一个分块\n \n // 检查每个可能的分块点\n for (let i = 0; i < n-1; i++) {\n // 如果前缀最大值 <= 后缀最小值,可以在i处分块\n if (prefixMax[i] <= suffixMin[i+1]) {\n chunks++;\n }\n }\n \n return chunks;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) - 需要三次遍历数组\n- 空间复杂度:O(n) - 需要两个额外数组","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3097244383","body":"## 核心思路 :\n- 计算链表长度并找到尾节点\n- 优化k值避免重复旋转\n- 找到新的尾节点(第length-k个节点)\n- 重新连接:断开新尾节点与新头节点,原尾节点连接原头节点\n\n## 代码:\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @param {number} k\n * @return {ListNode}\n */\nvar rotateRight = function(head, k) {\n // 边界情况处理\n if (!head || !head.next || k === 0) {\n return head;\n }\n \n // 1. 计算链表长度并找到尾节点\n let length = 1;\n let tail = head;\n while (tail.next) {\n tail = tail.next;\n length++;\n }\n \n // 2. 优化k值,避免不必要的旋转\n k = k % length;\n if (k === 0) {\n return head;\n }\n \n // 3. 找到新的尾节点(从头开始第length-k个节点)\n let newTail = head;\n for (let i = 0; i < length - k - 1; i++) {\n newTail = newTail.next;\n }\n \n // 4. 新的头节点是新尾节点的下一个节点\n let newHead = newTail.next;\n \n // 5. 断开连接并重新连接\n newTail.next = null; // 断开新尾节点与新头节点的连接\n tail.next = head; // 原尾节点连接到原头节点\n \n return newHead;\n};\n```\n\n## 复杂度分析 :\n- 时间复杂度 :O(n) - 需要遍历链表计算长度和找到切分点\n- 空间复杂度 :O(1) - 只使用常数个额外变量","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3103625610","body":"## 算法思路\n- 虚拟头节点技巧: 简化边界条件处理\n- 三指针法: prev, first, second 精确控制交换过程\n- 原地交换: 只修改指针,不创建新节点\n- 边界处理: 空链表和单节点的特殊情况\n\n## 代码实现\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar swapPairs = function(head) {\n // 边界情况:空链表或只有一个节点\n if (!head || !head.next) {\n return head;\n }\n \n // 创建虚拟头节点,简化操作\n let dummy = new ListNode(0);\n dummy.next = head;\n let prev = dummy;\n \n // 当存在至少两个节点时进行交换\n while (prev.next && prev.next.next) {\n // 定义要交换的两个节点\n let first = prev.next;\n let second = prev.next.next;\n \n // 执行交换操作\n // 步骤:prev -> first -> second -> ... \n // 变为:prev -> second -> first -> ...\n prev.next = second;\n first.next = second.next;\n second.next = first;\n \n // 移动prev指针到已交换的第二个节点(现在是first)\n prev = first;\n }\n \n return dummy.next;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) \n- 空间复杂度:O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109219828","body":"## 算法思路\n- 算法的核心思想是利用有序链表的特性:\n- 选择中间节点作为根节点,保证树的平衡性\n- 递归地将左半部分构建为左子树,右半部分构建为右子树\n- 最优解使用中序遍历的特性,避免重复遍历链表\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {ListNode} head\n * @return {TreeNode}\n */\nvar sortedListToBST = function(head) {\n // 计算链表长度\n function getLength(head) {\n let length = 0;\n while (head) {\n length++;\n head = head.next;\n }\n return length;\n }\n \n const length = getLength(head);\n let current = head;\n \n // 中序遍历构建BST\n function buildBST(start, end) {\n if (start > end) return null;\n \n const mid = Math.floor((start + end) / 2);\n \n // 先构建左子树\n const left = buildBST(start, mid - 1);\n \n // 创建根节点(当前链表节点)\n const root = new TreeNode(current.val);\n current = current.next;\n \n // 再构建右子树\n const right = buildBST(mid + 1, end);\n \n root.left = left;\n root.right = right;\n \n return root;\n }\n \n return buildBST(0, length - 1);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) - 每个节点只访问一次\n- 空间复杂度:O(log n) - 仅递归栈深度","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3117083288","body":"## 算法思路\n双指针法 :让两个指针分别从两个链表头部开始遍历,当指针到达链表末尾时跳转到另一个链表的头部。这样可以消除两个链表的长度差异,如果有交点,两个指针会在交点相遇;如果没有交点,两个指针最终都会变成 null。\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} headA\n * @param {ListNode} headB\n * @return {ListNode}\n */\nvar getIntersectionNode = function(headA, headB) {\n // 如果任一链表为空,直接返回null\n if (!headA || !headB) {\n return null;\n }\n \n // 双指针法:让两个指针分别遍历两个链表\n // 当指针到达链表末尾时,跳转到另一个链表的头部\n // 这样可以消除长度差,如果有交点,两指针会在交点相遇\n let pA = headA;\n let pB = headB;\n \n // 当两个指针不相等时继续遍历\n while (pA !== pB) {\n // 如果pA到达末尾,跳转到headB;否则继续下一个节点\n pA = pA === null ? headB : pA.next;\n // 如果pB到达末尾,跳转到headA;否则继续下一个节点\n pB = pB === null ? headA : pB.next;\n }\n \n // 返回交点(如果没有交点,两指针都会变成null)\n return pA;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(m + n),其中 m 和 n 分别是两个链表的长度。每个指针最多遍历两个链表一次。\n- 空间复杂度 :O(1),只使用了两个指针变量,没有使用额外的数据结构。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3117100989","body":"## 算法思路\n- 第一阶段 :使用快慢指针检测是否有环\n- 慢指针每次移动1步,快指针每次移动2步\n- 如果有环,快慢指针必定会相遇\n- 第二阶段 :找到环的起始节点\n- 基于数学原理:从头节点到环入口的距离等于从相遇点到环入口的距离\n- 将一个指针重置到头节点,两指针同速移动直到相遇\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar detectCycle = function(head) {\n // 边界情况:空链表或只有一个节点且无环\n if (!head || !head.next) {\n return null;\n }\n \n // 第一阶段:使用快慢指针检测是否有环\n let slow = head;\n let fast = head;\n \n // 快指针每次走两步,慢指针每次走一步\n while (fast && fast.next) {\n slow = slow.next;\n fast = fast.next.next;\n \n // 如果快慢指针相遇,说明存在环\n if (slow === fast) {\n break;\n }\n }\n \n // 如果没有环,返回null\n if (!fast || !fast.next) {\n return null;\n }\n \n // 第二阶段:找到环的起始节点\n // 将一个指针重置到头节点,两个指针同时以相同速度移动\n // 它们相遇的地方就是环的起始节点\n slow = head;\n while (slow !== fast) {\n slow = slow.next;\n fast = fast.next;\n }\n \n return slow; // 返回环的起始节点\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 最多遍历链表两次\n- 空间复杂度 :O(1) - 只使用常数个额外变量,满足进阶要求","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3124469572","body":"## 算法思路\n这个LRU(Least Recently Used)缓存实现采用了 哈希表 + 双向链表 的经典设计模式:\n数据结构组合 :\n - Map :用于O(1)时间复杂度的键值查找\n - 双向链表:用于维护访问顺序,支持O(1)的插入和删除操作\n - 虚拟头尾节点:简化边界条件处理\n\n## 代码\n```javascript\n/**\n * @param {number} capacity\n */\nvar LRUCache = function(capacity) {\n this.capacity = capacity;\n this.cache = new Map(); // 使用Map存储键值对\n this.head = {}; // 虚拟头节点\n this.tail = {}; // 虚拟尾节点\n this.head.next = this.tail;\n this.tail.prev = this.head;\n};\n\n/** \n * @param {number} key\n * @return {number}\n */\nLRUCache.prototype.get = function(key) {\n if (!this.cache.has(key)) {\n return -1;\n }\n \n // 存在则将节点移到链表头部(表示最近使用)\n const node = this.cache.get(key);\n this.removeFromList(node);\n this.addToHead(node);\n \n return node.value;\n};\n\n/** \n * @param {number} key \n * @param {number} value\n * @return {void}\n */\nLRUCache.prototype.put = function(key, value) {\n // 如果已存在,先删除旧节点\n if (this.cache.has(key)) {\n const oldNode = this.cache.get(key);\n this.removeFromList(oldNode);\n this.cache.delete(key);\n }\n \n // 创建新节点并添加到头部\n const newNode = { key, value, prev: null, next: null };\n this.cache.set(key, newNode);\n this.addToHead(newNode);\n \n // 如果超出容量,删除尾部节点(最久未使用)\n if (this.cache.size > this.capacity) {\n const tailNode = this.tail.prev;\n this.removeFromList(tailNode);\n this.cache.delete(tailNode.key);\n }\n};\n\n// 辅助方法:将节点添加到链表头部\nLRUCache.prototype.addToHead = function(node) {\n node.next = this.head.next;\n node.prev = this.head;\n this.head.next.prev = node;\n this.head.next = node;\n};\n\n// 辅助方法:从链表中删除节点\nLRUCache.prototype.removeFromList = function(node) {\n node.prev.next = node.next;\n node.next.prev = node.prev;\n};\n\n/** \n * Your LRUCache object will be instantiated and called as such:\n * var obj = new LRUCache(capacity)\n * var param_1 = obj.get(key)\n * obj.put(key,value)\n */\n```\n\n## 复杂度分析\n- 时间复杂度:O(1)\n- 空间复杂度:O(capacity)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124496973","body":"## 算法思路\n使用广度优先搜索(BFS)的方法来计算二叉树的最大深度:\n- 初始化 :如果根节点为空,直接返回0\n- 队列存储 :使用队列存储节点和对应的深度信息,初始将根节点和深度1入队\n- 层序遍历 :通过队列进行层序遍历,每次取出队首元素\n- 深度更新 :更新最大深度值,并将当前节点的左右子节点(如果存在)连同深度+1一起入队\n- 返回结果 :遍历完成后返回记录的最大深度\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar maxDepth = function(root) {\n if (!root) return 0;\n let queue = [[root, 1]];\n let maxDepth = 0;\n\n while (queue.length > 0) {\n let [node, depth] = queue.shift();\n if (node) {\n maxDepth = Math.max(maxDepth, depth);\n if (node.left) queue.push([node.left, depth + 1]);\n if (node.right) queue.push([node.right, depth + 1]);\n }\n }\n\n return maxDepth;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 O(n) ,其中n是二叉树中节点的总数\n- 空间复杂度 O(w) ,其中w是二叉树的最大宽度","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3126191127","body":"## 算法思路\n使用递归的深度优先搜索(DFS)方法:\n- 基本情况 :如果两个节点都为空,返回 true\n- 边界情况 :如果只有一个节点为空,返回 false\n- 值比较 :如果两个节点的值不相等,返回 false\n- 递归检查 :同时检查左子树和右子树是否相同\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {TreeNode} p\n * @param {TreeNode} q\n * @return {boolean}\n */\nvar isSameTree = function(p, q) {\n if (p === null && q === null) {\n return true;\n }\n if (p === null || q === null || p.val !== q.val) {\n return false;\n }\n return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(min(m, n)),其中 m 和 n 分别是两棵树的节点数。在最坏情况下需要遍历较小树的所有节点。\n- 空间复杂度 :O(min(m, n)),递归调用栈的深度取决于树的高度。在完全平衡的树中为 O(log(min(m, n))),在完全不平衡的树中为 O(min(m, n))。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3133136375","body":"## 算法思路\n这是一个典型的二叉树深度优先搜索(DFS)问题。核心思想是:\n- 从根节点开始,沿着每条路径向下遍历\n- 在遍历过程中,将当前路径形成的数字逐步构建(当前数字 = 之前数字 × 10 + 当前节点值)\n- 当到达叶节点时,将该路径形成的完整数字加入总和\n- 递归处理左右子树,最终返回所有路径数字的总和\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar sumNumbers = function(root) {\n // 深度优先搜索函数\n function dfs(node, currentSum) {\n // 如果节点为空,返回0\n if (!node) {\n return 0;\n }\n \n // 计算当前路径的数字:之前的数字*10 + 当前节点值\n currentSum = currentSum * 10 + node.val;\n \n // 如果是叶节点(没有左右子树),返回当前路径形成的数字\n if (!node.left && !node.right) {\n return currentSum;\n }\n \n // 递归计算左右子树的路径数字之和\n return dfs(node.left, currentSum) + dfs(node.right, currentSum);\n }\n \n return dfs(root, 0);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) ,其中 n 是二叉树中节点的数量,需要访问每个节点一次\n- 空间复杂度:O(h) ,其中 h 是二叉树的高度,递归调用栈的深度等于树的高度\n - 最坏情况(完全不平衡的树):O(n)\n - 最好情况(完全平衡的树):O(log n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3136794752","body":"## 算法思路\n广度优先搜索(BFS)\n- 使用层序遍历,从右到左遍历每一层\n- 通过队列实现,先添加右子节点再添加左子节点\n- 最后访问到的节点就是最底层最左边的节点\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n // 使用层序遍历(BFS)从右到左遍历每一层\n // 最后访问到的节点就是最底层最左边的节点\n let queue = [root];\n let result = root.val;\n \n while (queue.length > 0) {\n let levelSize = queue.length;\n \n // 遍历当前层的所有节点\n for (let i = 0; i < levelSize; i++) {\n let node = queue.shift();\n result = node.val; // 更新结果为当前节点值\n \n // 先添加右子节点,再添加左子节点\n // 这样在同一层中,左边的节点会后被访问到\n if (node.right) {\n queue.push(node.right);\n }\n if (node.left) {\n queue.push(node.left);\n }\n }\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),需要遍历所有节点\n- 空间复杂度:O(w),w为树的最大宽度(队列空间)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3140223821","body":"## 算法思路\n序列化过程 :\n- 采用前序遍历(根-左-右)的方式遍历二叉树\n- 空节点用 'null' 字符串表示\n- 所有节点值用逗号连接成字符串\n- 前序遍历的优势是根节点总在最前面,便于重构\n\n反序列化过程 :\n- 将字符串按逗号分割成数组\n- 使用递归按前序遍历顺序重构二叉树\n- 维护索引指针依次处理数组元素\n- 遇到 'null' 返回空节点,否则创建新节点并递归构建左右子树\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val) {\n * this.val = val;\n * this.left = this.right = null;\n * }\n */\n\n/**\n * Encodes a tree to a single string.\n *\n * @param {TreeNode} root\n * @return {string}\n */\nvar serialize = function(root) {\n const result = [];\n \n function preorder(node) {\n if (node === null) {\n result.push('null');\n return;\n }\n \n result.push(node.val.toString());\n preorder(node.left);\n preorder(node.right);\n }\n \n preorder(root);\n return result.join(',');\n};\n\n/**\n * Decodes your encoded data to tree.\n *\n * @param {string} data\n * @return {TreeNode}\n */\nvar deserialize = function(data) {\n if (!data || data === 'null') {\n return null;\n }\n \n const values = data.split(',');\n let index = 0;\n \n function buildTree() {\n if (index >= values.length || values[index] === 'null') {\n index++;\n return null;\n }\n \n const node = new TreeNode(parseInt(values[index]));\n index++;\n \n node.left = buildTree();\n node.right = buildTree();\n \n return node;\n }\n \n return buildTree();\n};\n\n/**\n * Your functions will be called as such:\n * deserialize(serialize(root));\n */\n```\n\n## 复杂度分析\n时间复杂度 :\n- 序列化:O(n) - 需要访问每个节点一次\n- 反序列化:O(n) - 需要处理每个序列化值一次\n\n空间复杂度 :\n- 序列化:O(n) - 递归栈深度最坏情况为O(n),结果数组大小为O(n)\n- 反序列化:O(n) - 递归栈深度最坏情况为O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3148418818","body":"## 算法思路\n- DFS遍历 :使用深度优先搜索遍历二叉树,记录每个节点的坐标(row, col)和值\n- 坐标规则 :根据题目要求,左子节点坐标为(row+1, col-1),右子节点坐标为(row+1, col+1)\n- 分组排序 :将节点按列索引分组,对每列内的节点先按行排序,同行按值排序\n- 结果输出 :按列索引从小到大的顺序返回垂序遍历结果\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {TreeNode} root\n * @return {number[][]}\n */\nvar verticalTraversal = function(root) {\n if (!root) return [];\n \n // 存储节点信息:[row, col, val]\n const nodes = [];\n \n // DFS遍历,记录每个节点的坐标和值\n function dfs(node, row, col) {\n if (!node) return;\n \n nodes.push([row, col, node.val]);\n \n // 左子节点:row+1, col-1\n dfs(node.left, row + 1, col - 1);\n // 右子节点:row+1, col+1\n dfs(node.right, row + 1, col + 1);\n }\n \n // 从根节点开始遍历,根节点坐标为(0, 0)\n dfs(root, 0, 0);\n \n // 按列索引分组\n const columnMap = new Map();\n for (const [row, col, val] of nodes) {\n if (!columnMap.has(col)) {\n columnMap.set(col, []);\n }\n columnMap.get(col).push([row, val]);\n }\n \n // 获取所有列索引并排序\n const columns = Array.from(columnMap.keys()).sort((a, b) => a - b);\n \n const result = [];\n for (const col of columns) {\n const columnNodes = columnMap.get(col);\n // 对每列内的节点排序:先按行排序,同行按值排序\n columnNodes.sort((a, b) => {\n if (a[0] !== b[0]) {\n return a[0] - b[0]; // 按行排序\n }\n return a[1] - b[1]; // 同行按值排序\n });\n \n // 提取值\n result.push(columnNodes.map(node => node[1]));\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n log n),其中n是节点数,主要消耗在排序操作\n- 空间复杂度 :O(n),用于存储节点信息和分组数据","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3148426517","body":"## 算法思路\n- 使用哈希表存储已遍历的数值和索引\n- 对每个数值计算其配对数值,在哈希表中O(1)时间查找\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number[]}\n */\nvar twoSum = function(nums, target) {\n // 创建哈希表,key为数值,value为索引\n const map = new Map();\n \n for (let i = 0; i < nums.length; i++) {\n // 计算当前数值需要配对的数值\n const complement = target - nums[i];\n \n // 在哈希表中查找配对数值\n if (map.has(complement)) {\n // 找到配对,返回两个索引\n return [map.get(complement), i];\n }\n \n // 将当前数值和索引存入哈希表\n map.set(nums[i], i);\n }\n \n return []; // 题目保证有解,这里不会执行到\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n)\n- 空间复杂度:O(n)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148432520","body":"## 算法思路\n采用桶排序的思想来实现:\n- 频率统计 :使用哈希表统计每个元素的出现频率\n- 桶排序 :创建频率桶,桶的索引表示频率,桶中存储具有该频率的元素\n- 结果收集 :从最高频率的桶开始遍历,收集前k个元素\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar topKFrequent = function(nums, k) {\n // 步骤1: 统计频率\n const freqMap = new Map();\n for (const num of nums) {\n freqMap.set(num, (freqMap.get(num) || 0) + 1);\n }\n \n // 步骤2: 创建频率桶\n // 桶的索引表示频率,桶中存储具有该频率的元素\n const buckets = new Array(nums.length + 1).fill(null).map(() => []);\n \n for (const [num, freq] of freqMap) {\n buckets[freq].push(num);\n }\n \n // 步骤3: 从高频率到低频率收集前k个元素\n const result = [];\n for (let i = buckets.length - 1; i >= 0 && result.length < k; i--) {\n if (buckets[i].length > 0) {\n result.push(...buckets[i]);\n }\n }\n \n // 返回前k个元素\n return result.slice(0, k);\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 满足题目要求的优于O(n log n)\n- 统计频率:O(n)\n- 创建桶并填充:O(n)\n- 收集结果:O(n)\n\n- 空间复杂度 :O(n)\n- 哈希表:O(n)\n- 桶数组:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3153115326","body":"## 算法思路\n- 核心思想 :枚举每个点作为回旋镖的中心点i\n- 距离计算 :计算中心点到所有其他点的欧式距离(使用距离平方避免开方运算)\n- 哈希统计 :使用Map统计相同距离的点的数量\n- 组合计算 :如果有n个点到中心点距离相同,可形成n×(n-1)个回旋镖\n- 顺序考虑 :回旋镖(i,j,k)和(i,k,j)是不同的,需要考虑j和k的顺序\n\n## 代码\n```javascript\n/**\n * @param {number[][]} points\n * @return {number}\n */\nvar numberOfBoomerangs = function(points) {\n let count = 0;\n \n // 遍历每个点作为回旋镖的中心点i\n for (let i = 0; i < points.length; i++) {\n // 使用Map记录从点i到其他点的距离及对应的点的数量\n const distanceMap = new Map();\n \n // 计算点i到其他所有点的距离\n for (let j = 0; j < points.length; j++) {\n if (i !== j) {\n // 计算欧式距离的平方(避免开方运算,提高效率)\n const distance = getDistanceSquared(points[i], points[j]);\n \n // 记录该距离对应的点的数量\n distanceMap.set(distance, (distanceMap.get(distance) || 0) + 1);\n }\n }\n \n // 对于每个距离,如果有n个点,则可以形成n*(n-1)个回旋镖\n // 因为回旋镖(i,j,k)中j和k的顺序是有意义的\n for (const [distance, pointCount] of distanceMap) {\n if (pointCount >= 2) {\n count += pointCount * (pointCount - 1);\n }\n }\n }\n \n return count;\n};\n\n/**\n * 计算两点间欧式距离的平方\n * @param {number[]} point1 \n * @param {number[]} point2 \n * @return {number}\n */\nfunction getDistanceSquared(point1, point2) {\n const dx = point1[0] - point2[0];\n const dy = point1[1] - point2[1];\n return dx * dx + dy * dy;\n}\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n²) - 外层循环n次,内层循环n-1次\n- 空间复杂度 :O(n) - 最坏情况下Map存储n-1个不同距离","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3153126755","body":"## 算法思路\n- 滑动窗口技术 :使用双指针 left 和 right 构成滑动窗口\n- 哈希表优化 :记录每个字符最后出现的位置\n- 动态调整 :遇到重复字符时,将左指针移动到重复字符的下一个位置\n- 实时更新 :持续更新最大长度\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @return {number}\n */\nvar lengthOfLongestSubstring = function(s) {\n if (s.length === 0) return 0;\n \n let left = 0; // 滑动窗口左指针\n let maxLength = 0; // 记录最大长度\n let charMap = new Map(); // 哈希表:字符 -> 最后出现的索引\n \n for (let right = 0; right < s.length; right++) {\n const char = s[right];\n \n // 如果字符已存在且在当前窗口内,移动左指针\n if (charMap.has(char) && charMap.get(char) >= left) {\n left = charMap.get(char) + 1;\n }\n \n // 更新字符的最新位置\n charMap.set(char, right);\n \n // 更新最大长度\n maxLength = Math.max(maxLength, right - left + 1);\n }\n \n return maxLength;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 每个字符最多被访问两次\n- 空间复杂度 :O(min(m,n)) - m是字符集大小,n是字符串长度","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3158322222","body":"## 算法思路\n- 滑动窗口 + 哈希表 :避免生成所有排列组合,直接在原字符串上滑动匹配\n- 分层遍历 :由于words中所有单词长度相同,按单词长度为步长进行遍历\n- 频次匹配 :使用哈希表记录words中单词频次,滑动窗口中维护当前单词频次\n- 智能重置 :遇到不在words中的单词时,直接重置窗口位置\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string[]} words\n * @return {number[]}\n */\nvar findSubstring = function(s, words) {\n if (!s || !words || words.length === 0) return [];\n \n const wordLen = words[0].length;\n const totalLen = wordLen * words.length;\n const result = [];\n \n // 创建words的频次映射\n const wordCount = new Map();\n for (const word of words) {\n wordCount.set(word, (wordCount.get(word) || 0) + 1);\n }\n \n // 对于每个可能的起始位置(0到wordLen-1),使用滑动窗口\n for (let i = 0; i < wordLen; i++) {\n let left = i;\n let right = i;\n let validWords = 0;\n const windowCount = new Map();\n \n while (right + wordLen <= s.length) {\n // 扩展右边界,添加新单词\n const rightWord = s.substring(right, right + wordLen);\n right += wordLen;\n \n if (wordCount.has(rightWord)) {\n windowCount.set(rightWord, (windowCount.get(rightWord) || 0) + 1);\n if (windowCount.get(rightWord) <= wordCount.get(rightWord)) {\n validWords++;\n }\n \n // 如果窗口大小超过目标长度,收缩左边界\n while (right - left > totalLen) {\n const leftWord = s.substring(left, left + wordLen);\n left += wordLen;\n \n if (wordCount.has(leftWord)) {\n if (windowCount.get(leftWord) <= wordCount.get(leftWord)) {\n validWords--;\n }\n windowCount.set(leftWord, windowCount.get(leftWord) - 1);\n }\n }\n \n // 检查是否找到有效的串联子串\n if (validWords === words.length && right - left === totalLen) {\n result.push(left);\n }\n } else {\n // 遇到不在words中的单词,重置窗口\n windowCount.clear();\n validWords = 0;\n left = right;\n }\n }\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n × m),其中n是字符串s的长度,m是单词长度\n- 外层循环m次(每个可能的起始偏移)\n- 内层每个字符最多被访问2次(加入和移出窗口)\n\n- 空间复杂度 :O(k),其中k是words数组的长度\n- 主要用于存储单词频次的哈希表","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3162949952","body":"## 算法思路\n- 数学原理 :如果数组总和 sum % p = remainder ,需要找到一个子数组,其和也等于 remainder ,移除后剩余部分就能被p整除\n- 技术方案 :使用前缀和 + 哈希表来高效查找目标子数组\n- 关键公式 : prefixSum[i] % p = (prefixSum[j] % p - remainder + p) % p\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} p\n * @return {number}\n */\nvar minSubarray = function(nums, p) {\n // 计算数组总和\n const totalSum = nums.reduce((sum, num) => sum + num, 0);\n \n // 如果总和已经能被p整除,不需要移除任何元素\n const remainder = totalSum % p;\n if (remainder === 0) {\n return 0;\n }\n \n // 使用哈希表记录前缀和的余数及其对应的索引\n const prefixMap = new Map();\n prefixMap.set(0, -1); // 初始化,前缀和为0时索引为-1\n \n let prefixSum = 0;\n let minLength = nums.length; // 初始化为数组长度(最坏情况)\n \n for (let i = 0; i < nums.length; i++) {\n prefixSum += nums[i];\n const currentRemainder = prefixSum % p;\n \n // 我们需要找到一个前缀和,使得当前前缀和减去它等于remainder\n // 即:currentRemainder - targetRemainder = remainder (mod p)\n // 所以:targetRemainder = (currentRemainder - remainder + p) % p\n const targetRemainder = (currentRemainder - remainder + p) % p;\n \n if (prefixMap.has(targetRemainder)) {\n const prevIndex = prefixMap.get(targetRemainder);\n const subarrayLength = i - prevIndex;\n minLength = Math.min(minLength, subarrayLength);\n }\n \n // 更新当前前缀和余数的索引\n prefixMap.set(currentRemainder, i);\n }\n \n // 如果最小长度等于数组长度,说明无法找到合适的子数组\n return minLength === nums.length ? -1 : minLength;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 只需要遍历数组一次,哈希表操作为O(1)\n- 空间复杂度 :O(min(n, p)) - 哈希表最多存储min(n, p)个不同的余数","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3166733694","body":"## 算法思路\n使用 快慢指针 (Floyd's Tortoise and Hare Algorithm)技术:\n- 设置两个指针:慢指针每次移动一步,快指针每次移动两步\n- 当快指针到达链表末尾时,慢指针恰好位于链表的中间位置\n- 对于偶数长度的链表,返回第二个中间节点\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar middleNode = function(head) {\n // 使用快慢指针法(Floyd's Tortoise and Hare Algorithm)\n // 慢指针每次移动一步,快指针每次移动两步\n // 当快指针到达链表末尾时,慢指针正好在中间位置\n \n let slow = head; // 慢指针\n let fast = head; // 快指针\n \n // 当快指针和快指针的下一个节点都不为空时继续循环\n while (fast !== null && fast.next !== null) {\n slow = slow.next; // 慢指针移动一步\n fast = fast.next.next; // 快指针移动两步\n }\n \n // 当循环结束时,slow指针指向中间节点\n // 如果链表长度为奇数,slow指向唯一的中间节点\n // 如果链表长度为偶数,slow指向第二个中间节点\n return slow;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) - 需要遍历链表一次,其中n是链表的长度\n- 空间复杂度:O(1) - 只使用了两个额外的指针变量,不随输入规模增长","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3172634872","body":"## 算法思路\n- 双指针技术 :使用 slow 指针指向当前不重复元素的位置, fast 指针遍历数组\n- 原地修改 :当发现不重复元素时,将其复制到 slow+1 位置\n- 利用排序特性 :由于数组已排序,相同元素必然相邻,只需比较相邻元素\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar removeDuplicates = function(nums) {\n // 边界情况:空数组或只有一个元素\n if (nums.length <= 1) {\n return nums.length;\n }\n \n // slow指针指向当前不重复元素的位置\n let slow = 0;\n \n // fast指针遍历数组,从第二个元素开始\n for (let fast = 1; fast < nums.length; fast++) {\n // 如果当前元素与前一个不重复元素不同\n if (nums[fast] !== nums[slow]) {\n // 将slow指针向前移动一位\n slow++;\n // 将当前不重复元素复制到slow位置\n nums[slow] = nums[fast];\n }\n // 如果相同,fast继续向前,slow保持不变\n }\n \n // 返回不重复元素的个数(slow指向最后一个不重复元素的索引)\n return slow + 1;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 只需遍历数组一次\n- 空间复杂度 :O(1) - 只使用常数额外空间,符合原地修改要求","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172638327","body":"## 算法思路\n- 二分查找核心思想 :通过比较中间元素与目标值,每次排除一半搜索空间\n- 查找逻辑 :如果找到目标值返回索引,否则返回应插入的位置\n- 关键实现 :循环结束时left指针就是插入位置\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar searchInsert = function(nums, target) {\n let left = 0;\n let right = nums.length - 1;\n \n // 二分查找\n while (left <= right) {\n // 计算中间位置,避免整数溢出\n let mid = Math.floor(left + (right - left) / 2);\n \n if (nums[mid] === target) {\n // 找到目标值,返回索引\n return mid;\n } else if (nums[mid] < target) {\n // 目标值在右半部分\n left = mid + 1;\n } else {\n // 目标值在左半部分\n right = mid - 1;\n }\n }\n \n // 没找到目标值,left就是应该插入的位置\n return left;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(log n) - 满足题目要求,每次迭代将搜索范围缩小一半\n- 空间复杂度 :O(1) - 只使用常数级别的额外变量","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3174034461","body":"## 算法思路\n使用双端队列维护一个单调递减的队列,队列中存储数组元素的索引:\n\n- 队首始终是当前窗口的最大值索引\n- 移除超出窗口范围的元素\n- 维护单调性:移除队尾所有小于等于当前元素的索引\n- 当窗口形成时,队首就是最大值\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar maxSlidingWindow = function(nums, k) {\n if (!nums || nums.length === 0 || k <= 0) {\n return [];\n }\n \n const result = [];\n const deque = []; // 存储数组索引的双端队列\n \n for (let i = 0; i < nums.length; i++) {\n // 移除队列中超出窗口范围的元素\n while (deque.length > 0 && deque[0] <= i - k) {\n deque.shift();\n }\n \n // 维护单调递减队列:移除队尾所有小于当前元素的索引\n while (deque.length > 0 && nums[deque[deque.length - 1]] <= nums[i]) {\n deque.pop();\n }\n \n // 将当前元素索引加入队尾\n deque.push(i);\n \n // 当窗口大小达到k时,开始记录结果\n if (i >= k - 1) {\n result.push(nums[deque[0]]); // 队首是当前窗口最大值\n }\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 每个元素最多进队列和出队列各一次\n- 空间复杂度 :O(k) - 队列最多存储k个元素","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3178188012","body":"## 算法思路:\n- 使用度数统计法,将问题转化为图论中的入度和出度计算\n- 法官的特征:不信任任何人(出度=0)+ 被所有其他人信任(入度=n-1)\n- 通过计算每个人的\"信任度\"(入度-出度)来找到法官\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} trust\n * @return {number}\n */\nvar findJudge = function(n, trust) {\n // 特殊情况:只有一个人且没有信任关系,那么这个人就是法官\n if (n === 1 && trust.length === 0) {\n return 1;\n }\n \n // 初始化信任度数组,trustScore[i] = 入度 - 出度\n const trustScore = new Array(n + 1).fill(0);\n \n // 遍历所有信任关系\n for (const [a, b] of trust) {\n trustScore[a]--; // a信任别人,出度+1,所以信任度-1\n trustScore[b]++; // b被信任,入度+1,所以信任度+1\n }\n \n // 查找信任度为n-1的人(法官候选人)\n for (let i = 1; i <= n; i++) {\n if (trustScore[i] === n - 1) {\n return i;\n }\n }\n \n // 没有找到法官\n return -1;\n};\n```\n\n## 算法复杂度分析\n- 时间复杂度: O(E + n)\n- 遍历trust数组:O(E),其中E是信任关系数量\n- 查找法官:O(n)\n\n- 空间复杂度: O(n)\n- 需要额外的信任度数组存储每个人的统计信息","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182100538","body":"## 算法思路\n这是一个经典的二分图判断问题。核心思想是:\n\n- 将问题转化为图着色问题\n- 构建无向图,其中dislikes数组中的每一对表示图中的一条边\n- 使用DFS图着色算法判断是否能用两种颜色给所有节点着色\n- 如果相邻节点都能着不同颜色,则可以分成两组\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} dislikes\n * @return {boolean}\n */\nvar possibleBipartition = function(n, dislikes) {\n // 构建邻接表表示图\n const graph = new Array(n + 1).fill(null).map(() => []);\n for (const [a, b] of dislikes) {\n graph[a].push(b);\n graph[b].push(a);\n }\n \n // 用于记录每个节点的颜色,0表示未着色,1和-1表示两种不同的颜色\n const colors = new Array(n + 1).fill(0);\n \n // DFS着色函数\n const dfs = (node, color) => {\n colors[node] = color;\n \n // 遍历所有邻接节点\n for (const neighbor of graph[node]) {\n if (colors[neighbor] === 0) {\n // 如果邻接节点未着色,给它着相反的颜色\n if (!dfs(neighbor, -color)) {\n return false;\n }\n } else if (colors[neighbor] === color) {\n // 如果邻接节点已经着色且颜色相同,说明不能构成二分图\n return false;\n }\n }\n return true;\n };\n \n // 遍历所有节点,处理可能存在的多个连通分量\n for (let i = 1; i <= n; i++) {\n if (colors[i] === 0) {\n if (!dfs(i, 1)) {\n return false;\n }\n }\n }\n \n return true;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(V + E),其中V是节点数量(n个人),E是边的数量(dislikes数组长度)\n- 空间复杂度 :O(V + E),主要用于邻接表存储、颜色数组和DFS递归栈","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3186630947","body":"## 算法思路分析:\n这是一个双层拓扑排序问题\n- 首先需要对小组进行拓扑排序,确保依赖的小组在前面\n- 然后对每个小组内的项目进行拓扑排序\n- 最后按小组顺序合并结果\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number} m\n * @param {number[]} group\n * @param {number[][]} beforeItems\n * @return {number[]}\n */\nvar sortItems = function(n, m, group, beforeItems) {\n // 为没有小组的项目分配虚拟小组ID\n let groupId = m;\n for (let i = 0; i < n; i++) {\n if (group[i] === -1) {\n group[i] = groupId++;\n }\n }\n \n // 构建小组图和项目图\n const groupGraph = new Array(groupId).fill(0).map(() => []);\n const groupIndegree = new Array(groupId).fill(0);\n const itemGraph = new Array(n).fill(0).map(() => []);\n const itemIndegree = new Array(n).fill(0);\n \n // 构建依赖关系图\n const groupEdges = new Set(); // 用于去重小组间的边\n \n for (let i = 0; i < n; i++) {\n for (const beforeItem of beforeItems[i]) {\n const beforeGroup = group[beforeItem];\n const currentGroup = group[i];\n \n // 项目依赖关系\n itemGraph[beforeItem].push(i);\n itemIndegree[i]++;\n \n // 小组依赖关系(只有当项目属于不同小组时)\n if (beforeGroup !== currentGroup) {\n const edgeKey = `${beforeGroup}->${currentGroup}`;\n if (!groupEdges.has(edgeKey)) {\n groupEdges.add(edgeKey);\n groupGraph[beforeGroup].push(currentGroup);\n groupIndegree[currentGroup]++;\n }\n }\n }\n }\n \n // 拓扑排序函数\n function topologicalSort(graph, indegree) {\n const queue = [];\n const result = [];\n \n // 找到所有入度为0的节点\n for (let i = 0; i < indegree.length; i++) {\n if (indegree[i] === 0) {\n queue.push(i);\n }\n }\n \n while (queue.length > 0) {\n const node = queue.shift();\n result.push(node);\n \n // 更新相邻节点的入度\n for (const neighbor of graph[node]) {\n indegree[neighbor]--;\n if (indegree[neighbor] === 0) {\n queue.push(neighbor);\n }\n }\n }\n \n return result.length === graph.length ? result : [];\n }\n \n // 对小组进行拓扑排序\n const sortedGroups = topologicalSort(groupGraph, [...groupIndegree]);\n if (sortedGroups.length === 0) {\n return []; // 小组间存在循环依赖\n }\n \n // 对项目进行拓扑排序\n const sortedItems = topologicalSort(itemGraph, [...itemIndegree]);\n if (sortedItems.length === 0) {\n return []; // 项目间存在循环依赖\n }\n \n // 按小组分类项目\n const groupToItems = new Map();\n for (const item of sortedItems) {\n const itemGroup = group[item];\n if (!groupToItems.has(itemGroup)) {\n groupToItems.set(itemGroup, []);\n }\n groupToItems.get(itemGroup).push(item);\n }\n \n // 按小组顺序合并结果\n const result = [];\n for (const groupId of sortedGroups) {\n if (groupToItems.has(groupId)) {\n result.push(...groupToItems.get(groupId));\n }\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n时间复杂度:O(n + E)\n- 构建图:O(E),E为所有依赖关系总数\n- 小组拓扑排序:O(V_g + E_g)\n- 项目拓扑排序:O(V_i + E_i)\n- 结果合并:O(n)\n\n空间复杂度:O(n + E + m)\n- 图存储:O(n + E)\n- 入度数组:O(n + m)\n- 辅助数据结构:O(n + m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3191484423","body":"## 算法思路\n机器人要回到原点(0,0),必须满足两个条件:\n- 向左移动的次数 = 向右移动的次数\n- 向上移动的次数 = 向下移动的次数\n\n## 代码\n```javascript\n/**\n * @param {string} moves\n * @return {boolean}\n */\nvar judgeCircle = function(moves) {\n let x = 0, y = 0; // 当前坐标\n \n for (let move of moves) {\n switch (move) {\n case 'L':\n x--;\n break;\n case 'R':\n x++;\n break;\n case 'U':\n y++;\n break;\n case 'D':\n y--;\n break;\n }\n }\n \n return x === 0 && y === 0;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n),其中n是moves字符串的长度,需要遍历一次字符串\n- 空间复杂度 :O(1),只使用了常数个额外变量,不随输入规模变化","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3194108225","body":"## 算法思路\n- 预处理 :为每个任务添加原始索引,按进入时间排序\n- 模拟执行 :使用最小堆维护可执行任务队列,按执行时间最短优先、索引最小优先的规则选择任务\n- 时间管理 :CPU空闲时直接跳转到下一个任务的进入时间,避免无效等待\n\n## 代码\n```javascript\n/**\n * @param {number[][]} tasks\n * @return {number[]}\n */\nvar getOrder = function(tasks) {\n const n = tasks.length;\n \n // 为每个任务添加原始索引,然后按进入时间排序\n const taskWithIndex = tasks.map((task, index) => [task[0], task[1], index]);\n taskWithIndex.sort((a, b) => a[0] - b[0]); // 按enqueueTime排序\n \n const result = [];\n // 优先队列:按执行时间升序,相同时按索引升序\n const availableTasks = new MinHeap((a, b) => {\n if (a[0] !== b[0]) {\n return a[0] - b[0]; // 按processingTime升序\n }\n return a[1] - b[1]; // 按originalIndex升序\n });\n \n let currentTime = 0;\n let taskIndex = 0; // 指向下一个要加入队列的任务\n \n while (result.length < n) {\n // 将所有在当前时间或之前进入队列的任务加入可执行队列\n while (taskIndex < n && taskWithIndex[taskIndex][0] <= currentTime) {\n const [enqueueTime, processingTime, originalIndex] = taskWithIndex[taskIndex];\n availableTasks.push([processingTime, originalIndex]);\n taskIndex++;\n }\n \n if (availableTasks.size() === 0) {\n // CPU空闲,直接跳到下一个任务的进入时间\n if (taskIndex < n) {\n currentTime = taskWithIndex[taskIndex][0];\n }\n } else {\n // 从可执行任务中选择执行时间最短的(相同时选择索引最小的)\n const [processingTime, originalIndex] = availableTasks.pop();\n result.push(originalIndex);\n currentTime += processingTime;\n }\n }\n \n return result;\n};\n\n// 最小堆实现\nclass MinHeap {\n constructor(compareFn) {\n this.heap = [];\n this.compare = compareFn || ((a, b) => a - b);\n }\n \n push(val) {\n this.heap.push(val);\n this.bubbleUp(this.heap.length - 1);\n }\n \n pop() {\n if (this.heap.length === 0) return undefined;\n if (this.heap.length === 1) return this.heap.pop();\n \n const top = this.heap[0];\n this.heap[0] = this.heap.pop();\n this.bubbleDown(0);\n return top;\n }\n \n size() {\n return this.heap.length;\n }\n \n bubbleUp(index) {\n while (index > 0) {\n const parentIndex = Math.floor((index - 1) / 2);\n if (this.compare(this.heap[index], this.heap[parentIndex]) >= 0) break;\n \n [this.heap[index], this.heap[parentIndex]] = [this.heap[parentIndex], this.heap[index]];\n index = parentIndex;\n }\n }\n \n bubbleDown(index) {\n while (true) {\n let minIndex = index;\n const leftChild = 2 * index + 1;\n const rightChild = 2 * index + 2;\n \n if (leftChild < this.heap.length && \n this.compare(this.heap[leftChild], this.heap[minIndex]) < 0) {\n minIndex = leftChild;\n }\n \n if (rightChild < this.heap.length && \n this.compare(this.heap[rightChild], this.heap[minIndex]) < 0) {\n minIndex = rightChild;\n }\n \n if (minIndex === index) break;\n \n [this.heap[index], this.heap[minIndex]] = [this.heap[minIndex], this.heap[index]];\n index = minIndex;\n }\n }\n}\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n log n)\n - 排序:O(n log n)\n - 堆操作:每个任务最多进出堆一次,总计O(n log n)\n- 空间复杂度 :O(n)\n - 存储任务信息、最小堆和结果数组","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194111949","body":"## 算法核心思路\n- 1.时间转换 :将 \"HH:MM\" 格式转换为分钟数便于计算\n- 2.对局编号计算 :\n - 开始时间: Math.ceil(minutes / 15) 确保只计算完整参与的对局\n - 结束时间: Math.floor(minutes / 15) 确保只计算完整参与的对局\n- 3.分情况处理 :\n - 同一天:结束时间对局编号 - 开始时间对局编号\n - 跨夜:(96 - 开始时间对局编号) + 结束时间对局编号\n\n## 代码\n```javascript\n/**\n * @param {string} loginTime\n * @param {string} logoutTime\n * @return {number}\n */\nvar numberOfRounds = function(loginTime, logoutTime) {\n // 将时间字符串转换为分钟数\n function timeToMinutes(time) {\n const [hours, minutes] = time.split(':').map(Number);\n return hours * 60 + minutes;\n }\n \n const startMinutes = timeToMinutes(loginTime);\n const endMinutes = timeToMinutes(logoutTime);\n \n // 如果结束时间早于开始时间,说明跨越了午夜\n if (endMinutes < startMinutes) {\n // 跨夜情况:从开始时间到午夜 + 从午夜到结束时间\n // 计算从开始时间到午夜能完成的对局数\n const roundsBeforeMidnight = 96 - Math.ceil(startMinutes / 15);\n // 计算从午夜到结束时间能完成的对局数\n const roundsAfterMidnight = Math.floor(endMinutes / 15);\n return roundsBeforeMidnight + roundsAfterMidnight;\n } else {\n // 同一天情况\n // 能完成的对局数 = 结束时间所在的对局编号 - 开始时间所在的对局编号\n const result = Math.floor(endMinutes / 15) - Math.ceil(startMinutes / 15);\n return Math.max(0, result); // 确保不返回负数\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(1) - 所有操作都是常数时间的数学计算\n- 空间复杂度 :O(1) - 只使用固定数量的变量","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3197064559","body":"## 算法思路\n- 1.统计字符频率\n- 2.条件三:变成同一个字母\n- 3.条件一 & 条件二:字母严格大小比较\n- 4.综合最优解\n\n## 代码\n```javascript\n/**\n * @param {string} a\n * @param {string} b\n * @return {number}\n */\nvar minCharacters = function(a, b) {\n let n = a.length, m = b.length;\n\n let freqA = new Array(26).fill(0);\n let freqB = new Array(26).fill(0);\n\n for (let ch of a) freqA[ch.charCodeAt(0) - 97]++;\n for (let ch of b) freqB[ch.charCodeAt(0) - 97]++;\n\n // 前缀和\n let prefixA = new Array(27).fill(0);\n let prefixB = new Array(27).fill(0);\n for (let i = 0; i < 26; i++) {\n prefixA[i+1] = prefixA[i] + freqA[i];\n prefixB[i+1] = prefixB[i] + freqB[i];\n }\n\n // 条件三:相同字母\n let ops3 = Infinity;\n for (let i = 0; i < 26; i++) {\n ops3 = Math.min(ops3, n + m - (freqA[i] + freqB[i]));\n }\n\n // 条件一 & 二\n let ops1 = Infinity, ops2 = Infinity;\n for (let c = 0; c < 25; c++) { // 0~24,分割点\n // a < b\n ops1 = Math.min(ops1, (n - prefixA[c+1]) + prefixB[c+1]);\n // b < a\n ops2 = Math.min(ops2, (m - prefixB[c+1]) + prefixA[c+1]);\n }\n\n return Math.min(ops1, ops2, ops3);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n + m)\n- 空间复杂度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3199072283","body":"## 算法思路\n- 1.将数组构建为一个 最大堆(heapify)\n 最大堆性质:父节点值 ≥ 子节点值。\n- 2.交换堆顶(最大值)和堆尾元素,把最大值放到最终位置。\n- 3.缩小堆的范围(长度减 1),重新 heapify。\n- 4.重复步骤 2–3,直到整个数组有序。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar sortArray = function(nums) {\n let n = nums.length;\n\n // 建堆(从最后一个非叶子节点开始向下调整)\n for (let i = Math.floor(n / 2) - 1; i >= 0; i--) {\n heapify(nums, n, i);\n }\n\n // 不断取出堆顶(最大值)放到数组末尾\n for (let i = n - 1; i > 0; i--) {\n // 交换堆顶和堆尾\n [nums[0], nums[i]] = [nums[i], nums[0]];\n // 调整剩余部分\n heapify(nums, i, 0);\n }\n\n return nums;\n};\n\n// 调整为最大堆\nfunction heapify(arr, heapSize, root) {\n let largest = root;\n let left = 2 * root + 1;\n let right = 2 * root + 2;\n\n if (left < heapSize && arr[left] > arr[largest]) {\n largest = left;\n }\n\n if (right < heapSize && arr[right] > arr[largest]) {\n largest = right;\n }\n\n if (largest !== root) {\n [arr[root], arr[largest]] = [arr[largest], arr[root]];\n heapify(arr, heapSize, largest);\n }\n}\n```\n\n## 复杂度分析\n- 时间复杂度\n建堆:O(n)\n每次取出最大值并 heapify:O(log n),共 n 次\n总计:O(n log n)\n- 空间复杂度\n堆排序在原数组上操作,只需要 O(1) 额外空间","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204787436","body":"## 算法思路:\n- 平方根一定在 1 ~ x/2 之间(除了 0 和 1 特殊处理)。\n- 用二分查找,比较 mid * mid 与 x。\n- 如果等于就直接返回。\n- 如果小于,就把 mid 作为候选答案,继续往右找。\n- 如果大于,就往左缩。\n\n## 代码\n```javascript\n/**\n * @param {number} x\n * @return {number}\n */\nvar mySqrt = function(x) {\n if (x < 2) return x; // 0 -> 0, 1 -> 1\n\n let left = 1, right = Math.floor(x / 2), ans = 0;\n while (left <= right) {\n let mid = Math.floor((left + right) / 2);\n let square = mid * mid;\n\n if (square === x) {\n return mid;\n } else if (square < x) {\n ans = mid; // mid 可能是答案\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 O(log n)\n- 空间复杂度 O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3209498631","body":"## 算法思路\n- 设定搜索区间 [1, n]。\n- 取中点 mid = Math.floor((left + right) / 2)。\n- 调用 isBadVersion(mid):\n- 如果是坏的(true),说明答案在 左边或就是 mid,更新 right = mid。\n- 如果不是坏的(false),说明答案在 右边,更新 left = mid + 1。\n- 循环直到 left == right,此时 left 就是第一个坏版本。\n\n## 代码\n```javascript\n/**\n * Definition for isBadVersion()\n * \n * @param {integer} version number\n * @return {boolean} whether the version is bad\n * isBadVersion = function(version) {\n * ...\n * };\n */\n\n/**\n * @param {function} isBadVersion()\n * @return {function}\n */\nvar solution = function(isBadVersion) {\n /**\n * @param {integer} n Total versions\n * @return {integer} The first bad version\n */\n return function(n) {\n let left = 1, right = n;\n while (left < right) {\n let mid = Math.floor((left + right) / 2);\n if (isBadVersion(mid)) {\n // mid 可能是第一个坏版本,所以不能跳过它\n right = mid;\n } else {\n // mid 不是坏的,第一个坏版本在右边\n left = mid + 1;\n }\n }\n return left; // 或者 right,二者相等\n };\n};\n```\n\n## 复杂度分析\n- 时间复杂度:每次二分区间缩小一半,最多调用 isBadVersion O(log n) 次。\n- 空间复杂度:我们只用到了几个变量,额外空间复杂度是 O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/42#issuecomment-3214357168","body":"## 算法思路\n- 1.分治思想(归并排序)\n- 把数组分为两半,分别统计左半部分和右半部分的翻转对数量。\n- 在合并的时候,再统计「跨左右两部分」的翻转对数量。\n- 2.跨区间统计方法\n- 假设左半部分是 left[],右半部分是 right[],它们都是有序的。\n- 对于每个 left[i],我们需要统计右边有多少个 right[j] 满足left[i]>2×right[j]\n- 因为 right[] 已经排序,可以用一个指针 双指针扫描,避免嵌套循环。\n- 3.合并排序\n- 统计完跨区间的翻转对数量后,把两个有序数组合并,递归回溯。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar reversePairs = function(nums) {\n if (!nums || nums.length === 0) return 0;\n\n const mergeSort = (arr, left, right) => {\n if (left >= right) return 0;\n\n let mid = Math.floor((left + right) / 2);\n let count = mergeSort(arr, left, mid) + mergeSort(arr, mid + 1, right);\n\n // 统计跨区间翻转对\n let j = mid + 1;\n for (let i = left; i <= mid; i++) {\n while (j <= right && arr[i] > 2 * arr[j]) {\n j++;\n }\n count += (j - (mid + 1));\n }\n\n // 合并两个有序数组\n let temp = [];\n let p1 = left, p2 = mid + 1;\n while (p1 <= mid && p2 <= right) {\n if (arr[p1] <= arr[p2]) {\n temp.push(arr[p1++]);\n } else {\n temp.push(arr[p2++]);\n }\n }\n while (p1 <= mid) temp.push(arr[p1++]);\n while (p2 <= right) temp.push(arr[p2++]);\n\n for (let i = 0; i < temp.length; i++) {\n arr[left + i] = temp[i];\n }\n\n return count;\n };\n\n return mergeSort(nums, 0, nums.length - 1);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(nlogn)\n- 空间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3218651000","body":"## 算法思路\n\n- 排序\n- 对 houses 和 heaters 进行排序,方便二分查找。\n- 二分查找\n- 对于每个房屋 h,在 heaters 中二分查找,找到最接近 h 的供暖器位置。\n- 计算 |h - heater_left| 和 |h - heater_right| 的最小值。\n- 得到该房屋的最小供暖距离。\n- 取最大值\n- 遍历所有房屋,取最小距离的最大值。\n\n## 代码\n```javascript\n/**\n * @param {number[]} houses\n * @param {number[]} heaters\n * @return {number}\n */\nvar findRadius = function(houses, heaters) {\n houses.sort((a, b) => a - b);\n heaters.sort((a, b) => a - b);\n\n let radius = 0;\n\n for (let house of houses) {\n // 二分查找\n let left = 0, right = heaters.length - 1;\n while (left <= right) {\n let mid = Math.floor((left + right) / 2);\n if (heaters[mid] < house) {\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n }\n\n // left 是第一个 >= house 的位置\n let dist1 = (left < heaters.length) ? Math.abs(heaters[left] - house) : Infinity;\n let dist2 = (right >= 0) ? Math.abs(heaters[right] - house) : Infinity;\n\n let nearest = Math.min(dist1, dist2);\n radius = Math.max(radius, nearest);\n }\n\n return radius;\n};\n```\n\n## 复杂度分析\n- 排序\n- houses 排序:O(n log n)\n- heaters 排序:O(m log m)\n- 二分查找\n- 每个房屋做一次二分:O(log m)\n- 共 n 个房屋:O(n log m)\n- 总时间复杂度:O(nlogn+mlogm+nlogm)\n- 空间复杂度:O(1)(除了排序外,常数额外空间)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3218659174","body":"## 排序数组\n- 先对 nums 排序。这样数对距离 = 两个数的差,可以利用单调性。\n- 二分查找答案\n- 距离范围:最小值 0,最大值 max(nums) - min(nums)。\n- 设二分中间值为 mid,问题转化为:\n- 数组中有多少对数对距离 ≤ mid。\n- 双指针统计 ≤ mid 的数对数量\n- 排序后数组 nums 单调递增。\n- 用两个指针 i、j:\n- 固定右端点 j,向左找满足 nums[j] - nums[i] <= mid 的最小 i。\n- 那么从 i 到 j-1 的所有元素都和 j 构成合法数对,总数是 j - i。\n- 整个过程是 O(n)。\n- 二分逻辑\n- 如果 ≤ mid 的数对数目 ≥ k,说明答案可能更小,右边界收缩。\n- 否则说明距离太小,左边界右移。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number}\n */\nvar smallestDistancePair = function(nums, k) {\n nums.sort((a, b) => a - b);\n\n // 统计差值 <= mid 的数对个数\n function countPairs(mid) {\n let count = 0;\n let i = 0;\n for (let j = 0; j < nums.length; j++) {\n while (nums[j] - nums[i] > mid) {\n i++;\n }\n count += j - i;\n }\n return count;\n }\n\n let left = 0, right = nums[nums.length - 1] - nums[0];\n while (left < right) {\n let mid = Math.floor((left + right) / 2);\n if (countPairs(mid) >= k) {\n right = mid; // 答案可能是 mid 或更小\n } else {\n left = mid + 1;\n }\n }\n return left;\n};\n```\n\n## 复杂度分析\n- 时间复杂度\n- 排序:O(n log n)\n- 二分查找:查找范围是 max(nums) - min(nums),最大 1e6,二分次数约 log(1e6) ≈ 20。\n- 每次 countPairs:O(n)(双指针扫描一遍)。\n- 总复杂度:O(n log n + n log W),其中 W = max(nums) - min(nums)。对 n = 1e4,完全可行。\n- 空间复杂度\n- 只用了常数级变量,O(1)(不算排序)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3218668542","body":"## 算法思路\n- 二分 + BFS/DFS\n- 时间范围是 [max(grid[0][0], grid[n-1][n-1]), n^2-1]。\n- 二分水位 mid,检查是否能在 mid 水位下从 (0,0) 到 (n-1,n-1)。\n- 如果可以,则收缩右边界,否则收缩左边界。\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar swimInWater = function(grid) {\n const n = grid.length;\n const directions = [[1,0],[-1,0],[0,1],[0,-1]];\n \n // 检查是否能在水位 t 下到达终点\n function canReach(t) {\n if (grid[0][0] > t) return false;\n const visited = Array.from({length: n}, () => Array(n).fill(false));\n const queue = [[0,0]];\n visited[0][0] = true;\n\n while (queue.length > 0) {\n const [x, y] = queue.shift();\n if (x === n-1 && y === n-1) return true;\n for (const [dx, dy] of directions) {\n const nx = x + dx, ny = y + dy;\n if (nx >= 0 && nx < n && ny >= 0 && ny < n &&\n !visited[nx][ny] && grid[nx][ny] <= t) {\n visited[nx][ny] = true;\n queue.push([nx, ny]);\n }\n }\n }\n return false;\n }\n\n // 二分查找最小可行水位\n let low = Math.max(grid[0][0], grid[n-1][n-1]);\n let high = n * n - 1;\n let ans = high;\n\n while (low <= high) {\n const mid = Math.floor((low + high) / 2);\n if (canReach(mid)) {\n ans = mid;\n high = mid - 1; // 尝试更小的水位\n } else {\n low = mid + 1;\n }\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- BFS 最多访问 n^2 个格子,复杂度 O(n^2)。\n- 二分查找 范围大小约为 n^2,二分次数 O(log(n^2)) = O(log n)。\n- 总时间复杂度:O(n^2 log n)。\n- 空间复杂度:需要 visited 数组 O(n^2)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3226685252","body":"## 核心思路\n- 滑动窗口(Sliding Window)\n- 定义元音集合\n- vowels = new Set(['a','e','i','o','u'])\n- 初始化窗口\n- 先统计前 k 个字符里元音的数量 count。\n- 这就是第一个窗口的元音数。\n- 滑动窗口\n- 从 i = k 开始,窗口向右滑动:\n- 移除窗口最左边的字符(如果它是元音则 count--)。\n- 加入窗口最右边的字符(如果它是元音则 count++)。\n- 每次更新最大值 maxCount = Math.max(maxCount, count)。\n- 提前终止\n- 如果 maxCount === k,说明某个窗口里全是元音,直接返回结果(不可能更大了)。\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {number} k\n * @return {number}\n */\nvar maxVowels = function(s, k) {\n const vowels = new Set(['a', 'e', 'i', 'o', 'u']);\n let count = 0, maxCount = 0;\n\n // 初始化前 k 个字符\n for (let i = 0; i < k; i++) {\n if (vowels.has(s[i])) count++;\n }\n maxCount = count;\n\n // 滑动窗口\n for (let i = k; i < s.length; i++) {\n if (vowels.has(s[i - k])) count--; // 移除最左边\n if (vowels.has(s[i])) count++; // 加入最右边\n maxCount = Math.max(maxCount, count);\n if (maxCount === k) return k; // 提前终止\n }\n\n return maxCount;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 初始化前 k 个字符统计需要 O(k)。\n- 然后遍历整个字符串一次 O(n)。\n- 总体复杂度:O(n)。\n- 空间复杂度:\n- 仅使用一个集合 Set 存元音,空间 O(1)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3226702074","body":"## 思路分析\n- 边界情况\n- 如果 k == 0:Alice 一开始就停,不抽牌,分数是 0。如果 0 <= n,返回 1;否则返回 0。\n- 如果 n >= k - 1 + maxPts:Alice 不可能超过 n,因为最大分数就是 k-1 + maxPts。此时概率是 1。\n- 动态规划建模\n- 定义 dp[i] = 从分数 i 出发,Alice 最终分数不超过 n 的概率。\n- 最终答案是 dp[0]。\n- 如果 i >= k:表示 Alice 已经停了。\n- 如果 i <= n:返回 1(安全)。\n- 否则返回 0(爆掉)。\n- 如果 i < k:Alice 会继续抽。\n- 优化:滑动窗口\n- 用一个变量 windowSum 维护滑动和,就能做到 O(n)。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number} k\n * @param {number} maxPts\n * @return {number}\n */\nvar new21Game = function(n, k, maxPts) {\n // 速返:一开始就停;或最高可能分也不超过 n\n if (k === 0 || n >= k - 1 + maxPts) return 1.0;\n\n const dp = new Array(n + 1).fill(0.0);\n // 终止区间:达到/超过 k 后立即停;在 [k, n] 内都是成功状态\n for (let i = k; i <= n; i++) dp[i] = 1.0;\n\n // 初始窗口和:dp[k]..dp[k+maxPts-1],这些里面只有 <= n 的是 1\n let windowSum = Math.min(n - k + 1, maxPts);\n\n // 从后往前做滑动平均\n for (let i = k - 1; i >= 0; i--) {\n dp[i] = windowSum / maxPts;\n // 更新窗口:加上新放入的 dp[i],减去滑出窗口的 dp[i + maxPts](越界视为 0)\n windowSum += dp[i] - (i + maxPts <= n ? dp[i + maxPts] : 0);\n // 也可写成:windowSum += dp[i] - (dp[i + maxPts] ?? 0);\n }\n return dp[0];\n};\n```\n\n## 复杂度分析\n- 时间复杂度\n- 只遍历了一次数组,每个状态 O(1) 计算。\n- 时间复杂度:O(n)\n- 空间复杂度\n- 需要一个 dp 数组大小为 O(n)。\n- 也可以优化成 O(maxPts)(因为只依赖一个窗口)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3231363055","body":"## 算法思路\n- 核心观察\n- 一个字符串的异位词就是 字符相同但顺序不同 的字符串。\n- 如果子串和 p 的 字符频率统计完全相同,那么它就是一个异位词。\n- 滑动窗口\n- 用两个数组(或哈希表)存放字符频率:\n- pCount 记录 p 中各字符出现次数。\n- sCount 记录当前窗口(长度等于 p.length)的各字符出现次数。\n- 每次窗口滑动:\n- 移入一个字符,更新 sCount。\n- 移出一个字符,更新 sCount。\n- 如果 sCount 和 pCount 相等,则记录当前窗口起始位置。\n- 优化比较\n- 不需要每次都完整比较两个数组(O(26))。\n- 但因为字符集仅 26 个,比较成本很小,可以直接比较数组,整体复杂度依旧可接受。\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string} p\n * @return {number[]}\n */\nvar findAnagrams = function(s, p) {\n let res = [];\n let m = p.length, n = s.length;\n if (n < m) return res;\n\n // 频次数组,26个小写字母\n let pCount = new Array(26).fill(0);\n let sCount = new Array(26).fill(0);\n\n // 统计 p 的频率\n for (let ch of p) {\n pCount[ch.charCodeAt(0) - 97]++;\n }\n\n // 初始化第一个窗口\n for (let i = 0; i < m; i++) {\n sCount[s.charCodeAt(i) - 97]++;\n }\n\n // 比较初始窗口\n if (sCount.join() === pCount.join()) res.push(0);\n\n // 滑动窗口\n for (let i = m; i < n; i++) {\n sCount[s.charCodeAt(i) - 97]++; // 加入右边字符\n sCount[s.charCodeAt(i - m) - 97]--; // 移出左边字符\n\n if (sCount.join() === pCount.join()) {\n res.push(i - m + 1);\n }\n }\n\n return res;\n};\n```\n\n## 复杂度分析\n- 时间复杂度\n- 初始化统计频率:O(m)\n- 滑动窗口遍历 s:O(n)\n- 每次比较频率数组:O(26) = O(1)\n- 总复杂度:O(n + m)\n- 空间复杂度\n- 两个长度为 26 的数组:O(26) ≈ O(1)\n- 结果数组存储下标,最坏情况 O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3236034367","body":"## 算法思路\n- 核心思想:滑动窗口\n- 我们在字符串 s 上维护一个动态窗口 [left, right)。\n- 用 need 记录字符串 t 中每个字符需要的次数。\n- 用 window 记录当前窗口中每个字符出现的次数。\n- 不断扩展 right 指针,直到窗口内满足 t 的要求。\n- 然后收缩 left,尽量缩小窗口,直到不满足要求为止。\n- 在满足要求的情况下,更新最小子串。\n- 满足条件的判断\n- 我们可以维护一个 valid 变量,表示窗口中满足 need 的字符种类数。\n- 当 valid === need.size 时,说明窗口包含了所有需要的字符。\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string} t\n * @return {string}\n */\nvar minWindow = function(s, t) {\n let need = new Map();\n let window = new Map();\n\n for (let c of t) {\n need.set(c, (need.get(c) || 0) + 1);\n }\n\n let left = 0, right = 0;\n let valid = 0;\n let start = 0, len = Infinity;\n\n while (right < s.length) {\n let c = s[right];\n right++;\n if (need.has(c)) {\n window.set(c, (window.get(c) || 0) + 1);\n if (window.get(c) === need.get(c)) {\n valid++;\n }\n }\n\n // 收缩左边界\n while (valid === need.size) {\n if (right - left < len) {\n start = left;\n len = right - left;\n }\n let d = s[left];\n left++;\n if (need.has(d)) {\n if (window.get(d) === need.get(d)) {\n valid--;\n }\n window.set(d, window.get(d) - 1);\n }\n }\n }\n\n return len === Infinity ? \"\" : s.substr(start, len);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 每个字符最多被左右指针访问一次,所以是 O(m + n),其中 m = s.length, n = t.length。\n- 空间复杂度:\n- 哈希表 need 和 window 至多包含全部字符,大小为 O(Σ),Σ 是字符集大小(对英文就是 O(26) 或 O(52) 或 O(128))。\n- 所以空间复杂度 O(Σ)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/50#issuecomment-3247555036","body":"## 算法思路\n- 一共要拿 k 张牌,可以从数组两端取。\n- 等价于:我们留下 n - k 张牌(连续子数组),这些是不能拿的。\n- 因此,最大得分 = 总和 - 最小的长度为 (n - k) 的子数组的和。\n- 先计算数组总和 total。\n- 如果 k == n,那就直接返回 total。\n- 否则,使用滑动窗口大小为 (n - k),找到 最小窗口和。\n- 答案就是 total - min_window_sum。\n\n## 代码\n```javascript\n/**\n * @param {number[]} cardPoints\n * @param {number} k\n * @return {number}\n */\nvar maxScore = function(cardPoints, k) {\n const n = cardPoints.length;\n const total = cardPoints.reduce((a, b) => a + b, 0);\n \n // 特殊情况:拿所有卡牌\n if (k === n) return total;\n \n const windowSize = n - k;\n // 初始化窗口和\n let windowSum = 0;\n for (let i = 0; i < windowSize; i++) {\n windowSum += cardPoints[i];\n }\n let minWindowSum = windowSum;\n \n // 滑动窗口\n for (let i = windowSize; i < n; i++) {\n windowSum += cardPoints[i] - cardPoints[i - windowSize];\n minWindowSum = Math.min(minWindowSum, windowSum);\n }\n \n return total - minWindowSum;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 计算总和 O(n)\n- 滑动窗口遍历一次数组 O(n)\n- 总复杂度 O(n)\n- 空间复杂度:\n- 只用常数级变量存储 O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/51#issuecomment-3247564267","body":"## 算法思路\n- 枚举所有可能的小时和分钟\n- 小时范围:0–11\n- 分钟范围:0–59\n- 总共 12 × 60 = 720 种组合。\n- 统计二进制表示中 1 的个数\n- bitCount(h) + bitCount(m) == turnedOn 才是合法解。\n- 其中 bitCount(x) 表示数字 x 的二进制中 1 的数量。\n- 格式化输出\n- 小时 h 直接转成字符串(不能有前导零)。\n- 分钟 m 必须是两位数,若小于 10 需在前面补 0。\n\n## 代码\n```javascript\n/**\n * @param {number} turnedOn\n * @return {string[]}\n */\nvar readBinaryWatch = function(turnedOn) {\n const res = [];\n // 遍历所有可能的时间\n for (let h = 0; h < 12; h++) {\n for (let m = 0; m < 60; m++) {\n // 检查是否满足亮灯数量\n if (bitCount(h) + bitCount(m) === turnedOn) {\n // 格式化分钟(必须两位数)\n const time = `${h}:${m.toString().padStart(2, '0')}`;\n res.push(time);\n }\n }\n }\n return res;\n};\n\n// 计算二进制数中 1 的个数\nfunction bitCount(num) {\n let count = 0;\n while (num > 0) {\n count += num & 1;\n num >>= 1;\n }\n return count;\n}\n```\n\n## 复杂度分析\n- 外层遍历所有 12 × 60 = 720 种时间组合 → O(720) ≈ O(1) (常数级,最多 720 次)。\n- 每次计算 bitCount(h) 和 bitCount(m),\n- h < 12(最多 4 bit),m < 60(最多 6 bit),所以计算一次 bitCount 的复杂度 ≤ 10。\n- 总复杂度依然是常数级。\n- 时间复杂度:O(1) (严格来说是 O(720×10),但近似常数)\n- 空间复杂度:O(1) (除返回结果外仅使用常量存储)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3247575227","body":"## 算法思路(回溯法)\n- 逐行放置:从第 0 行开始,尝试在每一列放置皇后。\n- 约束检查:放置前,检查当前列和对角线是否已有皇后。\n- 列冲突:用一个集合 cols 记录已占用的列。\n- 主对角线冲突:行号 - 列号 相同的点在同一主对角线上,用 diag1 集合。\n- 副对角线冲突:行号 + 列号 相同的点在同一副对角线上,用 diag2 集合。\n- 递归搜索:如果当前行放置成功,递归尝试下一行。\n- 回溯:如果无法继续,撤销放置,尝试下一个位置。\n- 统计解法数:当所有行都成功放置皇后时,计数 +1。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @return {number}\n */\nvar totalNQueens = function(n) {\n let count = 0;\n const cols = new Set(); // 记录已占用的列\n const diag1 = new Set(); // 记录主对角线 (row - col)\n const diag2 = new Set(); // 记录副对角线 (row + col)\n\n function backtrack(row) {\n if (row === n) { \n count++;\n return;\n }\n for (let col = 0; col < n; col++) {\n if (cols.has(col) || diag1.has(row - col) || diag2.has(row + col)) {\n continue; // 冲突,不能放\n }\n // 选择\n cols.add(col);\n diag1.add(row - col);\n diag2.add(row + col);\n\n backtrack(row + 1);\n\n // 回溯\n cols.delete(col);\n diag1.delete(row - col);\n diag2.delete(row + col);\n }\n }\n\n backtrack(0);\n return count;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 每行必须放置一个皇后,因此每一行尝试 n 种列的可能性。\n- 在冲突检测 O(1) 的情况下,最坏情况回溯树的大小接近 O(n!)。\n- 实际上,由于剪枝(冲突检测),复杂度会远小于 n!,但仍然是 指数级。\n- 时间复杂度:O(n!) (上界)。\n- 空间复杂度:\n- cols、diag1、diag2 最多各存储 n 个元素。\n- 递归栈深度最大为 n。\n- 空间复杂度:O(n)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3247583590","body":"## 算法思路\n- 遍历整个网格,当遇到值为 1 的格子时,说明找到了新的岛屿。\n- 使用 DFS(深度优先搜索)或 BFS(广度优先搜索)来扩展整个岛屿,计算其面积,并更新最大值。\n- 为避免重复计算,我们要将访问过的格子标记为 0(淹没)或使用 visited 数组。\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar maxAreaOfIsland = function(grid) {\n let m = grid.length, n = grid[0].length;\n let maxArea = 0;\n\n function dfs(i, j) {\n // 边界条件\n if (i < 0 || i >= m || j < 0 || j >= n || grid[i][j] === 0) {\n return 0;\n }\n // 标记访问过\n grid[i][j] = 0;\n let area = 1;\n // 四个方向\n area += dfs(i + 1, j);\n area += dfs(i - 1, j);\n area += dfs(i, j + 1);\n area += dfs(i, j - 1);\n return area;\n }\n\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n if (grid[i][j] === 1) {\n maxArea = Math.max(maxArea, dfs(i, j));\n }\n }\n }\n\n return maxArea;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 遍历整个矩阵,每个元素最多被访问一次(因为访问后会被置为 0)。\n- 每个格子在 DFS 中的递归调用也是 O(1)(最多 4 次相邻扩展)。\n- 总时间复杂度: O(m * n)\n- 空间复杂度:\n- 递归栈的深度,最坏情况是整个矩阵都是 1,即 O(m * n)。\n- 如果用 BFS + 队列,也需要 O(m * n) 的空间。\n- 空间复杂度: O(m * n)(递归栈 / 队列空间)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3247593268","body":"## 算法思路\n- 使用多源 BFS(广度优先搜索)来解决。\n- 找到所有陆地格子,放入队列(多源 BFS 起点)。\n- 从陆地开始向外扩展,遇到海洋格子时更新它的距离。\n- 记录 BFS 扩展到的最大层数,即最大距离。\n- 最后如果没有海洋或没有陆地,返回 -1。\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar maxDistance = function(grid) {\n const n = grid.length;\n const directions = [[1,0],[-1,0],[0,1],[0,-1]];\n const queue = [];\n\n // 1. 把所有陆地加入队列\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n if (grid[i][j] === 1) {\n queue.push([i, j]);\n }\n }\n }\n\n // 如果全是海洋或者全是陆地\n if (queue.length === 0 || queue.length === n * n) return -1;\n\n let distance = -1;\n\n // 2. 多源 BFS\n while (queue.length > 0) {\n let size = queue.length;\n distance++; // 每一层扩展一次\n for (let s = 0; s < size; s++) {\n const [x, y] = queue.shift();\n for (let [dx, dy] of directions) {\n const nx = x + dx, ny = y + dy;\n if (nx >= 0 && nx < n && ny >= 0 && ny < n && grid[nx][ny] === 0) {\n grid[nx][ny] = 1; // 标记为已访问(变为陆地)\n queue.push([nx, ny]);\n }\n }\n }\n }\n\n return distance;\n};\n```\n\n## 复杂度分析\n- BFS 遍历整个网格,每个格子最多入队一次。\n- 时间复杂度:O(n^2)\n- 空间复杂度(队列 + 访问标记):O(n^2)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3270177258","body":"## 思路\n- 一开始手上有一些 初始盒子,目标是最大化能获得的糖果数。关键点是:\n- 盒子可能是 开着的(status[i] = 1)或者 关着的(status[i] = 0)。\n- 你只有在盒子开着时,才能取走里面的糖果。\n- 打开盒子后,你可能获得 钥匙,可以解锁更多盒子。\n- 打开盒子后,你可能获得 更多盒子,这些盒子可能要等钥匙解锁才能用。\n- 所以整个过程就是一个 BFS / 队列模拟,类似 “不断解锁和探索”的过程。\n\n## 代码\n```javascript\n/**\n * @param {number[]} status\n * @param {number[]} candies\n * @param {number[][]} keys\n * @param {number[][]} containedBoxes\n * @param {number[]} initialBoxes\n * @return {number}\n */\nvar maxCandies = function(status, candies, keys, containedBoxes, initialBoxes) {\n let n = status.length;\n let res = 0;\n\n let haveKey = new Set();\n let haveBox = new Set(initialBoxes);\n let visited = new Array(n).fill(false);\n\n let queue = [...initialBoxes];\n\n while (queue.length > 0) {\n let box = queue.shift();\n if (visited[box]) continue;\n\n // 如果箱子是锁着的且没钥匙 -> 跳过\n if (status[box] === 0 && !haveKey.has(box)) continue;\n\n // 打开箱子\n visited[box] = true;\n res += candies[box];\n\n // 获得钥匙\n for (let k of keys[box]) {\n if (!haveKey.has(k)) {\n haveKey.add(k);\n // 如果之前已经有这个盒子但是打不开,现在可以打开了\n if (haveBox.has(k) && !visited[k]) {\n queue.push(k);\n }\n }\n }\n\n // 获得新的盒子\n for (let b of containedBoxes[box]) {\n if (!haveBox.has(b)) haveBox.add(b);\n if ((status[b] === 1 || haveKey.has(b)) && !visited[b]) {\n queue.push(b);\n }\n }\n }\n\n return res;\n};\n```\n\n## 复杂度分析\n- 时间复杂度\n- 每个盒子最多被处理一次,O(n)。\n- 钥匙和 containedBoxes 总长度之和最多 O(n)。\n- 所以总 时间复杂度 = O(n)。\n- 空间复杂度分析\n- visited / haveKey / haveBox 都是 O(n)。\n- 队列最多 O(n)。\n- 所以 空间复杂度 = O(n)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/56#issuecomment-3270189042","body":"/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {TreeNode} root\n * @return {number[][]}\n */\nvar verticalTraversal = function(root) {\n if (!root) return [];\n \n // 存储节点信息:[row, col, val]\n const nodes = [];\n \n // DFS遍历,记录每个节点的坐标和值\n function dfs(node, row, col) {\n if (!node) return;\n \n nodes.push([row, col, node.val]);\n \n // 左子节点:row+1, col-1\n dfs(node.left, row + 1, col - 1);\n // 右子节点:row+1, col+1\n dfs(node.right, row + 1, col + 1);\n }\n \n // 从根节点开始遍历,根节点坐标为(0, 0)\n dfs(root, 0, 0);\n \n // 按列索引分组\n const columnMap = new Map();\n for (const [row, col, val] of nodes) {\n if (!columnMap.has(col)) {\n columnMap.set(col, []);\n }\n columnMap.get(col).push([row, val]);\n }\n \n // 获取所有列索引并排序\n const columns = Array.from(columnMap.keys()).sort((a, b) => a - b);\n \n const result = [];\n for (const col of columns) {\n const columnNodes = columnMap.get(col);\n // 对每列内的节点排序:先按行排序,同行按值排序\n columnNodes.sort((a, b) => {\n if (a[0] !== b[0]) {\n return a[0] - b[0]; // 按行排序\n }\n return a[1] - b[1]; // 同行按值排序\n });\n \n // 提取值\n result.push(columnNodes.map(node => node[1]));\n }\n \n return result;\n};","onTime":false},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ariana850409":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074225557","body":"思維:\n以十進位的相加方式,將 k 拆解成字串,從個位數開始與 num 相加,最後再處理一次 num 的進位\n\n代碼:\n```\nclass Solution(object):\n def addToArrayForm(self, num, k):\n k = str(k)\n for i in range(-1, -(len(k)+1), -1):\n number = int(k[i])\n if abs(i) > len(num):\n num.insert(0, number)\n else:\n num[i] = num[i] + number\n\n for i in range(-1, -(len(num)+1), -1):\n temp = num[i]\n if temp >= 10:\n num[i] = temp - 10\n if abs(i-1) > len(num):\n num.insert(0, 1)\n else:\n num[i-1] += 1\n\n return num\n```\n\n時間複雜度:O(N)
\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3078087647","body":"思維:\n先找出所有符合字符 c 的 index,再判斷字符串 s 中每個字符跟要拿來比較的 index 的最短距離\n\n代碼:\n```\nclass Solution:\n def shortestToChar(self, s: str, c: str) -> List[int]:\n target = []\n for i, char in enumerate(s):\n if char == c:\n target.append(i)\n\n res = []\n t = 0\n for i in range(len(s)):\n tar = target[t]\n if i < tar:\n res.append(tar-i)\n elif i == tar:\n res.append(0)\n elif t+1 >= len(target):\n res.append(i-tar)\n else:\n next_tar = target[t+1]\n res.append(min(i-tar, next_tar-i))\n if i == next_tar:\n t += 1\n return res\n```\n\n時間複雜度:O(N)
\n空間複雜度:O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3083166293","body":"思維一:單純依照題義用最直接的想法來實作各函式,increment 用遍歷去直接改變列表中的值\n\n代碼:\n```python\nclass CustomStack:\n def __init__(self, maxSize: int):\n self.maxSize = maxSize\n self.stack = []\n \n def push(self, x: int) -> None:\n if if len(self.stack) < self.maxSize:\n self.stack.append(x)\n\n def pop(self) -> int:\n if not self.stack:\n return -1\n return self.stack.pop()\n \n def increment(self, k: int, val: int) -> None:\n k = min(k, len(self.stack))\n for i in range(k):\n self.stack[i] += val\n```\n時間複雜度:push, pop: O(1) / increment: O(N)\n\n空間複雜度:O(N)\n\n-----\n思維二:優化 increment 的時間複雜度,將 increment value 另存在一個列表,等 pop 時才判斷需加多少值\n\n代碼:\n```python\nclass CustomStack:\n def __init__(self, maxSize: int):\n self.maxSize = maxSize\n self.stack = []\n self.inc = [0] * maxSize\n \n def push(self, x: int) -> None:\n if not len(self.stack) >= self.maxSize:\n self.stack.append(x)\n\n def pop(self) -> int:\n if not self.stack:\n return -1\n inc_idx = len(self.stack)-1\n inc_val = self.inc[inc_idx]\n if inc_idx > 0:\n self.inc[inc_idx-1] += inc_val\n self.inc[inc_idx] = 0\n return self.stack.pop() + inc_val\n \n def increment(self, k: int, val: int) -> None:\n k = min(k, len(self.stack))\n if k > 0:\n self.inc[k-1] += val\n```\n時間複雜度:push, pop, increment: O(1)\n\n空間複雜度:O(N)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3087613442","body":"思維:使用兩個 stack 模擬進入與退出重複區塊的過程,每遇到 [ 就壓入當下狀態,遇到 ] 就彈出並拼接,逐步建立出完整的解碼字串\n\n代碼:\n```python\nclass Solution:\n def decodeString(self, s: str) -> str:\n cnt_stack = []\n str_stack = []\n cnt = ''\n temp = ''\n for c in s:\n if c.isdigit():\n cnt += c\n elif c == '[':\n cnt_stack.append(int(cnt))\n str_stack.append(temp)\n cnt = ''\n temp = ''\n elif c == ']':\n times = cnt_stack.pop()\n prev_str = str_stack.pop()\n temp = prev_str + temp * times\n else:\n temp += c\n\n return temp\n```\n時間複雜度:O(N)\n\n空間複雜度:O(N)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091473302","body":"思維一:以暴力解的方式在 peek 或 pop 的操作時,用另一個陣列依序存目前 stack pop 出來的所有元素,操作結果後再依序新增回去,時間及空間複雜度皆為 O(N)(無實作)
\n思維二:使用兩個 stack 來操作存取,當有 peek 或 pop 的操作時,從 out_stack 拿取,判斷 out_stack 為空時再一次性的把當前 in_stack 的所有元素倒進 out_stack\n\n代碼:\n```python\nclass MyQueue(object):\n\n def __init__(self):\n self.in_stack = []\n self.out_stack = []\n \n def push(self, x):\n \"\"\"\n :type x: int\n :rtype: None\n \"\"\"\n self.in_stack.append(x)\n \n def pop(self):\n \"\"\"\n :rtype: int\n \"\"\"\n if not self.out_stack:\n while self.in_stack:\n self.out_stack.append(self.in_stack.pop())\n return self.out_stack.pop()\n \n def peek(self):\n \"\"\"\n :rtype: int\n \"\"\"\n if not self.out_stack:\n while self.in_stack:\n self.out_stack.append(self.in_stack.pop())\n return self.out_stack[-1]\n \n def empty(self):\n \"\"\"\n :rtype: bool\n \"\"\"\n return not (self.in_stack + self.out_stack)\n```\n時間複雜度:O(1) (Amortized)\n\n空間複雜度:O(N)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3096165781","body":"思維:\n1. 空串列直接回傳\n2. 先計算鏈結長度 length\n3. 把 k 對 length 取餘,因為旋轉 length 次等於沒動\n4. 用兩個指針 slow 和 fast 找到新的頭 new_head 的位置\n5. 將鏈結斷開重新連接,完成旋轉\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode(object):\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution(object):\n def rotateRight(self, head, k):\n \"\"\"\n :type head: Optional[ListNode]\n :type k: int\n :rtype: Optional[ListNode]\n \"\"\"\n if not head: \n return head\n\n length = 1\n temp = head\n while temp.next:\n length += 1\n temp = temp.next\n\n slow, fast = head, head\n for _ in range(k % length):\n if fast.next:\n fast = fast.next\n else:\n fast = head\n\n if slow == fast: \n return head\n\n while fast.next:\n slow = slow.next\n fast = fast.next\n\n new_head = slow.next\n slow.next = None\n fast.next = head\n return new_head\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100848058","body":"思維:先處理無需交換的情況,透過一個 dummy 節點統一處理頭節點與後續節點的交換邏輯,每次迴圈交換一對相鄰節點,並用 pre 將已處理區與未處理區銜接起來,最後回傳 dummy 的下一個節點作為新鏈表的頭\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:\n if not head or not head.next:\n return head\n\n left = head\n right = head.next\n dummy = ListNode(None, head)\n pre = dummy\n while right:\n left.next = right.next\n right.next = left\n pre.next = right\n pre = left\n left = left.next\n right = left.next if left else None\n\n return dummy.next\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109165432","body":"思維:有想到要計算遞迴的中心點,但一開始解不出來,參考官方題解的思路加上畫圖後思路有比較清晰\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode(object):\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\n# Definition for a binary tree node.\n# class TreeNode(object):\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution(object):\n def sortedListToBST(self, head):\n \"\"\"\n :type head: Optional[ListNode]\n :rtype: Optional[TreeNode]\n \"\"\"\n if not head:\n return head\n\n pre, slow, fast = None, head, head\n while fast and fast.next:\n fast = fast.next.next\n pre = slow\n slow = slow.next\n if pre:\n pre.next = None\n\n node = TreeNode(slow.val)\n if slow == fast:\n return node\n \n node.left = self.sortedListToBST(head)\n node.right = self.sortedListToBST(slow.next)\n return node\n```\n時間複雜度:O(NlogN)\n\n空間複雜度:O(logN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112948103","body":"思維:\n1. 使用兩個指標 a 和 b,分別從 headA 和 headB 開始走。\n2. 每當指標走到自己 linked list 的結尾時,跳到另一條 linked list 的頭部繼續走。\n3. 最終:
\n a. 若兩條 list 有交點,a 和 b 會在同一個節點交會(因為走過的總長度相同)。
\n b. 若沒有交點,a 和 b 都會變成 None,同時結束迴圈。\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, x):\n# self.val = x\n# self.next = None\n\nclass Solution:\n def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:\n a, b = headA, headB\n a_switch, b_switch = False, False\n \n while a and b:\n if a == b:\n return a\n\n a = a.next if a.next else None\n if not a and not a_switch:\n a = headB\n a_switch = True\n \n b = b.next if b.next else None\n if not b and not b_switch:\n b = headA\n b_switch = True\n\n return None\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3114228960","body":"思維:使用快慢指針來偵測是否有環存在,若有找到相遇點的話,把 fast 指針重新指向 head 後找環的起點,兩個指針 slow 和 fast 都改成一次走一步,再次相遇時就是環的起始節點\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, x):\n# self.val = x\n# self.next = None\n\nclass Solution:\n def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:\n if not head or not head.next:\n return None\n\n slow, fast = head, head\n while fast:\n slow = slow.next\n fast = fast.next.next if fast.next else None\n if slow and slow == fast:\n fast = head \n while fast != slow:\n fast = fast.next\n slow = slow.next\n return fast\n\n return None\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3122031171","body":"思維:使用雙向鏈表搭配 Hash Map 實作 LRU Cache,讓每次的 get 和 put 操作都能在 O(1) 時間內完成。最近使用的節點會被移到鏈表頭部,當容量超過時,就從尾部刪除最久未使用的節點。\n\n代碼:\n```python\nclass ListNode:\n def __init__(self, key, value):\n self.key = key\n self.val = value\n self.next = None\n self.pre = None\n\nclass LRUCache:\n def __init__(self, capacity: int):\n self.capacity = capacity\n self.length = 0\n self.head = ListNode(None, None)\n self.tail = ListNode(None, None)\n self.head.next = self.tail\n self.tail.pre = self.head\n self.map = {}\n\n def _add_to_head(self, key: int, value: int):\n node = ListNode(key, value)\n node.next = self.head.next\n self.head.next = node\n node.next.pre = node\n node.pre = self.head\n self.map[key] = node\n self.length += 1\n\n def _remove_from_tail(self, key: int):\n remove_key = self.tail.pre.key\n self.tail.pre = self.tail.pre.pre\n self.tail.pre.next = self.tail\n self.map.pop(remove_key)\n self.length -= 1\n\n def _move_node_to_head(self, node: ListNode):\n node.pre.next = node.next\n node.next.pre = node.pre\n self.head.next.pre = node\n node.pre = self.head\n node.next = self.head.next\n self.head.next = node\n \n def get(self, key: int) -> int:\n if key in self.map:\n node = self.map[key]\n self._move_node_to_head(node)\n return self.map[key].val\n return -1\n \n def put(self, key: int, value: int) -> None:\n node = self.map.get(key)\n if node:\n self._move_node_to_head(node)\n node.val = value\n else:\n if self.length >= self.capacity:\n self._remove_from_tail(key) \n self._add_to_head(key, value)\n```\n時間複雜度:O(1)\n\n空間複雜度:O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124493359","body":"思維:DFS,透過遞迴分別計算左右子樹的最大深度,然後回傳較大的一邊再加 1(代表當前節點這一層),最終得到整棵樹的最大深度。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def maxDepth(self, root: Optional[TreeNode]) -> int:\n if not root:\n return 0\n return max(self.maxDepth(root.left), self.maxDepth(root.right))+1\n```\n時間複雜度:O(N)\n\n空間複雜度:O(h) (max depth of tree)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3127762191","body":"思維:DFS,透過遞歸比對兩棵樹的每個對應節點是否完全一樣,一層層往下檢查,直到整棵樹都比對完或中途不符合就結束。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:\n if not p and not q:\n return True\n \n if p and q and p.val == q.val:\n res_left = self.isSameTree(p.left, q.left)\n res_right = self.isSameTree(p.right, q.right)\n return res_left and res_right\n\n return False\n```\n時間複雜度:O(N)\n\n空間複雜度:O(h) (max depth of tree)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3133090654","body":"思維:DFS,透過遞歸保存當前數字的狀態,每走到下一層就把目前的 current_num 乘上 10 再加上當前節點的值,當走到葉子節點時就可以回傳目前這條路徑的數字,最後把左右子樹的 dfs 結果加總起來。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def sumNumbers(self, root: Optional[TreeNode]) -> int:\n def dfs(node, current_num):\n if not node:\n return 0\n current_num = current_num * 10 + node.val\n if not node.left and not node.right:\n return current_num\n return dfs(node.left, current_num) + dfs(node.right, current_num)\n return dfs(root, 0)\n```\n時間複雜度:O(N)\n\n空間複雜度:O(d) (max depth of tree)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3135855226","body":"思維一:BFS,使用廣度優先搜尋一層層遍歷二元樹節點,並記錄每一層最先遇到的節點。每當進入新的一層,就更新目前儲存的節點為該層最左側的節點。最終回傳的是最底層最左邊那個節點的值。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n q = deque()\n res = (root,0)\n q.append((root,0))\n while q:\n node, level = q.popleft()\n cur_level = res[1]\n if level > cur_level:\n res = (node, level)\n\n if node.left:\n q.append((node.left, level+1))\n if node.right:\n q.append((node.right, level+1))\n\n return res[0].val\n```\n\n時間複雜度:O(N)\n\n空間複雜度:O(w) (max width of tree)\n\n---------\n思維二:DFS,使用深度優先搜尋遍歷整顆樹,每當遇到更深層的節點,就更新目前記錄的最左邊節點值,最終返回的是整棵樹最深層最左邊的節點值。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n def dfs(node, cur_depth, leftmost, depthest):\n if cur_depth > depthest:\n leftmost = node.val\n depthest = cur_depth\n\n if node.left:\n leftmost, depthest = dfs(node.left, cur_depth+1, leftmost, depthest)\n if node.right:\n leftmost, depthest = dfs(node.right, cur_depth+1, leftmost, depthest)\n return leftmost, depthest\n\n leftmost, depthest = dfs(root, 1, root.val, 1)\n return leftmost\n```\n\n時間複雜度:O(N)\n\n空間複雜度:O(h) (max height of tree)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3140470104","body":"思維一:DFS
\nserialize: 使用 前序遍歷(DFS) 將樹的結構與節點值轉成 list,再轉為 JSON 字串,None 用來記錄空節點保證可逆。
\ndeserialize: 根據前序順序,遇到 None 表示空節點,遞迴還原出整棵樹的結構。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode(object):\n# def __init__(self, x):\n# self.val = x\n# self.left = None\n# self.right = None\n\nclass Codec:\n\n def serialize(self, root):\n \"\"\"Encodes a tree to a single string.\n \n :type root: TreeNode\n :rtype: str\n \"\"\"\n res = []\n def dfs(node):\n if not node:\n res.append(None)\n return\n\n res.append(node.val)\n dfs(node.left)\n dfs(node.right)\n\n dfs(root)\n return json.dumps(res)\n\n def deserialize(self, data):\n \"\"\"Decodes your encoded data to tree.\n \n :type data: str\n :rtype: TreeNode\n \"\"\"\n data = deque(json.loads(data))\n def dfs(data):\n val = data.popleft()\n if val is None:\n return\n\n node = TreeNode(val)\n node.left = dfs(data)\n node.right = dfs(data)\n return node\n \n return dfs(data)\n\n# Your Codec object will be instantiated and called as such:\n# ser = Codec()\n# deser = Codec()\n# ans = deser.deserialize(ser.serialize(root))\n```\n\n時間複雜度:O(N)
\n空間複雜度:O(N)\n\n-----------------\n\n思維二:BFS
\nserialize:利用 BFS(層序遍歷)將每層節點值與空位(None)一起寫入 list,最後轉成 JSON 字串。
\ndeserialize:讀回字串後同樣使用 BFS,按順序建立節點並接上左右子節點,重建出原始二叉樹。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode(object):\n# def __init__(self, x):\n# self.val = x\n# self.left = None\n# self.right = None\n\nclass Codec:\n\n def serialize(self, root):\n \"\"\"Encodes a tree to a single string.\n \n :type root: TreeNode\n :rtype: str\n \"\"\"\n res = []\n queue = deque([root])\n while queue:\n node = queue.popleft()\n if node:\n res.append(node.val)\n queue.append(node.left)\n queue.append(node.right)\n else:\n res.append(None)\n\n return json.dumps(res)\n\n def deserialize(self, data):\n \"\"\"Decodes your encoded data to tree.\n \n :type data: str\n :rtype: TreeNode\n \"\"\"\n data = deque(json.loads(data))\n root_val = data.popleft()\n if root_val is None:\n return None\n \n root = TreeNode(root_val)\n queue = deque([root])\n while queue:\n node = queue.popleft()\n if data:\n left_val = data.popleft()\n right_val = data.popleft()\n if left_val is not None:\n left_node = TreeNode(left_val)\n node.left = left_node\n queue.append(left_node)\n if right_val is not None:\n right_node = TreeNode(right_val)\n node.right = right_node\n queue.append(right_node)\n\n return root\n\n# Your Codec object will be instantiated and called as such:\n# ser = Codec()\n# deser = Codec()\n# ans = deser.deserialize(ser.serialize(root))\n```\n\n時間複雜度:O(N)
\n空間複雜度:O(N)","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3148593193","body":"思維:\n1. 對每個點 i 當作中心,計算它與所有其他點的距離\n2. 用 distance_map 統計,有多少個點與 i 的距離相同(也就是距離為 d 的點出現了幾次)\n3. 如果某個距離出現了 count 次(基本上就是超過一次的次數才會被納入計算),就能組出 count * (count - 1) 種 (j, k) boomerang(因為 (j, k), (k, j) 視為兩種組合,(count - 1) 為要扣掉已經放在前一個位置的元素)\n4. 最後把所有距離的組合數加總起來即可\n\n代碼:\n```python\nclass Solution:\n def numberOfBoomerangs(self, points: List[List[int]]) -> int:\n res = 0\n for i, x in enumerate(points):\n distance_map = defaultdict(int)\n for j, y in enumerate(points):\n if i != j:\n distance_map[(y[0] - x[0])**2 + (y[1] - x[1])**2] += 1\n\n for count in distance_map.values():\n res += count * (count-1)\n\n return res\n```\n時間複雜度:O(N^2)\n\n空間複雜度:O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3153175756","body":"思維:\n1. 使用雙指針 left 和 right 維護一個「不含重複字元的滑動視窗」\n2. 不斷將 right 指向的字元加入 seen\n3. 一旦發現重複字元,就從 left 開始依序從 seen 移除字元,直到這個重複字元被清掉\n4. 每次 right 移動後,更新視窗大小 right - left,維護一個最大值 max_str\n\n代碼:\n```python\nclass Solution:\n def lengthOfLongestSubstring(self, s: str) -> int:\n max_str = 0\n left = 0\n right = 0\n seen = set()\n while right < len(s):\n while s[right] in seen:\n seen.remove(s[left])\n left += 1\n seen.add(s[right])\n right += 1\n max_str = max(max_str, right-left)\n return max_str\n```\n時間複雜度:O(N)\n\n空間複雜度:O(k) (k for number of character types)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3160705635","body":"思維:\n1. 多組偏移掃描:使用 i in range(word_len) 對字串做「分組」掃描,防止錯過合法起始點\n2. 滑動視窗掃描:每次從 j 開始擷取一個單字(長度 word_len),如果這個字在 words 裡,放進 window_counter,若某個單字超出次數,移動 left(左指針)來縮小視窗,如果視窗內剛好有 word_count 個單字,加入結果\n3. 如果不是合法單字,清空 window_counter,重設 count 和 left(下一次從這個位置繼續)\n\n代碼:\n```python\nclass Solution:\n def findSubstring(self, s: str, words: List[str]) -> List[int]:\n word_len = len(words[0])\n word_count = len(words)\n total_len = word_len * word_count\n target_counter = Counter(words)\n res = []\n\n for i in range(word_len):\n left = i\n window_counter = Counter()\n count = 0\n\n for j in range(i, len(s) - word_len + 1, word_len):\n word = s[j:j+word_len]\n if word in target_counter:\n window_counter[word] += 1\n count += 1\n\n while window_counter[word] > target_counter[word]:\n left_word = s[left:left+word_len]\n window_counter[left_word] -= 1\n count -= 1\n left += word_len\n\n if count == word_count:\n res.append(left)\n\n else:\n window_counter.clear()\n count = 0\n left = j + word_len\n\n return res\n```\n時間複雜度:O(N × W) (N is length of s, W is length of words)\n\n空間複雜度:O(W)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3166506559","body":"思維:使用快慢指標 (two pointers) 技巧,設兩個指標 slow 和 fast 同時指向鏈表頭,每次 slow 走一步、fast 走兩步,當 fast 到達鏈表尾時,slow 正好在中間節點。\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:\n slow = fast = head\n while fast and fast.next:\n slow = slow.next\n fast = fast.next.next\n\n return slow \n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172494360","body":"思維:使用雙指針來實行二分搜尋法,設定左右邊界取中間位置\n1. 如果 nums[mid] == target,直接回傳 mid(找到目標)。\n2. 如果 nums[mid] > target,代表目標在左半邊,更新 right = mid - 1。\n3. 如果 nums[mid] < target,代表目標在右半邊,更新 left = mid + 1。\n4. 迴圈結束後(left > right),left 就是目標應插入的位置。\n\n代碼:\n```python\nclass Solution:\n def searchInsert(self, nums: List[int], target: int) -> int:\n left = 0\n right = len(nums)-1\n while left <= right:\n mid = (left+right)//2\n if nums[mid] == target:\n return mid\n elif nums[mid] > target:\n right = mid-1\n else:\n left = mid+1\n return left\n```\n時間複雜度:O(logN)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173687770","body":"思維:使用單調遞減隊列來維護視窗內最大值的 index\n1. 前 k 個元素先初始化隊列:維持隊列的遞減性,每次新來的元素會移除尾部比它小的元素,q[0] 永遠是最大值的 index\n2. 接下來從 k 到結尾,維持單調性並移除過期元素:新元素進來時維持單調隊列,移除滑出視窗的 index,每次把 nums[q[0]](視窗最大值)加入結果\n\n代碼:\n```python\nclass Solution:\n def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:\n res = []\n q = deque()\n for i in range(k):\n while q and nums[q[-1]] < nums[i]:\n q.pop()\n q.append(i)\n res.append(nums[q[0]])\n\n for i in range(k, len(nums)):\n while q and nums[q[-1]] < nums[i]:\n q.pop()\n q.append(i)\n while q[0] <= i-k:\n q.popleft()\n res.append(nums[q[0]])\n\n return res\n```\n時間複雜度:O(N)\n\n空間複雜度:O(k)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3178842909","body":"思維:\n1. 使用兩個表分別紀錄信任他人及被信任的計數\n2. 之後尋找一個人 x,滿足:trusted_tables[x] == n - 1(被其他人信任)以及 trust_tables[x] == 0:(自己沒信任任何人)\n3. 若找到這樣的人,回傳他的編號;否則回傳 -1\n\n代碼:\n```python\nclass Solution:\n def findJudge(self, n: int, trust: List[List[int]]) -> int:\n if n == 1:\n return 1\n\n trust_tables = defaultdict(int)\n trusted_tables = defaultdict(int)\n for [trust_a, trust_b] in trust:\n trust_tables[trust_a] += 1\n trusted_tables[trust_b] += 1\n\n for trusted_person, trusted_ticket in trusted_tables.items():\n if trusted_ticket == n-1 and trust_tables[trusted_person] == 0:\n return trusted_person\n return -1\n```\n時間複雜度:O(N)\n\n空間複雜度:O(N)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3188960333","body":"思維:\n1. 把沒群組的 item 分配新的唯一群組:這樣後面只需處理群組 id,不用特別分支處理 -1。\n2. 建立 item graph:由 prev -> curr(prev 必須在 curr 前面)。\n3. 建立 group graph:當 prev 與 curr 屬不同群組時,建立 g_prev -> g_curr 的依賴邊;用 set 避免重複邊。\n4. 對 group graph 做拓撲排序:得出 group 的一個合法順序;若有 cycle,無解回 []。\n5. 對 item graph 做拓撲排序:得出 items 在全域上的合法相對順序(若有 cycle,無解回 [])。\n6. 把 items 按 item_order 分桶到對應 group,再按 group_order 串接:同 group items 會連在一起且保持 item 之間的依賴。\n\n代碼:\n```python\nclass Solution:\n def sortItems(self, n: int, m: int, group: List[int], beforeItems: List[List[int]]) -> List[int]:\n new_group_id = m\n for i in range(n):\n if group[i] == -1:\n group[i] = new_group_id\n new_group_id += 1\n total_groups = new_group_id\n\n item_adj = [[] for _ in range(n)]\n item_indeg = [0] * n\n\n group_adj = [[] for _ in range(total_groups)]\n group_indeg = [0] * total_groups\n\n added_group_edges = set()\n\n for curr in range(n):\n for prev in beforeItems[curr]:\n item_adj[prev].append(curr)\n item_indeg[curr] += 1\n\n g_prev = group[prev]\n g_curr = group[curr]\n if g_prev != g_curr:\n if (g_prev, g_curr) not in added_group_edges:\n added_group_edges.add((g_prev, g_curr))\n group_adj[g_prev].append(g_curr)\n group_indeg[g_curr] += 1\n\n def topo_sort(num_nodes, adj, indeg):\n q = deque([i for i in range(num_nodes) if indeg[i] == 0])\n order = []\n while q:\n u = q.popleft()\n order.append(u)\n for v in adj[u]:\n indeg[v] -= 1\n if indeg[v] == 0:\n q.append(v)\n if len(order) == num_nodes:\n return order\n else:\n return []\n\n group_order = topo_sort(total_groups, group_adj, group_indeg[:])\n if not group_order:\n return []\n\n item_order = topo_sort(n, item_adj, item_indeg[:])\n if not item_order:\n return []\n\n items_by_group = defaultdict(list)\n for item in item_order:\n items_by_group[group[item]].append(item)\n\n result = []\n for g in group_order:\n result.extend(items_by_group[g])\n\n return result\n```\n時間複雜度:O(n + E)\n\n空間複雜度:O(n + m + E)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3191064414","body":"思維:依照題意模擬路徑\n\n代碼:\n```python\nclass Solution:\n def judgeCircle(self, moves: str) -> bool:\n spot = [0, 0]\n for move in moves:\n if move == 'R':\n spot[0] += 1\n elif move == 'L':\n spot[0] -= 1\n elif move == 'U':\n spot[1] += 1\n else:\n spot[1] -= 1\n \n return spot == [0, 0]\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194164140","body":"思維:\n1. 解析登入、登出時間(時、分),如果登出時間早於登入時間,代表跨過午夜就加 24 小時。\n2. 重新計算登入時間:向上取整到最近的 15 分鐘倍數(因為要等到下一個完整的 15 分鐘才算開始一局)。\n3. 重新計算登出時間:向下取整到最近的 15 分鐘倍數(因為超過的部分不算完整一局)。\n4. 計算完整局數,如果結果為負數則返回 0。\n\n這裡用 (logout_hour-login_hour)*4 - login_minute/15 + logout_minute/15 直接換算成以「15 分鐘為單位」的差距。\n\n代碼:\n```python\nclass Solution:\n def numberOfRounds(self, loginTime: str, logoutTime: str) -> int:\n login_hour, login_minute = map(int, loginTime.split(':'))\n logout_hour, logout_minute = map(int, logoutTime.split(':'))\n if logout_hour < login_hour or logout_hour == login_hour and logout_minute < login_minute:\n logout_hour += 24\n\n login_hour, login_minute = self.narrow_down_time(login_hour, login_minute, True)\n logout_hour, logout_minute = self.narrow_down_time(logout_hour, logout_minute, False)\n\n return max(0, int((logout_hour-login_hour)*4 - login_minute/15 + logout_minute/15))\n\n def narrow_down_time(self, login_hour: int, login_minute: int, is_login: bool):\n if is_login:\n login_minute = ceil(login_minute/15) * 15\n if login_minute == 60:\n login_hour += 1\n login_minute = 0\n else:\n login_minute = floor(login_minute/15) * 15\n\n return login_hour, login_minute\n```\n時間複雜度:O(1)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3196258303","body":"思維:\n1. 函式 compare_less(a_counter, b_counter):模擬條件 1、2,對所有可能分界點 ch(從 'b' 到 'z')進行遍歷
\n讓 a 的所有字母 < ch,讓 b 的所有字母 ≥ ch,使用 prefix sum 避免重複運算,計算出最少需要修改的字元數\n2. 函式 compare_distinct(a_counter, b_counter):模擬條件 3,讓兩字串變成同一種字母
\n對所有字母出現次數總和 Counter 做合併,找出現次數最多的字母後,將其餘字母通通改成這個字母,修改次數 = 總數量 - 該字母出現次數\n3. 分別計算三個條件需要的修改次數,回傳三者中的最小值\n\n代碼:\n```python\nclass Solution:\n def minCharacters(self, a: str, b: str) -> int:\n a_counter = Counter(ord(ch) for ch in a)\n b_counter = Counter(ord(ch) for ch in b)\n\n goal_a = self.compare_less(a_counter, b_counter)\n goal_b = self.compare_less(b_counter, a_counter)\n goal_c = self.compare_distinct(a_counter, b_counter)\n return min(goal_a, goal_b, goal_c)\n\n def compare_less(self, a_counter, b_counter):\n a_freq = [0] * 26\n b_freq = [0] * 26\n for k, v in a_counter.items():\n a_freq[k - ord('a')] = v\n for k, v in b_counter.items():\n b_freq[k - ord('a')] = v\n\n a_prefix = list(itertools.accumulate(a_freq))\n b_prefix = list(itertools.accumulate(b_freq))\n move = float('inf')\n for ch in range(1, 26):\n move_a = a_prefix[25] - a_prefix[ch-1]\n move_b = b_prefix[ch-1]\n move = min(move, move_a + move_b)\n return move\n\n def compare_distinct(self, a_counter, b_counter):\n all_counter = a_counter + b_counter\n most_key = max(all_counter, key=all_counter.get)\n total = sum(all_counter.values())\n return total - all_counter[most_key]\n```\n時間複雜度:O(n+m)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3201266614","body":"思維:先把所有數字用 heappush 丟進最小堆,維護「父節點 ≤ 子節點」,接著每次 heappop 拿走堆頂(最小值),直到堆空,收集出來的數列 res 就是升序排序。\n\n代碼:\n```python\nclass Solution:\n def sortArray(self, nums: List[int]) -> List[int]:\n min_heap = []\n res = []\n for num in nums:\n self.heappush(min_heap, num)\n\n while min_heap:\n res.append(self.heappop(min_heap))\n\n return res\n \n def heappush(self, h, x):\n h.append(x)\n i = len(h)-1\n\n while i > 0:\n p = (i - 1) // 2\n if h[i] < h[p]:\n h[i], h[p] = h[p], h[i]\n i = p\n else:\n break\n\n def heappop(self, h):\n last = h.pop()\n if not h:\n return last\n root = h[0]\n h[0] = last\n i = 0\n n = len(h)\n while True:\n left = 2*i + 1\n right = 2*i + 2\n if left >= n:\n break\n\n child = left\n if right < n and h[right] < h[left]:\n child = right\n if h[child] < h[i]:\n h[i], h[child] = h[child], h[i]\n i = child\n else:\n break\n return root\n```\n時間複雜度:O(n log n)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204542831","body":"思維:使用二分搜尋法,對於 x ≥ 2 的情況,設定搜尋範圍為 [1, x // 2],如果 mid^2 太大,就向左縮小範圍,如果太小,就向右移動範圍,當搜尋結束(left > right)時,right 就是最接近但不超過 √x 的整數\n\n代碼:\n```python\nclass Solution:\n def mySqrt(self, x: int) -> int:\n if x < 2:\n return x\n \n left, right = 1, x // 2\n while left <= right:\n mid = (left + right) // 2\n if mid * mid == x:\n return mid\n elif mid * mid > x:\n right = mid - 1\n else:\n left = mid + 1\n\n return right\n```\n時間複雜度:O(log x)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3211104911","body":"思維:使用二分搜尋法,如果 mid 是壞的:可能是答案,但還要往左找,right = mid - 1,如果 mid 是好的:答案一定在右邊,left = mid + 1,最後 left 會停在第一個壞版本的位置。\n\n代碼:\n```python\nclass Solution:\n def firstBadVersion(self, n: int) -> int:\n left, right = 1, n\n while left <= right:\n mid = (left + right) // 2\n if isBadVersion(mid):\n right = mid - 1\n else:\n left = mid + 1\n return left\n```\n時間複雜度:O(log n)\n\n空間複雜度:O(1)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3216087383","body":"思維:\n1. 先對加熱器位置排序,才能用二分搜尋快速找到每個房子最近的加熱器\n2. 遍歷每個房子,使用二分搜尋找到第一個 heaters[mid] 大於等於當前 house 的位置(也就是最接近右邊的加熱器)\n3. 再往回看一個位置 heaters[r],也就是最接近左邊的加熱器\n4. 比較左右加熱器距離,選擇較小者\n5. 更新最大加熱半徑(最小距離中的最大值)\n\n代碼:\n```python\nclass Solution:\n def findRadius(self, houses: List[int], heaters: List[int]) -> int:\n res = 0\n heaters.sort()\n \n for house in houses:\n l, r = 0, len(heaters) - 1\n while l <= r:\n mid = (l + r) // 2\n if house <= heaters[mid]:\n r = mid - 1\n else:\n l = mid + 1\n\n l_res, r_res = inf, inf\n if 0 <= l <= len(heaters)-1:\n l_res = abs(heaters[l] - house)\n if 0 <= r <= len(heaters)-1:\n r_res = abs(heaters[r] - house)\n\n res = max(res, min(l_res, r_res))\n\n return res\n```\n時間複雜度:O(M log M + N log M) (M for length of heaters, N for length of houses)\n\n空間複雜度:O(1)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3223499698","body":"思維:先初始化前 k 個字元中有多少母音,用滑動視窗維持長度為 k 的區間往右滑動,每次移動一格,視窗左邊出去一個字元、右邊進來一個字元,如果左邊移出的是母音即減 1,如果右邊移入的是母音即加 1,並且更新最大值,直到滑到最後一格為止\n\n代碼:\n```python\nclass Solution:\n def maxVowels(self, s: str, k: int) -> int:\n vowels = set('aeiou')\n count = sum(1 for c in s[:k] if c in vowels)\n max_count = count\n\n for i in range(k, len(s)):\n if s[i-k] in vowels:\n count -= 1\n if s[i] in vowels:\n count += 1\n max_count = max(max_count, count)\n\n return max_count\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3227824002","body":"思維:\n1. 邊界判斷:若 k == 0,不會抽牌,分數永遠是 0,且一定 ≤ n,直接回傳 1.0。若 n ≥ k + maxPts - 1,最多只能拿到 k - 1 + maxPts 分,而這些都 ≤ n,直接回傳 1.0\n2. 初始化:建立一個長度 n + 1 的 dp 陣列,dp[i] 表示拿到 i 分的機率,設定 dp[0] = 1.0(初始在 0 分),window_sum = 1.0 表示 dp[0] 的值,res = 0.0,用來累加最終結果(分數 ≥ k 的機率)\n3. 進入迴圈,從 i = 1 到 n:使用滑動視窗平均法計算 dp[i] = window_sum / maxPts,如果 i < k 代表還會繼續抽牌 → 將 dp[i] 加入 window_sum,影響後續機率,如果 i ≥ k,代表不能再抽牌了 → 將 dp[i] 加入 res,因為這是可能的最終分數\n4. 維護滑動視窗:若 i - maxPts ≥ 0,將前方的 dp[i - maxPts] 從 window_sum 中扣除,保持視窗大小為 maxPts\n5. 迴圈結束後,回傳累積的結果:回傳 res,即所有停在 k 到 n 分的總機率\n\n代碼:\n```python\nclass Solution:\n def new21Game(self, n: int, k: int, maxPts: int) -> float:\n if k == 0 or n >= k + maxPts - 1:\n return 1\n \n dp = [0.0] * (n + 1)\n dp[0] = 1.0\n window_sum = 1.0\n res = 0.0\n\n for i in range(1, n + 1):\n dp[i] = window_sum / maxPts\n if i < k:\n window_sum += dp[i]\n else:\n res += dp[i]\n\n if i - maxPts >= 0:\n window_sum -= dp[i-maxPts]\n\n return res\n```\n\n時間複雜度:O(N)\n\n空間複雜度:O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3232431244","body":"思維:透過固定長度為 len(p) 的滑動視窗掃過整個字串 s,用 Counter 統計當前視窗的字元分佈\n1. 初始化兩個 Counter:target 記錄 p 的字元分佈,cur 動態維護視窗內的字元分佈\n2. 向右移動右指標 r 更新 cur,每次移動後如果 cur == target,代表此視窗是一個 anagram,res 加入 l\n3. 視窗長度若達到 len(p),就縮左邊,如果左邊的字元也在 p 中,從 cur 中減一,移動左指標 l,確保視窗長度維持為 len(p)\n\n代碼:\n```python\nclass Solution:\n def findAnagrams(self, s: str, p: str) -> List[int]:\n res = []\n target = Counter(p)\n cur = Counter()\n l, r = 0, 0\n\n while r < len(s):\n if s[r] in p:\n cur[s[r]] += 1\n \n if cur == target:\n res.append(l)\n\n r += 1\n if r - l >= len(p):\n if s[l] in p:\n cur[s[l]] -= 1\n l += 1\n\n return res\n```\n時間複雜度:O(N)\n\n空間複雜度:O(k)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3235535873","body":"思維:\n1. 使用 target 記錄 t 中每個字元需要出現幾次,required 為需要達成的字元種類數,formed 表示目前有多少種字元達到目標需求\n2. 用滑動視窗 [l, r] 掃過 s\n3. 視窗內使用 cur 統計目前出現的字元次數\n4. 每當 formed == required(即目前視窗內已滿足所有字元需求),就嘗試更新最短子字串\n5. 然後移動左指標 l,直到不再滿足條件,再往右擴張 r\n\n代碼:\n```python\nclass Solution:\n def minWindow(self, s: str, t: str) -> str:\n if not s or not t or len(t) > len(s):\n return ''\n\n res = ''\n target = Counter(t)\n cur = Counter()\n required = len(target)\n formed = 0\n l = 0\n\n for r in range(len(s)):\n char = s[r]\n if char in target:\n cur[char] += 1\n if cur[char] == target[char]:\n formed += 1\n\n while formed == required:\n window = s[l:r+1]\n if not res or len(window) < len(res):\n res = window\n\n if s[l] in target:\n cur[s[l]] -= 1\n if cur[s[l]] < target[s[l]]:\n formed -= 1\n l += 1\n\n return res\n```\n時間複雜度:O(N)\n\n空間複雜度:O(N)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3241211135","body":"思維:\n1. 每一層遞迴代表一個 row(橫列),每一層嘗試在該 row 的每一個 col(直行)上放一個 Q\n2. 使用三個集合記錄不能放的位置(剪枝):used_cols:欄位不能重複、used_diag1:↘ 對角線(row - col)不能重複、used_diag2:↙ 對角線(row + col)不能重複\n3. 如果當前格子合法:將當前 col 與對角線加入對應集合,進入下一 row 繼續放皇后\n4. 如果成功放到第 n 行,代表一種合法放法,count += 1\n5. 每個回合結束後回溯:移除當前狀態,嘗試下一個 col\n\n代碼:\n```python\nclass Solution:\n def totalNQueens(self, n: int) -> int:\n count = 0\n\n def backtracking(row, used_cols, used_diag1, used_diag2):\n if row == n:\n nonlocal count \n count += 1\n return\n\n for col in range(n):\n if col in used_cols or row - col in used_diag1 or row + col in used_diag2:\n continue\n \n used_cols.add(col)\n used_diag1.add(row - col)\n used_diag2.add(row + col)\n\n backtracking(row + 1, used_cols, used_diag1, used_diag2)\n\n used_cols.remove(col)\n used_diag1.remove(row - col)\n used_diag2.remove(row + col)\n\n backtracking(0, set(), set(), set())\n\n return count\n```\n時間複雜度:O(n!)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3244207256","body":"思維:深度優先搜尋(DFS)\n1. 初始化變數: seen 避免重複拜訪相同格子、max_area記錄最大島嶼面積\n2. 走過整張地圖: 雙層 for loop,遍歷每一格 (i, j)\n3. 找到新的島嶼起點就 DFS: 如果是還沒拜訪過的陸地,就從這裡開始 DFS,算面積,回傳面積後更新 max_area\n4. DFS 拜訪所有相連陸地: 每次進來的 (row, col) 都會標記為已拜訪,area = 1 表示這一格自己先算進面積\n5. 遞迴搜尋上下左右的相連格子: 檢查鄰近 4 格是否可以繼續走,遞迴地累加 area\n6. DFS 結束後回傳這座島的面積\n\n代碼:\n```python\nclass Solution:\n direction = [(1, 0), (-1, 0), (0, 1), (0, -1)]\n\n def maxAreaOfIsland(self, grid: List[List[int]]) -> int:\n seen = set()\n max_area = 0\n for i in range(len(grid)):\n for j in range(len(grid[0])):\n if grid[i][j] == 1 and (i, j) not in seen:\n area = self.dfs(i, j, seen, grid)\n max_area = max(max_area, area)\n \n return max_area\n\n def dfs(self, row, col, seen, grid):\n seen.add((row, col))\n area = 1\n for dx, dy in self.direction:\n x, y = row + dx, col + dy\n if 0 <= x < len(grid) and 0 <= y < len(grid[0]) and grid[x][y] == 1 and (x, y) not in seen:\n area += self.dfs(x, y, seen, grid)\n \n return area\n```\n時間複雜度:O(m × n)\n\n空間複雜度:O(m × n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3249687017","body":"思維:多源 BFS\n1. 把所有的陸地格(值為 1)當作起點,加入 queue 中\n2. 先判斷若陸地為空(全是水)或全是陸地,回傳 -1\n3. BFS 擴展每一層水格:每次從 queue 拿一個格子出來,對四個方向進行探索,如果是水(值為 0),就更新它為「距離 = 前一格 + 1」,並將它加入 queue,等下繼續擴展\n4. 最後回傳最大距離 -1:因為初始的陸地值是 1,所以水格的距離是從 2 開始計算,因此真正的距離 = 格子值 - 1\n\n代碼:\n```python\nclass Solution:\n def maxDistance(self, grid: List[List[int]]) -> int:\n q = deque()\n for i in range(len(grid)):\n for j in range(len(grid[0])):\n if grid[i][j] == 1:\n q.append((i, j))\n \n if not q or len(q) == len(grid) * len(grid):\n return -1\n\n directions = [(0, 1), (0, -1), (1, 0), (-1, 0)]\n max_dist = 0\n while q:\n x, y = q.popleft()\n for dx, dy in directions:\n nx = x + dx\n ny = y + dy\n if 0 <= nx < len(grid) and 0 <= ny < len(grid[0]) and grid[nx][ny] == 0:\n grid[nx][ny] = grid[x][y] + 1\n q.append((nx, ny))\n max_dist = max(max_dist, grid[nx][ny])\n\n return max_dist - 1\n```\n時間複雜度:O(n^2)\n\n空間複雜度:O(n^2)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3251575584","body":"思維:\n1. 把初始擁有箱子(initialBoxes)能打開的箱子(status = 1)加入 queue\n2. 使用 queue 處理可以打開的箱子,如果已經處理過的話則跳過\n3. 開箱拿糖果後,處理新拿到的箱子鑰匙,把鑰匙對應到已擁有且未開啟過的 box 加入 queue\n4. 處理新拿到的箱子,如果箱子可以直接打開或擁有鑰匙就加進 queue,否則放進 own_boxes 等待日後有拿到 key 再打開\n5. 整個流程直到 queue 為空,表示目前已經沒能力再開更多箱子了,回傳總糖果數量\n\n代碼:\n```python\nclass Solution:\n def maxCandies(self, status: List[int], candies: List[int], keys: List[List[int]], containedBoxes: List[List[int]], initialBoxes: List[int]) -> int:\n own_boxes = set(initialBoxes)\n own_keys = set()\n visited = set()\n q = deque()\n total_candies = 0\n\n for box in initialBoxes:\n if status[box] == 1:\n q.append(box)\n \n while q:\n box = q.popleft()\n if box in visited:\n continue\n\n total_candies += candies[box]\n visited.add(box)\n \n for key in keys[box]:\n own_keys.add(key)\n if key in own_boxes and key not in visited:\n q.append(key)\n\n for new_box in containedBoxes[box]:\n own_boxes.add(new_box)\n if (status[new_box] == 1 or new_box in own_keys) and new_box not in visited:\n q.append(new_box) \n\n return total_candies\n```\n時間複雜度:O(n+k)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/56#issuecomment-3256863525","body":"思維:\n1. 廣度優先搜尋 (BFS) 遍歷樹,使用 deque 從 root 開始,記錄每個節點的座標\n2. 收集節點資訊,每個節點存成 (x, y, val),加入 nodes 列表\n3. 排序節點,按照題目規則排序:y(由左到右),x(由上到下),val(同位置時數字小的先)\n4. 按列分組,掃描排序後的 nodes,根據 y 值變化劃分列表\n5. 回傳結果,res 即 vertical order traversal 的輸出。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def verticalTraversal(self, root: Optional[TreeNode]) -> List[List[int]]:\n nodes = []\n q = deque([(root, 0, 0)])\n while q:\n node, x, y = q.popleft()\n nodes.append((x, y, node.val))\n if node.left:\n q.append((node.left, x+1, y-1))\n if node.right:\n q.append((node.right, x+1, y+1))\n\n nodes.sort(key=lambda x: (x[1], x[0], x[2]))\n res = []\n cur_y = None\n for _, y, val in nodes:\n if y != cur_y:\n res.append([val])\n cur_y = y\n else:\n res[-1].append(val)\n\n return res\n```\n時間複雜度:O(nlogn)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/57#issuecomment-3260998230","body":"思維:\n1. 定義狀態 dp[i] 表示「到達第 i 階的最小花費」\n2. 每次要到達第 i 階,有兩種方式:從第 i-1 階踩一階上來 → 花費 = dp[i-1] + cost[i-1] or 從第 i-2 階踩兩階上來 → 花費 = dp[i-2] + cost[i-2]\n3. 所以取較小值 dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])\n4. 我們要到達頂樓 = len(cost),因此答案是 dp[-1](即 dp[len(cost)])\n\n代碼:\n```python3\nclass Solution:\n def minCostClimbingStairs(self, cost: List[int]) -> int:\n dp = [0] * (len(cost) + 1)\n for i in range(2, len(cost) + 1):\n dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])\n\n return dp[-1]\n```\n時間複雜度:O(n)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/58#issuecomment-3263817074","body":"思維:\n1. 如果只有一間房子,直接回傳 nums[0]\n2. 初始化 dp 陣列,建立一個長度與 nums 相同的陣列 dp,dp[i] 表示考慮到第 i 間房子時,選擇偷這間房子,能得到的最大金額\n3. 填入前兩個房子:如果 i < 2,直接偷這間房子\n4. 狀態轉移(從 i=2 開始),偷第 i 間房的前提是不能偷相鄰的,所以考慮搭配 i-2 或搭配 i-3 的最佳解\n5. 最後答案一定是偷到倒數第 1 間(dp[-1])或倒數第 2 間(dp[-2]),取最大值\n\n代碼:\n```python\nclass Solution:\n def rob(self, nums: List[int]) -> int:\n if len(nums) == 1:\n return nums[0]\n\n dp = [0] * len(nums)\n for i, num in enumerate(nums):\n if i < 2:\n dp[i] = num\n else:\n dp[i] = max(dp[i-2] + num, dp[i-3] + num)\n\n return max(dp[-1], dp[-2])\n```\n時間複雜度:O(n)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/59#issuecomment-3264481892","body":"思維:\n1. dp[i]: 表示以 nums[i] 結尾的 LIS 最長長度、count[i]: 表示有多少組 LIS 長度等於 dp[i] 是以 nums[i] 結尾的\n2. 對每個 i,檢查它前面的每個 j,如果 nums[j] < nums[i],則可以將 nums[i] 接在 nums[j] 後面\n3. 如果接在 j 後面可以讓序列更長(dp[j] + 1 > dp[i]),則更新 dp[i] = dp[j] + 1,並且把組數設為 count[i] = count[j]\n4. 如果接在 j 後面剛好等長(dp[j] + 1 == dp[i]),則表示找到另一條一樣長的走法,所以把組數加進來 count[i] += count[j]\n5. 最後找出所有 dp[i] == max_len 的位置,把它們對應的 count[i] 加總起來\n\n代碼:\n```python\nclass Solution:\n def findNumberOfLIS(self, nums: List[int]) -> int:\n n = len(nums)\n dp = [1] * n\n count = [1] * n\n\n for i in range(n):\n for j in range(i):\n if nums[j] < nums[i]:\n if dp[j] + 1 > dp[i]:\n dp[i] = dp[j] + 1\n count[i] = count[j]\n elif dp[j] + 1 == dp[i]:\n count[i] += count[j]\n\n max_len = max(dp)\n return sum(c for i, c in enumerate(count) if dp[i] == max_len)\n```\n時間複雜度:O(n^2)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3269134596","body":"思維:\n1. 設 dp[i][j] = text1[:i] 與 text2[:j] 的最長共同子序列長度\n2. 如果其中一個字串長度為 0 → LCS = 0,所以 dp[0][*] 和 dp[*][0] 全部設為 0\n3. 如果 text1[i-1] == text2[j-1],這個字元可以加入 LCS → dp[i][j] = dp[i-1][j-1] + 1\n4. 否則這個字元不能同時出現在 LCS,只能丟掉其中一個字元,取兩種情況最大值 → dp[i][j] = max(dp[i-1][j], dp[i][j-1])\n5. 回傳 dp[-1][-1](表格右下角)就是最終答案\n\n代碼:\n```python\nclass Solution:\n def longestCommonSubsequence(self, text1: str, text2: str) -> int:\n m = len(text1)\n n = len(text2)\n dp = [[0]*(n+1) for _ in range(m+1)]\n \n for i in range(1, m+1):\n for j in range(1, n+1):\n if text1[i-1] == text2[j-1]:\n dp[i][j] = dp[i-1][j-1] + 1\n else:\n dp[i][j] = max(dp[i-1][j], dp[i][j-1])\n\n return dp[-1][-1]\n```\n時間複雜度:O(m * n)\n\n空間複雜度:O(m * n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/61#issuecomment-3273520377","body":"思維:\n1. 機器人從左上角走到右下角,只能往下或往右,所以每個格子的路徑數 = 從上方來的路徑數 + 從左方來的路徑數\n2. 狀態定義:dp[i][j] = 從起點 (0,0) 到 (i,j) 的路徑數\n3. 初始化所有路徑都是 1,主要是第一行、第一列只能直走一條路徑因此都是 1\n4. dp[i][j] 的路徑數就等於 dp[i−1][j] (從上方來的路徑數) + dp[i][j−1] (從左方來的路徑數)\n5. 最後答案取右下角 dp[m-1][n-1]\n\n代碼:\n```python\nclass Solution:\n def uniquePaths(self, m: int, n: int) -> int:\n dp = [[1] * n for _ in range(m)]\n for i in range(1, m):\n for j in range(1, n):\n dp[i][j] = dp[i-1][j] + dp[i][j-1]\n \n return dp[m-1][n-1]\n```\n時間複雜度:O(m * n)\n\n空間複雜度:O(m * n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/62#issuecomment-3278614246","body":"思維:\n1. 狀態定義:dp[r][c] = 騎士在走了 t 步之後,位於 (r,c) 的機率\n2. 初始化:t=0 時,起點 (row, column) 的機率 = 1.0,其他位置 = 0.0\n3. 狀態轉移:從 (r,c) 出發,分散到 8 個可能位置。每一個合法位置的機率 += dp[r][c] / 8\n4. 重複 k 次:每一步產生新的棋盤機率分佈,並用新的棋盤機率更新 dp 陣列\n5. 回傳答案:把整個棋盤上機率加總,就是騎士還在棋盤上的總機率\n\n代碼:\n```python\nclass Solution:\n def knightProbability(self, n: int, k: int, row: int, column: int) -> float:\n dp = [[0.0] * n for _ in range(n)]\n dp[row][column] = 1.0\n positions = [(-1, 2), (-1, -2), (-2, 1), (-2, -1), (1, 2), (1, -2), (2, 1), (2, -1)]\n\n for i in range(k):\n next_dp = [[0.0] * n for _ in range(n)]\n for r in range(n):\n for c in range(n):\n if dp[r][c] > 0:\n for dr, dc in positions:\n nr, nc = r + dr, c + dc\n if 0 <= nr < n and 0 <= nc < n:\n next_dp[nr][nc] += dp[r][c] / 8.0\n dp = next_dp \n\n return sum(sum(row) for row in dp)\n```\n時間複雜度:O(k * n^2)\n\n空間複雜度:O(n^2)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/63#issuecomment-3285759121","body":"思維:\n1. 如果 1+2+…+max < desiredTotal → 永遠湊不到目標 → return False\n2. 如果 desiredTotal ≤ maxChoosableInteger → 先手一次就贏 → return True\n3. 用 bitmask mask 記錄哪些數字已被選過,用 remain 記錄距離目標還差多少\n4. 遞迴判斷 (dfs) 嘗試每一個未被選過的數字 num\n5. 如果 num ≥ remain → 我馬上贏 → return True,否則進入新狀態 (new_mask, remain-num),讓對手繼續\n6. 如果對手在新狀態輸(dfs 回 False)→ 我必勝 → return True\n7. 如果沒有任何選擇能讓我贏 → return False\n\n代碼:\n```python\nclass Solution:\n def canIWin(self, maxChoosableInteger: int, desiredTotal: int) -> bool: \n total_sum = (1 + maxChoosableInteger) * maxChoosableInteger / 2\n if total_sum < desiredTotal:\n return False\n if desiredTotal <= maxChoosableInteger:\n return True\n \n @lru_cache(None)\n def dfs(mask, remain):\n for num in range(1, maxChoosableInteger + 1):\n if not mask & (1 << (num-1)):\n if num >= remain:\n return True\n new_mask = mask | (1 << (num-1))\n if not dfs(new_mask, remain - num):\n return True\n return False\n\n return dfs(0, desiredTotal)\n```\n時間複雜度:O(m * 2^m)\n\n空間複雜度:O(2^m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/64#issuecomment-3287665138","body":"思維:\n1. 如果 nums 的總和是奇數,不可能分成兩組相等 → return False\n2. 否則,目標和 = 總和 / 2\n3. 狀態定義:dp[i][j] = 是否可以用前 i 個數字湊出和 j\n4. 初始化:dp[0][0] = True(不用任何數字就能湊出 0),dp[0][j>0] = False(不用數字不可能湊出正數)\n5. 若 j < nums[i-1] → 這個數太大,不能用因此只能 → dp[i][j] = dp[i-1][j]\n6. 若 j ≥ nums[i-1] → 可以選用或不用這個數 → dp[i][j] = dp[i-1][j] or dp[i-1][j - nums[i-1]]\n7. 最後看 dp[n][target],如果 True → 代表能找到一個子集和 = target → 表示 nums 可分成兩組\n\n代碼:\n```python\nclass Solution:\n def canPartition(self, : List[int]) -> bool:\n if sum(nums) % 2 > 0:\n return False\n target = sum(nums) // 2\n\n dp = [[False] * (target + 1) for _ in range(len(nums) + 1)]\n dp[0][0] = True\n for i in range(1, len(nums) + 1):\n for j in range(target + 1):\n if j < nums[i-1]:\n dp[i][j] = dp[i-1][j]\n else:\n dp[i][j] = dp[i-1][j] or dp[i-1][j-nums[i-1]]\n\n return dp[len(nums)][target]\n```\n時間複雜度:O(n * m) (n for length of nums, m for target)\n\n空間複雜度:O(n * m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289413390","body":"思維:\n1. 要找能不能在 nums 前加上 + 或 -,最後湊成 target,等價於找一個子集,使總和 = (sum(nums)+target)/2 = p\n2. 如果 abs(target) > sum → 超過總和,必然無解,如果 sum + target 是奇數 → p 不是整數,也必然無解\n3. 狀態定義:dp[j] = 方法數,表示能湊出和為 j 的子集數量\n4. 初始化:dp[0] = 1 → 空集合能湊出 0 的方法只有 1 種\n5. 狀態轉移:遍歷每個數字 num,倒序更新,如果能湊出 j-num,再加上 num 就能湊出 j\n6. 答案回傳 dp[p],也就是湊出和為 p 的方法數\n\n代碼:\n```python\nclass Solution:\n def findTargetSumWays(self, nums: List[int], target: int) -> int:\n if abs(target) > sum(nums) or (sum(nums) + target) % 2 > 0:\n return 0\n\n p = (sum(nums) + target) // 2\n dp = [0] * (p + 1)\n dp[0] = 1\n for i in range(len(nums)):\n for j in range(p, nums[i]-1, -1):\n dp[j] += dp[j-nums[i]]\n\n return dp[p]\n``` \n時間複雜度:O(n * p) \n\n空間複雜度:O(p)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/66#issuecomment-3290383887","body":"思維:\n1. 初始化建立 dp 陣列,長度為 amount+1,全部設成無窮大 inf,代表一開始不可達\n2. 設 dp[0] = 0,表示湊 0 元不需要硬幣\n3. 外層金額 i 從 1 跑到 amount,內層對每個硬幣 coin 嘗試\n4. 如果 i - coin >= 0,表示可用這枚硬幣,更新 dp[i] = min(dp[i], dp[i - coin] + 1) (選湊出 i 元的最少硬幣數,看最後一枚硬幣選哪個面額)\n5. 回傳答案如果 dp[amount] 還是 inf,代表不可達回傳 -1,否則回傳 dp[amount]\n\n代碼:\n```python\nclass Solution:\n def coinChange(self, coins: List[int], amount: int) -> int:\n dp = [inf] * (amount + 1)\n dp[0] = 0\n for i in range(1, amount+1):\n for coin in coins:\n if i - coin >= 0:\n dp[i] = min(dp[i], dp[i - coin]+1)\n \n return dp[amount] if dp[amount] != inf else -1\n```\n時間複雜度:O(m × n) (m for amount, n for length of coins)\n\n空間複雜度:O(m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3299125872","body":"思維:\n1. 昨天的題目需考慮排列數(考慮順序),今天的題目僅需考慮組合數(不考慮順序)\n2. 定義 dp[i] = 湊出金額 i 的 組合數\n3. dp[0] = 1:湊出 0 元只有一種方式,什麼都不拿,其餘 dp[i] = 0,表示一開始還沒有任何組合\n4. 外層迴圈:逐一考慮硬幣 coin,內層迴圈:從金額 coin 開始到 amount 逐步更新\n5. dp[i] += dp[i - coin]:若要湊出金額 i,可以先用一個 coin,剩下的 i - coin 由之前的組合補上\n6. 避免重複排列,因為外層是硬幣,每一種硬幣只能在自己之後加入,確保順序不會被重複計算\n7. 回傳答案 dp[amount] 即為湊出總金額的組合數\n\n代碼:\n```python\nclass Solution:\n def change(self, amount: int, coins: List[int]) -> int:\n dp = [0] * (amount + 1)\n dp[0] = 1\n for coin in coins:\n for i in range(coin, amount+1):\n dp[i] += dp[i - coin]\n\n return dp[amount]\n```\n時間複雜度:O(m × n) (m for amount, n for length of coins)\n\n空間複雜度:O(m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/68#issuecomment-3301195823","body":"思維:\n1. 排序貪心:把 g(貪心值)與 s(餅乾大小)都排序\n2. 從大的開始配對:i 指向最大餅乾,j 指向最難滿足的小孩\n3. 若 s[i] >= g[j],就把這片大餅乾給這個小孩,否則,去嘗試滿足下一個(較不貪心)孩子\n5. 結束條件:任一方用完即停止,輸出成功配對數 res\n\n代碼:\n```python\nclass Solution:\n def findContentChildren(self, g: List[int], s: List[int]) -> int:\n g.sort()\n s.sort()\n i = len(s)-1\n j = len(g)-1\n res = 0\n \n while i >= 0 and j >= 0:\n if s[i] >= g[j]:\n res += 1\n i -= 1\n j -= 1\n\n return res\n```\n時間複雜度:O(nlogn+mlogm) (sorting)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/69#issuecomment-3305048523","body":"思維:\n1. 先依 start 排序,若 start 相同則依 end 排序\n2. 用 prev_end 記錄上一次保留的區間結束\n3. 遍歷:如果當前區間 cur_start < prev_end → 代表重疊\n4. 若 cur_end < prev_end → 保留更早結束的區間(更新 prev_end)\n5. 不管怎樣,重疊就要刪掉一個,res += 1\n6. 否則(不重疊) → 更新 prev_end = cur_end\n7. 回傳刪除數量\n\n代碼:\n```python\nclass Solution:\n def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:\n intervals = sorted(intervals)\n prev_end = intervals[0][1]\n res = 0\n\n for i in range(1, len(intervals)):\n cur_start, cur_end = intervals[i]\n if cur_start < prev_end:\n if cur_end < prev_end:\n prev_end = cur_end\n res += 1\n else:\n prev_end = cur_end\n \n return res\n```\n時間複雜度:O(nlogn)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/70#issuecomment-3310296356","body":"思維:\n1. 初始化設定 farthest = 0,代表目前能到達的最遠位置(初始只能到 index 0)\n2. 遍歷陣列依序檢查每個位置檢查是否可達:i = 當前所在索引,step = 在這個位置能往前跳的最大步數\n3. 如果 i > farthest,表示這個位置已經超過了之前能到的最遠範圍 → 代表根本走不到這裡 → 直接回傳 False\n4. 否則更新最遠範圍 farthest = max(farthest, i + step)\n5. 結束迴圈能完整跑完,代表沒有遇到無法到達的位置,直接回傳 True(一定能到達最後一格)\n\n代碼:\n```python\nclass Solution:\n def canJump(self, nums: List[int]) -> bool:\n farthest = 0\n for i, step in enumerate(nums):\n if i > farthest:\n return False\n farthest = max(farthest, i + step)\n return True\n```\n時間複雜度:O(n)\n\n空間複雜度:O(1)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/73#issuecomment-3317351262","body":"思維:\n1. Base Case: n=1 → [1]、n=2 → [1,2]\n2. 把問題拆成奇數子問題 (長度 = (n+1)//2) 和偶數子問題 (長度 = n//2),避免等差數列的產生\n3. 奇數組跟偶數組內分別都是從一個更小的 beautiful array 轉換來的,本身不會產生違規的等差數列\n4. 如果一邊是奇數、一邊是偶數,它們的平均數會是小數(不是整數),但我們的陣列只包含整數,不可能命中,所以跨組之間絕對安全\n5. 奇數子問題的結果全部轉換成奇數(2*x-1)\n6. 偶數子問題的結果全部轉換成偶數(2*x)\n7. 把奇數陣列與偶數陣列串接在一起,得到長度 n 的 beautiful array\n\n代碼:\n```python\nclass Solution:\n def beautifulArray(self, n: int) -> List[int]:\n if n == 1:\n return [1]\n if n == 2:\n return [1, 2]\n\n odd_arr = [x*2 -1 for x in self.beautifulArray((n+1) // 2)]\n even_arr = [x*2 for x in self.beautifulArray(n // 2)]\n \n return odd_arr + even_arr\n```\n時間複雜度:O(nlogn)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/74#issuecomment-3322731377","body":"思維:\n1. 所有數字 XOR 一遍,因為成對的數字會抵消掉 (a ^ a = 0),最後剩下的是 xor_all = x ^ y\n2. 這裡的 x, y 就是我們要找的兩個只出現一次的數字\n3. 找到一個區分 x, y 的 bit,因為 x != y,xor_all 至少有一個 bit = 1,代表 x 和 y 在那一位不同\n4. 用 diff_bit = xor_all & (-xor_all) 取出最低 set bit (最右邊的 1)\n5. 根據這個 diff_bit 把數字分組,如果 (num & diff_bit) != 0 → 放在組 A,否則 → 放在組 B\n6. 各組再 XOR 一遍,成對數字會互相抵消,只剩下唯一的 x 或 y\n7. 最後兩組結果就是 [x, y]\n\n代碼:\n```python\nclass Solution:\n def singleNumber(self, nums: List[int]) -> List[int]:\n xor_all = 0\n for num in nums:\n xor_all ^= num\n\n diff_bit = xor_all & (-xor_all)\n\n x, y = 0, 0\n for num in nums:\n if num & diff_bit:\n x ^= num\n else:\n y ^= num\n\n return [x, y]\n```\n時間複雜度:O(n)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/75#issuecomment-3326355904","body":"思維:\n1. 把長度為 n 的陣列 nums 想成有 n 個開關(bit),一個整數 mask 的二進位表示,就代表一個子集合,mask 從 0 走到 (1<> i) & 1 == 1,代表第 i 位被選中 → subset.append(nums[i]),最後把 subset 加進 res\n4. 回傳結果 res\n\n代碼:\n```python\nclass Solution:\n def subsets(self, nums: List[int]) -> List[List[int]]:\n n = len(nums)\n res = []\n for mask in range(1 << n):\n subset = []\n for i in range(n):\n if (mask >> i) & 1:\n subset.append(nums[i])\n res.append(subset)\n\n return res\n```\n時間複雜度:O(n · 2^n)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/76#issuecomment-3332654533","body":"思維:\n1. TrieNode 結構:children 字典,用來存放「下一個字元 → 子節點」,hasword 標記當前節點是否對應一個完整單詞\n2. Trie 主類別:insert(word) 從 root 出發逐字檢查,若不存在就新建節點,最後節點標記 hasword = True\n3. search(word) 從 root 出發逐字檢查,若遇到缺失字元,直接回傳 False,結束後檢查最後節點的 hasword,若 True 表示單詞存在\n4. startsWith(prefix) 與 search 類似,但不需檢查 hasword,只要能走到 prefix 的最後一個節點就回傳 True\n\n代碼:\n```python\nclass TrieNode:\n def __init__(self):\n self.children = {}\n self.hasword = False\n\n\nclass Trie:\n def __init__(self):\n self.head = TrieNode()\n \n def insert(self, word: str) -> None:\n cur = self.head\n for c in word:\n if c not in cur.children:\n cur.children[c] = TrieNode()\n cur = cur.children[c]\n cur.hasword = True\n\n def search(self, word: str) -> bool:\n cur = self.head\n for c in word:\n if c not in cur.children:\n return False\n cur = cur.children[c]\n\n return cur.hasword\n\n def startsWith(self, prefix: str) -> bool:\n cur = self.head\n for c in prefix:\n if c not in cur.children:\n return False\n cur = cur.children[c]\n return True\n \n\n# Your Trie object will be instantiated and called as such:\n# obj = Trie()\n# obj.insert(word)\n# param_2 = obj.search(word)\n# param_3 = obj.startsWith(prefix)\n```\n時間複雜度:O(n) (Insert, search, startsWith)\n\n空間複雜度:O(n) (Insert) / O(1) (search, startsWith)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/77#issuecomment-3337545631","body":"思維:\n1. TrieNode 結構:children 存子節點,precount 紀錄該節點以下所有 key 對應值的總和(前綴總和),count 紀錄如果這裡是完整單字,記錄它的 value\n2. insert(key, val):逐字往下走,若不存在就新建節點,每走過一個節點 → precount += val(加上新值)\n3. 如果這個 key 之前沒出現過 → 直接存 count = val,如果 key 已經存在 → 先取出舊值 deduct = cur.count,再更新 count = val\n4. 最後重新走一遍 key,把前綴總和扣掉原本的舊值 precount -= deduct\n5. sum(prefix):從 root 開始逐字走 prefix,如果 prefix 路徑不存在 → 回傳 0,如果存在 → 回傳最後節點的 precount\n\n代碼:\n```python\nclass TrieNode:\n def __init__(self):\n self.children = {}\n self.precount = 0\n self.count = 0\n\nclass MapSum:\n\n def __init__(self):\n self.head = TrieNode()\n\n def insert(self, key: str, val: int) -> None:\n cur = self.head\n for c in key:\n if c not in cur.children:\n cur.children[c] = TrieNode()\n cur = cur.children[c]\n cur.precount += val\n\n if not cur.count:\n cur.count = val\n else:\n deduct = cur.count\n cur.count = val\n cur = self.head\n for c in key:\n cur = cur.children[c]\n cur.precount -= deduct\n \n\n def sum(self, prefix: str) -> int:\n cur = self.head\n for c in prefix:\n if c not in cur.children:\n return 0\n cur = cur.children[c]\n return cur.precount\n\n\n# Your MapSum object will be instantiated and called as such:\n# obj = MapSum()\n# obj.insert(key,val)\n# param_2 = obj.sum(prefix)\n```\n時間複雜度:O(n) (Insert, sum)\n\n空間複雜度:O(n) (Insert) / O(1) (sum)","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/82#issuecomment-3355772609","body":"思維:\n1. 任何不包含 1 的子樹應該被刪掉,若節點值是 0,且左右子樹都不存在或都被刪光,那這個節點也該刪\n2. 從下往上考慮 → 遞迴後序遍歷 (post-order),先處理左右子樹,回傳「修剪後的子樹」,再決定當前節點要不要刪除\n3. 若節點是 None,直接回傳 None\n4. 遞迴:修剪左子樹 root.left = pruneTree(root.left)、修剪右子樹 root.right = pruneTree(root.right)\n5. 判斷若 root.val == 0 且 root.left == None 且 root.right == None → 回傳 None,否則保留節點\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def pruneTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:\n if not root:\n return None\n\n root.left = self.pruneTree(root.left)\n root.right = self.pruneTree(root.right)\n\n if root.val == 0 and not root.left and not root.right:\n return None\n\n return root\n```\n時間複雜度:O(n)\n\n空間複雜度:O(n)","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null],"zechengze":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074243047","body":"### Time complexity\nO(max(n, log₁₀(k)))\n\n### Space complexity\nO(max(n, log₁₀(k)))\n\n```python\nclass Solution:\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n ans = []\n n = len(num)\n carry = 0\n i = n - 1\n while k > 0 or i >= 0 or carry > 0:\n sum = carry\n if k > 0:\n rem = k % 10\n sum += rem\n k //= 10\n if i >= 0:\n sum += num[i]\n i -= 1\n carry = sum // 10\n ans.insert(0, sum % 10)\n return ans","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092419843","body":"使用兩個 stack:\n- in_stack: 用來接收 push\n- out_stack: 用來處理 pop 和 peek\n- 當 out_stack 為空時,將 in_stack 的所有元素彈出並倒序放入 out_stack,用來模擬 queue 的 FIFO\n\n - push:O(1)\n - pop:O(1)\n - peek:O(1)\n - empty :O(1)\n\n---\n\n### Python code\n\n```python\nclass MyQueue:\n\n def __init__(self):\n self.in_stack = []\n self.out_stack = []\n\n def push(self, x: int) -> None:\n self.in_stack.append(x)\n\n def pop(self) -> int:\n self.peek() # 確保 out_stack 有東西\n return self.out_stack.pop()\n\n def peek(self) -> int:\n if not self.out_stack:\n while self.in_stack:\n self.out_stack.append(self.in_stack.pop())\n return self.out_stack[-1]\n\n def empty(self) -> bool:\n return not self.in_stack and not self.out_stack","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109185662","body":"### 解題思路\n- 先統計整個 linked list 長度。\n- 使用遞迴,每次選擇區間的中間當作 root。\n- 左子樹遞迴後才處理當前節點。\n\n時間 O(n) 每個節點遍歷一次\n\n```python\nclass Solution:\n def sortedListToBST(self, head: ListNode) -> TreeNode:\n def getLength(node: ListNode) -> int:\n length = 0\n while node:\n length += 1\n node = node.next\n return length\n\n def buildBST(start: int, end: int) -> TreeNode:\n nonlocal head\n if start > end:\n return None\n\n mid = (start + end) // 2\n # 先建左子樹\n left = buildBST(start, mid - 1)\n\n # 再建 root(中序)\n root = TreeNode(head.val)\n head = head.next\n\n # 最後建右子樹\n root.left = left\n root.right = buildBST(mid + 1, end)\n return root\n\n length = getLength(head)\n return buildBST(0, length - 1)","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124485354","body":"### 思路\n- 遞迴 DFS\n- 如果節點為空,深度為 0。\n- 遞迴左右子樹的最大深度,取最大值後 +1。\n\n---\n\n### 遞迴 DFS(Top-down)\n\n```python\nclass Solution:\n def maxDepth(self, root: Optional[TreeNode]) -> int:\n if not root:\n return 0\n return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3136873834","body":"### BFS(反向遍歷)\n\n- 一般 BFS 是左先入,改為右先入左後入\n- 最後訪問的節點就是最底層最左側的節點\n- 每次 `popleft()` 拿出的節點覆蓋 `leftmost`\n- 時間複雜度 : O(n)\n---\n\n```python\n\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n if not root:\n return None\n \n queue = deque([root])\n leftmost = None\n\n while queue:\n leftmost = queue.popleft()\n if leftmost.right:\n queue.append(leftmost.right)\n if leftmost.left:\n queue.append(leftmost.left)\n\n return leftmost.val\n","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146260024","body":"### 解題思路:哈希表(一次遍歷)\n\n1. 初始化一個空dict h\n2. 遍歷陣列 nums,對每個元素 nums[i]:\n - 計算 plus = target - nums[i]\n - 如果 plus 的值在字典中,回傳 [h[plus], i]\n - else 將 nums[i] 存入 dict 中\n\n- 時間、空間複雜度:O(n)\n\n---\n```python\nclass Solution:\n def twoSum(self, nums: List[int], target: int) -> List[int]:\n h = {}\n for i in range(len(nums)):\n plus = target - nums[i]\n if plus in h:\n return [h[plus], i]\n else:\n h[nums[i]] = i","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148509431","body":"### 解題思路:哈希表 + 排序\n\n1. 先用 dict 統計每個元素出現的次數\n2. 使用 sorted 對 dict 依據頻率降序排序\n3. 取出前 k 個 keys 回傳\n\n- 時間複雜度:O(n log n)\n\n---\n\n```python\nclass Solution:\n def topKFrequent(self, nums: List[int], k: int) -> List[int]:\n h_map = {}\n for i in nums:\n if i in h_map:\n h_map[i] += 1\n else:\n h_map[i] = 1\n\n h_map = dict(sorted(h_map.items(), key=lambda x: x[1], reverse=True))\n ans = list(h_map.keys())[:k]\n return ans\n","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3170662667","body":"## 解題思路\n陣列已排序,相同的元素一定會相鄰,因此可以使用雙指針: \n1. 設定指標 `init` 指向下個唯一值要放置的位置,初始為 1。 \n2. 從第二個元素開始遍歷,若與前一個元素不同,則將該元素放到 `init` 位置並將 `init` 加 1。 \n3. 最後 `init` 即為去重後的長度。\n\n---\n\n## 時間複雜度\n- **O(n)**:只需遍歷一次陣列。\n\n## 空間複雜度\n- **O(1)**:在原陣列上進行操作,未使用額外空間。\n\n---\n\n## 程式碼\n```python\nfrom typing import List\n\nclass Solution:\n def removeDuplicates(self, nums: List[int]) -> int:\n init = 1\n for i in range(1, len(nums)):\n if nums[i] != nums[i - 1]:\n nums[init] = nums[i]\n init += 1\n return init\n```\n","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182007045","body":"### 解題思路\n1. 將 `dislikes` 轉換為 **圖的鄰接表** `dislike_table`。\n2. 使用顏色標記(`BLUE = 1`, `GREEN = -1`)來表示兩組人。\n3. 對每個尚未染色的人進行 DFS:\n - 將當前人染色為某一顏色。\n - 對於他不喜歡的人,必須染成相反顏色。\n - 如果發現相鄰節點顏色與自己相同,則表示無法二分。\n4. 如果所有人都能正確染色,則回傳 `True`。\n\n---\n\n```python\nfrom collections import defaultdict\nfrom typing import List\n\nclass Solution:\n def possibleBipartition(self, N: int, dislikes: List[List[int]]) -> bool:\n BLUE, GREEN = 1, -1\n \n def draw(person_id, color):\n color_of[person_id] = color\n for the_other in dislike_table[person_id]:\n if color_of[the_other] == color:\n return False\n if not color_of[the_other] and not draw(the_other, -color):\n return False\n return True\n \n if N == 1 or not dislikes:\n return True\n \n dislike_table = defaultdict(list)\n color_of = defaultdict(int)\n \n for p1, p2 in dislikes:\n dislike_table[p1].append(p2)\n dislike_table[p2].append(p1)\n \n for person_id in range(1, N + 1):\n if not color_of[person_id] and not draw(person_id, BLUE):\n return False\n \n return True","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mr-kient":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074503694","body":"### 【Day 1】989. 数组形式的整数加法\n\n#### Main Idea\n\n1. Since the length of `num` can reach 10000, a brute-force approach of adding each digit of `num` multiplied by 10^[n-i] to form a number and then adding it to K is not feasible, as it would cause an overflow.\n\n2. We can simulate manual vertical calculation by reversing the array and starting the addition from the last digit of both `num` and `k`.\n\n3. Set a global variable `ex` to determine if a carry is needed when adding each digit.\n\n > [!NOTE]\n > Remember to check if there is a carry after adding the first digit.\n\n4. If an array index exceeds the limit, treat it as 0; if `k` is shorter than `num`, treat the remaining digits of `k` as 0.\n\n\n#### Code\n\n```cpp\nclass Solution {\npublic:\n vector addToArrayForm(vector& num, int k) {\n int n = num.size();\n vector res;\n int ex = 0;\n int i = n - 1;\n\n while (i >= 0 || k > 0) {\n int x = (i >= 0) ? num[i] : 0; //k可能比num长\n int y = k % 10;\n int sum = x + y + ex;\n res.push_back(sum % 10);\n ex = sum / 10;\n k /= 10;\n i--;\n }\n\n if (ex)\n res.push_back(ex);\n\n reverse(res.begin(), res.end());\n\n return res;\n }\n};\n```\n\n#### Complexity\n\n$O(Max(num.size(), log(k)))$","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3076134448","body":"### **【Day 2】821. 字符的最短距离**\n\n#### Main idea\n\n1. Two linear traversals: The first one records the distance from each `s[i]` to the previous `c` from left to right; The second time, from right to left, update the minimum distance compared to the previous distance\n2. ⚠️ Note: During the two initializations, the first initialization should be very small because there will be no appearance of `c` after traversing to the right for a long time. If the setting is not small enough, it will result in an insufficiently large distance value, which will affect the update of the correct value from right to left in the second traversal\n\n```cpp\nclass Solution {\npublic:\n vector shortestToChar(string s, char c) {\n int n = s.size();\n vector res(n, n);\n int c_id = -n;\n\n for (int i = 0; i < n; i++) {\n\n if (s[i] == c) {\n c_id = i;\n }\n res[i] = i - c_id;\n }\n\n c_id = 2 * n;\n\n for (int j = n - 1; j >= 0; j--) {\n if (s[j] == c) {\n c_id = j;\n }\n\n res[j] = min(res[j], c_id - j);\n }\n\n return res;\n }\n};\n```\n\n#### Complexity\n\nLoop twice: $O(2*s.szie())$","onTime":true},null,null,null,null,null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124415547","body":"### 【Day 13】[104. 二叉树的最大深度](https://leetcode.cn/problems/maximum-depth-of-binary-tree/)\n\n#### Main Idea \n\n1. 首先考虑到递归即遍历二叉树的左右子树,计算每个节点的左右子树的最大深度\n\n - **递归终止条件**:如果当前节点为空,则返回0(表示当前路径长度为0)。\n - **递归逻辑**:对于当前节点,递归计算左子树的最大深度和右子树的最大深度,取较大值并加1(当前节点本身)\n - **时间复杂度**:O(n),其中n是二叉树的节点总数。每个节点被访问一次。\n\n2. DFS\n\n ```c++\n /**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\n \n class Solution {\n public:\n int maxDepth(TreeNode* root) {\n if (!root) return 0;\n \n std::stack> s;\n s.push({root, 1});\n int max_depth = 0;\n \n while (!s.empty()) {\n auto [node, depth] = s.top();\n s.pop();\n max_depth = std::max(max_depth, depth);\n \n if (node->left) {\n s.push({node->left, depth + 1});\n }\n if (node->right) {\n s.push({node->right, depth + 1});\n }\n }\n \n return max_depth;\n }\n };\n ```\n\n \n\n#### 时间复杂度\n\n要计算二叉树的最大深度,必须访问每一个节点一次,因为最长路径可能出现在任意位置。**没有比O(n)更优的时间复杂度**,因为无论如何都需要遍历所有节点以确认最长路径。","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146453148","body":"### 【Day 19】两数之和\n\n#### Main Idea\n\n1. **暴力枚举**\n - 遍历数组中的每一个元素 `nums[i]`,再对其后续所有元素 `nums[j]`(`j > i`)进行遍历,判断 `nums[i] + nums[j] == target` 时返回 `[i, j]`。\n - **时间复杂度**:O(n²),最坏情况下需要检查所有的元素对。\n2. **哈希表(一遍扫描)**\n - 利用一个哈希表 `mp` 存储 <数值 → 下标 >的映射。\n - 遍历数组,令 `complement = target - nums[i]`:\n - 如果哈希表中已存在 `complement`,说明之前遇到过这么一个数,二者之和等于 `target`,直接返回对应的下标。\n - 否则将当前元素 `nums[i]` 及其下标 `i` 存入哈希表,继续扫描。\n - **优点**:一次遍历搞定,时间和空间都最优。\n\n```c++\n#include \n#include \nusing namespace std;\n\nclass Solution {\npublic:\n vector twoSum(vector& nums, int target) {\n unordered_map mp; // 存储 已访问的数值 → 下标\n for (int i = 0; i < nums.size(); ++i) {\n int complement = target - nums[i];\n // 如果哈希表中已有 complement,则直接返回答案\n if (mp.find(complement) != mp.end()) {\n return { mp[complement], i };\n }\n // 否则将当前数及下标存入\n mp[nums[i]] = i;\n }\n return {}; // 根据题意不会走到这里\n }\n};\n```\n\n#### 时间复杂度\n\n- **哈希表解法**:O(n),只需一次遍历即可完成查找与存储操作。\n- **空间复杂度**:O(n),最坏情况下哈希表需存储 n 个元素。","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3168242525","body":"Main Idea\n\n1. 快慢指针法\n\n设置两个指针 slow 和 fast,初始都指向链表头结点。\n\nfast 每次向前移动 两步,slow 每次向前移动 一步。\n\n当 fast 到达链表末尾时,slow 恰好位于链表的中间位置。\n\n由于题目要求 当有两个中间结点时返回第二个,快慢指针法天然满足这一条件:当链表长度为偶数时,fast 会先到 NULL,此时 slow 指向的就是第二个中间结点。\n\n\n\n2. 时间复杂度\n\nO(n):每个结点最多被访问一次(快指针访问 n/2 次,慢指针访问 n 次)。\n\n\n\n3. 空间复杂度\n\nO(1):只使用了两个额外指针,不需要额外的数据结构。\n\n\n\n\n\n---\n\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * ListNode *next;\n * ListNode() : val(0), next(nullptr) {}\n * ListNode(int x) : val(x), next(nullptr) {}\n * ListNode(int x, ListNode *next) : val(x), next(next) {}\n * };\n */\nclass Solution {\npublic:\n ListNode* middleNode(ListNode* head) {\n ListNode* slow = head;\n ListNode* fast = head;\n while (fast != nullptr && fast->next != nullptr) {\n slow = slow->next; // 慢指针走一步\n fast = fast->next->next; // 快指针走两步\n }\n return slow; // slow 即为中间结点\n }\n};\n\n\n---\n\n时间复杂度分析\n\n访问链表的所有节点至少需要一次遍历,因此 没有比 O(n) 更优的时间复杂度。\n\n快慢指针法通过一次遍历同时得到中间节点,避免了额外的存储或两次遍历,比先统计长度再走一半更高效。\n","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3188424726","body":"#### Main Idea\n\n1. **把未分组项目“补组”**:对 `group[i] == -1` 的项目,给它们分配新的组号(从 `m` 开始递增),这样每个项目都有归属组,最终组的总数记为 `G`。\n2. **两层拓扑排序(Group 拓扑 + Item 拓扑)**:\n\n * **项目层图**:对每条依赖 `u ∈ beforeItems[v]`,连边 `u → v`,统计项目入度。\n * **组层图**:若 `group[u] != group[v]`,再在组图里连边 `group[u] → group[v]`,统计组入度。\n * **先对项目图做一次拓扑排序(得到全局项目顺序)**,再对组图做一次拓扑排序(得到组顺序)。\n3. **按组拼接**:将“项目拓扑序”按照其组别分桶(保持项目拓扑中的相对顺序),再按“组拓扑序”依次把每个桶拼接起来即为答案。\n4. **不可行判定**:任一拓扑排序失败(存在环)则返回空数组。\n\n* **关键点**:跨组依赖只影响组与组的先后关系(由组图保证),组内项目的详细先后由项目图保证。用“两层图”可同时满足“组块相邻”和“依赖有序”。\n\n---\n\n2. **实现**\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n vector sortItems(int n, int m, vector& group, vector>& beforeItems) {\n // 1) 给未分组的项目分配新组号\n int gid = m;\n for (int i = 0; i < n; ++i) {\n if (group[i] == -1) group[i] = gid++;\n }\n int G = gid; // 组总数\n\n // 2) 建立项目图 & 组图\n vector> itemAdj(n), groupAdj(G);\n vector itemIn(n, 0), groupIn(G, 0);\n\n for (int v = 0; v < n; ++v) {\n for (int u : beforeItems[v]) {\n itemAdj[u].push_back(v);\n itemIn[v]++;\n if (group[u] != group[v]) {\n groupAdj[group[u]].push_back(group[v]);\n groupIn[group[v]]++;\n }\n }\n }\n\n // 通用 Kahn 拓扑\n auto topo = [](const vector>& adj, vector indeg) -> vector {\n int N = (int)adj.size();\n queue q;\n for (int i = 0; i < N; ++i) if (indeg[i] == 0) q.push(i);\n vector order;\n order.reserve(N);\n while (!q.empty()) {\n int x = q.front(); q.pop();\n order.push_back(x);\n for (int y : adj[x]) {\n if (--indeg[y] == 0) q.push(y);\n }\n }\n if ((int)order.size() != N) return {}; // 有环\n return order;\n };\n\n // 3) 分别对 项目图、组图 做拓扑排序\n vector itemOrder = topo(itemAdj, itemIn);\n if (itemOrder.empty()) return {};\n vector groupOrder = topo(groupAdj, groupIn);\n if (groupOrder.empty()) return {};\n\n // 4) 按项目拓扑序分桶到各组里,保持项目相对次序\n vector> bucket(G);\n for (int x : itemOrder) bucket[group[x]].push_back(x);\n\n // 5) 按组拓扑序拼接\n vector ans;\n ans.reserve(n);\n for (int g : groupOrder) {\n for (int x : bucket[g]) ans.push_back(x);\n }\n return ans;\n }\n};\n```\n\n#### 时间复杂度\n\n* 建图与两次拓扑排序总计 **O(n + E)**,其中 `E = Σ |beforeItems[i]|`。\n* 额外空间用于邻接表、入度数组与分桶,均为 **O(n + E + G)**。\n","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3205439203","body":"#### Main Idea\n\n1. **线性扫描 (超时)**\n - 从 0 开始向上遍历整数 `i`。\n - 检查 `i * i` 的值。当第一次出现 `i * i > x` 时,那么 `i-1` 就是我们要求的平方根的整数部分。\n - **注意**:`i * i` 的计算可能会导致整数溢出。为避免此问题,应将判断条件改为 `i > x / i`。\n - **缺点**:当 `x` 非常大时,循环次数过多,会导致执行超时,无法通过所有测试用例。\n\n2. **二分查找**\n - `x` 的平方根一定在 `[0, x]` 这个区间内。\n - 我们可以将问题转化为:**在一个有序的范围内(`0` 到 `x`),寻找最大的整数 `k`,使得 `k² <= x`**。\n - 这正是二分查找的经典应用场景。设置搜索区间的左右边界 `left` 和 `right`,计算中间值 `mid`:\n - 如果 `mid² <= x`,说明 `mid` 是一个可能的解,但我们还想尝试更大的值,因此记录当前解,并在右半部分继续搜索:`ans = mid`, `left = mid + 1`。\n - 如果 `mid² > x`,说明 `mid` 太大了,解一定在左半部分,因此缩小搜索范围:`right = mid - 1`。\n - **优点**:每次都将搜索范围减半,时间复杂度低,效率极高。\n\n```c++\nclass Solution {\npublic:\n int mySqrt(int x) {\n if (x == 0) {\n return 0;\n }\n\n int left = 1, right = x;\n int ans = 0;\n\n while (left <= right) {\n int mid = left + (right - left) / 2;\n\n // 为防止 mid * mid 溢出,使用除法来判断\n // mid <= x / mid 等价于 mid * mid <= x\n if (mid <= x / mid) {\n ans = mid; // mid 是一个可能的解\n left = mid + 1; // 尝试在右侧寻找更大的解\n } else {\n right = mid - 1; // mid 太大,到左侧去寻找\n }\n }\n return ans;\n }\n};\n```\n\n#### 时间复杂度\n\n- **二分查找解法**:O(log n),其中 n 为输入值 `x`。二分查找每次都将搜索空间减半,因此时间复杂度是对数级别的。\n- **空间复杂度**:O(1),解法只使用了常数个额外变量,与输入 `x` 的大小无关。","onTime":true},null,null,null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3237241808","body":"#### Main Idea\n\n1. 滑动窗口 + 计数\n\n - 用两个计数器统计字符需求:`need[c]` 表示目标串 `t` 中每个字符需要的数量,`have[c]` 表示当前窗口中已有的数量。\n - 扩张右端:右指针 `r` 逐步右移,把字符加入窗口,并在 `have[c]` 达到 `need[c]` 时,更新已满足的种类数 `formed`。\n - 收缩左端:当窗口已满足 `t` 的全部字符需求(`formed == required`,其中 `required` 为 `t` 中不同字符的个数)时,尽量左移 `l` 缩小窗口并更新最优答案。\n - 唯一性:题目保证若存在答案则唯一,我们只需在收缩时维护最短长度即可。\n\n ```cpp\n #include \n using namespace std;\n \n class Solution {\n public:\n string minWindow(string s, string t) {\n if (t.empty() || s.size() < t.size()) return \"\";\n \n // 统计目标需求\n vector need(128, 0), have(128, 0);\n int required = 0; // 需要满足的不同字符的种类数\n for (char c : t) {\n if (need[c] == 0) required++;\n need[c]++;\n }\n \n int formed = 0; // 当前窗口中已满足 need 的种类数\n int bestLen = INT_MAX, bestL = 0;\n int l = 0;\n \n for (int r = 0; r < (int)s.size(); ++r) {\n char cr = s[r];\n have[cr]++;\n \n // 当某字符数量刚好达到需求,更新 formed\n if (need[cr] > 0 && have[cr] == need[cr]) {\n formed++;\n }\n \n // 若已满足所有字符需求,尽量收缩左端\n while (formed == required) {\n if (r - l + 1 < bestLen) {\n bestLen = r - l + 1;\n bestL = l;\n }\n char cl = s[l];\n have[cl]--;\n // 收缩导致某字符不足,formed 减一\n if (need[cl] > 0 && have[cl] < need[cl]) {\n formed--;\n }\n l++;\n }\n }\n \n return bestLen == INT_MAX ? \"\" : s.substr(bestL, bestLen);\n }\n };\n ```\n\n#### 时间复杂度\n\n双指针各自只右移且不回退,整体 **O(m + n)**;计数数组为常数空间。","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3240735616","body":"#### Main Idea\n\n1. **逐行放置**\n - 每一行选择一个不与已放皇后冲突的列。冲突规则:同列、主对角线(r−c)、次对角线(r+c)。\n - **递归终止**:当行号 `row == n`,说明已成功放置 n 个皇后,计数 +1。\n - **选择与撤销**:在当前行尝试所有合法列,递归下一行,回退继续尝试。\n2. **位运算优化**\n - 用 n 位二进制位掩码表示列与对角线占用:\n - `cols`:哪些列被占。\n - `diag1`:主对角线占用(相当于下一行左移一位)。\n - `diag2`:次对角线占用(相当于下一行右移一位)。\n - 可放置位置:`bits = ~(cols | diag1 | diag2) & mask`,其中 `mask = (1<> 1`。\n\n#### 回溯 + 位运算\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n int totalNQueens(int n) {\n int mask = (1 << n) - 1;\n return dfs(0, 0, 0, 0, mask, n);\n }\n\nprivate:\n // row: 当前行号;cols/diag1/diag2:占用掩码;mask:仅保留 n 位\n int dfs(int row, int cols, int diag1, int diag2, int mask, int n) {\n if (row == n) return 1;\n\n int count = 0;\n int bits = (~(cols | diag1 | diag2)) & mask; // 当前行可放置的位置集合\n\n while (bits) {\n int p = bits & -bits; // 取最低位可行位置\n bits -= p; // 移除该位置\n\n count += dfs(row + 1,\n cols | p,\n ((diag1 | p) << 1) & mask, // 主对角线左移并截断\n (diag2 | p) >> 1, // 次对角线右移\n mask, n);\n }\n return count;\n }\n};\n```\n\n#### 时间复杂度\n\n- **时间**:回溯搜索的上界接近 **O(n!)**,但位运算将冲突判断降为 O(1) 常数,n ≤ 9 时非常快。\n- **空间**:**O(n)**(递归深度 n,掩码为常数额外空间)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3247569627","body":"#### Main Idea\n\n1. BFS(从所有陆地同时出发)\n\n * 把所有值为 `1` 的格子(陆地)一起入队,距离视作 0;像海浪一样一圈圈向外扩散。\n * 第一次被扩散到的海洋格子的距离,就是它到最近陆地的最短曼哈顿距离。\n * 最后被访问到的海洋格子的距离即为答案。\n * **边界**:若全为陆地或全为海洋,返回 `-1`。\n\n2. 实现\n\n ```cpp\n #include \n using namespace std;\n\n class Solution {\n public:\n int maxDistance(vector>& grid) {\n int n = grid.size();\n queue> q;\n vector> dist(n, vector(n, -1));\n\n // 把所有陆地入队,距离置 0\n for (int i = 0; i < n; ++i) {\n for (int j = 0; j < n; ++j) {\n if (grid[i][j] == 1) {\n q.push({i, j});\n dist[i][j] = 0;\n }\n }\n }\n\n // 若全海或全陆,直接返回 -1\n if (q.empty() || (int)q.size() == n * n) return -1;\n\n int ans = -1;\n int dirs[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};\n\n // 多源 BFS\n while (!q.empty()) {\n auto [x, y] = q.front(); q.pop();\n for (auto& d : dirs) {\n int nx = x + d[0], ny = y + d[1];\n if (nx < 0 || ny < 0 || nx >= n || ny >= n) continue;\n if (dist[nx][ny] != -1) continue; // 访问过\n dist[nx][ny] = dist[x][y] + 1; // 最近陆地距离\n ans = max(ans, dist[nx][ny]);\n q.push({nx, ny});\n }\n }\n return ans;\n }\n };\n ```\n\n#### 时间复杂度\n\n* 时间:每个格子最多入队一次,四邻检查常数次,整体 **O(N²)**。\n\n","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/58#issuecomment-3263627488","body":"#### Main Idea\n\n1. **线性决策(相邻不能同抢)**\n\n * 到第 `i` 间房时只有两种选择:\n\n * **不抢它**:收益等于前一间的最佳收益 `dp[i-1]`\n * **抢它**:收益等于“到 i-2 的最佳收益 + 本屋金额” → `dp[i-2] + nums[i]`\n * 所以转移式:`dp[i] = max(dp[i-1], dp[i-2] + nums[i])`\n2. **初值与边界**\n\n * 空数组 → 答案 `0`\n * `dp[0] = nums[0]`\n * `dp[1] = max(nums[0], nums[1])`(如果存在)\n3. **滚动变量优化空间**\n\n * 只依赖 `i-1` 和 `i-2`,用两个变量就够了:\n\n * `prev2` 表示 `dp[i-2]`,`prev1` 表示 `dp[i-1]`\n * 新值 `cur = max(prev1, prev2 + nums[i])`,随后前移指针\n\n#### 动态规划(滚动变量,O(1) 空间)\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n int rob(vector& nums) {\n if (nums.empty()) return 0;\n int n = nums.size();\n if (n == 1) return nums[0];\n\n int prev2 = 0; // dp[i-2]\n int prev1 = 0; // dp[i-1]\n for (int x : nums) {\n int cur = max(prev1, prev2 + x);\n prev2 = prev1;\n prev1 = cur;\n }\n return prev1;\n }\n};\n```\n\n#### 时间复杂度\n\n* **时间**:`O(n)`(单次线性扫描)\n* **空间**:`O(1)`(滚动变量),如需恢复路径则 `O(n)` 用于记录选择","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/63#issuecomment-3284142988","body":"#### Main idea\n\n**把局面想成“还差多少 + 已用过哪些数”**\n\n- 每次你从公共池里挑一个数,目标值就相应减少;被挑过的数以后都不能再用。\n- 于是每一步其实就是在“还差的分数”和“哪些数已被拿走”的组合之间转换。\n\n**当前能赢的充要条件**\n\n- 如果你现在能直接拿到一个数,使得**累计和立刻达到/超过目标**,你马上赢。\n- 否则,你希望找到一个数字,让对手接下来面对的局面是**必输局**。\n 换句话说:**存在**一个选择能把对手“送进死局”,那你这一步就是必赢;\n 如果**所有**选择都会把对手“送进稳赢局”,那你这一步就是必输。\n\n**两条简单但很有用的剪枝**\n\n- **总和不够就别想了**:如果 1 到 `maxChoosableInteger` 的总和都达不到目标,先手必输。\n- **目标非正直接赢**:如果目标本来就 ≤ 0(或被前人操作减到 ≤ 0),先手已满足条件,直接判赢。\n\n**记住算过的局面,别重复思考(记忆化)**\n\n- 同一组“已用过的数字 + 还差多少”的局面,赢或输的结论是固定的。\n- 把每个局面的输赢结果记下来,后面再遇到就直接用,避免在相同分支上反复推演。\n\n**直觉理解(以示例 1 为例)**\n\n- `max=10, 目标=11`:无论先手先拿哪个数 `x`,后手都能立刻拿到 `11-x`(且该数仍在 1..10 且未被用),直接结束游戏。\n- 所以先手无解——这就是“把对手送进稳赢局”在反方向上的体现。\n\n#### Implementation(cpp)\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n bool canIWin(int maxChoosableInteger, int desiredTotal) {\n if (desiredTotal <= 0) return true;\n\n int n = maxChoosableInteger;\n int sum = n * (n + 1) / 2;\n if (sum < desiredTotal) return false; // 全拿都不够,必输\n\n // 2^n 状态;-1=未知,0=必败,1=必胜\n vector memo(1 << n, -1);\n return dfs(0, desiredTotal, n, memo);\n }\n\nprivate:\n // mask: 已用集合(第 i 位表示数字 i+1 是否已用)\n // remain: 距离目标还差多少\n bool dfs(int mask, int remain, int n, vector& memo) {\n char &res = memo[mask];\n if (res != -1) return res;\n\n // 枚举当前可选的每个数 i\n for (int i = 1; i <= n; ++i) {\n int bit = 1 << (i - 1);\n if (mask & bit) continue; // 已用,跳过\n if (i >= remain) return res = 1; // 直接到达/超过目标,当前玩家赢\n // 若选 i 之后对手必败,则当前必胜\n if (!dfs(mask | bit, remain - i, n, memo)) return res = 1;\n }\n return res = 0; // 所有选择都会让对手必胜 => 当前必败\n }\n};\n\n```\n\n#### 复杂度\n\nO(n · 2^n)","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/69#issuecomment-3306753472","body":"#### Main Idea\n\n1. **把“最少删除”转化为“最多保留”**\n\n * 经典区间调度:**按右端点升序**排序,**尽可能先选结束早的区间**,就能在不重叠前提下**保留最多**的区间。\n * 需要移除的最小数量 = `总数 n - 能保留的最大不重叠数量 keep`。\n\n2. **为什么按右端点排是最优的**\n\n * 选更早结束的区间,给后面的区间留下**更多起始空间**,不比选结束晚的更差。\n * 可用“**交换论证**”:若最优解里某一步没有选最早结束者,换成结束更早的,不减少可选余地,解仍最优。\n\n3. **边界与定义(开闭性)**\n\n * 本题规定:端点相同只**接触不重叠**(`[1,2]` 与 `[2,3]` 可共存),因此判断不重叠条件是 `start >= lastEnd`。\n * 允许负数坐标;`1 <= n <= 1e5`,需 `O(n log n)` 排序 + `O(n)` 一次扫描。\n\n---\n\n#### 贪心(按右端点排序)\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n int eraseOverlapIntervals(vector>& intervals) {\n if (intervals.empty()) return 0;\n\n // 1) 按 end 升序排\n sort(intervals.begin(), intervals.end(),\n [](const vector& a, const vector& b){\n if (a[1] != b[1]) return a[1] < b[1];\n return a[0] < b[0];\n });\n\n // 2) 贪心选择:尽量保留更多不重叠区间\n int keep = 0;\n int lastEnd = INT_MIN; // 当前已选集合的最后一个区间的 end\n for (auto &it : intervals) {\n int s = it[0], e = it[1];\n if (s >= lastEnd) { // 与上一个选择不重叠(端点相接也可)\n ++keep;\n lastEnd = e;\n }\n }\n return (int)intervals.size() - keep; // 最少删除 = 总数 - 最多保留\n }\n};\n```\n\n---\n\n#### 等价实现(按左端点排序的“原地计数删谁”)\n\n* 也可以**按起点升序**,一遍扫描:\n\n * 若当前 `s < prevEnd` 发生**重叠** ⇒ 必须删一个;\n * **删谁?** 删右端点更大的那个(保留 `end` 更小者),将 `prevEnd = min(prevEnd, e)`。\n * 计数 `remove++`。\n* 与前法等价,常用于不想单独计“keep”的写法。\n\n```cpp\nint eraseOverlapIntervals(vector>& intervals) {\n if (intervals.empty()) return 0;\n sort(intervals.begin(), intervals.end()); // 默认按 start,再按 end\n\n int remove = 0;\n int prevEnd = intervals[0][1];\n for (int i = 1; i < (int)intervals.size(); ++i) {\n int s = intervals[i][0], e = intervals[i][1];\n if (s < prevEnd) { // 重叠了,需要删一个\n ++remove;\n prevEnd = min(prevEnd, e); // 删 end 较大的那个,保留更早结束\n } else {\n prevEnd = e; // 不重叠,正常推进\n }\n }\n return remove;\n}\n```\n\n#### 复杂度\n\n* 排序 `O(n log n)`,单扫 `O(n)`;总 `O(n log n)`。\n* 额外空间 `O(1)`(除了排序)。\n\n","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/76#issuecomment-3332731592","body":"#### Main Idea\n\n1. **字母映射到孩子指针(26 叉树)**\n\n * 每个结点保存 `children[26]` 与 `isEnd`。\n * `insert(word)`:从根逐字符走,若孩子不存在就新建;末结点标记 `isEnd = true`。\n * `search(word)`:逐字符走,若中途缺结点则 `false`;走完返回末结点 `isEnd`。\n * `startsWith(prefix)`:逐字符走,若中途缺结点则 `false`;都能走到则 `true`(无需 `isEnd`)。\n\n2. **正确性与边界**\n\n * 仅小写字母 → 直接用 `idx = c - 'a'`。\n * `search` 必须要求完整单词结束处 `isEnd == true`,否则只是前缀命中。\n * 空间按需分配:只有路径上用到的结点才创建。\n\n\n---\n\n#### 实现(C++,指针版)\n\n```cpp\n#include \nusing namespace std;\n\nstruct TrieNode {\n bool isEnd = false;\n TrieNode* ch[26];\n TrieNode() : isEnd(false) {\n memset(ch, 0, sizeof(ch));\n }\n};\n\nclass Trie {\npublic:\n Trie() { root = new TrieNode(); }\n\n // 插入单词\n void insert(const string& word) {\n TrieNode* p = root;\n for (char c : word) {\n int idx = c - 'a';\n if (!p->ch[idx]) p->ch[idx] = new TrieNode();\n p = p->ch[idx];\n }\n p->isEnd = true;\n }\n\n // 完整匹配\n bool search(const string& word) {\n TrieNode* p = walk(word);\n return p && p->isEnd;\n }\n\n // 前缀匹配\n bool startsWith(const string& prefix) {\n return walk(prefix) != nullptr;\n }\n\nprivate:\n TrieNode* root;\n\n // 沿字符串行走,走不到返回空\n TrieNode* walk(const string& s) {\n TrieNode* p = root;\n for (char c : s) {\n int idx = c - 'a';\n if (!p->ch[idx]) return nullptr;\n p = p->ch[idx];\n }\n return p;\n }\n};\n```\n#### 复杂度\n\n * 设字符串长度为 `L`:\n\n * `insert / search / startsWith` 都是 **O(L)**。\n * 空间:创建的结点数 ≤ 所有插入字符串长度之和。\n\n","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/82#issuecomment-3357108848","body":"#### Main idea\n\n**后序递归 + 就地剪枝**\n\n* “要保留的节点”必须满足:自己是 1,或者**子树里至少有一个 1**。\n* 等价地说:当一个节点值为 0,且**左右子树都被剪成空**,这个节点也应被删除。\n* 因此用**后序遍历**:先递归处理左右子树,把不含 1 的子树返回成 `nullptr`;回来后再判断当前节点是否也应被删。\n\n**判定规则(在回溯处)**\n\n* `root->left = prune(left)`,`root->right = prune(right)`;\n* 若 `root->val==0 && root->left==nullptr && root->right==nullptr` → 返回 `nullptr`(整棵以 root 为根的子树都不含 1)。\n* 否则返回 `root`。\n\n这保证了每个节点只访问一次,且删除顺序从叶到根,不会误留“全 0 链”。\n\n#### Implementation(cpp)\n\n```cpp\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\n\nclass Solution {\npublic:\n TreeNode* pruneTree(TreeNode* root) {\n if (!root) return nullptr;\n\n root->left = pruneTree(root->left);\n root->right = pruneTree(root->right);\n\n // 若当前为0且左右都为空 => 该节点所在子树不含1,剪掉\n if (root->val == 0 && !root->left && !root->right) {\n return nullptr;\n }\n return root;\n }\n};\n```\n\n#### 复杂度\n\n* 时间:`O(n)`,每个节点访问一次。\n* 空间:`O(h)`,递归栈深度(`h` 为树高,最坏 `O(n)`,平均 `O(log n)`)。","onTime":false},null,null,null,null,null,null,null,null,null,null,null,null],"leohongyi":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3076771871","body":"【Day 1】989. 数组形式的整数加法\nmain idea 从最低位开始加,如果还有进位,将其添加到结果前面 使用逆序遍历 range(len(num) - 1, -1, -1) 从数组的最后一个元素(最低位)开始\ndivmod(num[i] + k, 10) 计算当前位置的数字与 k 相加后的结果,返回商和余数 如果处理完数组中所有位后仍有进位(k > 0)\n从 k 中提取最低位数字,并插入到数组最前面\n继续处理 k 的下一位,直到 k 变为 0\n余数 num[i] 保存在当前位置\n商 k 作为进位传递给下一个更高位\n整体时间复杂度为 O(max(n, log k))。\ncode\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n for i in range(len(num) - 1, -1, -1):\n k, num[i] = divmod(num[i] + k, 10)\n \n while k > 0:\n k, digit = divmod(k, 10)\n num.insert(0, digit)\n return num\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3077014132","body":"main idea:\n创建 ret 数组,长度为len(s)\n再次遍历s的过程中,我们需要判断当满足以下两点条件时,指针 p 右移一位\np小于arr最大下标\n前下标i 到 p + 1的绝对距离比到 p 的绝对距离小\n每次将 p - i 的绝对距离添加至 ret[i] 中\n\n def shortestToChar(self, s: str, c: str) -> List[int]:\n ret, p, arr = [], 0, [i for i in range(len(s)) if s[i] == c]\n for i, j in enumerate(s):\n if p < len(arr) - 1 and abs(arr[p] - i) > abs(arr[p + 1] - i):\n p += 1\n ret.append(abs(arr[p] - i))\n return ret\nTime Complexity: O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3082831029","body":"使用数组的栈结构,self.top作为栈顶指针\n进出栈分别通过简单的数组赋值与读取进行操作\nincrement函数通过一个循环进行赋值操作\nclass CustomStack:\n\n def __init__(self, maxSize: int):\n self.stack = [0]*maxSize\n self.top = -1\n\n def push(self, x: int) -> None:\n if self.top < len(self.stack) - 1:\n self.top += 1\n self.stack[self.top] = x\n\n def pop(self) -> int:\n if self.top is -1:\n return self.top\n else:\n self.top -= 1\n return self.stack[self.top+1]\n \n\n def increment(self, k: int, val: int) -> None:\n for i in range(min(k, self.top + 1)):\n self.stack[i] += val\n\n\n\nTime complexity: O(k)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3092615113","body":"算法步骤:\n利用current string, current number 记录所有不同的括号层级内的string和num;\n使用stk来记录之前的数字和前置str;推荐先push num, 后push str 至 stack;\nO(n)\n代码:\nclass Solution:\n def decodeString(self, s: str) -> str:\n cur_str, cur_num = \"\", \"\"\n stk = []\n for c in s:\n if c.isdigit():\n cur_num += c\n elif c == '[':\n stk.append(cur_str)\n stk.append(cur_num)\n cur_str, cur_num = \"\", \"\"\n elif c == ']':\n cur_str *= int(stk.pop())\n cur_str = stk.pop() + cur_str\n else:\n cur_str += c\n return cur_str\n\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092624509","body":"算法设计\n加入队尾 push() : 将数字 val 加入栈 A 即可。\n获取队首元素 peek() :\n当栈 B 不为空: B中仍有已完成倒序的元素,因此直接返回 B 的栈顶元素。\n否则,当 A 为空: 即两个栈都为空,无元素,因此返回 -1 。\n否则: 将栈 A 元素全部转移至栈 B 中,实现元素倒序,并返回栈 B 的栈顶元素。\n弹出队首元素 pop() :\n执行 peek() ,获取队首元素。\n弹出 B 的栈顶元素。\n队列判空 empty() : 当栈 A 和 B 都为空时,队列为空。\n\nclass MyQueue:\n\n def __init__(self):\n self.A, self.B = [], []\n\n def push(self, x: int) -> None:\n self.A.append(x)\n\n def pop(self) -> int:\n peek = self.peek()\n self.B.pop()\n return peek\n\n def peek(self) -> int:\n if self.B: return self.B[-1]\n if not self.A: return -1\n # 将栈 A 的元素依次移动至栈 B\n while self.A:\n self.B.append(self.A.pop())\n return self.B[-1]\n def empty(self) -> bool:\n return not self.A and not self.B\n\n\n# Your MyQueue object will be instantiated and called as such:\n# obj = MyQueue()\n# obj.push(x)\n# param_2 = obj.pop()\n# param_3 = obj.peek()\n# param_4 = obj.empty()\n时间复杂度: push(), empty() 函数的时间复杂度为 O(1) ;peek() , pop() 函数在 N 次队首元素删除操作中总共需完成 N 个元素的倒序,均摊时间复杂度为 O(1) 。\n\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3105379844","body":"main: 如果当前元素大于或者等于maxx,入栈, 更新最大值maxx\n如果当前元素小于栈顶元素,循环弹出栈顶元素,直到当前元素大于或等于栈顶元素,注意不用将当前元素入栈!!不过要再将maxx压入栈,因为刚刚pop时肯定把maxx弹出栈了\n\n。class Solution:\n def maxChunksToSorted(self, arr: List[int]) -> int:\n maxx, stk = arr[0], [arr[0]]\n for i in range(1, len(arr)):\n if arr[i] >= maxx:\n maxx = arr[i]\n stk.append(arr[i])\n else:\n while stk and stk[-1] > arr[i]:\n stk.pop()\n stk.append(maxx)\n return len(stk)\n 时间复杂度O(n)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3111913253","body":"找到尾结点 形成环形链表\n尾结点移动length - k 步 有移动k步 == 左移length - k 步\n找到头结点 断开头尾链接\n\n\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def rotateRight(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:\n if not head or not head.next:\n return head\n tail = head\n length = 1\n while tail.next:\n length += 1\n tail = tail.next\n tail.next = head\n\n k = k % length\n for _ in range(length - k):\n tail = tail.next\n \n head = tail.next\n tail.next = None\n return head\n ","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3111983736","body":"先交换以node3为头结点的链表 \nnode1指向地柜返回的链表头\n把node2指向node1\n返回node2 作为交换完成的链表头结点\n\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:\n if head is None or head.next is None:\n return head\n node1 = head\n node2 = head.next\n node3 = node2.next\n\n node1.next = self.swapPairs(node3)\n node2.next = node1\n\n return node2\n ","onTime":false},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dmax1314":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3082278662","body":"1. 第一个想法是数组转换数字然后相加再转换回去\n时间和空间复杂度都应该是O(n)\n```python\nfrom typing import List\n\nclass Solution:\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n # 1. 数组 -> 字符串 -> 数字\n # 首先将列表中的每个数字转换为字符串,然后拼接成一个完整的字符串\n # [1, 2, 0, 0] -> [\"1\", \"2\", \"0\", \"0\"] -> \"1200\"\n s = \"\".join(map(str, num))\n \n num_val = int(s)\n \n # 2. 数字相加\n result_val = num_val + k\n \n # 3. 数字 -> 字符串 -> 数组\n # 将结果数字转换回字符串\n # 1234 -> \"1234\"\n result_s = str(result_val)\n \n # 将结果字符串中的每个字符转换回整数,并放入列表中\n # \"1234\" -> [\"1\", \"2\", \"3\", \"4\"] -> [1, 2, 3, 4]\n result_array = [int(digit) for digit in result_s]\n \n return result_array\n```\n但是似乎换其他的语言会溢出\n2. 第二个想法就是模拟加法操作,从个位数加起,关键问题在于处理进位\n```python\nclass Solution:\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n result = []\n carry = 0\n i = len(num) - 1 # 指向 num 的最后一位\n \n while i >= 0 or k > 0 or carry > 0:\n digit = carry # 初始化为进位\n \n if i >= 0: # 如果 num 中还有数字\n digit += num[i]\n i -= 1\n \n if k > 0: # 如果 k 中还有数字\n digit += k % 10\n k //= 10 # 整个 k 除以 10\n \n # 处理进位\n result.append(digit % 10)\n carry = digit // 10\n \n result.reverse() # 因为是从个位到十位添加的,最后需要反转\n return result # 返回结果\n```\n这里是要反转的 我一开始忘了这个事情,因为数组把个位的和放在了第一位和实际数字反过来了\n时间复杂度: O(max(N, M)),其中 N 是 num 的长度,M 是 k 的数字长度。我们需要遍历这两个数的每一位。\n空间复杂度: O(max(N, M)),用于存储结果数组。\n\n---\n在看lc题解的时候发现一个很有趣的模板可能以后会用到\n ```\nwhile ( A 没完 || B 没完)\n A 的当前位\n B 的当前位\n\n 和 = A 的当前位 + B 的当前位 + 进位carry\n\n 当前位 = 和 % 10;\n 进位 = 和 / 10;\n\n判断还有进位吗\n```\n>作者:lilyunoke\n>链接:https://leetcode.cn/problems/add-to-array-form-of-integer/solutions/570659/989-ji-zhu-zhe-ge-jia-fa-mo-ban-miao-sha-8y9r/\n>来源:力扣(LeetCode)\n>著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。\n\n稍微改了一下得到一个python加法模板,\n```python\nclass Solution:\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n n = len(num)\n res = []\n i = n - 1\n s = 0\n carry = 0\n while i >= 0 or k != 0:\n x = num[i] if i >= 0 else 0\n y = k % 10 if k != 0 else 0\n\n s = x + y + carry\n carry = s // 10\n k //= 10\n\n i -= 1\n res.insert(0, s % 10)\n\n if carry != 0:\n res.insert(0, carry)\n return res\n```\n据说这个模板还可以用到[2](https://leetcode.com/problems/add-two-numbers/description/),[165](https://leetcode.com/problems/compare-version-numbers/)和[809](https://leetcode.com/problems/expressive-words/)这周末抽空可以做一下","onTime":false},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3086540520","body":"# 第四天\n构造栈结构,利用先入后出的特性来实现括号匹配\n大概做法就是\n1. 使用栈来存放数字、字符以及中间结果。\n2. 遇到数字时,解析出完整的k值(可能是多位数)。\n3. 遇到开括号 `[` 时,将当前构建的字符串入栈,重置字符串。\n4. 遇到闭括号 `]` 时,出栈,形成一个新的字符串并重复生成。\n5. 最终合并所有字符串返回结果。\n```python\nclass Solution:\n def decodeString(self, s: str) -> str:\n stack = [] # 初始化栈\n current_num = 0 # 当前数字\n current_str = '' # 当前构建的字符串\n\n for char in s:\n if char.isdigit(): # 如果是数字\n current_num = current_num * 10 + int(char) # 处理多位数\n elif char == '[': # 遇到左括号\n stack.append(current_str) # 存储当前字符串\n stack.append(current_num) # 存储当前数字\n current_str = '' # 重置字符串\n current_num = 0 # 重置数字\n elif char == ']': # 遇到右括号\n num = stack.pop() # 弹出数字\n prev_str = stack.pop() # 弹出前一个字符串\n current_str = prev_str + current_str * num # 生成新的字符串\n else:\n current_str += char # 累加字符\n\n return current_str # 返回解码后的字符串\n```\n时间复杂度是 O(n),其中 n 是字符串 s 的长度。每个字符都被处理一次。\n空间复杂度是 O(n),在最坏情况下,栈可能会存储所有字符和数字。\n\n---\n读了题解发现还存在递归法,也就是用[]来决定递归的开头和结束\n```python\nclass Solution:\n def decodeString(self, s: str) -> str:\n def dfs(s,i):\n res,multi='',0\n while i str:\n def dfs(s, i):\n res, multi = \"\", 0\n while i < len(s):\n if '0' <= s[i] <= '9':\n multi = multi * 10 + int(s[i])\n elif s[i] == '[':\n i, tmp = dfs(s, i + 1)\n res += multi * tmp\n multi = 0\n elif s[i] == ']':\n return i, res\n else:\n res += s[i]\n i += 1\n return res\n return dfs(s,0)\n```\n时间复杂度是 O(n),其中 n 是字符串 s 的长度。每个字符都被处理一次。\n空间复杂度是 O(n),在最坏情况下,递归调用栈可能会存储所有字符和数字。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091499578","body":"用两个模拟栈的队列来实现栈的基本操作。一个用于添加尾部元素,另一个用于弹出头部元素。即一个近栈stack in和一个出栈stack out。\n```python\nclass MyQueue:\n\n def __init__(self):\n \"\"\"\n in主要负责push,out主要负责pop\n \"\"\"\n self.stack_in = []\n self.stack_out = []\n\n\n def push(self, x: int) -> None:\n \"\"\"\n 有新元素进来,就往in里面push\n \"\"\"\n self.stack_in.append(x)\n\n\n def pop(self) -> int:\n \"\"\"\n Removes the element from in front of queue and returns that element.\n \"\"\"\n if self.empty():\n return None\n \n if self.stack_out:\n return self.stack_out.pop()\n else:\n for i in range(len(self.stack_in)):\n self.stack_out.append(self.stack_in.pop())\n return self.stack_out.pop()\n\n\n def peek(self) -> int:\n \"\"\"\n Get the front element.\n \"\"\"\n ans = self.pop()\n self.stack_out.append(ans)\n return ans\n\n\n def empty(self) -> bool:\n \"\"\"\n 只要in或者out有元素,说明队列不为空\n \"\"\"\n return not (self.stack_in or self.stack_out)\n```\n时间复杂度:\n- `push` 操作的时间复杂度是 O(1),因为我们只是将元素添加到 `stack_in` 的末尾。\n- `pop` 和 `peek` 操作的平均时间复杂度是 O(1),但在最坏情况下(当 `stack_out` 为空时),需要将 `stack_in` 中的所有元素转移到 `stack_out`,这需要 O(n) 的时间,其中 n 是 `stack_in` 中的元素数量。然而,这种情况不会频繁发生,因此平均时间复杂度仍然是 O(1)。\n- `empty` 操作的时间复杂度是 O(1),因为我们只是检查两个栈是否为空。\n\n空间复杂度是 O(n),其中 n 是队列中的元素数量,因为我们需要存储所有元素在两个栈中。\n\n但是我有个问题,不知道为什么用lc自己的time complexity分析出来是O(n)的时间和空间复杂度,可能是因为lc的分析是基于最坏情况的分析?","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094285074","body":"题目的核心是找到最多的分块数量,使得将每个块独立排序后,拼接起来的结果与整个数组排序后的结果相同。\n\n第一个想法是利用排序后的性质。一个块可以被成功分割的条件是:块内所有元素的原数组最大值,小于等于它右边所有元素的最小值。如果满足这个条件,那么这个块排序后,所有元素就都会在它们最终应该在的位置的左边。\n\n为了实现这个想法,我们可以预处理两个数组:\n\n- max_of_left[i]:表示原数组 arr[0...i] 中的最大值。\n- min_of_right[i]:表示原数组 arr[i...n-1] 中的最小值。\n\n然后遍历数组,如果在 i 位置,满足 max_of_left[i] <= min_of_right[i+1],就说明我们可以在 i 和 i+1 之间切一刀。\n```python\nfrom typing import List\n\nclass Solution:\n def maxChunksToSorted(self, arr: List[int]) -> int:\n n = len(arr)\n if n <= 1:\n return 1\n\n # 1. 计算从左到右每个位置的最大值\n max_of_left = [0] * n\n max_of_left[0] = arr[0]\n for i in range(1, n):\n max_of_left[i] = max(max_of_left[i-1], arr[i])\n\n # 2. 计算从右到左每个位置的最小值\n min_of_right = [0] * n\n min_of_right[n-1] = arr[n-1]\n for i in range(n-2, -1, -1):\n min_of_right[i] = min(min_of_right[i+1], arr[i])\n\n # 3. 遍历查找可以分割的点\n # 如果 max_of_left[i] <= min_of_right[i+1],说明 arr[0...i] 的所有元素\n # 都小于等于 arr[i+1...n-1] 的所有元素,可以切分\n chunks = 0\n for i in range(n - 1):\n if max_of_left[i] <= min_of_right[i+1]:\n chunks += 1\n\n # 总块数 = 分割点数量 + 1\n return chunks + 1\n```\n时间复杂度:O(N),其中 N 是数组的长度。我们需要三次独立的 O(N) 遍历。\n空间复杂度:O(N),用于存储 max_of_left 和 min_of_right 两个辅助数组。\n\n---\n在看题解的时候,发现了一个更巧妙的解法,虽然时间复杂度稍高,但是代码非常简洁。它的思路是比较原数组和排序后数组的元素和。\n\n如果 arr[0...i] 的元素和等于 sorted_arr[0...i] 的元素和,这意味着 arr[0...i] 中的元素集合和 sorted_arr[0...i] 中的元素集合是完全相同的(只是顺序不同)。因为 sorted_arr[0...i] 包含了整个数组中最小的 i+1 个元素,所以 arr[0...i] 也必然包含了这 i+1 个最小元素。这就保证了 arr[0...i] 中的任意元素都小于等于 arr[i+1...n-1] 中的任意元素,因此可以在 i 处进行分割。\n```python\nfrom typing import List\n\nclass Solution:\n def maxChunksToSorted(self, arr: List[int]) -> int:\n sorted_arr = sorted(arr)\n \n sum_arr = 0\n sum_sorted = 0\n chunks = 0\n \n for i in range(len(arr)):\n sum_arr += arr[i]\n sum_sorted += sorted_arr[i]\n \n if sum_arr == sum_sorted:\n chunks += 1\n \n return chunks\n```\n时间复杂度:O(N log N),瓶颈在于对数组的排序。\n\n空间复杂度:O(N),用于存储排序后的数组副本。\n\n还有一个基于单调栈的解法,时间复杂度可以做到 O(N)。\n\n思路是遍历数组,用一个栈来维护每个块的最大值。\n\n1. 如果当前元素 num 大于或等于栈顶元素,说明 num 可以自己形成一个新的块(或者加入前一个块且不影响排序性),直接将 num 入栈。\n2. 如果当前元素 num 小于栈顶元素,说明 num 必须和前面的块合并,直到栈顶元素小于或等于 num。在合并过程中,需要记录被弹出的那些块中的最大值 head,因为这个 head 将成为合并后新块的最大值,然后将 head 入栈。\n\n最终栈的大小就是块的数量。\n```python\nfrom typing import List\n\nclass Solution:\n def maxChunksToSorted(self, arr: List[int]) -> int:\n stack = []\n for num in arr:\n if not stack or num >= stack[-1]:\n stack.append(num)\n else:\n # 当前元素num比栈顶小,需要合并\n head = stack.pop()\n # 持续弹出所有大于num的元素\n while stack and stack[-1] > num:\n stack.pop()\n # 将原先这些块的最大值head作为新块的代表入栈\n stack.append(head)\n return len(stack)\n```\n\n时间复杂度:O(N),因为每个元素最多入栈和出栈一次。\n\n空间复杂度:O(N),在最坏的情况下(例如数组本身有序),栈的大小会等于数组长度。\n","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112533354","body":"双指针\n1. 创建两个指针 pA 和 pB,分别指向两个链表的头节点 headA 和 headB。\n2. 同时向前移动这两个指针,pA 每次走一步,pB 每次也走一步。\n3. 核心操作:如果 pA 指针走到了链表 A 的末尾(即 pA 变为 None),则将它重定向到链表 B 的头节点 headB。同样,如果 pB 指针走到了链表 B 的末尾,则将它重定向到链表 A 的头节点 headA。\n4. 两个指针最终会在相交点相遇。如果两个链表不相交,它们会同时在路径的最后变为 None,此时循环结束。\n\n```python\nclass Solution:\n def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:\n if not headA or not headB:\n return None\n\n pA = headA\n pB = headB\n\n # 当 pA 和 pB 相等时循环终止(可能是在交点,也可能同为 None)\n while pA is not pB:\n # 如果pA走到头,就让他从headB开始走;否则,pA正常往下走\n pA = headB if pA is None else pA.next\n # 如果pB走到头,就让他从headA开始走;否则,pB正常往下走\n pB = headA if pB is None else pB.next\n \n # 返回相遇点\n return pA\n```\n时间复杂度:O(m+n)。在最坏的情况下(例如,两个链表不相交),每个指针都需要遍历两个链表的总长度。\n空间复杂度:O(1)。只使用了两个额外的指针,没有使用其他数据结构。","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3121201700","body":"为了实现一个支持 O(1) 时间复杂度的查找插入和删除,可以用hash map去记录key和value之间的映射关系。但是hash map是无序的,没有办法记录各项的使用顺序,可以一个双向链表来记录使用顺序。这样就可以在插入和删除的时候,快速地调整链表的顺序。\n\n```python\nclass DLinkedNode:\n def __init__(self, key=0, value=0):\n self.key = key\n self.value = value\n self.prev = None\n self.next = None\n\nclass LRUCache:\n def __init__(self, capacity: int):\n self.cache = dict()\n self.capacity = capacity\n # 使用伪头部和伪尾部节点,简化边界条件处理\n self.head = DLinkedNode()\n self.tail = DLinkedNode()\n self.head.next = self.tail\n self.tail.prev = self.head\n\n def _add_to_head(self, node: DLinkedNode):\n # 将节点添加到头部\n node.prev = self.head\n node.next = self.head.next\n self.head.next.prev = node\n self.head.next = node\n\n def _remove_node(self, node: DLinkedNode):\n # 从链表中删除一个节点\n node.prev.next = node.next\n node.next.prev = node.prev\n\n def _move_to_head(self, node: DLinkedNode):\n # 将一个存在的节点移动到头部\n self._remove_node(node)\n self._add_to_head(node)\n\n def get(self, key: int) -> int:\n if key not in self.cache:\n return -1\n \n node = self.cache[key]\n # 访问过后,变为最近使用,移动到头部\n self._move_to_head(node)\n return node.value\n\n def put(self, key: int, value: int) -> None:\n if key in self.cache:\n # 如果 key 存在,更新值并移动到头部\n node = self.cache[key]\n node.value = value\n self._move_to_head(node)\n else:\n # 如果 key 不存在\n if len(self.cache) == self.capacity:\n # 缓存已满,淘汰最久未使用的节点(尾部节点)\n removed_node = self.tail.prev\n self._remove_node(removed_node)\n # 不要忘了从哈希表中也删除\n del self.cache[removed_node.key]\n\n # 创建新节点并添加到头部\n new_node = DLinkedNode(key, value)\n self._add_to_head(new_node)\n self.cache[key] = new_node\n```\n时间复杂度:get 和 put 操作都是 O(1)。所有操作都是哈希表查找和链表头尾操作的组合。\n空间复杂度:O(capacity),因为哈希表和双向链表最多存储 capacity 个元素。","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3132881592","body":"DFS - 递归\n这道题的结构天然适合使用递归来解决。我们可以定义一个函数,该函数接收一个节点和从根到该节点父节点所构成的数字。\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import Optional\n\nclass Solution:\n def sumNumbers(self, root: Optional[TreeNode]) -> int:\n \n def dfs(node: Optional[TreeNode], current_path_sum: int) -> int:\n if not node:\n return 0\n \n # 计算到达当前节点的路径代表的数字\n new_sum = current_path_sum * 10 + node.val\n \n # 如果是叶子节点,返回当前路径的数字\n if not node.left and not node.right:\n return new_sum\n \n # 如果不是叶子节点,返回左右子树的路径数字之和\n else:\n return dfs(node.left, new_sum) + dfs(node.right, new_sum)\n\n return dfs(root, 0)\n```\n时间复杂度:O(N),其中 N 是树中节点的数量。我们需要访问每个节点一次。\n空间复杂度:O(H),其中 H 是树的高度。这部分空间用于递归调用栈。在最坏的情况下(树退化成链表),空间复杂度为 O(N);在最好的情况下(完全二叉树),空间复杂度为 O(log N)。\n\n---\n\nDFS - 迭代\n> 递归可能导致的栈溢出问题(在树极深的情况下),我们可以将递归转换为迭代\n\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import Optional\n\nclass Solution:\n def sumNumbers(self, root: Optional[TreeNode]) -> int:\n if not root:\n return 0\n \n total_sum = 0\n stack = [(root, root.val)] # 栈中存储 (节点, 到达该节点的路径数值)\n\n while stack:\n node, current_number = stack.pop()\n\n # 如果是叶子节点,将路径数值加入总和\n if not node.left and not node.right:\n total_sum += current_number\n\n # 将右子节点压栈\n if node.right:\n stack.append((node.right, current_number * 10 + node.right.val))\n \n # 将左子节点压栈\n if node.left:\n stack.append((node.left, current_number * 10 + node.left.val))\n \n return total_sum\n```\n时间复杂度:O(N),每个节点入栈和出栈一次。\n空间复杂度:O(H),栈在最坏情况下存储 H 个节点,H 是树的高度。与递归版本类似,最好情况 O(log N),最坏情况 O(N)。\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3134942374","body":"因为题目中提到了**行**,我们可以用bfs一行一行地处理树的节点\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import Optional\nimport collections\n\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n if not root:\n return 0\n \n queue = collections.deque([root])\n bottom_left_val = 0\n \n while queue:\n # 当前层的节点数量\n level_size = len(queue)\n \n # 每一层的第一个节点就是该层的最左侧节点\n # 我们只需要记录它,然后继续遍历\n bottom_left_val = queue[0].val\n \n # 遍历当前层的所有节点\n for _ in range(level_size):\n node = queue.popleft()\n \n # 将下一层的节点加入队列\n if node.left:\n queue.append(node.left)\n if node.right:\n queue.append(node.right)\n \n return bottom_left_val\n```\n时间复杂度:O(N),其中 N 是树中节点的总数。因为每个节点都会入队和出队一次。\n空间复杂度:O(W),其中 W 是树的最大宽度。在最坏的情况下(一个完整的二叉树),队列的大小可以达到 N/2。\n\n---\n当然dfs也是可以做的,要记录目前为止发现的最深层级max_depth和最深层级最左边节点的值result_val,先左后右地进行递归\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import Optional\n\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n self.max_depth = -1 # 记录最大深度,初始化为-1\n self.result_val = 0 # 记录结果值\n \n def dfs(node: Optional[TreeNode], current_depth: int):\n if not node:\n return\n \n # 如果当前深度大于已记录的最大深度\n # 说明我们第一次到达这个新深度,且由于先序遍历的顺序,这一定是该层最左的节点\n if current_depth > self.max_depth:\n self.max_depth = current_depth\n self.result_val = node.val\n \n # 必须先遍历左子树,再遍历右子树\n dfs(node.left, current_depth + 1)\n dfs(node.right, current_depth + 1)\n \n dfs(root, 0)\n return self.result_val\n```\n时间复杂度:O(N),因为我们仍然需要访问树中的每一个节点。\n空间复杂度:O(H),其中 H 是树的高度。这部分空间是递归调用栈所占用的。最坏情况下,树呈链状,空间复杂度为 O(N)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3146236433","body":"```python\n# Definition for a binary tree node.\n# class TreeNode(object):\n# def __init__(self, x):\n# self.val = x\n# self.left = None\n# self.right = None\n\nclass Codec:\n\n def serialize(self, root):\n \"\"\"Encodes a tree to a single string.\n \n :type root: TreeNode\n :rtype: str\n \"\"\"\n res = []\n def dfs(node):\n if not node:\n res.append(\"null\")\n return\n res.append(str(node.val))\n dfs(node.left)\n dfs(node.right)\n \n dfs(root)\n return \",\".join(res)\n\n def deserialize(self, data):\n \"\"\"Decodes your encoded data to tree.\n \n :type data: str\n :rtype: TreeNode\n \"\"\"\n if not data:\n return None\n \n # 使用列表模拟一个队列,方便 pop(0)\n node_list = data.split(',')\n \n def build_tree():\n val = node_list.pop(0)\n if val == \"null\":\n return None\n \n node = TreeNode(int(val))\n node.left = build_tree()\n node.right = build_tree()\n return node\n \n return build_tree()\n```\n复杂度 空间和时间都是 O(N)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3141867802","body":"坐标记录 + 排序\n为每一个节点确定其坐标 (row, col),并记录下 (row, col, val) 这个三元组。最后BFS即可(DFS应该也行)\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import List, Optional\nimport collections\n\nclass Solution:\n def verticalTraversal(self, root: Optional[TreeNode]) -> List[List[int]]:\n if not root:\n return []\n \n # 1. 遍历与记录\n # 使用 BFS 遍历树,记录每个节点的 (col, row, val)\n nodes_info = []\n queue = collections.deque([(root, 0, 0)]) # (node, row, col)\n \n while queue:\n node, row, col = queue.popleft()\n nodes_info.append((col, row, node.val))\n \n if node.left:\n queue.append((node.left, row + 1, col - 1))\n if node.right:\n queue.append((node.right, row + 1, col + 1))\n \n # 2. 排序\n # 对记录下来的节点信息进行排序\n # Python 的元组排序默认按元素顺序比较,完美符合题目要求\n nodes_info.sort()\n \n # 3. 分组\n # 将排序后的结果按列分组\n result_map = collections.OrderedDict()\n for col, row, val in nodes_info:\n if col not in result_map:\n result_map[col] = []\n result_map[col].append(val)\n \n return list(result_map.values())\n```\n时间复杂度:O(N log N)。\nBFS 遍历需要 O(N) 的时间,其中 N 是节点数。nodes_info.sort() 是整个算法的瓶颈,对 N 个元素排序需要 O(N log N) 的时间。最后的分组步骤需要 O(N) 的时间。\n因此,总时间复杂度为 O(N log N)。\n\n空间复杂度:O(N)。\nBFS 的队列在最坏情况下需要存储 O(W) 个节点,W 是树的最大宽度。nodes_info 列表需要存储所有 N 个节点的信息,因此需要 O(N) 的空间。result_map 也需要 O(N) 的空间来存储所有节点的值。\n因此,总空间复杂度为 O(N)。\n\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146235205","body":"```python\nfrom typing import List, Set\n\nclass Solution:\n def generateParenthesis(self, n: int) -> List[str]:\n # 使用列表来模拟dp数组,每个元素是一个哈希集合\n dp: List[Set[str]] = [set() for _ in range(n + 1)]\n \n # 基础情况:0对括号只有一种组合,即空字符串\n dp[0].add(\"\")\n \n # 从1对括号开始,迭代到n对\n for i in range(1, n + 1):\n # 遍历所有可能的分割点 j\n for j in range(i):\n # A 部分有 j 对括号,B 部分有 i-1-j 对\n list_p = dp[j]\n list_q = dp[i - 1 - j]\n \n # 组合 p 和 q\n for p in list_p:\n for q in list_q:\n # 使用哈希集合 dp[i] 自动去重\n dp[i].add(f\"({p}){q}\")\n \n return list(dp[n])\n```\n复杂度好像有点难算 看看大家有没有什么想法 我再算一算","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3147359265","body":"首先想到的是26字母那道题一样开一个数组然后建一个数组索引转换hash map去做 但是我不清楚是不是升序 所以要用min和max 那这样的效果肯定很差 内存会超 结果没想到居然能过\n```python\nfrom typing import List\n\nclass Solution:\n def topKFrequent(self, nums: List[int], k: int) -> List[int]:\n if not nums:\n return []\n \n # -----------------------------------------------------------------\n # 步骤 1: 使用“数组哈希”(直接寻址法)统计频率\n # -----------------------------------------------------------------\n \n # a. 找到数值范围以确定数组大小\n min_val = min(nums)\n max_val = max(nums)\n \n # b. 定义偏移量,将所有数值映射到数组的非负索引\n offset = -min_val\n \n # c. 创建计数数组\n count_array_size = max_val - min_val + 1\n count_array = [0] * count_array_size\n \n # d. 遍历原数组,完成计数\n for num in nums:\n # 将 num 通过偏移量映射到数组索引\n index = num + offset\n count_array[index] += 1\n\n # -----------------------------------------------------------------\n # 步骤 2: 使用桶排序来找到前 K 个高频元素\n # -----------------------------------------------------------------\n\n # a. 创建桶,桶的索引代表频率\n # 桶的数量是 len(nums) + 1,因为一个元素的频率不可能超过总数\n buckets = [[] for _ in range(len(nums) + 1)]\n\n # b. 遍历计数数组,将元素放入对应频率的桶中\n for i in range(count_array_size):\n freq = count_array[i]\n if freq > 0:\n # 将索引 i 转换回原始数字\n num = i - offset\n buckets[freq].append(num)\n\n # -----------------------------------------------------------------\n # 步骤 3: 从后往前收集结果\n # -----------------------------------------------------------------\n \n result = []\n # 从最高频率的桶开始遍历\n for i in range(len(buckets) - 1, 0, -1):\n # 如果当前频率的桶中有元素\n if buckets[i]:\n # 将这个桶里的所有元素加入结果集\n result.extend(buckets[i])\n \n # 如果结果集大小已经足够,可以提前退出\n if len(result) >= k:\n break\n \n # 返回前 k 个元素,如果最后一个桶加入了多余元素,用切片保证只返回k个\n return result[:k]\n```\n---\n然后我想到遍历数组 建一个hash map(元素,频率) 然后按频率降序排序提出来前k个\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def topKFrequent(self, nums: List[int], k: int) -> List[int]:\n # 1. 使用 collections.Counter 快速统计频率,O(N)\n freq_map = collections.Counter(nums)\n \n # 2. 对哈希表按值(频率)进行排序\n # sorted 函数的时间复杂度是 O(M log M),其中 M 是不同元素的数量\n # M <= N,所以最坏是 O(N log N)\n sorted_items = sorted(freq_map.items(), key=lambda item: item[1], reverse=True)\n \n # 3. 提取前 k 个元素\n result = [item[0] for item in sorted_items[:k]]\n \n return result\n```\n空间复杂度:O(N)\n时间复杂度:O(NlogN)。其中 N 是数组 nums 的长度。瓶颈在于排序那一步,即使只有 M 个独立元素,在最坏情况下 M 可能等于 N。这个复杂度不满足题目进阶要求。\n\n---\n可以看到关键问题在于排序,想办法避免排序 我就可以用最小堆来做\n维护一个最小的heapq 按频率存入 如果堆的大小超过k了就把频率最低的pop out就行\n```python\nimport collections\nimport heapq\nfrom typing import List\n\nclass Solution:\n def topKFrequent(self, nums: List[int], k: int) -> List[int]:\n # 1. 统计频率,O(N)\n freq_map = collections.Counter(nums)\n \n # 2. 维护一个大小为 k 的最小堆,O(M log k),M是不同元素的数量\n min_heap = []\n for num, freq in freq_map.items():\n # Python的heapq是最小堆,所以我们存入(频率, 数字)\n # 这样堆会根据频率排序\n heapq.heappush(min_heap, (freq, num))\n if len(min_heap) > k:\n heapq.heappop(min_heap) # pop out频率最小的元素\n \n # 3. 提取结果\n # 此时堆中的k个元素就是频率最高的k个\n result = [item[1] for item in min_heap]\n return result\n```\n","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3156822202","body":"双指针滑动窗口\n```python\nclass Solution:\n def lengthOfLongestSubstring(self, s: str) -> int:\n # 哈希表存储 {字符: 最后出现的位置索引}\n char_map = {}\n max_len = 0\n left = 0 # 窗口的左边界\n \n # right 是窗口的右边界,不断向右移动\n for right in range(len(s)):\n char = s[right]\n \n # 如果当前字符已经存在于哈希表中,并且其位置在当前窗口内\n if char in char_map and char_map[char] >= left:\n # 遇到重复字符,收缩窗口\n # 将左边界移动到重复字符上一次出现位置的下一个位置\n left = char_map[char] + 1\n \n # 更新字符的最新位置\n char_map[char] = right\n \n # 更新最大长度\n current_len = right - left + 1\n max_len = max(max_len, current_len)\n \n return max_len\n```\n时间复杂度:O(N)。left 和 right 两个指针都只会从头到尾遍历字符串一次,每个字符最多被访问两次。\n\n空间复杂度:O(k),其中 k 是字符串中不同字符的数量。在最坏的情况下(所有字符都不同),空间复杂度为 O(N)。如果字符集有限(例如 ASCII 码共 128 个),则空间复杂度为常数 O(128)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3156831483","body":"这道题和上一题的区别一个是子字符串(3)一个是子序列(30)\n解法还是双指针滑动窗口 只不过需要改造一下,现在要独立扫描word_len 次\n即\n>第一次扫描:从索引 0 开始,窗口每次移动 word_len,检查的子串是 s[0...], s[word_len...], s[2*word_len...] ...\n第二次扫描:从索引 1 开始,窗口每次移动 word_len,检查的子串是 s[1...], s[1+word_len...], s[1+2*word_len...] ...\n\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def findSubstring(self, s: str, words: List[str]) -> List[int]:\n if not s or not words:\n return []\n\n word_len = len(words[0])\n num_words = len(words)\n total_len = word_len * num_words\n words_freq = collections.Counter(words)\n result = []\n\n # 我们需要进行 word_len 次扫描\n for i in range(word_len):\n left = i # 当前扫描的窗口左边界\n seen = collections.Counter() # 当前窗口内单词的频率\n count = 0 # 当前窗口内有效单词的数量\n\n # 窗口右边界以 word_len 为步长滑动\n for j in range(i, len(s) - word_len + 1, word_len):\n word = s[j : j + word_len]\n \n if word in words_freq:\n seen[word] += 1\n count += 1\n \n # 如果一个单词的数量超了,就从左边收缩窗口\n while seen[word] > words_freq[word]:\n left_word = s[left : left + word_len]\n seen[left_word] -= 1\n count -= 1\n left += word_len\n \n # 如果窗口内单词数量正好,说明找到了一个解\n if count == num_words:\n result.append(left)\n # 为了继续搜索,将窗口最左边的单词移出\n left_word = s[left : left + word_len]\n seen[left_word] -= 1\n count -= 1\n left += word_len\n\n else:\n # 如果遇到的单词不在 words 列表中,则当前窗口作废\n # 直接将左边界移动到这个坏单词的后面\n seen.clear()\n count = 0\n left = j + word_len\n \n return result\n```\n时间复杂度O(N),N是字符串s的长度\n空间复杂度O(ML),M是words列表里的单词数量 L是每个单词长度","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3161453831","body":"```python\nfrom typing import List\n\nclass Solution:\n def minSubarray(self, nums: List[int], p: int) -> int:\n n = len(nums)\n # 1. 同余定理:计算目标余数\n target_rem = sum(nums) % p\n \n # 如果总和已经能被 p 整除,无需移除\n if target_rem == 0:\n return 0\n \n # 2. 哈希表:存储 {余数: 最后一次出现的索引}\n # 初始化 {0: -1} 来处理从开头开始的子数组\n rem_map = {0: -1}\n min_len = n # 初始化为一个最大值\n \n # 3. 前缀和:用一个变量 current_sum 动态计算\n current_sum = 0\n \n for i, num in enumerate(nums):\n current_sum += num\n current_rem = current_sum % p\n \n # 计算需要寻找的配对余数\n needed_rem = (current_rem - target_rem + p) % p\n \n # 如果找到了配对\n if needed_rem in rem_map:\n prev_index = rem_map[needed_rem]\n # 更新最短长度\n min_len = min(min_len, i - prev_index)\n \n # 更新当前余数的最新索引\n rem_map[current_rem] = i\n \n # 如果 min_len 没有被更新过,或者更新后的值等于n(意味着要移除整个数组)\n # 则说明找不到合适的“真”子数组\n return min_len if min_len < n else -1\n```\n时间复杂度:O(N),因为我们只遍历了数组一次。\n空间复杂度:O(min(N,p)),因为哈希表中最多存储 p 个不同的余数。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3169922808","body":"双指针\n```python\nfrom typing import Optional\n\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\n\nclass Solution:\n def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:\n # 初始化快慢指针\n slow = head\n fast = head\n \n # 当快指针没有走到链表末尾时\n while fast and fast.next:\n # 慢指针走一步\n slow = slow.next\n # 快指针走两步\n fast = fast.next.next\n \n # 当循环结束时,慢指针正好在中间位置\n return slow\n```\n时间复杂度:O(N)。虽然有两个指针,但我们只对链表进行了一次单向遍历。\n空间复杂度:O(1)。只使用了两个额外的指针变量,没有使用额外的存储空间。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3169886502","body":"双指针/快慢指针\n快的去遍历 慢的维护只出现一次的元素\n```python\nfrom typing import List\n\nclass Solution:\n def removeDuplicates(self, nums: List[int]) -> int:\n # 如果数组为空,直接返回 0\n if not nums:\n return 0\n \n # slow 指针指向下一个将要被赋值的、新的不重复元素的位置。\n # nums[0] 默认是第一个不重复的元素,所以 slow 从 1 开始。\n slow = 1\n \n # fast 指针从第二个元素开始,遍历整个数组\n for fast in range(1, len(nums)):\n if nums[fast] != nums[fast - 1]:\n nums[slow] = nums[fast]\n slow += 1\n \n return slow","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173197055","body":"我们可以用单调队列(双端队列 (deque))来维护窗口内的“候选最大值”,使得获取当前最大值的操作是 O(1) 的\n>双端队列 (deque)\n队列中存储的是数组元素的索引,而不是元素本身。\n队列中的索引所对应的 nums 数组中的值,是从头到尾单调递减的。\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:\n n = len(nums)\n if n * k == 0:\n return []\n \n # 单调队列,存储的是元素的索引\n # 队列中的索引对应的 nums 值是单调递减的\n deque = collections.deque()\n result = []\n\n for i in range(n):\n # 1. 维护单调性:移除队尾所有小于当前值的元素\n while deque and nums[deque[-1]] <= nums[i]:\n deque.pop()\n \n # 2. 当前元素索引入队\n deque.append(i)\n \n # 3. 维护窗口大小:移除已经滑出窗口的队头元素\n if deque[0] <= i - k:\n deque.popleft()\n \n # 4. 记录结果:当窗口完全形成后开始记录\n if i >= k - 1:\n # 队头元素永远是当前窗口的最大值\n result.append(nums[deque[0]])\n \n return result\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3187054447","body":"```python\nfrom typing import List\n\nclass Solution:\n def findJudge(self, n: int, trust: List[List[int]]) -> int:\n # 使用一个数组记录每个人的信任差额\n trust_scores = [0] * (n + 1)\n \n for a, b in trust:\n trust_scores[a] -= 1 # 信任别人,分数-1\n trust_scores[b] += 1 # 被人信任,分数+1\n \n # 寻找分数为 n-1 的法官\n for i in range(1, n + 1):\n if trust_scores[i] == n - 1:\n return i\n \n return -1\n```\n时间复杂度: O(n + m), m为trust列表长度\n空间复杂度: O(n)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3187045338","body":"这道题的本质是判断一个图是否为二分图 (Bipartite Graph)。\n n 个人看作是图的 n 个节点 (Vertex),每一对 dislike关系 [a, b] 看作是连接节点 a 和 b 的一条无向边 (Edge)。\n判断由人和他们之间的“不喜欢”关系构成的图,是否是一个二分图。\nDFS着色\n```python\nfrom typing import List\n\nclass Solution:\n def possibleBipartition(self, n: int, dislikes: List[List[int]]) -> bool:\n # 1. 构建图的邻接表\n graph = [[] for _ in range(n + 1)]\n for u, v in dislikes:\n graph[u].append(v)\n graph[v].append(u)\n \n # 2. 创建 colors 数组,0:未着色, 1:颜色A, -1:颜色B\n colors = [0] * (n + 1)\n \n # 3. 遍历所有节点\n for i in range(1, n + 1):\n # 如果节点未被着色,从它开始进行DFS\n if colors[i] == 0:\n if not self.dfs(i, 1, colors, graph):\n return False\n \n return True\n\n def dfs(self, node: int, color: int, colors: List[int], graph: List[List[int]]) -> bool:\n # 给当前节点染色\n colors[node] = color\n \n # 遍历所有邻居\n for neighbor in graph[node]:\n # 如果邻居颜色与当前节点相同,产生冲突\n if colors[neighbor] == color:\n return False\n # 如果邻居未被染色,对其进行DFS\n if colors[neighbor] == 0:\n # 给邻居染上相反的颜色\n if not self.dfs(neighbor, -color, colors, graph):\n return False\n \n return True\n```\nBFS着色\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def possibleBipartition(self, n: int, dislikes: List[List[int]]) -> bool:\n # 1. 构建图的邻接表\n graph = [[] for _ in range(n + 1)]\n for u, v in dislikes:\n graph[u].append(v)\n graph[v].append(u)\n \n # 2. 创建 colors 数组\n colors = [0] * (n + 1)\n \n # 3. 遍历所有节点\n for i in range(1, n + 1):\n if colors[i] == 0: # 未被染色,开始BFS\n queue = collections.deque([i])\n colors[i] = 1 # 染上颜色A\n \n while queue:\n node = queue.popleft()\n # 遍历邻居\n for neighbor in graph[node]:\n # 如果邻居颜色与当前节点相同,冲突\n if colors[neighbor] == colors[node]:\n return False\n # 如果邻居未染色,染上相反颜色并入队\n if colors[neighbor] == 0:\n colors[neighbor] = -colors[node]\n queue.append(neighbor)\n \n return True\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3187051602","body":"双层拓扑排序 关键在于排序的规则\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def sortItems(self, n: int, m: int, group: List[int], beforeItems: List[List[int]]) -> List[int]:\n \n # 1. 数据预处理:为没有团队的项目分配新团队ID\n new_group_id = m\n for i in range(n):\n if group[i] == -1:\n group[i] = new_group_id\n new_group_id += 1\n \n num_groups = new_group_id\n\n # 2. 构建项目图和团队图及其入度数组\n item_graph = [[] for _ in range(n)]\n item_indegree = [0] * n\n group_graph = [[] for _ in range(num_groups)]\n group_indegree = [0] * num_groups\n\n for i in range(n):\n for prev_item in beforeItems[i]:\n # 项目图依赖\n item_graph[prev_item].append(i)\n item_indegree[i] += 1\n \n # 如果属于不同团队,则产生团队图依赖\n if group[prev_item] != group[i]:\n group_graph[group[prev_item]].append(group[i])\n group_indegree[group[i]] += 1\n\n # 3. 通用的拓扑排序函数\n def topological_sort(graph, indegree):\n num_nodes = len(graph)\n queue = collections.deque([i for i in range(num_nodes) if indegree[i] == 0])\n sorted_order = []\n while queue:\n u = queue.popleft()\n sorted_order.append(u)\n for v in graph[u]:\n indegree[v] -= 1\n if indegree[v] == 0:\n queue.append(v)\n \n return sorted_order if len(sorted_order) == num_nodes else []\n\n # 4. 执行两次拓扑排序\n item_order = topological_sort(item_graph, item_indegree)\n group_order = topological_sort(group_graph, group_indegree)\n\n if not item_order or not group_order:\n return []\n\n # 5. 合并结果\n # a. 将排好序的项目按团队分组\n items_by_group = collections.defaultdict(list)\n for item in item_order:\n items_by_group[group[item]].append(item)\n \n # b. 根据团队顺序,拼接项目\n final_result = []\n for group_id in group_order:\n final_result.extend(items_by_group[group_id])\n \n return final_result\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3193081347","body":"模拟\n```python\nclass Solution:\n def judgeCircle(self, moves: str) -> bool:\n # 初始化坐标\n x, y = 0, 0\n \n # 遍历每一步\n for move in moves:\n if move == 'U':\n y += 1\n elif move == 'D':\n y -= 1\n elif move == 'L':\n x -= 1\n elif move == 'R':\n x += 1\n \n # 检查最终位置是否为原点\n return x == 0 and y == 0\n```\n或者直接看字符串里面是否满足U==D, L==R\n```python\nclass Solution:\n def judgeCircle(self, moves: str) -> bool:\n # Python 的 count() 方法让这个思路的实现非常简洁\n # 检查向上和向下的步数是否相等\n vertical_balance = (moves.count('U') == moves.count('D'))\n \n # 检查向左和向右的步数是否相等\n horizontal_balance = (moves.count('L') == moves.count('R'))\n \n return vertical_balance and horizontal_balance\n```\n两个复杂度是一样的\n时间复杂度:O(N)\n空间复杂度:O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193084373","body":"排序 + 最小堆\nmin_heap存放已到达但未执行的任务(processingTime, original_index) 按照时间、索引排序\n```python\nimport heapq\nfrom typing import List\n\nclass Solution:\n def getOrder(self, tasks: List[List[int]]) -> List[int]:\n # 1. 数据预处理:附加原始索引并按入队时间排序\n # tasks_with_indices 的格式: [[enqueueTime, processingTime, original_index], ...]\n tasks_with_indices = sorted(\n [(tasks[i][0], tasks[i][1], i) for i in range(len(tasks))]\n )\n \n result_order = []\n min_heap = [] # 优先队列,存储 (processingTime, original_index)\n \n task_pointer = 0 # 指向下一个要检查的任务\n current_time = 0 # 当前时间\n \n # 当还有任务未处理或未入队时,循环继续\n while task_pointer < len(tasks) or min_heap:\n \n # 如果CPU空闲且没有任务在等待,快进到下一个任务的到达时间\n if not min_heap and current_time < tasks_with_indices[task_pointer][0]:\n current_time = tasks_with_indices[task_pointer][0]\n\n # 2. 将所有已到达的任务加入最小堆\n while task_pointer < len(tasks) and tasks_with_indices[task_pointer][0] <= current_time:\n enqueue_time, process_time, original_index = tasks_with_indices[task_pointer]\n heapq.heappush(min_heap, (process_time, original_index))\n task_pointer += 1\n \n # 3. 从堆中取出最优任务执行\n if min_heap:\n process_time, original_index = heapq.heappop(min_heap)\n current_time += process_time\n result_order.append(original_index)\n \n return result_order\n```\n复杂度:假设N个任务,那么时间复杂度是O(NlogN)有排序造成的,空间是O(N) tasks列表和min_heap都需要O(N)的空间","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3204406944","body":"a->c,需要len(a) - a中c的个数\nb->c需要len(b) - b中c的个数\n我们需要考虑len(a) + len(b) - (a中c的个数 + b中c的个数)\n此外还可以优化一下\n如果a= c 的字符。\nb 中需要改变的,是那些 < c 的字符。\na>=b同理\n```python\nimport collections\n\nclass Solution:\n def minCharacters(self, a: str, b: str) -> int:\n n, m = len(a), len(b)\n freq_a = collections.Counter(a)\n freq_b = collections.Counter(b)\n\n # --- 计算条件 3 的最小代价 ---\n # 代价 = 总长度 - 两个字符串中某个字符的最大总频次\n max_combined_freq = 0\n for i in range(26):\n char = chr(ord('a') + i)\n max_combined_freq = max(max_combined_freq, freq_a[char] + freq_b[char])\n \n cost3 = n + m - max_combined_freq\n\n # --- 计算条件 1 (a < b) 和 条件 2 (b < a) 的最小代价 ---\n cost1 = float('inf') # a < b\n cost2 = float('inf') # b < a\n \n # 使用前缀/后缀和的思想来优化计数\n a_lt_count = 0 # a 中 < 当前分界线的字符数\n b_lt_count = 0\n \n # 遍历所有 25 个可能的分界线 ('b' 到 'z')\n for i in range(25):\n char = chr(ord('a') + i)\n a_lt_count += freq_a[char]\n b_lt_count += freq_b[char]\n \n # 分界线是 char_next = chr(ord('a') + i + 1)\n # 条件 1 (a < char_next, b >= char_next):\n # - a 中要改的是 >= char_next 的, 即 (n - a_lt_count)\n # - b 中要改的是 < char_next 的, 即 b_lt_count\n current_cost1 = (n - a_lt_count) + b_lt_count\n cost1 = min(cost1, current_cost1)\n \n # 条件 2 (b < char_next, a >= char_next):\n # - b 中要改的是 >= char_next 的, 即 (m - b_lt_count)\n # - a 中要改的是 < char_next 的, 即 a_lt_count\n current_cost2 = (m - b_lt_count) + a_lt_count\n cost2 = min(cost2, current_cost2)\n\n return min(cost1, cost2, cost3)\n```\n时间复杂度:O(N+M),其中 N 和 M 分别是两个字符串的长度。\n空间复杂度:O(1),大小为 26 的频率表\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3208576782","body":"堆排序\n```python\nclass Solution:\n def sortArray(self, nums: List[int]) -> List[int]:\n def heapify(nums, n, i):\n largest = i\n left = 2 * i + 1\n right = 2 * i + 2\n\n if left < n and nums[left] > nums[largest]:\n largest = left\n if right < n and nums[right] > nums[largest]:\n largest = right\n if largest != i:\n nums[i], nums[largest] = nums[largest], nums[i]\n heapify(nums, n, largest)\n\n n = len(nums)\n for i in range(n // 2 - 1, -1, -1):\n heapify(nums, n, i)\n\n for i in range(n - 1, 0, -1):\n nums[i], nums[0] = nums[0], nums[i]\n heapify(nums, i, 0)\n```\n时间复杂度:O(NlogN)\n空间复杂度:O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3208555582","body":"二分\n```python\nclass Solution:\n def mySqrt(self, x: int) -> int:\n\n if x == 0:\n return 0\n \n # 定义二分查找的左右边界\n left, right = 0, x\n ans = 0\n \n while left <= right:\n # 计算中间值\n mid = left + (right - left) // 2\n \n # 避免 mid 为 0 的情况,或者直接判断 mid * mid\n if mid == 0:\n left = mid + 1\n continue\n \n # 比较 mid 的平方与 x\n # 为了防止 mid * mid 溢出(在某些语言中),可以写成 mid <= x / mid\n if mid * mid > x:\n # mid 太大,搜索左半部分\n right = mid - 1\n else:\n # mid 是一个可能的答案,尝试寻找更大的\n ans = mid\n left = mid + 1\n \n return ans\n```\n时间复杂度:O(logN)\n空间复杂度:O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3208553626","body":"二分查找\n```python\nclass Solution:\n def firstBadVersion(self, n: int) -> int:\n left, right = 1, n\n \n while left < right:\n mid = left + (right - left) // 2\n \n if isBadVersion(mid):\n # 如果 mid 是坏的,那第一个坏版本在 [left, mid] 区间内\n # 我们不能排除 mid,所以 right = mid\n right = mid\n else:\n # 如果 mid 是好的,那第一个坏版本在 [mid + 1, right] 区间内\n left = mid + 1\n \n return left\n```\n时间复杂度:O(logN)\n空间复杂度:O(1)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3222475353","body":"排除法\n排除掉卡片的正面和背面是同一个数字 X的卡片\n```python\nfrom typing import List\n\nclass Solution:\n def flipgame(self, fronts: List[int], backs: List[int]) -> int:\n # 1. 找出所有“不可能的”数字\n impossible_nums = set()\n for i in range(len(fronts)):\n if fronts[i] == backs[i]:\n impossible_nums.add(fronts[i])\n \n # 2. 寻找最小的“好”数字\n min_good_num = float('inf')\n found_good_num = False\n \n # 遍历所有出现过的数字\n all_nums = fronts + backs\n \n for num in all_nums:\n # 如果这个数字不是“不可能的”\n if num not in impossible_nums:\n found_good_num = True\n min_good_num = min(min_good_num, num)\n \n # 3. 返回结果\n return min_good_num if found_good_num else 0\n```\n时间复杂度:O(N),其中 N 是卡片的数量。\n空间复杂度:O(N)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3222461055","body":"二分 + DFS/BFS\n```python\nfrom typing import List\n\nclass Solution:\n def swimInWater(self, grid: List[List[int]]) -> int:\n n = len(grid)\n left, right = grid[0][0], n * n - 1\n ans = right\n\n def is_possible(t):\n # 检查在时间 t 是否能从 (0,0) 到达 (n-1, n-1)\n if grid[0][0] > t:\n return False\n \n stack = [(0, 0)]\n visited = {(0, 0)}\n \n while stack:\n r, c = stack.pop()\n if r == n - 1 and c == n - 1:\n return True\n \n for dr, dc in [(0, 1), (0, -1), (1, 0), (-1, 0)]:\n nr, nc = r + dr, c + dc\n if 0 <= nr < n and 0 <= nc < n and (nr, nc) not in visited and grid[nr][nc] <= t:\n visited.add((nr, nc))\n stack.append((nr, nc))\n return False\n\n while left <= right:\n mid = left + (right - left) // 2\n if is_possible(mid):\n ans = mid\n right = mid - 1\n else:\n left = mid + 1\n \n return ans\n```\n时间复杂度:O($n^2logn$)\n空间复杂度:O($n^2$)\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3222456504","body":"Sliding Window\n维护一个固定大小为 k 的窗口,在字符串上滑动。当窗口向右移动一格时,只需要考虑移出窗口的字符和移入窗口的字符对元音数量的影响即可。\n```python\nfrom typing import List\n\nclass Solution:\n def maxVowels(self, s: str, k: int) -> int:\n vowels = {'a', 'e', 'i', 'o', 'u'}\n \n # 1. 初始化:计算第一个窗口的元音数\n current_vowels = 0\n for i in range(k):\n if s[i] in vowels:\n current_vowels += 1\n \n max_vowels = current_vowels\n \n # 2. 滑动窗口\n # 从第 k 个字符开始,模拟窗口向右滑动\n for i in range(k, len(s)):\n # a. 处理新移入的字符 s[i]\n if s[i] in vowels:\n current_vowels += 1\n \n # b. 处理被移出的字符 s[i-k]\n if s[i-k] in vowels:\n current_vowels -= 1\n \n # c. 更新最大值\n max_vowels = max(max_vowels, current_vowels)\n \n return max_vowels\n```\n时间复杂度:O(N)\n空间复杂度:O(1)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3232274052","body":"动态规划 + 滑动窗口\n定义 dp[i] 为:爱丽丝最终得分恰好为 i 的概率,最后要计算$\\sum_i=k^n dp[i]$,dp[0] = 1\n```python\nclass Solution:\n def new21Game(self, n: int, k: int, maxPts: int) -> float:\n # 如果 k=0,开始就是 >=k,游戏直接结束,得分为0,概率为1\n if k == 0:\n return 1.0\n \n # dp[i] 表示得到分数 i 的概率\n dp = [0.0] * (n + 1)\n dp[0] = 1.0\n \n # window_sum 维护一个大小为 maxPts 的滑动窗口内 dp 值的和\n window_sum = 1.0\n result = 0.0\n \n for i in range(1, n + 1):\n # 计算 dp[i]\n dp[i] = window_sum / maxPts\n \n # 如果 i < k,dp[i] 会对后续的 dp 值产生贡献,加入窗口\n if i < k:\n window_sum += dp[i]\n \n # 如果 i >= k,这是一个最终得分,累加到结果中\n # 注意:题目求的是 <= n 的概率,而 dp 数组只到 n,所以循环内累加即可\n if i >= k:\n result += dp[i]\n \n # 如果 i >= maxPts,需要将滑出窗口的 dp 值减去\n if i >= maxPts:\n window_sum -= dp[i - maxPts]\n \n return result\n```\n时间复杂度:O(n)。我们只对 dp 数组进行了一次遍历。\n空间复杂度:O(n)。用于存储 dp 数组。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3232278119","body":"滑动窗口 + 字符频率统计\n```python\nfrom typing import List\n\nclass Solution:\n def findAnagrams(self, s: str, p: str) -> List[int]:\n s_len, p_len = len(s), len(p)\n \n # 边缘情况:如果 s 比 p 短,不可能找到异位词\n if s_len < p_len:\n return []\n \n result = []\n # 使用大小为 26 的数组作为频率统计表\n p_counts = [0] * 26\n s_window_counts = [0] * 26\n \n # 1. & 2. 初始化 p 的频率表和 s 的第一个窗口的频率表\n for i in range(p_len):\n p_counts[ord(p[i]) - ord('a')] += 1\n s_window_counts[ord(s[i]) - ord('a')] += 1\n \n # 3. 第一次比较\n if p_counts == s_window_counts:\n result.append(0)\n \n # 4. 滑动窗口\n for i in range(p_len, s_len):\n # a. 移入新字符\n s_window_counts[ord(s[i]) - ord('a')] += 1\n # b. 移出旧字符\n s_window_counts[ord(s[i - p_len]) - ord('a')] -= 1\n \n # c. 再次比较\n if p_counts == s_window_counts:\n # 当前窗口的起始索引是 i - p_len + 1\n result.append(i - p_len + 1)\n \n return result\n```\n时间复杂度:O(textlen(s)+textlen(p))\n空间复杂度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3235951126","body":"用一个 right 指针不断地扩展窗口,直到窗口内的子串满足了“包含 t 中所有字符”的条件。一旦窗口满足条件,就记录下这个“可行解”,然后开始移动 left 指针,收缩窗口\n```python\nimport collections\n\nclass Solution:\n def minWindow(self, s: str, t: str) -> str:\n # need 存储 t 中字符的需求数量\n need = collections.Counter(t)\n # window 存储当前窗口中字符的数量\n window = collections.Counter()\n\n left, right = 0, 0\n valid = 0 # 记录 window 中有多少字符已经满足了 need 的要求\n \n # 记录最小覆盖子串的起始索引和长度\n start = 0\n min_len = float('inf')\n\n while right < len(s):\n # c 是将移入窗口的字符\n c = s[right]\n right += 1\n \n # 扩展窗口\n if c in need:\n window[c] += 1\n if window[c] == need[c]:\n valid += 1\n \n # 判断左侧窗口是否要收缩\n while valid == len(need):\n # 在这里更新最小覆盖子串\n if right - left < min_len:\n start = left\n min_len = right - left\n\n # d 是将移出窗口的字符\n d = s[left]\n left += 1\n \n # 收缩窗口\n if d in need:\n if window[d] == need[d]:\n valid -= 1\n window[d] -= 1\n\n # 返回最小覆盖子串,如果 min_len 还是初始值,说明没有找到\n return \"\" if min_len == float('inf') else s[start : start + min_len]\n```\n时间复杂度: O(len(s)+len(t))\n空间复杂度: O(N), N是字符集的大小","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3244023262","body":"dfs\n```python\nfrom typing import List\n\nclass Solution:\n def maxAreaOfIsland(self, grid: List[List[int]]) -> int:\n if not grid:\n return 0\n \n rows, cols = len(grid), len(grid[0])\n max_area = 0\n \n def dfs(r, c):\n # 边界条件检查 & 终止条件 (遇到水或已访问过的陆地)\n if not (0 <= r < rows and 0 <= c < cols and grid[r][c] == 1):\n return 0\n \n # 将当前单元格标记为已访问 (沉岛)\n grid[r][c] = 0\n \n # 当前单元格面积为 1,并递归探索四个方向\n return (1 + dfs(r + 1, c) +\n dfs(r - 1, c) +\n dfs(r, c + 1) +\n dfs(r, c - 1))\n\n # 遍历整个网格\n for r in range(rows):\n for c in range(cols):\n if grid[r][c] == 1:\n current_area = dfs(r, c)\n max_area = max(max_area, current_area)\n \n return max_area\n```\n时间复杂度O(MN)\n空间复杂度最坏O(MN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3251910064","body":"Multi-Source BFS\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def maxDistance(self, grid: List[List[int]]) -> int:\n n = len(grid)\n queue = collections.deque()\n \n # 1. 初始化:将所有陆地加入队列\n for r in range(n):\n for c in range(n):\n if grid[r][c] == 1:\n queue.append((r, c))\n \n # 边缘情况:如果全是陆地或全是海洋\n if len(queue) == 0 or len(queue) == n * n:\n return -1\n \n distance = -1\n # 2. 多源 BFS\n while queue:\n distance += 1\n # 遍历当前层的所有节点\n for _ in range(len(queue)):\n r, c = queue.popleft()\n \n # 探索四个方向的邻居\n for dr, dc in [(0, 1), (0, -1), (1, 0), (-1, 0)]:\n nr, nc = r + dr, c + dc\n \n if 0 <= nr < n and 0 <= nc < n and grid[nr][nc] == 0:\n grid[nr][nc] = 1 # 标记为已访问\n queue.append((nr, nc))\n \n return distance\n```\n时间复杂度:O(N^2)\n空间复杂度:O(N^2)\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3251914219","body":"模拟+bfs\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def maxCandies(self, status: List[int], candies: List[int], keys: List[List[int]], containedBoxes: List[List[int]], initialBoxes: List[int]) -> int:\n \n total_candies = 0\n \n # 我们拥有的、但未打开的盒子\n my_closed_boxes = set()\n # 可以打开并处理的盒子队列\n queue = collections.deque()\n\n # 初始化\n for box_idx in initialBoxes:\n if status[box_idx] == 1:\n queue.append(box_idx)\n else:\n my_closed_boxes.add(box_idx)\n\n while queue:\n box_idx = queue.popleft()\n \n # 1. 拿糖果\n total_candies += candies[box_idx]\n \n # 2. 拿钥匙,并用新钥匙尝试打开已有的盒子\n for key in keys[box_idx]:\n status[key] = 1 \n if key in my_closed_boxes:\n queue.append(key)\n my_closed_boxes.remove(key)\n \n # 3. 拿新盒子\n for contained_box in containedBoxes[box_idx]:\n if status[contained_box] == 1:\n queue.append(contained_box)\n else:\n my_closed_boxes.add(contained_box)\n \n return total_candies\n```\n时间复杂度: O(盒子数+钥匙数+内涵盒子数)\n\n空间复杂度: O(盒子数)。最坏情况下要存储所有盒子的信息。\n\n","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/57#issuecomment-3260205356","body":"dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])\n```python\nclass Solution:\n def minCostClimbingStairs(self, cost: List[int]) -> int:\n n = len(cost)\n dp = [0] * (n + 1)\n \n # dp[0] 和 dp[1] 默认为 0,因为可以从这两级开始\n \n # 从第 2 级台阶开始,应用转移方程\n for i in range(2, n + 1):\n dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])\n \n return dp[n]\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/58#issuecomment-3276673110","body":"dp[i] = max(nums[i-1] + dp[i-2], dp[i-1])\n\n```python\nclass Solution:\n def rob(self, nums: List[int]) -> int:\n n = len(nums)\n if n == 0: return 0\n if n == 1: return nums[0]\n \n dp = [0] * (n + 1)\n dp[0] = 0\n dp[1] = nums[0]\n \n for i in range(2, n + 1):\n dp[i] = max(nums[i-1] + dp[i-2], dp[i-1])\n \n return dp[n]\n```\n可以优化到只依赖前两个状态来节省内存空间\n```python\nfrom typing import List\n\nclass Solution:\n def rob(self, nums: List[int]) -> int:\n # rob_prev 代表 dp[i-2],rob_curr 代表 dp[i-1]\n rob_prev, rob_curr = 0, 0\n \n for num in nums:\n # 计算 dp[i] = max(num + dp[i-2], dp[i-1])\n temp = max(num + rob_prev, rob_curr)\n # 更新状态,为下一次循环做准备\n rob_prev = rob_curr\n rob_curr = temp\n \n return rob_curr\n```\n时间复杂度: O(N)\n空间复杂度: O(1)\n\n\n\n\n\n\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/59#issuecomment-3276687323","body":"dp[i] = 1 + max(dp[j]),其中 0 <= j < i 且 nums[j] < nums[i]。\n```python\nfrom typing import List\n\nclass Solution:\n def findNumberOfLIS(self, nums: List[int]) -> int:\n n = len(nums)\n if n <= 1:\n return n\n \n # lengths[i]: 以 nums[i] 结尾的 LIS 长度\n # counts[i]: 以 nums[i] 结尾的 LIS 个数\n lengths = [1] * n\n counts = [1] * n\n\n # 填充 DP 数组\n for i in range(n):\n for j in range(i):\n if nums[j] < nums[i]:\n # 情况一:发现更长的子序列\n if lengths[j] + 1 > lengths[i]:\n lengths[i] = lengths[j] + 1\n counts[i] = counts[j] # 路径数继承\n # 情况二:发现另一条同样长的子序列\n elif lengths[j] + 1 == lengths[i]:\n counts[i] += counts[j] # 路径数累加\n\n max_len = max(lengths)\n result = 0\n for i in range(n):\n if lengths[i] == max_len:\n result += counts[i]\n \n return result\n```\n时间复杂度: O(N^2)\n\n空间复杂度: O(N)\n\n","onTime":false},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/62#issuecomment-3276694316","body":"dp[r][c] =骑士当前位于棋盘上 (r, c) 位置的概率\n从 (r, c) 出发,能为下一个状态 dp_curr 中的 (nr, nc) 贡献 dp_prev[r][c] / 8 的概率\ndp_curr[nr][nc]=\\sum dp(nr, nc)\n```python\nfrom typing import List\n\nclass Solution:\n def knightProbability(self, n: int, k: int, row: int, column: int) -> float:\n # dp[r][c] 表示骑士在 (r, c) 位置的概率\n dp = [[0.0] * n for _ in range(n)]\n dp[row][column] = 1.0\n \n # 骑士的8个移动方向\n moves = [(-2, -1), (-2, 1), (-1, -2), (-1, 2),\n (1, -2), (1, 2), (2, -1), (2, 1)]\n \n # 迭代 k 步\n for _ in range(k):\n # dp_next 用于存储下一步的概率分布\n dp_next = [[0.0] * n for _ in range(n)]\n \n # 遍历棋盘上所有位置\n for r in range(n):\n for c in range(n):\n # 如果当前位置有概率 > 0\n if dp[r][c] > 0:\n # 尝试8种移动\n for dr, dc in moves:\n nr, nc = r + dr, c + dc\n \n # 如果移动后的位置在棋盘内\n if 0 <= nr < n and 0 <= nc < n:\n # 将概率贡献给下一个状态\n dp_next[nr][nc] += dp[r][c] / 8.0\n \n # 用新状态覆盖旧状态\n dp = dp_next\n \n # 计算最终仍在棋盘上的总概率\n total_probability = sum(sum(row) for row in dp)\n return total_probability\n```\n时间复杂度 O(kn^2)\n空间复杂度: O(n^2)","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gjwang224":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3086564307","body":"## Code\n```cpp\nclass Solution {\npublic:\n vector addToArrayForm(vector& num, int k) {\n int len = num.size()-1;\n vector returnNum;\n int tmp=0;\n \n while(k && len>=0){\n returnNum.push_back((num[len] + k%10 + tmp)%10);\n tmp = (num[len] + k%10 + tmp)/10;\n len--;\n k = k/10;\n }\n\n while(k){\n returnNum.push_back((k%10 + tmp)%10);\n tmp = (k%10 + tmp)/10;\n k = k/10;\n }\n \n while(len>=0){\n returnNum.push_back((num[len] + tmp)%10);\n tmp = (num[len] + tmp)/10;\n len--;\n }\n \n if(tmp) returnNum.push_back(tmp);\n reverse(returnNum.begin(), returnNum.end());\n return returnNum;\n }\n};","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3093190969","body":"#### C++\n``` C++\nclass Solution {\npublic:\n vector shortestToChar(string s, char c) {\n vector dis, rearr;\n for(int i = 0; i < s.size(); i++) if(s.at(i) == c) dis.push_back(i);\n for(int i = 0; i < s.size(); i++){\n int minn = 1e5+5;\n for(int j = 0; j < dis.size(); j++){\n minn = min(minn, abs(i-dis.at(j)));\n }\n rearr.push_back(minn);\n }\n return rearr;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3087031064","body":"### C++ 代码\n``` C++\nclass CustomStack {\npublic:\n int stack[1005];\n int size = -1, mS;\n CustomStack(int maxSize) {\n mS = maxSize;\n }\n \n void push(int x) {\n if(size < mS-1){\n stack[++size] = x;\n }\n }\n \n int pop() {\n if(size < 0) return -1;\n else return stack[size--];\n }\n \n void increment(int k, int val) {\n for(int i = 0; i < k; i++){\n stack[i] += val;\n }\n }\n};\n\n/**\n * Your CustomStack object will be instantiated and called as such:\n * CustomStack* obj = new CustomStack(maxSize);\n * obj->push(x);\n * int param_2 = obj->pop();\n * obj->increment(k,val);\n */\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3086899860","body":"### 思路 \n遍历整个字符串,总共有四种可能,分别是 数字 字母 左括号 右括号\n1. 数字:定义`digit`存储读取到的数字\n2. 字母:可以直接读取累加至`res`\n3. 左括号:需要将前面的`res`和`digit`分别入栈,并将其赋为0和”“\n4. 右括号:读取栈顶元素,循环拼接后,累加至`res`\n### C++ 代码\n``` C++\nclass Solution {\npublic:\n string decodeString(string s) {\n stack numStack;\n stack strStack;\n int digit=0;\n string res=\"\";\n\n for(int i = 0; i < s.size(); i++){\n if(s.at(i) >= '0' && s.at(i) <= '9'){// 数字\n digit = digit*10+s.at(i)-'0';\n } else if(s.at(i) >= 'a' && s.at(i) <= 'z'){// 字符\n res += s.at(i);\n } else if(s.at(i) == '['){// 左括号\n numStack.push(digit);\n strStack.push(res);\n res = \"\";\n digit=0;\n } else {// 右括号\n int count = numStack.top();\n numStack.pop();\n string outString = strStack.top();\n strStack.pop();\n for(int i = 0; i < count; i++) outString += res;\n res = outString;\n }\n }\n return res;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092046146","body":"#### 思路\n\n1. `push`和`empty`可以直接进行操作。\n2. `pop`和 `peek`需要得到入栈的第一个元素,可以使用一个辅助栈,对第一个栈进行出栈同时第二个栈进行入栈操作,这样第二个栈`top`得到的元素就是第一个栈入栈的第一个元素。\n\n``` C++\nclass MyQueue {\npublic:\n stack tmp;\n stack stack;\n MyQueue() {\n }\n \n void push(int x) {\n tmp.push(x);\n }\n \n int pop() {\n while(!tmp.empty()){\n stack.push(tmp.top());\n tmp.pop();\n }\n int a = stack.top();\n stack.pop();\n while(!stack.empty()){\n tmp.push(stack.top());\n stack.pop();\n }\n return a;\n }\n \n int peek() {\n while(!tmp.empty()){\n stack.push(tmp.top());\n tmp.pop();\n }\n int a = stack.top();\n while(!stack.empty()){\n tmp.push(stack.top());\n stack.pop();\n }\n return a;\n }\n \n bool empty() {\n return tmp.empty();\n }\n};\n\n/**\n * Your MyQueue object will be instantiated and called as such:\n * MyQueue* obj = new MyQueue();\n * obj->push(x);\n * int param_2 = obj->pop();\n * int param_3 = obj->peek();\n * bool param_4 = obj->empty();\n */\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094511890","body":"#### 哈希\n\n```c++\nclass Solution {\npublic:\n int maxChunksToSorted(vector& arr) {\n unordered_map ans;\n vector tmp = arr;\n sort(tmp.begin(), tmp.end());\n int cnt=0;\n for(int i = 0; i < arr.size(); i++){\n ans[arr[i]]++;\n ans[tmp[i]]--;\n if(ans[arr[i]]==0) ans.erase(arr[i]);\n if(ans[tmp[i]]==0) ans.erase(tmp[i]);\n if(ans.empty()) cnt++;\n }\n return cnt;\n }\n};\n```\n时间复杂度 nlog(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095832085","body":"#### 思路\n\n先将链表变为首尾相连循环链表,然后通过`k`找到断开位置的前一个元素,断开,返回头节点即可。\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * struct ListNode *next;\n * };\n */\nstruct ListNode* rotateRight(struct ListNode* head, int k) {\n if(head==NULL || k==0) return head;\n int len=1;\n struct ListNode * p=head;\n if(p) len=1;\n while(p->next){\n len++;\n p = p->next;\n }\n //printf(\"%d\\n\", len);\n p->next = head;\n k = k%len;\n for(int i = 0; i < len-k-1; i++){\n head = head->next;\n }\n p = head->next;\n head->next = NULL;\n return p;\n}\n```\n\n时间复杂度O(n)\n\n空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3102195778","body":"#### C代码\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * struct ListNode *next;\n * };\n */\nstruct ListNode* swapPairs(struct ListNode* head) {\n //struct ListNode Node;\n //Node.next = head;\n //struct ListNode* tmp = &Node;\n struct ListNode* Node=(struct ListNode*)malloc(sizeof(struct ListNode));\n Node->next = head;\n struct ListNode* tmp = Node;\n while(tmp->next && tmp->next->next){\n struct ListNode* first = tmp->next;\n struct ListNode* second = tmp->next->next;\n tmp->next = second;\n first->next = second->next;\n second->next = first;\n tmp = first;\n }\n return Node->next;\n}\n```\n\n时间复杂度O(n)\n\n空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3106692662","body":"#### C++代码\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * ListNode *next;\n * ListNode() : val(0), next(nullptr) {}\n * ListNode(int x) : val(x), next(nullptr) {}\n * ListNode(int x, ListNode *next) : val(x), next(next) {}\n * };\n */\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n TreeNode* sortedListToBST(ListNode* head) {\n if(head==NULL) return NULL;\n int n = 0;\n for(auto p=head; p; p=p->next){\n n++;\n }\n if(n==1) return new TreeNode(head->val);\n auto cur = head;\n for(int i = 0; i < n/2-1; i++) cur = cur->next;\n auto root = new TreeNode(cur->next->val);\n root->right = sortedListToBST(cur->next->next);\n cur->next = NULL;\n root->left = sortedListToBST(head);\n return root;\n }\n};\n```\n\n时间复杂度O(nlog(n))","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112024319","body":"#### C++代码\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * ListNode *next;\n * ListNode(int x) : val(x), next(NULL) {}\n * };\n */\nclass Solution {\npublic:\n ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {\n if(headA==NULL || headB==NULL) return NULL;\n ListNode *a = headA, *b = headB;\n while(a!=b){\n if(a == NULL) a = headB;\n a = a->next;\n if(b == NULL) b = headA;\n b = b->next;\n }\n return a;\n }\n};\n```\n\n时间复杂度O(n+m)\n\n空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3116982615","body":"#### C++代码\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * ListNode *next;\n * ListNode(int x) : val(x), next(NULL) {}\n * };\n */\nclass Solution {\npublic:\n ListNode *detectCycle(ListNode *head) {\n unordered_map visit;\n while(head){\n visit[head]++;\n if(visit[head]==2) return head;\n head=head->next;\n } \n return NULL;\n }\n};\n```\n\n时间复杂度O(n)\n\n空间复杂度O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3121297965","body":"#### C++代码\n\n- hash表: `unordered_map hash;`\n- 双向链表用来 将`Node` 根据 使用时间 进行排序。靠近左端表示最近使用,靠近右端表示较长时间没有使用。\n\n``` c\nclass LRUCache {\npublic:\n struct Node {\n int key, val;\n Node *prev, *next;\n Node(int _key, int _val): key(_key), val(_val), prev(NULL), next(NULL){}\n }*L, *R; //L头节点 R尾节点\n\n unordered_map hash;\n int n;\n\n void delete_node(Node *p){\n p->next->prev = p->prev;\n p->prev->next = p->next;\n }\n\n void insert_node(Node *p){ //链表头插入\n p->next = L->next;\n L->next->prev = p;\n p->prev = L;\n L->next = p;\n }\n\n LRUCache(int capacity) {\n n = capacity;\n L = new Node(-1, -1);\n R = new Node(-1, -1);\n L->next = R;\n R->prev = L;\n }\n \n int get(int key) {\n if(!hash.count(key)) return -1;\n else{\n auto p = hash[key];\n delete_node(p);\n insert_node(p);\n return p->val;\n }\n }\n \n void put(int key, int value) {\n if(!hash.count(key)){\n if(hash.size()==n){\n auto p = R->prev;\n delete_node(p);\n hash.erase(p->key);\n }\n auto p = new Node(key, value);\n hash[key] = p;\n insert_node(p);\n }else {\n auto p = hash[key];\n p->val = value;\n delete_node(p);\n insert_node(p);\n }\n }\n};\n\n/**\n * Your LRUCache object will be instantiated and called as such:\n * LRUCache* obj = new LRUCache(capacity);\n * int param_1 = obj->get(key);\n * obj->put(key,value);\n */\n```\n\n时间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124142122","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n int maxDepth(TreeNode* root) {\n if(root == NULL) return 0;\n return max(maxDepth(root->left), maxDepth(root->right)) + 1;\n }\n};\n```\n\n时间复杂度O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125702334","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n bool isSameTree(TreeNode* p, TreeNode* q) {\n if(p==NULL && q==NULL) return true;\n else if(p==NULL && q!=NULL) return false;\n else if(p!=NULL && q==NULL) return false;\n else if(q->val != p->val) return false;\n else return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);\n }\n};\n```\n\n时间复杂度O(n)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3130752830","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n int dfs(TreeNode *root, int sum) {\n if(root == nullptr) return 0;\n int tmp = sum*10+root->val;\n if(root->left==nullptr && root->right==nullptr) return tmp;\n return dfs(root->left, tmp) + dfs(root->right, tmp);\n }\n int sumNumbers(TreeNode* root) {\n return dfs(root, 0);\n }\n};\n```\n\n时间复杂度O(n)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3135775890","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n void dfs(TreeNode* root, int height, int &curVal, int &curHeight){\n if(root==nullptr) return ;\n height++;\n dfs(root->left, height, curVal, curHeight);\n dfs(root->right, height, curVal, curHeight);\n if (height > curHeight) {\n curHeight = height;\n curVal = root->val;\n }\n }\n int findBottomLeftValue(TreeNode* root) {\n int curVal=0, curHeight=0;\n dfs(root, 0, curVal, curHeight);\n return curVal;\n }\n};\n```\n\n\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3139476046","body":"#### C++代码\n\n``` c\nclass Codec {\npublic:\n\n // Encodes a tree to a single string.\n void rserialize(TreeNode* root, string& str) {\n // 前序遍历(中左右,遇到空节点输入None),用逗号隔开\n if (root == NULL) str += \"None,\";\n else {\n str += to_string(root->val) + \",\";\n rserialize(root->left, str);\n rserialize(root->right, str);\n } \n }\n string serialize(TreeNode* root) {\n string ret;\n rserialize(root, ret);\n return ret;\n }\n\n // Decodes your encoded data to tree.\n\n TreeNode* rdeserialize(list& dataArray) {\n if(dataArray.front() == \"None\") {\n dataArray.erase(dataArray.begin());\n return NULL;\n }\n // 前序遍历(中左右)恢复树结构\n TreeNode* root = new TreeNode(stoi(dataArray.front()));\n dataArray.erase(dataArray.begin());\n root->left = rdeserialize(dataArray);\n root->right = rdeserialize(dataArray);\n return root;\n }\n\n TreeNode* deserialize(string data) {\n list dataArray;\n string str;\n // 添加各节点val\n // 按引用传递,按值传递会增加耗时\n for (auto& c : data) {\n if (c == ',') {\n // 以逗号作为节点分割\n dataArray.push_back(str);\n str.clear();\n } else {\n str.push_back(c);\n }\n }\n // 添加尾部节点val\n if (!str.empty()) {\n dataArray.push_back(str);\n str.clear();\n }\n return rdeserialize(dataArray);\n }\n};\n\n\n//参考链接:https://leetcode.cn/problems/serialize-and-deserialize-binary-tree/solutions/1536508/by-peaceful-thompsonfsu-8143/\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3144061296","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n // 深度优先搜索函数 参数:当前节点、当前行号、当前列号、存储节点信息的map\n void dfs(TreeNode* node, int row, int col, map>>& colNodes) {\n // 若节点为空,直接返回\n if (node == nullptr) {\n return;\n }\n \n // 记录当前节点的信息:(行号, 值) 存入对应列的列表中\n colNodes[col].push_back({row, node->val});\n \n // 递归处理左子树:行号+1,列号-1\n dfs(node->left, row + 1, col - 1, colNodes);\n \n // 递归处理右子树:行号+1,列号+1\n dfs(node->right, row + 1, col + 1, colNodes);\n }\n\n // 自定义比较函数:用于对同一列的节点进行排序\n static bool compareNodes(const pair& a, const pair& b) {\n // 若行号相同,按节点值从小到大排序\n if (a.first == b.first) {\n return a.second < b.second;\n }\n // 否则按行号从小到大排序\n return a.first < b.first;\n }\n\n vector> verticalTraversal(TreeNode* root) {\n // 存储列号到节点信息的映射:key=列号,value=该列所有节点的(行号, 值)\n map>> colNodes;\n \n // 深度优先遍历树,记录每个节点的位置和值\n dfs(root, 0, 0, colNodes);\n \n // 最终结果容器\n vector> result;\n \n // 遍历每一列\n for (auto& entry : colNodes) {\n // 对当前列的节点按规则排序(使用自定义比较函数)\n sort(entry.second.begin(), entry.second.end(), compareNodes);\n \n // 提取排序后的节点值,组成当前列的结果\n vector colValues;\n for (auto& node : entry.second) {\n colValues.push_back(node.second); // node.second是节点值\n }\n result.push_back(colValues);\n }\n \n return result;\n }\n};\n\n//参考链接:https://leetcode.cn/problems/vertical-order-traversal-of-a-binary-tree/solutions/3739810/dui-wo-lai-shuo-huan-shi-fu-za-liao-xie-iar46/\n\n```\n\n\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146382948","body":"#### C++代码\n\n``` c\nclass Solution {\npublic:\n vector twoSum(vector& nums, int target) {\n unordered_map hash;\n for(int i = 0; i < nums.size(); i++){\n auto iter = hash.find(target-nums[i]);\n if(iter != hash.end()) return {iter->second, i};\n hash[nums[i]] = i;\n }\n return {};\n }\n};\n```\n\n时间复杂度:O(n)\n\n空间复杂度:O(n)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148379333","body":"#### C++\n\n``` c\nclass Solution {\npublic:\n vector topKFrequent(vector& nums, int k) {\n vector ans;\n unordered_map f;\n for(int i = 0;i < nums.size();i++) {\n f[nums[i]]++;\n }\n priority_queue, vector >, greater > > q;\n for(auto& [num, count] : f) {\n if(q.size() < k)\n q.push({count, num});\n else {\n if(q.top().first < count) {\n q.pop();\n q.push({count, num});\n }\n }\n }\n while(!q.empty()) {\n //cout<>& points) {\n int result=0;\n for(vector P : points){\n unordered_map map;\n for(vector Q : points){\n int dis = (P[0]-Q[0])*(P[0]-Q[0])+(P[1]-Q[1])*(P[1]-Q[1]);\n map[dis]++;\n }\n for(auto [a,b] : map){\n result+=b*(b-1);\n }\n }\n return result;\n }\n};\n```\n\n时间复杂度:O(n2)\n空间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3154861022","body":"``` c\nclass Solution {\npublic:\n int lengthOfLongestSubstring(string s) {\n unordered_map dic;\n int i = -1, res = 0, len = s.size();\n for(int j = 0; j < len; j++) {\n if (dic.find(s[j]) != dic.end())\n i = max(i, dic.find(s[j])->second);\n dic[s[j]] = j;\n res = max(res, j - i);\n }\n return res;\n }\n};\n```\n\n时间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3158408178","body":"\n\n``` c\nclass Solution {\npublic:\n vector findSubstring(string s, vector& words) {\n unordered_map hash;\n vector res;\n int n = s.length(), m = words.size();\n if (n == 0 || m == 0)\n return res;\n int len = words[0].length(), end = n - m * len;\n if (n < m * len)\n return res;\n for (auto word : words)\n hash[word]++;\n int size = hash.size();\n for (int k = 0; k < len; k++) {\n unordered_map cur_hash;\n int satisfy = 0;\n for (int i = k, j = k; j <= n - len;) {\n string cur = s.substr(j, len);\n if (hash.find(cur) == hash.end()) {\n j = j + len;\n i = j;\n cur_hash.clear();\n satisfy = 0;\n } else {\n cur_hash[cur]++;\n if (cur_hash[cur] == hash[cur])\n satisfy++;\n else if (cur_hash[cur] > hash[cur]) {\n while (i < j && cur_hash[cur] > hash[cur]) {\n string temp = s.substr(i, len);\n i += len;\n cur_hash[temp]--;\n if (cur_hash[temp] == hash[temp] - 1)\n satisfy--;\n }\n }\n if (satisfy == size) {\n string temp = s.substr(i, len);\n cur_hash[temp]--;\n satisfy--;\n res.push_back(i);\n i = i + len;\n }\n j = j + len;\n }\n }\n }\n return res;\n }\n};\n```\n\n时间复杂度O(n^2)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3163210992","body":"\n\n``` c\nclass Solution {\npublic:\n int minSubarray(vector &nums, int p) {\n int n = nums.size(), s[n + 1];\n s[0] = 0;\n for (int i = 0; i < n; i++) s[i + 1] = (s[i] + nums[i]) % p;\n int x = s[n];\n\n int ans = n;\n unordered_map last;\n for (int i = 0; i <= n; ++i) {\n last[s[i]] = i;\n auto it = last.find((s[i] - x + p) % p);\n if (it != last.end()) {\n ans = min(ans, i - it->second);\n }\n }\n return ans < n ? ans : -1;\n }\n};\n```\n\n时间复杂度O(n)\n空间复杂度O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3167368429","body":"\n\n``` c\nclass Solution {\npublic:\n ListNode* middleNode(ListNode* head) {\n int len = 0;\n ListNode* p = head;\n while (p != nullptr) {\n len++;\n p = p->next;\n }\n int k = 0;\n p = head;\n while (k < len / 2) {\n k++;\n p = p->next;\n }\n return p;\n }\n};\n```\n\n时间复杂度O(n)\n空间复杂度O(1)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3169793378","body":"```c\nclass Solution {\npublic:\n int removeDuplicates(vector& nums) {\n if (nums.empty()) {\n return 0;\n }\n int slow = 0;\n for (int fast = 1; fast < nums.size(); fast++) {\n if (nums[fast] != nums[slow]) {\n slow++;\n nums[slow] = nums[fast];\n }\n }\n return slow + 1;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172513759","body":"```c\n\nclass Solution {\npublic:\n int searchInsert(vector& nums, int target) {\n int n = nums.size();\n int left = 0, right = n - 1, ans = n;\n while (left <= right) {\n int mid = ((right - left) / 2) + left;\n if (target <= nums[mid]) {\n ans = mid;\n right = mid - 1;\n } else {\n left = mid + 1;\n }\n }\n return ans;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173606055","body":"```c\nclass Solution {\npublic:\n vector maxSlidingWindow(vector& nums, int k) {\n if(nums.size() == 0 || k == 0) return {};\n deque deque;\n vector res(nums.size() - k + 1);\n for(int j = 0, i = 1 - k; j < nums.size(); i++, j++) {\n if(i > 0 && deque.front() == nums[i - 1])\n deque.pop_front();\n while(!deque.empty() && deque.back() < nums[j])\n deque.pop_back();\n deque.push_back(nums[j]);\n if(i >= 0)\n res[i] = deque.front();\n }\n return res;\n }\n }\n};\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3178242802","body":"```c\nclass Solution {\npublic:\n int findJudge(int n, vector>& trust) {\n vector inDegrees(n + 1);\n vector outDegrees(n + 1);\n for (auto& edge : trust) {\n int x = edge[0], y = edge[1];\n ++inDegrees[y];\n ++outDegrees[x];\n }\n for (int i = 1; i <= n; ++i) {\n if (inDegrees[i] == n - 1 && outDegrees[i] == 0) {\n return i;\n }\n }\n return -1;\n }\n};\n\n```","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3213208919","body":"```C++\nclass Solution {\npublic:\n bool judgeCircle(string moves) {\n int R=0,L=0,U=0,D=0;\n for(int i = 0; i < moves.size(); i++){\n if(moves[i]=='R') R++;\n if(moves[i]=='L') L++;\n if(moves[i]=='U') U++;\n if(moves[i]=='D') D++;\n }\n if(R==L&&U==D) return true;\n else return false;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193632408","body":"```c\n\nclass Solution {\npublic:\n vector getOrder(vector>& tasks) {\n long now = 0; \n priority_queue, vector>, greater> >entry, ready;\n int size = tasks.size();\n\n for (int i = 0; i < size; ++i){\n entry.push(make_pair(tasks[i][0], i));\n }\n\n vector res;\n while(!entry.empty() or !ready.empty()){\n if (ready.empty()){\n now = entry.top().first;\n while (!entry.empty() && now == entry.top().first){ \n ready.push(make_pair(tasks[entry.top().second][1], entry.top().second));\n entry.pop();\n }\n }\n res.emplace_back(ready.top().second);\n now += ready.top().first;\n ready.pop();\n\n while(!entry.empty() && entry.top().first <= now){ \n ready.push(make_pair(tasks[entry.top().second][1], entry.top().second));\n entry.pop();\n }\n }\n\n return res;\n }\n};\n\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3213243204","body":"```C++\nclass Solution {\npublic:\n int numberOfRounds(string startTime, string finishTime) {\n // 转化为分钟\n int t0 = 60 * stoi(startTime.substr(0, 2)) + stoi(startTime.substr(3, 2));\n int t1 = 60 * stoi(finishTime.substr(0, 2)) + stoi(finishTime.substr(3, 2));\n if (t1 < t0){\n t1 += 1440;\n }\n // 第一个小于等于 finishTime 的完整对局的结束时间\n t1 = t1 / 15 * 15;\n return max(0, (t1 - t0)) / 15;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3213232703","body":"```C++\nclass Solution {\npublic:\n int minCharacters(string a, string b) {\n int n = a.size(), m = b.size();\n vector cntA(26, 0), cntB(26, 0);\n for (char c : a)\n ++cntA[c - 'a'];\n for (char c : b)\n ++cntB[c - 'a'];\n\n // 计算前缀和\n vector preA(27, 0), preB(27, 0);\n for (int i = 0; i < 26; ++i) {\n preA[i + 1] = preA[i] + cntA[i];\n preB[i + 1] = preB[i] + cntB[i];\n }\n\n int ans = INT_MAX;\n\n // 条件 1\n for (int k = 1; k < 26; ++k) {\n int costA = n - preA[k];\n int costB = preB[k];\n ans = min(ans, costA + costB);\n }\n\n // 条件 2\n for (int k = 0; k < 25; ++k) {\n int costA = preA[k + 1];\n int costB = m - preB[k + 1];\n ans = min(ans, costA + costB);\n }\n\n // 条件 3\n for (int ch = 0; ch < 26; ++ch) {\n int costA = n - cntA[ch];\n int costB = m - cntB[ch];\n ans = min(ans, costA + costB);\n }\n\n return ans;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3213189716","body":"```c++\nclass Solution {\npublic:\n vector sortArray(vector& nums) {\n if (nums.empty()) return nums;\n quickSort(nums, 0, static_cast(nums.size()) - 1);\n return nums;\n }\n\nprivate:\n void quickSort(vector& nums, int l, int r) {\n if (l >= r) return;\n int p = partition(nums, l, r);\n quickSort(nums, l, p - 1);\n quickSort(nums, p + 1, r);\n }\n\n int partition(vector& nums, int l, int r) {\n int idx = l + rand() % (r - l + 1);\n swap(nums[idx], nums[r]);\n int pivot = nums[r];\n\n int i = l - 1;\n for (int j = l; j < r; ++j) {\n if (nums[j] < pivot) {\n ++i;\n swap(nums[i], nums[j]);\n }\n }\n swap(nums[i + 1], nums[r]);\n return i + 1;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3213176894","body":"```c++\nclass Solution {\npublic:\n int mySqrt(int x) {\n int l = 0, r = x, ans=0;\n while(l<=r){\n int mid = l + (r-l)/2;\n if((long long)mid*mid<=x){\n ans = mid;\n l = mid+1;\n } else{\n //ans = mid;\n r = mid-1;\n }\n \n }\n return ans;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3213126368","body":"```c++\nclass Solution {\npublic:\n int firstBadVersion(int n) {\n int l = 1, r = n;\n while(l w;\n\n int reversePairs(vector& nums) {\n return merge_sort(nums, 0, nums.size()-1);\n }\n\n int merge_sort(vector &nums, int l, int r) {\n if(l>=r) return 0;\n int mid = l+r>>1;\n int res = merge_sort(nums, l, mid) + merge_sort(nums, mid+1, r);\n for(int i = l, j = mid+1; i <= mid; i++){\n while(j<=r && nums[j]*2ll& houses, vector& heaters) {\n for (int i = 0, j = 0; i < houses.size(); i ++ ) {\n while (j < heaters.size() && abs(heaters[j] - houses[i]) > mid)\n j ++ ;\n if (j >= heaters.size()) return false;\n }\n return true;\n }\n\n int findRadius(vector& houses, vector& heaters) {\n sort(houses.begin(), houses.end());\n sort(heaters.begin(), heaters.end());\n int l = 0, r = INT_MAX;\n while (l < r) {\n int mid = (long long)l + r >> 1;\n if (check(mid, houses, heaters)) r = mid;\n else l = mid + 1;\n }\n return r;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3217486441","body":"```C++\nclass Solution {\npublic:\n bool check(vector& nums,int n,int k,int mid)\n {\n int cnt = 0;\n for(int i = 0,j = 1; i < n - 1 ; i ++)\n {\n while(j < n && nums[j] - nums[i] <= mid)\n j ++;\n cnt += j - i - 1;\n j = max(j,i + 1);\n }\n return cnt >= k;\n }\n int smallestDistancePair(vector& nums, int k)\n {\n int n = nums.size();\n sort(nums.begin(),nums.end());\n int left = 0,right = nums[n - 1] - nums[0];\n while(left < right)\n {\n int mid = (left + right) >> 1;\n if(check(nums,n,k,mid)) right = mid;\n else left = mid + 1;\n }\n return left;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3219872784","body":"```C++\nclass Solution {\npublic:\n int swimInWater(vector>& grid) {\n int m = grid.size(), n = grid[0].size();\n vector> dis(m, vector(n, INT_MAX));\n dis[0][0] = grid[0][0];\n vector> dirs = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};\n priority_queue, vector>, greater<>> pq;\n pq.emplace(grid[0][0], 0, 0);\n while (!pq.empty()) {\n auto [d, x, y] = pq.top();\n pq.pop();\n if (x == m - 1 && y == n - 1) {\n return d;\n }\n if (d > dis[x][y]) {\n continue;\n }\n for (auto& dir : dirs) {\n int nx = x + dir[0], ny = y + dir[1];\n if (nx >= 0 && nx < m && ny >= 0 && ny < n) {\n int nd = max(d, grid[nx][ny]);\n if (nd < dis[nx][ny] ) {\n dis[nx][ny] = nd;\n pq.emplace(nd, nx, ny);\n }\n }\n }\n }\n return -1;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3223228330","body":"```C++\nclass Solution {\npublic:\n bool pd(char a){\n if(a == 'a'||a == 'e'||a == 'i'||a == 'o'||a == 'u') return true;\n return false;\n }\n int maxVowels(string s, int k) {\n int count = 0, cnt=0;\n int l = 0, r = k-1;\n for(int i = 0; i <= r; i++) if(pd(s.at(i))) count++;\n cnt = count;\n if(s.size() == k) return count;\n while(++r != s.size()){\n if(pd(s.at(l))) count--;\n if(pd(s.at(r))) count++;\n l++;\n cnt = max(cnt, count);\n }\n return cnt;\n }\n};\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3243929010","body":"```C++\nclass Solution {\npublic:\n int getArea(vector>& grid, int i, int j) {\n if (i == grid.size() || i < 0)\n return 0;\n else if (j == grid[0].size() || j < 0)\n return 0;\n if (grid[i][j] == 1) {\n grid[i][j] = 0;\n return 1 + getArea(grid, i + 1, j) + getArea(grid, i - 1, j) +\n getArea(grid, i, j + 1) + getArea(grid, i, j - 1);\n }\n return 0;\n }\n int maxAreaOfIsland(vector>& grid) {\n int maxArea = 0;\n int area = 0;\n for (int i = 0; i < grid.size(); i++) {\n for (int j = 0; j < grid[0].size(); j++) {\n if (grid[i][j] == 1) {\n area = getArea(grid, i, j);\n maxArea = maxArea > area ? maxArea : area;\n }\n }\n }\n return maxArea;\n }\n};\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3268602696","body":"```C++\nclass Solution {\npublic:\n int longestCommonSubsequence(string text1, string text2) {\n int n = (int)text1.size(), m = (int)text2.size();\n vector dp(m + 1, 0);\n for (int i = 1; i <= n; ++i) {\n int prev = 0; // 相当于 dp[i-1][j-1]\n for (int j = 1; j <= m; ++j) {\n int tmp = dp[j];\n if (text1[i - 1] == text2[j - 1]) dp[j] = prev + 1;\n else dp[j] = max(dp[j], dp[j - 1]);\n prev = tmp;\n }\n }\n return dp[m];\n }\n};\n\n```\n时间复杂度O(n*m)\n空间复杂度O(min(n,m))","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/66#issuecomment-3290572491","body":"```C++\nclass Solution {\npublic:\n int coinChange(vector& coins, int amount) {\n vector dp(amount+1,INT_MAX);\n dp[0]=0;\n for(int i=0;i addToArrayForm(int[] num, int k) {\n int n = num.length, carry = 0, i = n - 1;\n List res = new ArrayList<>();\n \n while (i >= 0 || k > 0 || carry > 0) {\n int kDigit = k % 10;\n k /= 10;\n int sum = i >= 0 ? carry + kDigit + num[i] : carry + kDigit;\n res.add(sum % 10);\n carry = sum >= 10 ? 1 : 0;\n --i;\n }\n \n Collections.reverse(res);\n return res;\n }\n}\n```\n\n## Complexity Analysis\nTime: `O(2*max(N, log(K)))`\n* Given a number `K`, its length will be `O(log_{2}(K))`, the time complexity depends on the length of `N` and `K`, whichever is longer.\n* Notice we want to insert digits at the end of the array and then reverse it after we finish the addition (reverse takes `O(res.size())`). If we insert at the head of array, then it will take `O(n^2)` of time.\n\nSpace: `O(1)`, as we didn't use additional spaces except the return array.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3077454608","body":"#### Main Idea\nThe problem asks for the shortest distance from each character in a string s to a given character c. Since c may appear multiple times, we must compute the shortest distance to any occurrence of c for each index.\n\nThe key idea is to perform two passes over the string:\n\nLeft-to-right pass: Calculate distance from the nearest c to the left.\n\nRight-to-left pass: Refine the distance by checking for any closer c on the right.\n\nBy using two passes, we can efficiently compute the minimal distance to the nearest c for each character.\n\n#### Code\n\n```java\nclass Solution {\n public int[] shortestToChar(String s, char c) {\n int n = s.length();\n int[] dist = new int[n];\n Arrays.fill(dist, Integer.MAX_VALUE);\n for (int i = 0; i < n; ++i) {\n if (s.charAt(i) == c) {\n dist[i] = 0;\n } else if (i > 0 && dist[i - 1] < Integer.MAX_VALUE) {\n dist[i] = dist[i - 1] + 1;\n }\n }\n\n for (int i = n - 1; i >= 0; --i) {\n if (i < n - 1 && dist[i + 1] != Integer.MAX_VALUE) {\n dist[i] = Math.min(dist[i], dist[i + 1] + 1);\n }\n }\n\n return dist;\n }\n}\n```\n\n#### Complexity\nTime: `O(n)`\nSpace: `O(n)`","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3082949045","body":"## Main Idea\nA stack can be implemented with an array, but usually we only have access to stack top due to encapsulation, while we can actually access/modify any elements in the array internally.\n\nWe can implement the stack API with `array`:\n* `push()`: append at the end of array (`O(1)`)\n* `pop()`: remove the end of array (`O(1)`)\n* `increment()`: use a for loop to increment `array[0:k]` (`O(k)`).\n\n### Optimization. Range Update && Lazy Evaluation\nNotice the time complexity of `increment()` is too high due to range update, and we can use a difference array to optimize it.\n\nAlso we don't really care about the values of elements until we `pop` them, so we can evaluate them when we pop them out of the stack.\n\n## Code\n```java\nclass CustomStack {\n private Deque stack;\n private int[] arr;\n public CustomStack(int maxSize) {\n stack = new ArrayDeque<>();\n arr = new int[maxSize];\n }\n \n public void push(int x) {\n if (stack.size() < arr.length) {\n stack.push(x);\n } \n }\n \n public int pop() {\n if (stack.isEmpty()) {\n return -1;\n }\n int index = stack.size() - 1, ret = stack.pop() + arr[index];\n if (index > 0) {\n arr[index - 1] += arr[index];\n }\n arr[index] = 0;\n return ret;\n }\n \n public void increment(int k, int val) {\n k = Math.min(k - 1, stack.size() - 1);\n if (k >= 0) {\n arr[k] += val;\n }\n }\n}\n```\n## Complexity Analysis\nTime: `O(1)` for all operations\nSpace: `O(n)` as we used 2 arrays.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3087312725","body":"### Main Idea\n\nStoring everything in one stack will lead to so many pushes/pops, so we can use two stacks, one stack for string, one stack for number.\n\nIterate the input string:\n\n* If `str[i]` is a number, parse the number, push that number to number stack, and push current string to string stack, then empty the string to start over.\n* If `str[i]` is a closed bracket, then we pop the number stack to get `count`, pop the string stack to get `str`, then append the current string with `count` times to the `str`.\n* Else, append the character to current string.\n\n### Code\n\n* Java\n\n```java\nclass Solution {\n public String decodeString(String s) {\n int n = s.length();\n Deque strStack = new ArrayDeque<>();\n Deque numStack = new ArrayDeque<>();\n StringBuilder sb = new StringBuilder();\n \n for (int i = 0; i < n; i++) {\n if (Character.isDigit(s.charAt(i))) {\n int j = i + 1;\n while (Character.isDigit(s.charAt(j))) {\n j++;\n }\n int count = Integer.parseInt(s.substring(i, j));\n numStack.push(count);\n strStack.push(sb);\n sb = new StringBuilder();\n i = j - 1;\n } else if (s.charAt(i) == ']') {\n int count = numStack.pop();\n StringBuilder top = strStack.isEmpty() ? new StringBuilder() : strStack.pop();\n while (count-- > 0) {\n top.append(sb);\n }\n sb = top;\n } else {\n if (s.charAt(i) != '[') {\n sb.append(s.charAt(i));\n }\n }\n }\n \n return sb.toString();\n }\n}\n```\n\n### Complexity Analysis\n\nTime: `O(max(k) * n)`, each digit will be pushed/popped at most `max(k)` times","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092141722","body":"## Main Idea\nWe can use `stack1` as the input stack, and `stack2` as the output stack. \n\n* `push()`: Push to `stack1`, so this new element will be on the stack top of `stack1` (which is the end of our queue).\n* `pop()` and `peek()`: Since we use `stack2` as our output stack, when we call `pop()` or `peek()`:\n* If `stack2` is empty, we want to move all elements from `stack1` to `stack2`, and their order will be reversed, so the bottom of `stack1` will be the top of `stack2`, which is the head of our queue.\n* If not, then we have access to the top of `stack2` already.\n\n## Code\n\n```java\nclass MyQueue {\n Deque stack1;\n Deque stack2;\n \n public MyQueue() {\n stack1 = new ArrayDeque<>();\n stack2 = new ArrayDeque<>();\n }\n \n public void push(int x) {\n stack1.push(x);\n }\n \n public int pop() {\n if (stack2.isEmpty()) {\n move();\n }\n return stack2.pop();\n }\n \n public int peek() {\n if (stack2.isEmpty()) {\n move();\n }\n \n return stack2.peek();\n }\n \n public boolean empty() {\n return stack1.isEmpty() && stack2.isEmpty();\n }\n \n private void move() {\n while (!stack1.isEmpty()) {\n stack2.push(stack1.pop());\n }\n }\n}\n```\n## Complexity Analysis\nTime:\n* `push()`: `O(1)`\n* `pop()` and `peek()`: \n\t* The **worst case** of `pop()` and `peek()` will be `O(n)`, where we have to move all elements from `stack1` to `stack2`.\n\t* **Amortized Analysis**: Say we have `n` elements in `stack1`, and `0` elements in `stack2`, and we want to call `pop()` or `peek()` `n` times. The first call will take `n` operations to move all elements from `stack2` to `stack1`. But after the first call we will have at least `n - 1` elemetns in `stack2`, which makes the next `n - 1` calls `O(1)`. So the amrotized time will be `O(n + 1 + 1 +...+1 / n) = O((2n-1)/n) = O(1)`.\n\nSpace: `O(1)`, the two stacks are given and we didn't use any extra spaces.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3093992695","body":"### Main Idea\nFor chunks `[c1, c2, c3, ..., cn]`, we have to maintain the property: `max(ci) <= min(cj)` if `i < j`. So we can create a monotonously increasing stack `stack` to **keep track of the max value for each previous chunk**. \n\nIf `arr[i] >= stack.peek()`, we can greedily create a new chunk and `stack.push(arr[i])`. Else, we need to find the previous chunk with max value smaller or equal to `arr[i]`, say `ck`, and we need to merge all the chunks `[c_k+1, ... c_cur]` with `arr[i]`.\n\nTo merge chunks, we can just pop all the max values representing those chunks off the stack, and push back the max among them (in our case, it will be stack top cuz this stack is increasing) as the max of the new chunk. \n\nFinally the size of the stack will be the number of chunks.\n### Code\n```java\nclass Solution {\n public int maxChunksToSorted(int[] arr) {\n int n = arr.length;\n Deque stack = new ArrayDeque<>();\n for (int num : arr) {\n int max = num;\n while (!stack.isEmpty() && stack.peek() > num) {\n max = Math.max(max, stack.pop());\n }\n stack.push(max);\n }\n return stack.size();\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(n)`","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095444824","body":"\n### Main Idea\n1. Find the length of the linked list. If `length == 0`, return `head`.\n2. If `k >= n`, then we can do `k = k % n` which doesn't affect the final result but reduce the number of rotations.\n3. Use two pointers to traverse the linked list to find the last kth element and its previous node.\n4. Modify the linked list.\n\n\n### Code\n```java\nclass Solution {\n public ListNode rotateRight(ListNode head, int k) {\n int n = getLength(head);\n if (n == 0) return head;\n k %= n;\n \n // Find the last kth element as new head\n ListNode fast = head, slow = head;\n for (int i = 0; i < k; ++i) {\n fast = fast.next;\n }\n \n while (fast.next != null) {\n fast = fast.next;\n slow = slow.next;\n }\n \n fast.next = head;\n ListNode newHead = slow.next;\n slow.next = null;\n return newHead;\n \n }\n \n private int getLength(ListNode head) {\n int len = 0;\n while (head != null) {\n ++len;\n head = head.next;\n }\n return len;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(1)`","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100701991","body":"### Main Idea\n1. If the current list has length smaller than 2, don't need to swap.\n2. Else, recursivly swap the list `head.next.next`, and the swap function should return the `next` node.\n3. Swap the current 2 nodes, `newHead = head.next`, `newHead.next = head` and `head.next = next`.\n\n### Code\n```java\nclass Solution {\n public ListNode swapPairs(ListNode head) {\n if (head == null || head.next == null) return head;\n ListNode next = swapPairs(head.next.next);\n ListNode newHead = head.next;\n newHead.next = head;\n head.next = next;\n return newHead;\n }\n}\n```\n\n### Complexity Analysis\n* Time: `O(n)`\n* Space: `O(n)` for the recursive call.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109183645","body":"### Main Idea\n1. Define `inOrder(int i, int j)` to be the problem of the converting `list[i:j]` to BST.\n2. Base case: if `i > j`, return `null`.\n3. Calculate `mid = i + (j - i) / 2`, left subtree will be `inOrder(i, mid - 1)`, and then we create our root with the current node `cur`, then the next node to create will be `cur.next`, and we build the right sutree with `inOrder(mid + 1, j)`.\n\n### Code\n```java\nclass Solution {\n private ListNode cur;\n public TreeNode sortedListToBST(ListNode head) {\n if (head == null) return null;\n cur = head;\n int n = getLength(head);\n return inOrder(0, n - 1);\n }\n\n private TreeNode inOrder(int l, int r) {\n if (l > r) return null;\n int m = l + (r - l) / 2;\n TreeNode left = inOrder(l, m - 1);\n TreeNode root = new TreeNode(cur.val);\n cur = cur.next;\n TreeNode right = inOrder(m + 1, r);\n root.left = left;\n root.right = right;\n return root;\n }\n\n private int getLength(ListNode head) {\n int cnt = 0;\n while (head != null) {\n head = head.next;\n ++cnt;\n }\n return cnt;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(logn)` for recursive calls.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112278406","body":"Say the length of `a_1` to `a_i` is `a`, `b_1` to `b_i` is `b`, and `c_1` to `c_n` is `c`. If there is no interseciton, then `c = 0`. And `a + b = b + a`. If there is an intersection, then `a + c + b = b + c + a`, and the two pointers will meet at the intersection point.\n```\npublic ListNode getIntersectionNode(ListNode headA, ListNode headB) {\n ListNode h1 = headA, h2 = headB;\n while (h1 != h2) {\n\n h1 = h1 == null ? headB : h1.next;\n h2 = h2 == null ? headA : h2.next;\n }\n return h1; \n }\n```\n\nSo we can just go over both linked list once, and switch the pointers.","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3118087746","body":"### Main Idea\nDefine two pointers `fast` and `slow`, each iteration, `fast` moves 2 steps forward while `slow` moves 1 step. If there is a cycle, then `fast` will equals `slow` eventually, and if not, we will exit the loop.\n\nIf a cycle is detected, we need to find the starting point. \n\n```\nfast = 2 * slow\n\nfast = l + n1 * c + t\nslow = l + n2 * c + t\n\n\nl + n1 * c + t = 2 * l + 2 * n2 * c + 2 * t\nl = n1 * c - 2 * n2 * c = c * (n1 - 2 * n2) = n' * c - t\n```\n\n```\n L\n-------- ----I-----\n | | D\n ----------\n```\n### Code\n```java\npublic class Solution {\n public ListNode detectCycle(ListNode head) {\n if (head == null) return null;\n ListNode fast = head, slow = head;\n while (fast != null && fast.next != null) {\n fast = fast.next.next;\n slow = slow.next;\n if (fast == slow) {\n while (slow != head) {\n slow = slow.next;\n head = head.next;\n }\n return head;\n }\n }\n return null;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(1)`","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3126063970","body":"### Main Idea\n* Base case 1, both `p` and `q` are `null`, return `true`.\n* Base case 2, else if either of them is `null` or their values are not equal, return `false`.\n* Recursive case: both left and right subtrees are equal.\n\n### Code\n```java\nclass Solution {\n public boolean isSameTree(TreeNode p, TreeNode q) {\n if (p == null && q == null) {\n return true;\n } else if (p == null || q == null || p.val != q.val) {\n return false;\n }\n return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);\n }\n}\n```\n\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(h) = O(n)`","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3136827599","body":"### Main Idea\nThis problem is asking for the leftmost node of the last layer, and when it comes to traversal by layer, BFS comes in handy.\n\nIn a standard BFS algorithm, we use a queue to keep track of the nodes on each layer, we just need to modify the algorithm to record the first node of the current layer, and if we exit the loop from the current layer, that means this is the last layer, and the node we recorded will be the one we want to find.\n\n### Code\n```java\nclass Solution {\n public int findBottomLeftValue(TreeNode root) {\n Queue q = new ArrayDeque<>();\n q.offer(root);\n int res = 0;\n while (!q.isEmpty()) {\n res = q.peek().val;\n int size = q.size();\n for (int i = 0; i < size; ++i) {\n TreeNode n = q.poll();\n if (n.left != null) q.offer(n.left);\n if (n.right != null) q.offer(n.right);\n }\n }\n return res;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n)`\nSpace: `O(n)`","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3144871038","body":"### main Idea\n1. We store `Pair` in our pq, where `TreeNode` is the node and `int[]` is its coordinate.\n2. Since we want to maintain the row order, we compare pairs by their row order, smaller row has higher priority.\n3. If row numbers are the same, we compare values, since we don't really care about the order we process columns each row.\n4. Use a map that maps `col` to `list` to store the node values.\n\n\n### Code\n* Java\n\n```java\nclass Solution {\n public List> verticalTraversal(TreeNode root) {\n // column -> list\n Map> map = new HashMap<>();\n PriorityQueue> queue = new PriorityQueue<>((p1, p2) -> {\n int loc1[] = p1.getValue();\n int loc2[] = p2.getValue();\n if (loc1[0] == loc2[0]) {\n return p1.getKey().val - p2.getKey().val;\n } else {\n return loc1[0] - loc2[0];\n }\n });\n queue.offer(new Pair(root, new int[] {0, 0}));\n while (!queue.isEmpty()) {\n int size = queue.size();\n for (int i = 0; i < size; ++i) {\n Pair p = queue.poll();\n TreeNode node = p.getKey();\n int loc[] = p.getValue();\n List list = map.getOrDefault(loc[1], new ArrayList<>());\n list.add(node.val);\n map.put(loc[1], list);\n if (node.left != null) {\n queue.offer(new Pair(node.left, new int[] {loc[0] + 1, loc[1] - 1}));\n }\n\n if (node.right != null) {\n queue.offer(new Pair(node.right, new int[] {loc[0] + 1, loc[1] + 1}));\n }\n }\n }\n\n List> res = new ArrayList<>();\n for (int i = -1000; i <= 1000; ++i) {\n if (map.containsKey(i)) {\n res.add(map.get(i));\n }\n }\n return res;\n }\n}\n```\n### Complexity Analysis\nTime: `O(nlogn)`\nSpace: `O(n)`","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3162435845","body":"```java\nclass Solution {\n public int minSubarray(int[] nums, int p) {\n int n = nums.length;\n long arraySum = Arrays.stream(nums).asLongStream().sum(); \n int targetRemainder = (int) (arraySum % p);\n if (targetRemainder == 0) {\n return 0;\n } else if (arraySum < p) {\n return -1;\n }\n \n Map remainderToIndex = new HashMap<>();\n remainderToIndex.put(0, -1);\n \n long preSum = 0;\n int minLen = Integer.MAX_VALUE;\n for (int i = 0; i < n; ++i) {\n preSum += nums[i];\n int remainder = (int) (preSum % p);\n int remainderToCheck = (int) (remainder - targetRemainder);\n if (remainderToCheck < 0) {\n remainderToCheck += p;\n }\n \n if (remainderToIndex.containsKey(remainderToCheck)) {\n int index = remainderToIndex.get(remainderToCheck);\n minLen = Math.min(minLen, i - index);\n }\n \n remainderToIndex.put(remainder, i);\n }\n \n return minLen >= n ? -1 : minLen;\n }\n}\n\n/*\n [3, 1, 4, 2], p = 6\n \n arraySum = 10, targetRemainder = 4\n \n preSum = 3,\n\n [3, 1, 4, 2] = 10\n \n [0, 3, 4, 8, 10]\n \n [7, ]\n \n Sum: 9 p=6\n \n a mod b = (a + b) mod b\n \n (S_j - S_i) mod p == sum mod p\n \n \n x mod p = a\n y mod p = b\n \n (x - y) mod p = a - b (if a >= b)\n a - b + p (if a < b)\n*/\n```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182362544","body":"## Method 1. BFS\n### Main Idea\nBasically, this problem is asking if we can mark the graph with 2 colors, where adjacent vertices can't have the same color.\n\nSo we can apply BFS to traverse the graph, say we mark a vertex `v` with color 1, then we have to mark all its neighbors with color 2. If any of them was marked color 1, then we know it's impossible to mark the graph with 2 colors, so we can return `false`.\n\nIf no such contradictions found, that means the graph can be 2-colored, so return `true`.\n### Code\n* Java\n\n```java\nclass Solution {\n public boolean possibleBipartition(int n, int[][] dislikes) {\n List[] graph = new ArrayList[n + 1];\n for (int i = 0; i <= n; ++i) graph[i] = new ArrayList<>();\n \n for (int[] edge : dislikes) {\n graph[edge[0]].add(edge[1]);\n graph[edge[1]].add(edge[0]);\n }\n \n int[] colors = new int[n + 1];\n for (int i = 1; i <= n; ++i) {\n if (colors[i] != 0) continue;\n Queue q = new ArrayDeque<>();\n q.offer(i);\n colors[i] = 1;\n while (!q.isEmpty()) {\n int size = q.size();\n while (size-- > 0) {\n int v = q.poll(), c = colors[v];\n for (int nei : graph[v]) {\n if (colors[nei] == c) return false;\n if (colors[nei] != 0) continue;\n colors[nei] = -1 * c;\n q.offer(nei);\n }\n }\n }\n }\n return true;\n }\n}\n```\n### Complexity Analysis\nTime: `O(E + V)`\n\nSpace: `O(E + V)`","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204204644","body":"```java\nclass Solution {\n public int mySqrt(int x) {\n int left = 0, right = x;\n\n while (left < right - 1) {\n int mid = left + (right - left) / 2;\n long midSquare = 1l * mid * mid;\n if (midSquare == x) {\n return mid;\n } else if (midSquare < x) {\n left = mid;\n } else {\n right = mid - 1;\n }\n }\n long rightSqaure = 1l * right * right;\n return rightSqaure > x ? left : right;\n }\n}\n```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3222726555","body":"```java\nclass Solution {\n public int maxVowels(String s, int k) {\n String vowels = \"aeiou\";\n int n = s.length(), l = 0, r = 0, res = 0, cnt = 0;\n while (r < n) {\n while (r < n && r - l < k) {\n if (vowels.indexOf(s.charAt(r)) != -1) {\n ++cnt;\n }\n ++r;\n }\n\n res = Math.max(res, cnt);\n if (vowels.indexOf(s.charAt(l)) != -1) {\n --cnt;\n }\n ++l;\n }\n\n return res;\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3243695565","body":"```java\nclass Solution {\n public int maxAreaOfIsland(int[][] grid) {\n int m = grid.length, n = grid[0].length;\n int[][] dirs = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};\n \n int ret = 0;\n for (int i = 0; i < m; i++) {\n for (int j = 0; j < n; j++) {\n if (grid[i][j] == 0) {\n continue;\n }\n \n Queue queue = new ArrayDeque<>();\n queue.offer(new int[] {i, j});\n grid[i][j] = 0;\n int area = 1;\n while (!queue.isEmpty()) {\n int[] loc = queue.poll();\n for (int[] dir : dirs) {\n int x = loc[0] + dir[0], y = loc[1] + dir[1];\n if (x < 0 || x >= m || y < 0 || y >= n || grid[x][y] == 0) {\n continue;\n }\n queue.offer(new int[] {x, y});\n grid[x][y] = 0;\n area++;\n }\n }\n \n ret = Math.max(ret, area);\n }\n }\n \n return ret;\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3269054068","body":"## Method 1. DP + Count\n### Main Idea\nSimilar to the DP solution of the LIS problem, but we also need to count how many shorter subsequences contribute to each subsequence ending at index `i`.\n\nSo we define `dp[i][0]` to be the max len of subsequence ending at `i`, and `dp[i][1]` to be the number of shorter subsequences contributing to \n### Code\n* Java\n\n```java\nclass Solution {\n public int findNumberOfLIS(int[] nums) {\n int n = nums.length, res = 0, max = 0;\n // \n int[][] dp = new int[n][2];\n \n for (int i = 0; i < n; ++i) {\n dp[i][0] = 1;\n int cnt = 1;\n for (int j = 0; j < i; ++j) {\n if (nums[i] > nums[j]) {\n if (dp[j][0] + 1 > dp[i][0]) {\n dp[i][0] = dp[j][0] + 1;\n cnt = dp[j][1];\n } else if (dp[j][0] + 1 == dp[i][0]) {\n cnt += dp[j][1];\n }\n }\n }\n \n if (dp[i][0] > max) {\n max = dp[i][0];\n res = cnt;\n } else if (dp[i][0] == max) {\n res += cnt;\n }\n dp[i][1] = cnt;\n }\n return res;\n }\n}\n```\n### Complexity Analysis\nTime: `O(n^2)`\n\nSpace: `O(n)`","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3295757426","body":"```java\nclass Solution {\n public int change(int amount, int[] coins) {\n int n = coins.length;\n int[] dp1 = new int[amount + 1], dp2 = new int[amount +1];\n for (int i = 0; i < n; i++) {\n for (int j = 0; j <= amount; j++) {\n if (i == 0 || j == 0) {\n if (j % coins[i] == 0) {\n dp2[j] = 1;\n }\n continue;\n }\n \n if (j - coins[i] >= 0) {\n dp2[j] = dp1[j] + dp2[j - coins[i]];\n } else {\n dp2[j] = dp1[j];\n }\n }\n \n int[] tmp = dp1;\n dp1 = dp2;\n dp2 = tmp;\n }\n return dp1[amount];\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/74#issuecomment-3322650611","body":"```java\nclass Solution {\n public int[] singleNumber(int[] nums) {\n int xor = 0;\n for (int num : nums) {\n xor ^= num;\n }\n \n\n int rightmostBit = xor & (-xor);\n \n int num1 = 0, num2 = 0;\n for (int num : nums) {\n if ((num & rightmostBit) != 0) {\n num1 ^= num;\n } else {\n num2 ^= num;\n }\n }\n \n return new int[]{num1, num2};\n }\n}\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"suukii":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mirrors-cl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xqy97":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jakkiabc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckyoneday":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chouqin99":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhaogeg111":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shawnhu23":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ye2222":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"uyplayer":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guixian001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"serena9":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"junzmer":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hx-code":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"admu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xxiaomm":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"pgquestions":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"eldinzhou":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jiangwenzhe":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shawnwu6688":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tomtao626":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aiweng1981":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"richard-lime":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"acoada":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"duanyaqi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ccslience":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kaiykk":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cachezhou0617":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangtuo1999":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cytrue":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckyryan-web":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"naomiwufzz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liuajingliu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"miss1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"johnxizhao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"incipe-win":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"revisegoal":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckysq999":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dereklisdr":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"perfqi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mryao1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"likeyousmile":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhg1992":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liquanluo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aq666888":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"samlu-ecnu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhongxiangxiang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hatorimain":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"neado":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaojunjun1110":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wxleah":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sunl1ght":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kerrhl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"orangejuz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"flyzenr":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"c1f2h3":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dlm001128":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liuxy94":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aconcert":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"linjunhe":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hyqqq22":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yibenxiao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"elon-lau":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nowkizzz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gsgtgyb":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"irenia111":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"suiyi8760":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"saltychess":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rabbit2010520":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ellie-wu05":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yopming":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckytwj":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zzz607":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zoulufeng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xxoojs":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"okkband":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wyz999":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hacker90":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ricjli":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luhaoling":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"flaming-cl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gelxgx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gaominghao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jessie725":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lsunxh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lanceli424":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qycoder":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qilin88":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hengheng-yun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"smz1995":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"size-of":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"moyuanhua":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"9vivian88":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guxuehua":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kirosola":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"biscuit279":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"maoting":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"youzhaing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jawn-ha":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hanwangxxx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dujt-x":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"degndaixingqiu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gzgzgzgzgzgz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gentleman-goodman":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xinyi-arch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zenwangzy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"andyyxw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fourierhai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yangz001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mannnn6":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"haoyangxie":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chjillout":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wenjialu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mhcn":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"coconutice":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jackgaoyuan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xingzhan0312":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yufeng727":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fontendart":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yingchehu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cobayaz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tomato-tomato":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xfliudx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"djd28176":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xilutian":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xy147":[null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091443042","body":"### js代码\n```JavaScript\n\nvar MyQueue = function() {\n this.inStack = [];\n this.outStack = [];\n};\nMyQueue.prototype.push = function(x) {\n this.inStack.push(x);\n};\n\nMyQueue.prototype.pop = function() {\n if (!this.outStack.length) {\n this.in2out();\n }\n return this.outStack.pop();\n};\n\nMyQueue.prototype.peek = function() {\n if (!this.outStack.length) {\n this.in2out();\n }\n return this.outStack[this.outStack.length - 1];\n};\n\nMyQueue.prototype.empty = function() {\n return this.outStack.length === 0 && this.inStack.length === 0;\n};\n\nMyQueue.prototype.in2out = function() {\n while (this.inStack.length) {\n this.outStack.push(this.inStack.pop());\n }\n};\n\n```\n\n### 复杂度分析\n时间复杂度:O(1)\n空间复杂度:O(n)","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3120847716","body":"```\nclass ListNode {\n constructor(key, value) {\n this.key = key\n this.value = value\n this.next = null\n this.prev = null\n }\n}\n\nclass LRUCache {\n constructor(capacity) {\n this.capacity = capacity\n this.hash = {}\n this.count = 0\n this.dummyHead = new ListNode()\n this.dummyTail = new ListNode()\n this.dummyHead.next = this.dummyTail\n this.dummyTail.prev = this.dummyHead\n }\n\n get(key) {\n let node = this.hash[key]\n if (node == null) return -1\n this.moveToHead(node)\n return node.value\n }\n\n put(key, value) {\n let node = this.hash[key]\n if (node == null) {\n if (this.count == this.capacity) {\n this.removeLRUItem()\n }\n let newNode = new ListNode(key, value)\n this.hash[key] = newNode\n this.addToHead(newNode)\n this.count++\n } else {\n node.value = value\n this.moveToHead(node)\n }\n }\n\n moveToHead(node) {\n this.removeFromList(node)\n this.addToHead(node)\n }\n \n removeFromList(node) {\n let temp1 = node.prev\n let temp2 = node.next\n temp1.next = temp2\n temp2.prev = temp1\n }\n\n addToHead(node) {\n node.prev = this.dummyHead\n node.next = this.dummyHead.next\n this.dummyHead.next.prev = node\n this.dummyHead.next = node\n }\n\n removeLRUItem() {\n let tail = this.popTail()\n delete this.hash[tail.key]\n this.count--\n }\n\n popTail() {\n let tail = this.dummyTail.prev\n this.removeFromList(tail)\n return tail\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146107002","body":"```const twoSum = (nums, target) => {\n const prevNums = {};\n\n for (let i = 0; i < nums.length; i++) {\n const curNum = nums[i];\n const targetNum = target - curNum;\n const targetNumIndex = prevNums[targetNum];\n if (targetNumIndex !== undefined) {\n return [targetNumIndex, i];\n } else {\n prevNums[curNum] = i;\n }\n }\n}```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3167532564","body":"### js代码\n```JavaScript\nvar middleNode = function(head) {\n let slow = fast = head\n while(fast && fast.next){\n slow = slow.next\n fast = fast.next.next\n }\n return slow\n};\n\n```\n\n### 复杂度分析\n时间复杂度:O(N)\n空间复杂度:O(1)","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3190926614","body":"### js代码\n```JavaScript\nvar judgeCircle = function(moves) {\n return moves.split('L').length === moves.split('R').length && moves.split('U').length === moves.split('D').length\n};\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"itsjacob":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shunanch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yppah-eb":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"raychenlei":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"woshichuanqilz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"willuuu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"christina-soda":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jia98shanliang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"user-vannnn":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tobepellucid":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"johnvsd":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yueza":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shawyuan97":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"victorhuang99":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cusanity":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jay-xzj":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shiradaone":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xinyue-ma":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"taojin1992":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joyce94":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"steven72574":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tian-pengfei":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"asuka1h":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaowangcoding":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"james0608":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kaneyang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"azl397985856":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"whgsh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chengfengfengwang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bulingbulingbuling":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"c2tr":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"eden-ye":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"codingtrains":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"starorbiting":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mo-xiaoxiu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"passengersa":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073445770","body":"思维:\n1、将数组num和k转换为字符,\n2、使用BigInt方法相加\n3、最后使用将相加得到转换为数字数组\n时间复杂度:O(n)\n代码:\n/**\n * @param {number[]} num\n * @param {number} k\n * @return {number[]}\n */\nvar addToArrayForm = function (num, k) {\n let numStr = num.join('')\n let sum = BigInt(numStr) + BigInt(k)\n return sum.toString().split('').map(Number)\n};","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3084084442","body":"时间复杂度:O(n)\n代码:\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.maxSize = maxSize;\n this.stack = [];\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if (this.stack.length < this.maxSize) {\n this.stack.push(x);\n }\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if (this.stack.length === 0) {\n return -1;\n }\n return this.stack.pop();\n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n const len = this.stack.length;\n const count = Math.min(k, len);\n for (let i = 0; i < count; i++) {\n this.stack[i] += val;\n }\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3097108121","body":"思路:\n首先,计算链表的长度 n。\n接着,将 k 对 n 取模,因为旋转 n 次后链表会回到原来的状态,所以取模可以避免不必要的旋转操作。\n然后,找到新的链表头节点和尾节点。新的链表头节点是原链表中第 n - k 个节点,新的链表尾节点是原链表的最后一个节点。\n最后,将原链表的尾节点连接到原链表的头节点,形成一个环形链表,再从新的链表头节点处断开,得到旋转后的链表。\n时间复杂度:O(n),其中 n 是链表的长度。需要遍历链表两次,第一次计算链表的长度,第二次找到新的链表头节点的前一个节点。\n代码:\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n // 定义链表节点类\nclass ListNode {\n constructor(val = 0, next = null) {\n this.val = val;\n this.next = next;\n }\n}\n/**\n * @param {ListNode} head\n * @param {number} k\n * @return {ListNode}\n */\nvar rotateRight = function(head, k) {\n if (!head || !head.next) return head;\n\n // 计算链表的长度\n let n = 1;\n let tail = head;\n while (tail.next) {\n tail = tail.next;\n n++;\n }\n\n // 对 k 取模\n k %= n;\n\n // 如果 k 为 0,说明不需要旋转,直接返回原链表\n if (k === 0) return head;\n\n // 找到新的链表头节点的前一个节点\n let newTail = head;\n for (let i = 0; i < n - k - 1; i++) {\n newTail = newTail.next;\n }\n\n // 新的链表头节点\n let newHead = newTail.next;\n\n // 断开原链表,形成新的链表\n newTail.next = null;\n tail.next = head;\n\n return newHead; \n};\n\n// 辅助函数:将数组转换为链表\nfunction arrayToList(arr) {\n if (arr.length === 0) return null;\n let head = new ListNode(arr[0]);\n let current = head;\n for (let i = 1; i < arr.length; i++) {\n current.next = new ListNode(arr[i]);\n current = current.next;\n }\n return head;\n}\n\n// 辅助函数:将链表转换为数组\nfunction listToArray(head) {\n let result = [];\n let current = head;\n while (current) {\n result.push(current.val);\n current = current.next;\n }\n return result;\n}","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shellylcooper":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"testplm":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tom-zhouch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"skylarxu214":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"taihui":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huaxueguakele":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yang-chenyu104":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mlking15":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"-3":[],"cyonline":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rzhao010":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zywang0":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jetery":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"klspta":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bookyue":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jancerwu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"buer1121":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ceramickitten":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gg925407590":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"alyenor":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chenming-cao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ggohem":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dark-volute":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ronething":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jmastella":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"paopaohua":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dd2001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mayloveless":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yuexi001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nineis7":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"abby-xu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gsw9818":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaomingshixiaotang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"snmyj":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"flipn9":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wabw1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xqmmy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"a-pricity":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sclihuiming":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"amazeding":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"astrking":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tzuikuo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ringo1597":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"brucezhang-utf-8":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luanxing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"moin-jer":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lihua1997":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cuizezhou":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xuanaxuan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tiandao043":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"restlessbreeze":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ruikiwi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huiminren":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"saitochen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wtdcai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"albert556":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wuxiaoshawn":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zrtch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhuzhu096":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"whoam-challenge":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"weisday":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"syh-coder":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaaller":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kyrie96521":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cavecrypto":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cxgbro":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"erjian96":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"a-polarbear":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"alexno1no2":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yetfan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhiyuanpeng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bwspsu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"arinzz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mdge":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"allenfeng666":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yin02":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"elsa-zhang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"asur4s":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"littlesugarman":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhihaowan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"apockira":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guowei0223":[null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3077086971","body":"```\n首先需要找到所有c出现的index,存在c_index list里为后续的pointer搜索做好准备\npointer = 0 定义好pointer的起点\n遍历s,在c_index的范围内,对比pointer和pointer + 1 和s中各个位置的绝对距离,如果发现pointer和s的距离大于pointer +1,那么说明s的index已经走到了离pointer+1更近的距离,那么这时候我们更新pointer,+ 1, 指到下一个c_index中c的位置。\nres.append()c_index中pointer和s中index的距离\n\nclass Solution:\n def shortestToChar(self, s: str, c: str) -> List[int]:\n c_index = []\n for i in range(len(s)):\n if s[i] == c:\n c_index.append(i)\n pointer = 0\n res = []\n for i in range(len(s)):\n if pointer < len(c_index) -1:\n if abs(i-c_index[pointer])> abs(i-c_index[pointer+1]):\n pointer += 1\n res.append(abs(i-c_index[pointer]))\n return res\n\n因为用了指针,所以时间复杂度 O(n)。 空间复杂度 O(n)。 \n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3087516204","body":"```\n使用栈的经典题型。遇见数字就num*10 + item处理。 遇见【 左括号说明要开始处理括号内部,用stack先存好之前已经处理的结果,遇见】后括号说明括号完成,则需要stack。pop()出保存的结果加上括号里的内容。是字母的话,则res+ item更新括号内信息。\n空间复杂度 O(n)\n时间复杂度 O(n)\n\nclass Solution:\n def decodeString(self, s: str) -> str:\n res = \"\"\n stack = []\n num = 0\n for item in s:\n if item.isdigit():\n num = num * 10 + int(item)\n elif item == \"[\":\n stack.append([num, res])\n num = 0\n res = \"\"\n elif item == \"]\":\n pre_num, pre_res = stack.pop()\n res = pre_res + pre_num * res\n else:\n res += item\n return res\n```","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3101341120","body":"还是链表的老套路,设置一个dummy head。 判断cur.next and cur.next.next: 是否存在,存在了再进行下一步。\n用tmp,tmp1 来保存cur。next和cur.next.next.next。 然后我们开始进行交换步骤。\n\n```\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:\n dummy_head = ListNode(next =head)\n cur = dummy_head\n while cur.next and cur.next.next:\n temp = cur.next\n temp1 = cur.next.next.next\n cur.next = cur.next.next\n cur.next.next = temp\n temp.next = temp1\n cur = cur.next.next\n return dummy_head.next\n\n```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125611734","body":"可以利用bfs的方法解决。 把每个点放入queue中,然后popleft()两个node进行比较。\n\n```\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:\n if not p and not q:\n return True\n if not p or not q:\n return False\n \n que = deque([p,q])\n \n while que:\n cur1 = que.popleft()\n cur2 = que.popleft()\n if not cur1 and not cur2:\n continue\n\n if not cur1 or not cur2 or cur1.val != cur2.val:\n return False\n \n que.append(cur1.left)\n que.append(cur2.left)\n que.append(cur1.right)\n que.append(cur2.right)\n return True\n\n```\n","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3148705374","body":"```\nclass Solution:\n def numberOfBoomerangs(self, points: List[List[int]]) -> int:\n ans = 0\n for x1, y1 in points:\n cnt = defaultdict(int)\n for x2, y2 in points:\n d2 = (x1 - x2) ** 2 + (y1 - y2) ** 2\n ans += cnt[d2] * 2\n cnt[d2] += 1\n return ans\n\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shuqianyang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sj941127":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zjsuper":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yongxi-zhou":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"darwintk":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"h-steven":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mischaqi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wurongronga":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"miduoliu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luckyshenzhengkang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"y4h2":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yoco323":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"forschers":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shanshuiqiankun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"annabellhyx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hwfrankfung":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"frederickfan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huibinny":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ggmybro":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"myleetcodejourney":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"want2333":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"staringwhere":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"allenfeng8":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ryanbaiyansong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dou-yu-xuan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hyxupup":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cs12300":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chiehw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aesir-idun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kaldsk12":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hxj2001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"for123s":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zzhilin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yfu6":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mengsixing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"import-ant":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joriscai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wangqianqian202301":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"airwalkers":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhumengcheng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kofzhang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"leonalhq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hjy-u":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"csthaha":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zepherust":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"feefeefee":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hughlin07":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huizsh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chanceyliu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hshen11":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"horace7":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wangzh0114":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dragonfcl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huifeng248":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sarah11qing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"el1as7":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zcytm3000":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"pangjiadai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xb798298436":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ywang525":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"limbo42":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dorapocket":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zoeyzyzyzy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jasonqiu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lp1506947671":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"texamc2":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joemonkeylee":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"northseacoder":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dominique9898":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wl678":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"meisgithub":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sye9286":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fuku-l":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kangliqi1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"richardtaok":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chocolate-emperor":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lydia61":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangjiahuan17":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"seanutf":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangyong-hub":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"erquaner":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jiujingxukong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"x1aox1a":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"drinkmorekaik":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dinjufen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yuzmt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"munmust":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yan-jie":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hktangshuo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zpbc007":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"linlizzz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"krabbejing":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"firehaosky":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chao-cc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jinjin680":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cruiseyugh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"quieter2018":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jadeliu13":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaoq777":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jiangyanlineu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liuxiner":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yufanzh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"franciszq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kangqinsen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"manwzy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jerry9926":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"soso1105":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"pkuphy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhenya-zhu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wty9sky":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"skyoct":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bingzxy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaodingc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jyjsunny":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aoxiangw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"enrilwang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aswrise":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"aneureka":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ljqchlsw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jingyuzhou123":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dianlandu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jameswangxin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhenxied":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"nuozhouzhang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shin-guid":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bochengwan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kyo-tom":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"uratora":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guitarys":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sosdogecoin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zol013":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lrwhc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wwewwt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cyk1337":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangyu1131":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"diana21170648":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"61hhh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"quaaaaaack":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"acy925":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bi9potato":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"guangsizhongbin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhaoygcq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"catkathy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yqycs":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhuxinyu-znb":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"freesan44":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mo660":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sencc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"randong22":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"beginner-jamji":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yzhyzhyzh123":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sunstrongchina":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dongzegithub":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"metsystem":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"miller-em":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dorian-byte":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yizhewill":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qiaojunch":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhouliuhuo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"beanza":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"kingxiaozhe":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ygnauh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wzbwzt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"iambigchen":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"weiboshi":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"master-guang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jennyjgao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wangjay408":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chang-you":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rocjemaintiendrai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ainfinitedz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"christ36":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hengistchan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huiyingc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"andyli4":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"momogir":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jamjid":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"freeroo2":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ycan253":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"laurallalala":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"danielyan86":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rennzhang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"larscheng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qingkediguo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"adfvcdxv":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"javajianghu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chloe-c11":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"verkru":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"eggeggliu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dr-kkk":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jinhma":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"emergence23":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"0christ1":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"junru281":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"joe-the-plumber":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jsaki":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"witerth":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ludwig-ll":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luster-lyl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"smallppgirl":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"realduxy":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"awilekong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wwz223":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zhangjinzhepro":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"atom-set":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"coderxiaowq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hillsonziqiu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"alexzhang-mini":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xil324":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"bordergong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hawkins-hjq":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"cathyshang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"greyqt":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yanglimbo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"rao-qianlin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dtjk":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"martina001":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lxy1108":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"franklinsworld666":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"brainlds":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huamulanyyds":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"eclairs46":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"maike-hps":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sanjiu81":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qinmengx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yashuning":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"luzhaofeng":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lizhao-liu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yukibei":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hermione666":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"yyyyytc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zin-next":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"pandapls":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jackinai":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"godkun":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dadahui":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"akxuan":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fightforcoding":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"jialigogogo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"celestexiong":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"zjy-debug":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"peggyhao":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sleepydog25":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"edwineo":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"panfx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"liudi9047":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"allanli-lhh":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xchen172":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qiaoeve":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tangyi23":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shangjiaw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tongxw":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"haodongwang1995":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shuichicx":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"qunshanhe":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hebingliang":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"baiqz":[null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092397229","body":"\n### 思路:\n通过元素在栈之间的转移来模拟队列的先进先出。\n\n\n```python\nclass MyQueue:\n \"\"\"使用两个栈实现的队列类\"\"\"\n\n def __init__(self):\n # 初始化两个栈:stack_in 用于入队操作,stack_out 用于出队操作\n self.stack_in = []\n self.stack_out = []\n\n def push(self, x: int) -> None:\n \"\"\"将元素 x 添加到队列的尾部\n 直接将元素压入 stack_in\n \"\"\"\n self.stack_in.append(x)\n\n def pop(self) -> int:\n \"\"\"移除并返回队列头部的元素\n 1. 如果 stack_out 为空,将 stack_in 中的所有元素弹出并压入 stack_out\n 2. 这样能确保元素以先进先出的顺序出栈\n 3. 弹出 stack_out 的栈顶元素\n \"\"\"\n if not self.stack_out:\n while self.stack_in:\n self.stack_out.append(self.stack_in.pop())\n return self.stack_out.pop()\n\n def peek(self) -> int:\n \"\"\"返回队列头部的元素,但不删除它\n 复用 pop 方法获取队首元素,然后将其压回 stack_out 以保持队列状态不变\n \"\"\"\n res = self.pop()\n self.stack_out.append(res)\n return res\n\n def empty(self) -> bool:\n \"\"\"检查队列是否为空\n 当且仅当两个栈都为空时,队列为空\n \"\"\"\n return not (self.stack_in or self.stack_out)\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"xiaogaoddd":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tuuna":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lxy12l":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"chxbilly":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"sentiy-hub":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"fea1220":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wtbkevin":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"awenbocc":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"hallcia":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"huzhipeng-hu":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"tongtz":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lindo146":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"heye0507":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"lmw6412036":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/1#issuecomment-3072932165","body":"@azl397985856 需要建day1啦","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3076893308","body":"## 思路1\n\n枚举每个普通字符,分别找到其左侧,右侧**最近**特殊字符的位置,求出距离,并取最小值。\n\n1. 预处理每个特殊字符的位置,保存至数组data;\n2. 枚举每个普通字符,在data中查找其左侧,右侧**最近**特殊字符的位置,求出距离,并取最小值。查找过程用可以**二分**实现,也可以用\n **单个指针记录最后一次位置**实现;\n3. 返回结果。\n\n## 思路1代码\n\n```javascript\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function (s, c) {\n let n = s.length, data = [];\n for (let i = 0; i < n; i++) {\n if (s[i] === c) data.push(i);\n }\n\n // 双指针\n // left 左侧最近的c索引\n // right 右侧最近的c索引 right = left + 1\n let left = -1, right = -1, m = data.length;\n let ans = new Array(n).fill(0);\n for (let i = 0; i < n; i++) {\n let char = s[i];\n if (char === c) continue;\n\n let ldis = Infinity, rdis = Infinity;\n // 在data中寻找左侧最近的c索引\n // left 指针移动的条件:data[left + 1] < i,确保data[left] 是在i的左侧,距离i更近\n while (left + 1 < m && data[left + 1] < i) left++;\n if (left >= 0) ldis = i - data[left];\n \n right = left + 1;\n if (right < m) rdis = data[right] - i;\n ans[i] = Math.min(ldis, rdis);\n }\n return ans;\n };\n```\n\n## 思路1复杂度分析\n\n- 时间复杂度:O(n + m),n为字符串s的长度,m为data的长度,遍历字符串s2次,left也只是从左往右移动一次,为O(m),所以总的时间复杂度为O(n + m)。\n- 空间复杂度:O(m),m为data的长度,不考虑返回值的话,需要一个额外的长度为m的数组来保存c的位置,所以空间复杂度为O(m);考虑返回值,需要一个额外的长度为n的数组来保存结果,间复杂度为O(n)。\n\n---\n\n## 思路2\n\n也可以枚举每个特殊字符c的位置,处理c往左、往右能覆盖的普通字符,记录每个普通字符的最小值即可。\n\n1. 预处理每个特殊字符的位置,保存至数组data;\n2. 从左往右遍历data,处理每个特殊字符c左侧的普通字符的距离,保存至数组答案ans;可以使用思路1单指针记录最后一个位置的方式,降低时间复杂度;具体可以看代码;\n3. 从右往左遍历data,处理每个特殊字符c右侧的普通字符的距离,与答案ans对应位置比较,取最小值;\n4. 返回答案ans。\n\n## 思路2代码\n```javascript\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function (s, c) {\n let n = s.length, data = [], ans = new Array(n).fill(Infinity);\n for (let i = 0; i < n; i++) {\n if (s[i] === c) {\n ans[i] = 0;\n data.push(i);\n }\n }\n\n const m = data.length;\n\n // 从左往右遍历\n let left = 0;//从左往右开始,第一个普通字符的索引\n for (let j of data) {\n while (left < n && s[left] === c) left++;\n while (left < n && s[left] !== c && left < j) {\n // console.log('处理left',left,j);\n ans[left] = Math.min(ans[left], j - left);\n left++;\n }\n }\n\n // 从右往左遍历\n let right = n - 1;// 从右往左开始,第一个普通字符的索引\n for (let i = m - 1; i >= 0; i--) {\n let j = data[i];\n while (right >= 0 && s[right] === c) right--;\n while (right >= 0 && s[right] !== c && right > j) {\n ans[right] = Math.min(ans[right], right - j);\n right--;\n }\n }\n return ans;\n };\n```\n## 思路2复杂度分析\n\n- 时间复杂度:O(n + m),n为字符串s的长度,遍历字符串s1次,遍历data两次,left、right也只是各移动一次,所以总的时间复杂度为O(n + m)。\n- 空间复杂度:O(m),m为data的长度,不考虑返回值的话,需要一个额外的长度为m的数组来保存c的位置,所以空间复杂度为O(m);考虑返回值,需要一个额外的长度为n的数组来保存结果,间复杂度为O(n)。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3082655797","body":"## 思路1\n这是一个典型的栈设计题,数据规模不大的情况下,按照常规操作即可。可以使用数组或链表来存储。\n## 代码1\n```javascript\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.data = []\n this.maxSize = maxSize;\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if(this.data.length < this.maxSize) this.data.push(x);\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if(this.data.length === 0) return -1;\n return this.data.pop(); \n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n let n = this.data.length;\n for(let i = 0;i < k;i++){\n if(i < n) this.data[i] += val;\n else break;\n }\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n```\n## 复杂度分析1\n* 时间复杂度:O(n*k)。n表示操作次数。插入和删除的时间复杂度都是O(1),每次increment都要遍历数组,时间复杂度是O(k);所以总的复杂度为O(n*k)。\n* 空间复杂度:O(n)。n为maxSize。\n---\n## 思路2\n如果k较大,increment是个非常耗时的操作,所以我们需要优化increment的操作。\n优化思路:increment是批量更新的,可以用差分数组来实现。但是又要支持高效的查询与删除操作,所以可以用树状数组来维护这个差分数组。\n## 代码2\n```javascript\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function (maxSize) {\n this.cnt = 0;\n this.data = new Array(maxSize + 1).fill(0);\n this.maxSize = maxSize;\n};\n\n/**\n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function (x) {\n if (this.cnt === this.maxSize) return;\n this.cnt++;\n this.update(this.cnt - 1, x);\n if(this.cnt <= this.maxSize - 1) this.update(this.cnt, -x);\n //console.log('push ',x,this.data);\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function () {\n if(this.cnt === 0) return -1;\n let ans = this.query(this.cnt - 1);\n this.update(this.cnt - 1, -ans);\n if(this.cnt <= this.maxSize - 1) this.update(this.cnt,ans);\n this.cnt--;\n //console.log('pop ',ans,this.data);\n return ans;\n};\n\n/**\n * @param {number} k\n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function (k, val) {\n if(this.cnt === 0) return;\n this.update(0, val);\n let r = Math.min(k,this.maxSize,this.cnt);\n if(r <= this.maxSize - 1) this.update(r,-val);\n};\n\n\nCustomStack.prototype.query = function (i) {\n i = i + 1;\n let ans = 0;\n while (i) {\n ans += this.data[i];\n i -= this.lowbit(i);\n }\n return ans;\n}\n\nCustomStack.prototype.update = function (i, val) {\n i = i + 1;\n while (i <= this.maxSize) {\n this.data[i] += val;\n i += this.lowbit(i);\n }\n}\n\n\nCustomStack.prototype.lowbit = function (i) {\n return i & (-i);\n}\n\n/**\n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n\n```\n\n## 复杂度分析2\n* 时间复杂度:O(n*log(maxSize))。n表示操作次数。插入、删除、批量更新的时间复杂度都是O(log(maxSize));所以总的复杂度为O(n*log(maxSize))。\n* 空间复杂度:O(n)。n为maxSize。\n---\n## 思路3\n有没有保持插入,删除O(1),批量更新O(1)的算法呢?官方题解给出了一个懒删除的技巧。小伙伴们可以尝试一下。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3087040795","body":"## 思路一:栈\n这是一个典型的括号匹配问题,可以用栈来解决。 \n步骤:\n1. 创建一个栈sStack,栈顶元素标示当前答案,初始元素为空字符串;\n2. 创建一个栈nStack,存储需要重复的数字k;\n3. 声明一个全局变量num,用来记录数字。遍历字符串:\n 1. 如果当前字符为数字,追加到num中;\n 2. 如果当前字符为左括号,将num压入栈nStack,将一个新的空字符串压入栈sStack,并清空num。**遇到左括号表示要开启新一轮的字符串重复过程,因此数字栈压入需要重复的数字k,字符串栈压入一个空字符串来存储本轮重复过程产生的答案**;\n 3. 如果当前字符为字母,追加到栈sStack的栈顶元素中;\n 4. 如果当前字符为右括号,取出栈sStack的栈顶元素s,取出栈nStack的栈顶元素k,s重复k次;并追加到栈sStack的栈顶元素中。**遇到右括号表示本轮重复过程结束,因此将栈sStack的栈顶元素重复k次,并追加到栈sStack的栈顶元素中,继续前一轮的重复**。\n 5. 最后栈sStack的栈顶元素即为结果。\n## 代码一\n```javascript\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n let sStack = [''],nStack = [],n = s.length;\n let num = 0;\n for(let i = 0;i < n;i++){\n let c = s[i];\n if(/\\d/.test(c)) num = num * 10 + Number(c);\n else if(c === '[') {\n nStack.push(num);\n num = 0;\n sStack.push('');\n }else if(/[a-z]/.test(c)){\n // console.log(sStack)\n sStack[sStack.length - 1] += c;\n }else{\n let s = sStack.pop(),k = nStack.pop();\n // console.log(s,k);\n if(s) s = s.repeat(k);\n sStack[sStack.length - 1] += s;\n // console.log(sStack)\n }\n }\n return sStack[0];\n };\n```\n## 复杂度分析一\n* 时间复杂度:O(n),其中n为字符串s的长度。\n* 空间复杂度:O(n),需要两个最长长度为n的栈保存答案及数字,其中n为字符串s的长度。\n--- \n## 思路二:递归\n括号匹配问题,一般可以用递归来解决。 \n步骤:\n1. 预处理字符串s,记录与每个“\\[”匹配的“\\]”的位置,保存至数组left中。\n> 预处理匹配括号位置是这类递归问题常见的技巧。\n2. 从左往右遍历字符串s: \n 1. 如果当前字符为字母,则将当前字符添加到结果res中;\n 2. 如果当前字符为数字,则将数字保存在变量num中;\n 3. 如果当前字符为左括号,递归调用f,处理\\[i + 1, left\\[i] - 1]的子串,得到的结果重复num次,并追加到结果res中;num清空;\n4. 返回res。\n\n## 代码二\n```javascript\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n let stack = [],n = s.length,left = new Array(n).fill(-1);\n for(let i = 0;i < n;i++){\n let c = s[i];\n if(c === '[') stack.push(i);\n else if(c === ']') left[stack.pop()] = i;\n }\n return f(0,n - 1);\n // -----------------------------------\n function f(l,r){\n let ans = '',num = 0;\n for(let i = l;i <= r;i++){\n let c = s[i];\n if(/\\d/.test(c)) num = num * 10 + Number(c);\n else if(c === '['){\n ans += f(i + 1,left[i] - 1).repeat(num);\n num = 0;\n i = left[i];\n }else if(/[a-z]/.test(c)) ans += c;\n }\n return ans;\n }\n};\n```\n\n## 复杂度分析二\n* 时间复杂度:O(n),其中n为字符串s的长度。\n* 空间复杂度:O(n),即递归栈深度,最大为n,其中n为字符串s的长度。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091479392","body":"## 思路\n1. 设计双栈,一个用于存放入队数据,一个用于存放出队数据。\n2. 各个操作的实现思路:\n 1. push:将数据压入pushData栈中。\n 2. pop:如果popData栈为空,则将pushData栈中的数据全部弹出并压入popData栈中。然后弹出popData栈的栈顶元素。\n 3. peek:同pop操作,最后一步返回popData栈的栈顶元素。 \n 4. empty:判断两个栈是否为空。 \n\n> js中可以用数组模拟栈。\n## 代码\n```javascript\nvar MyQueue = function() {\n this.pushData = []\n this.popData = [] \n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nMyQueue.prototype.push = function(x) {\n this.pushData.push(x) \n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.pop = function() {\n if(this.popData.length === 0 && this.pushData.length) while(this.pushData.length) this.popData.push(this.pushData.pop());\n return this.popData.pop();\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.peek = function() {\n if(this.popData.length === 0 && this.pushData.length) while(this.pushData.length) this.popData.push(this.pushData.pop());\n return this.popData[this.popData.length - 1];\n};\n\n/**\n * @return {boolean}\n */\nMyQueue.prototype.empty = function() {\n return this.pushData.length === 0 && this.popData.length === 0\n};\n\n/** \n * Your MyQueue object will be instantiated and called as such:\n * var obj = new MyQueue()\n * obj.push(x)\n * var param_2 = obj.pop()\n * var param_3 = obj.peek()\n * var param_4 = obj.empty()\n */\n```\n## 复杂度分析\n- 时间复杂度:O(1):插入、删除、查找操作的均摊时间复杂度都是O(1)\n- 空间复杂度:O(n):栈的存储空间","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094576990","body":"## 思路\n比较容易的思路是,排序后,每个块和排序前元素的种类和数量完全相同,可以用哈希表或前缀和来求解。此思路的时间复杂度是O(n),空间复杂度是O(nlog(n))。 \n后来看了看题解,发现可以用单调栈或维护前后缀的思路来求解。\n\n### 排序块性质\n**我们要想划分最多的块,并且保证排序后的结果和原数组的排序结果相同,则块中的元素必须保证,块中的最大值都比右边的元素小或者相同,块中的最小值都比左边的元素大或者相同。**\n则我们维护一个前缀最大值和后缀最小值两个数组,只要前缀的最大值,小于等于后缀的最小值,则可划分(相当于给数组划一条线)。\n## 代码\n```javascript\n/**\n * @param {number[]} arr\n * @return {number}\n */\nvar maxChunksToSorted = function(arr) {\n let n = arr.length, prefixMax = new Array(n).fill(-Infinity),suffixMin = new Array(n).fill(Infinity);\n for(let i = 0;i < n;i++){\n prefixMax[i] = Math.max(i ? prefixMax[i - 1] : -Infinity,arr[i]);\n let j = n - 1 - i;\n suffixMin[j] = Math.min(j + 1 < n ? suffixMin[j + 1] : Infinity,arr[j]);\n }\n\n let ans = 1;\n for(let i = 0;i < n - 1;i++){\n if(prefixMax[i] <= suffixMin[i + 1]) ans++;\n }\n return ans\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n)\n- 空间复杂度:O(n)\n\n## 参考题解\n[https://leetcode.cn/problems/max-chunks-to-make-sorted-ii/solutions/1/zui-duo-neng-wan-cheng-pai-xu-de-kuai-by-z0wz/](https://leetcode.cn/problems/max-chunks-to-make-sorted-ii/solutions/1/zui-duo-neng-wan-cheng-pai-xu-de-kuai-by-z0wz/)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095130877","body":"## 思路\n旋转链表的本质上是将链表尾部k个节点移动到链表头部。按照这个思路步骤如下:\n1. 计算链表长度l;\n2. 如果 k % l === 0 或者 l === 0,即k为l的整数倍,或者链表为空,则不需要旋转,直接返回head;否则 k = k % l;\n3. 声明两个指针fast、slow,fast先移动k步;\n4. fast、slow同时移动,直到fast到达链表末尾;\n5. 此时:\n 1. slow的下一个节点即为新的头结点\n 2. slow.next 指向 null\n 3. fast.next 指向 head\n 4. 返回新的头结点\n\n## JavaScript代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @param {number} k\n * @return {ListNode}\n */\nvar rotateRight = function(head, k) {\n if(!head || k === 0) return head;\n let l = 0,curr = head;\n while(curr){\n l++;\n curr = curr.next;\n }\n k = k % l;\n if(k === 0) return head;\n let fast = head,slow = head;\n while(k){\n fast = fast.next;\n k--;\n }\n\n while(fast.next){\n fast = fast.next;\n slow = slow.next;\n }\n\n let newHead = slow.next;\n slow.next = null;\n fast.next = head;\n return newHead;\n\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中n为链表的长度。\n- 空间复杂度:O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100439586","body":"## 思路\n因为是两两交换,所以可以声明四个指针记录涉及到交换的节点,修改相关指针的next指向即可。具体步骤如下:\n1. 特判:链表为空或链表只有一个节点,直接返回原链表。\n2. 为了简化代码,声明一个哨兵节点dummy,dummy.next = head,方便统一处理。\n3. 声明指针prev,指向前一次交换后的结束节点;声明指针curr,指向本次交换的开始节点。初始值prev = dummy,curr = head,开始循环:\n 1. 循环终止条件:curr为空或者curr的下一个节点为空(即curr没有可以交换的节点了)。\n 2. 声明next指针,next = curr.next;声明nextCurr指针,nextCurr = curr.next.next;\n 3. 两两交换:curr.next = nextCurr,next.next = curr;\n 4. 重新设置头尾指向,确保下一轮循环正确执行:prev.next = next;\n 5. 重新设置prev,curr:prev = curr; curr = nextCurr;继续循环,直到循环终止条件。\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar swapPairs = function(head) {\n if(!head || !head.next) return head;\n const dummy = new ListNode();\n dummy.next = head;\n \n let prev = dummy,curr = dummy.next;\n while(curr && curr.next){\n let next = curr.next,nextCurr = next.next;\n curr.next = nextCurr;\n next.next = curr;\n \n prev.next = next;\n\n prev = curr;\n curr = curr.next;\n }\n\n return dummy.next;\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是链表的长度。\n- 空间复杂度:O(1),仅使用有限个指针。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3105520636","body":"## 思路\n* 本题目标是将一个有序单链表(升序排列)转换为一棵高度平衡的二叉搜索树(Height Balanced Binary Search Tree)。\n* 核心思想是使用递归方式构建树,每次选择链表的中间节点作为当前子树的根节点,以保证左右子树的高度差不超过 1。\n* 利用快慢指针(slow 和 fast)找到链表的中间节点,并将链表分割为左子链表和右子链表,分别递归构建左右子树。\n* 实现步骤如下:\n 1. 递归终止条件:\n * 如果链表为空(!head),返回 null。\n * 如果只有一个节点(!head.next),直接构建一个 TreeNode 返回。\n 2. 寻找中间节点:\n * 使用快慢指针法,fast 每次走两步,slow 每次走一步,当 fast 到达末尾时,slow 正好指向中间节点。使用一个临时变量 prev 记录 slow 的前一个节点,方便后续断开连接。\n 3. 分割链表:\n * 将 slow 前面的节点作为左子链表,断开连接。\n * slow.next 作为右子链表继续递归处理。\n 4. 构建树节点:\n * 当前 slow.val 作为根节点,递归构建左右子树。\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {ListNode} head\n * @return {TreeNode}\n */\nvar sortedListToBST = function(head) {\n if(!head) return head;\n // display(head)\n if(!head.next) return new TreeNode(head.val);\n\n // 寻找中间节点\n let slow = head,fast = head,prev = null;\n while(fast.next && fast.next.next){\n fast = fast.next.next;\n prev = slow;\n slow = slow.next;\n }\n // 此时,slow是中间节点,slow.next是右子树的根\n let next = slow.next;\n if(prev) prev.next = null;\n slow.next = null;\n\n const root = new TreeNode(slow.val);\n root.left = sortedListToBST(prev ? head : null);\n root.right = sortedListToBST(next);\n return root;\n};\n\nfunction display(head){\n let ans = [],p = head;\n while(p){\n ans.push(p.val);\n p = p.next;\n }\n console.log('处理的树:',ans)\n}\n```\n## 复杂度分析\n* 时间复杂度:O(n log n)\n * 每一层递归都需要遍历链表的一半来找中间节点(O(n)),递归深度为 log n,因此总时间复杂度为 O(n log n)。\n* 空间复杂度:O(log n)\n * 主要是递归调用栈的空间,取决于树的高度。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3111762311","body":"## 思路\n- 定义两个指针 `pA` 和 `pB`,分别从 `headA` 和 `headB` 开始遍历。\n- 当 `pA` 和 `pB` 不相遇时,它们会继续向前移动:\n - 如果 `pA` 到达末尾 (`null`),则跳转到 `headB`。\n - 如果 `pB` 到达末尾 (`null`),则跳转到 `headA`。\n- 这样,两个指针最终会在相交点相遇,或者同时到达末尾 (`null`),从而退出循环。\n- 返回 `pA`,即相交节点或 `null`。\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} headA\n * @param {ListNode} headB\n * @return {ListNode}\n */\nvar getIntersectionNode = function (headA, headB) {\n let pA = headA, pB = headB;\n while (pA !== pB) {\n pA = pA ? pA.next : headB;\n pB = pB ? pB.next : headA;\n }\n return pA;\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n + m),其中 n 和 m 分别为链表 headA 和 headB 的长度。\n- 空间复杂度:O(1),只使用了两个指针变量,没有额外的空间。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3116200386","body":"## 思路\n- 首先处理边界情况:如果head为空,直接返回\n- 快慢指针同时遍历链表,快指针每次走两步,慢指针每次走一步\n- 当两指针相遇时停止第一阶段\n- 如果fast为null,说明无环,返回null\n- 将slow重置为head,两个指针以相同速度继续移动直到相遇\n- 相遇点即为环的起始节点\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar detectCycle = function(head) {\n if(!head) return head;\n let slow = head,fast = head;\n while(fast){\n fast = fast.next;\n if(fast) fast = fast.next;\n\n slow = slow.next;\n\n if(slow === fast) break;\n }\n\n if(!fast) return fast;\n\n slow = head;\n\n while(slow !== fast){\n slow = slow.next;\n fast = fast.next;\n }\n\n return slow\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n)\n- 空间复杂度:O(1)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3125594702","body":"## LRU Cache 算法思路分析\n\nLRU (Least Recently Used) 缓存是一种常用的缓存淘汰策略,当缓存满时,会优先淘汰最近最少使用的元素。\n\n### 核心数据结构\n\n1. **双向链表**:维护元素的访问顺序,头部是最近最少使用的元素,尾部是最近使用的元素\n2. **哈希表(Map)**:提供O(1)时间复杂度的元素查找\n\n### 主要操作实现\n\n#### 1. 初始化\n- 设置缓存容量\n- 初始化当前元素计数器\n- 创建哈希表存储键值对\n- 创建虚拟头节点和尾节点,方便操作\n\n#### 2. 获取元素get\n- 如果元素不存在,返回-1\n- 如果元素存在:\n - 将该节点从当前位置删除\n - 将该节点插入到链表尾部(标记为最近使用)\n - 返回节点值\n\n#### 3. 插入/更新元素put\n- **新元素插入**:\n - 如果缓存已满,删除链表头部节点(最近最少使用的元素)\n - 创建新节点并添加到哈希表\n - 将新节点插入链表尾部\n- **更新元素**:\n - 更新节点值\n - 将节点从当前位置删除并移到链表尾部\n\n#### 4. 辅助方法\n- insertToTail:将节点插入链表尾部\n- deleteFromHead:删除链表头部节点\n- deleteNode:删除指定节点\n\n## 代码\n```javascript\n/**\n * @param {number} capacity\n */\nvar LRUCache = function(capacity) {\n this.capacity = capacity;\n this.cnt = 0;\n this.map = new Map();\n this.head = new DoubleNode();\n this.tail = new DoubleNode();\n this.head.next = this.tail;\n this.tail.prev = this.head; \n};\n\n/** \n * @param {number} key\n * @return {number}\n */\nLRUCache.prototype.get = function(key) {\n // console.log('get',key)\n \n if(this.map.has(key) === false) return -1;\n let node = this.map.get(key);\n\n this.deleteNode(node);\n \n this.insertToTail(node);\n // this.map.set(key,node);\n \n // this.display();\n\n return node.val;\n};\n\n/** \n * @param {number} key \n * @param {number} value\n * @return {void}\n */\nLRUCache.prototype.put = function(key, value) {\n if(this.map.has(key) === false){// 插入操作\n let node = new DoubleNode(key,value);\n if(this.cnt === this.capacity) this.deleteFromHead(); \n else this.cnt++\n this.map.set(key,node);\n this.insertToTail(node);\n }else{\n let node = this.map.get(key);\n node.val = value;\n\n this.deleteNode(node);\n\n this.insertToTail(node);\n // this.map.set(key,node);\n }\n\n // console.log('put',key,value);\n // this.display();\n};\n\nLRUCache.prototype.insertToTail = function(node){\n let prev = this.tail.prev;\n \n prev.next = node;\n node.next = this.tail;\n \n this.tail.prev = node;\n node.prev = prev;\n}\n\nLRUCache.prototype.deleteFromHead = function(){\n let node = this.head.next;\n let next = node.next;\n \n this.head.next = next;\n next.prev = this.head;\n\n this.map.delete(node.key);\n}\n\nLRUCache.prototype.deleteNode = function(node){\n let prev = node.prev,next = node.next;\n prev.next = next;\n next.prev = prev;\n\n node.prev = null;\n node.next = null;\n\n // this.map.delete(node.key);\n}\n\nLRUCache.prototype.display = function(){\n let k = this.cnt,p = this.head.next;\n let ans = []\n while(k){\n ans.push(p.key + '=>' + p.val);\n k--;\n p = p.next;\n }\n console.log(ans);\n}\n\nfunction DoubleNode(key,val){\n this.key = key;\n this.val = val;\n this.next = null;\n this.prev = null;\n}\n\n\n/** \n * Your LRUCache object will be instantiated and called as such:\n * var obj = new LRUCache(capacity)\n * var param_1 = obj.get(key)\n * obj.put(key,value)\n */\n```\n## 复杂度分析\n### 时间复杂度\n- get操作:O(1)\n- put操作:O(1)\n\n### 空间复杂度\n- O(capacity),需要存储最多capacity个元素\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3123739061","body":"## 思路\n\n使用了递归的思想来解决问题:\n\n1. **基础情况(Base Case)**:如果当前节点为空(`!root`),则返回深度0,因为空节点没有深度。\n\n2. **递归关系(Recursive Relation)**:\n - 分别计算左子树和右子树的最大深度:`maxDepth(root.left)` 和 `maxDepth(root.right)`\n - 取两者中的较大值:`Math.max(maxDepth(root.left), maxDepth(root.right))`\n - 加上当前节点的1层高度:`+1`\n\n### 算法执行过程\n\n1. 对于任意节点,先递归计算其左子树的最大深度\n2. 再递归计算其右子树的最大深度\n3. 比较左右子树的深度,取较大值\n4. 将较大值加1(代表当前节点所在的层),作为以当前节点为根的子树的最大深度\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar maxDepth = function(root) {\n if(!root) return 0;\n return Math.max(maxDepth(root.left),maxDepth(root.right))+1;\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**:O(n),其中n是二叉树的节点数。因为需要遍历每个节点一次。\n- **空间复杂度**:O(h),其中h是二叉树的高度。这是由于递归调用栈的深度,最坏情况下(完全不平衡的树)可能达到O(n),最好情况下(完全平衡的树)为O(log n)。\n\n这是一个典型的分治算法应用,将问题分解为更小的子问题(左右子树的深度),然后合并结果得到最终答案。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125568669","body":"## 代码思路分析\n\n这是一个经典的二叉树递归问题,采用深度优先搜索(DFS)的方式解决:\n\n1. **基本情况处理**:\n - 如果两个节点都为null,则认为相同,返回true\n - 如果其中一个节点为null,另一个不是,则不同,返回false\n\n2. **递归比较**:\n - 比较当前节点的值是否相等\n - 递归比较左子树是否相同\n - 递归比较右子树是否相同\n - 只有当值相等且左右子树都相同时,才返回true\n\n## 代码实现\n\n```javascript\nvar isSameTree = function(p, q) {\n // 如果两个节点都为空,则相同\n if(p===null && q===null) return true;\n // 如果只有一个节点为空,则不同\n if(p===null) return false;\n if(q===null) return false;\n // 比较当前节点值,并递归比较左右子树\n return p.val===q.val && isSameTree(p.left,q.left) && isSameTree(p.right,q.right);\n};\n```\n\n\n## 复杂度分析\n\n- **时间复杂度**:O(min(m,n)),其中m和n分别是两个二叉树的节点数。在最坏情况下,需要遍历两个树中所有节点。\n- **空间复杂度**:O(min(m,n)),递归调用的层数最多为较小树的高度,最坏情况下为O(min(m,n))。\n\n这个算法通过递归方式同时遍历两棵树的相同位置节点,并比较它们的值是否相等,从而判断两棵树是否完全相同。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3130348089","body":"## 思路\n\n### 核心思路\n- 使用深度优先搜索(DFS)遍历二叉树\n- 在遍历过程中维护从根节点到当前节点形成的数字\n- 当到达叶节点时,将形成的数字加到结果中\n\n### 具体实现\n\n1. **函数定义与参数**:\n - `sumNumbers(root, prev = 0)` 接收当前节点 `root` 和之前形成的数字 `prev`\n - `prev` 参数有默认值 0,用于累积从根到当前节点的数字\n\n2. **边界条件处理**:\n ```javascript\n if(!root) return 0;\n ```\n\n - 如果当前节点为空,返回 0\n\n3. **数字累积**:\n ```javascript\n prev = prev * 10 + root.val;\n ```\n\n - 将当前节点值添加到路径数字中\n - 通过 `prev * 10 + root.val` 实现数字的逐位构建\n\n4. **叶节点判断**:\n ```javascript\n if(!root.left && !root.right) return prev;\n ```\n\n - 如果当前节点是叶节点(无左右子节点),返回累积的数字\n\n5. **递归处理**:\n ```javascript\n return sumNumbers(root.left,prev) + sumNumbers(root.right,prev);\n ```\n\n - 分别递归处理左右子树\n - 将左右子树的结果相加返回\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar sumNumbers = function(root,prev = 0) {\n if(!root) return 0;\n prev = prev * 10 + root.val;\n if(!root.left && !root.right) return prev;\n return sumNumbers(root.left,prev) + sumNumbers(root.right,prev);\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**:O(n),其中 n 是二叉树的节点数,需要遍历每个节点一次\n- **空间复杂度**:O(h),其中 h 是二叉树的高度,主要是递归调用栈的空间\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3134622736","body":"## 思路\n\n### 1. 核心思想\n使用深度优先搜索(DFS)遍历二叉树,记录每一层最左边的节点值。\n\n### 2. 关键实现点\n\n- **层级记录**:通过 `level` 参数跟踪当前节点所在的层级\n- **每层只记录一次**:利用 `level === left.length` 条件确保每层只记录第一个访问的节点值\n- **先左后右遍历**:先遍历左子树再遍历右子树,保证每层第一个访问的是最左边的节点\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n let left = [];\n dfs(root,0)\n return left[left.length - 1];\n // ----------------------\n function dfs(root,level){\n if(!root) return;\n if(level === left.length) left.push(root.val);\n dfs(root.left,level + 1);\n dfs(root.right,level + 1);\n }\n};\n```\n## 优化后的代码\n优化思路:没必要用数组保存整个左侧值,只需要记录左侧值第一次出现即可\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n let left = 0,ans;\n dfs(root,0)\n return ans;\n // ----------------------\n function dfs(root,level){\n if(!root) return;\n if(level === left) {\n left++;\n ans = root.val;\n }\n dfs(root.left,level + 1);\n dfs(root.right,level + 1);\n }\n};\n```\n\n\n## 复杂度分析\n- **时间复杂度**:O(n),其中 n 是二叉树的节点数,需要遍历每个节点一次\n- **空间复杂度**:O(h),其中 h 是二叉树的高度,主要是递归调用栈的空间开销","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3138308014","body":"## 思路\n\n### 1. 序列化 (`serialize`)\n- 使用前序遍历(根-左-右)遍历二叉树\n- 对于每个节点:\n - 如果节点为空,将 `null` 添加到结果数组\n - 如果节点不为空,将节点值添加到结果数组,然后递归处理左右子树\n- 最后将数组转换为 JSON 字符串返回\n\n### 2. 反序列化 (`deserialize`)\n- 将 JSON 字符串解析为数组\n- 使用递归方式重建二叉树:\n - 按顺序读取数组元素\n - 如果当前元素是 `null`,返回 `null`\n - 如果当前元素不是 `null`,创建新节点,并递归构建左右子树\n - 利用前序遍历的特点,按顺序处理就能重建原来的树结构\n\n## 关键特点\n\n1. **前序遍历**:保证了根节点在子节点之前被处理,便于重建时确定父子关系\n2. **空节点标记**:用 `null` 标记空节点,确保能完全还原树的结构\n3. **递归实现**:两个函数都使用递归方式实现,代码简洁清晰\n\n## 示例说明\n\n假设有一棵二叉树:\n```\n 1\n / \\\n 2 3\n / \\\n 4 5\n```\n\n\n- 序列化结果:`[1,2,null,null,3,4,null,null,5,null,null]`\n- 反序列化时按此顺序重建树结构\n\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val) {\n * this.val = val;\n * this.left = this.right = null;\n * }\n */\n\n/**\n * Encodes a tree to a single string.\n *\n * @param {TreeNode} root\n * @return {string}\n */\nvar serialize = function(root) {\n let ans = [];\n dfs(root);\n return JSON.stringify(ans);\n // -----------------\n function dfs(root){\n if(!root){\n ans.push(null);\n return;\n }\n ans.push(root.val);\n dfs(root.left);\n dfs(root.right);\n }\n};\n\n/**\n * Decodes your encoded data to tree.\n *\n * @param {string} data\n * @return {TreeNode}\n */\nvar deserialize = function(data) {\n let arr = JSON.parse(data),i = 0;\n //console.log(arr);\n return dfs();\n // if(arr.length === 0) return null;\n // ---------------------\n function dfs(){\n let node;\n // console.log(i,arr[i]);\n if(arr[i] === null) node = null;\n else node = new TreeNode(arr[i]);\n i++;\n if(node) {\n node.left = dfs();\n node.right = dfs();\n }\n return node;\n }\n};\n\n/**\n * Your functions will be called as such:\n * deserialize(serialize(root));\n */\n```\n\n## 复杂度分析\n- 时间复杂度:序列化和反序列化的时间复杂度都是 O(n),其中 n 是二叉树的节点数。\n- 空间复杂度:考虑到返回值的话,序列化和反序列化的空间复杂度都是 O(n),其中 n 是二叉树的节点数。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3141895435","body":"## 思路\n\n### 具体实现步骤\n\n1. **数据结构选择**\n - 使用一个大小为2001的数组 cols 每个元素是一个优先队列 `PriorityQueue`\n - 优先队列用于处理同一列中节点的排序问题\n\n2. **排序规则**\n - 主要按行号 row 排序(上到下)\n - 行号相同时按节点值 `node.val` 排序\n\n3. **DFS遍历**\n - 通过 dfs 函数遍历整个二叉树\n - 将每个节点按其列号存入对应的优先队列中\n - 列号通过 `col + 1000` 映射到数组索引,处理负数列号\n\n4. **结果构建**\n - 遍历 cols 数组,跳过空队列\n - 从每个非空队列中依次取出元素,构建每列的结果\n - 按列顺序组合成最终结果\n\n## 关键点\n\n- **坐标系统**:以根节点为原点(0,0),向左列号减1,向右列号加1,向下行号加1\n- **偏移处理**:通过 `col + 1000` 将可能的负数列号映射到正数索引\n- **排序逻辑**:同一位置优先按行排序,其次按值排序\n\n这种方法确保了垂直遍历的正确顺序。\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {TreeNode} root\n * @return {number[][]}\n */\nvar verticalTraversal = function(root) {\n let cols = new Array(2000 + 1).fill(0).map(()=>new PriorityQueue((a,b)=>{\n if(a[0] !== b[0]) return a[0] - b[0];\n return a[2] - b[2];\n }));\n\n dfs(root,0,0);\n let ans = [];\n for(let i = 0;i <= 2000;i++){\n let data = cols[i];\n if(data.size() === 0) continue;\n let temp = []\n while(data.size()) temp.push(data.dequeue()[2]);\n ans.push(temp);\n }\n return ans;\n\n // --------------------------------\n function dfs(node,row,col){\n if(!node) return;\n cols[col + 1000].enqueue([row,col,node.val]);\n dfs(node.left,row + 1,col - 1);\n dfs(node.right,row + 1,col + 1);\n }\n \n};\n```\n\n## 复杂度分析\n\n### 时间复杂度\n\n1. **初始化阶段**\n - 创建大小为2001的数组并初始化优先队列:O(2001) = O(1)\n\n2. **DFS遍历阶段**\n - 对每个节点执行一次 dfs 调用\n - 假设树有 N 个节点,则 DFS 总共执行 N 次\n - 每次 enqueue 操作在优先队列中的时间复杂度为 O(log M),其中 M 是队列中元素个数\n - 最坏情况下,所有节点都在同一列,M 最大为 N\n - 因此 DFS 阶段时间复杂度为 O(N log N)\n\n3. **结果构建阶段**\n - 遍历2001个位置的数组:O(2001) = O(1)\n - 从优先队列中 dequeue 所有元素:每个元素 dequeue 一次,总共 N 个元素\n - 每次 dequeue 操作为 O(log M)\n - 总时间复杂度为 O(N log N)\n\n**总时间复杂度:O(N log N)**,其中 N 是二叉树中节点的数量\n\n### 空间复杂度\n\n1. **存储结构**\n - cols 数组:大小固定为 2001,每个元素是一个优先队列\n - 所有优先队列总共存储 N 个节点信息:O(N)\n - 每个节点信息是一个包含3个元素的数组:O(1) 每节点\n\n2. **递归调用栈**\n - dfs 函数的递归深度最多为树的高度 H\n - 在最坏情况下(树退化为链表),H = N\n - 平均情况下,对于平衡二叉树,H = log N\n\n3. **结果数组**\n - ans 数组存储最终结果:O(N)\n\n**总空间复杂度:O(N)**,其中 N 是二叉树中节点的数量\n\n### 总结\n\n- **时间复杂度:O(N log N)**\n- **空间复杂度:O(N)**\n\n其中 N 为二叉树的节点总数。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146457266","body":"## 思路:\n\n1. **使用哈希表存储已遍历元素**:\n - 创建一个空对象 [map](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\454\\2.js#L5-L5) 作为哈希表\n - 用于存储已经遍历过的元素值和其对应的索引\n\n2. **一次遍历查找**:\n - 遍历数组中的每个元素 `nums[i]`,记为 [a](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\452\\1.js#L14-L14)\n - 计算目标差值 `b = target - a`\n - 检查 `b` 是否已经在哈希表中存在\n - 如果存在,说明找到了两个数,它们的和等于目标值,直接返回这两个数的索引 `[map[b], i]`\n - 如果不存在,将当前元素 [a](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\452\\1.js#L14-L14) 和它的索引 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 存入哈希表,继续遍历\n\n### 算法优势:\n1. **时间复杂度优化**:从暴力解法的 O(n²) 降低到 O(n)\n2. **空间换时间**:使用额外的哈希表存储,换取查找时间的优化\n3. **一次遍历**:只需要遍历一次数组就能得到结果\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number[]}\n */\nvar twoSum = function(nums, target) {\n let map = {}\n for(let i = 0;i < nums.length;i++){\n let a = nums[i],b = target - a;\n if(map[b] !== undefined) return [map[b],i];\n map[a] = i;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是数组的长度。\n- 空间复杂度:O(n),哈希表 map 的大小为 n。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3146924002","body":"## 思路\n### 主要步骤:\n\n1. **统计频次**:使用 [map](file:///E:/力扣刷题/algorithm_exercises/程序员面试金典/面试题04.01.节点间通路/main.js#L13-L13) 对象统计每个数字在数组中出现的频次\n ```javascript\n let map = {};\n for(let i of nums) map[i] = (map[i] || 0) + 1;\n ```\n\n\n2. **维护大小为 K 的最小堆**:使用最小堆来保存频率最高的 K 个元素\n ```javascript\n let q = new MinPriorityQueue(v=>v[1]); // 基于元素出现频次的优先队列\n ```\n\n\n遍历统计结果,将元素和其频次作为数组加入堆中,当堆的大小超过 K 时,移除堆顶(即当前堆中频次最低的元素):\n ```javascript\n for(let key in map){\n q.enqueue([+key,map[key]]);\n if(q.size() > k) q.dequeue();\n }\n ```\n\n\n3. **构建结果数组**:依次从堆中取出元素,因为是最小堆,所以频次低的先出堆,最终得到的就是频次最高的 K 个元素\n ```javascript\n let ans = [];\n while(q.size()){\n ans.push(q.dequeue()[0]);\n }\n ```\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar topKFrequent = function(nums, k) {\n let q = new MinPriorityQueue(v=>v[1]);\n let map = {};\n for(let i of nums) map[i] = (map[i] || 0) + 1;\n for(let key in map){\n q.enqueue([+key,map[key]]);\n if(q.size() > k) q.dequeue();\n } \n let ans = [];\n while(q.size()){\n ans.push(q.dequeue()[0]);\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(N log K),其中 N 是数组的长度\n- 空间复杂度:O(N),用于存储频次映射表","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3148902680","body":"## 思路\n\n### 1. 数据结构选择\n- 使用 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5) 数组存储每个点到其他点的距离统计\n- `map[i]` 是一个 Map,记录第 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 个点到其他各点的距离及出现次数\n\n### 2. 核心逻辑\n- **距离计算**:遍历所有点对,计算两点间距离的平方(避免开根号运算)\n- **距离统计**:将每对点的距离信息分别记录到两个点的统计中\n- **结果计算**:对于每个点,如果到其他点有相同距离的点超过1个,则可以组成回旋镖\n\n### 3. 关键步骤详解\n\n```javascript\n// 计算两点间距离的平方\nfunction calc(i,j){\n let a = Math.abs(points[i][0] - points[j][0]),b = Math.abs(points[i][1] - points[j][1]);\n return a * a + b * b;\n}\n```\n这段代码计算两个点之间的欧几里得距离的平方,使用平方避免浮点运算。\n\n```javascript\n// 统计每个点到其他点的距离\nfunction addMap(i,dis){\n let m = map[i];\n m.set(dis,(m.get(dis) || 0) + 1);\n}\n```\n将距离信息记录到对应点的统计Map中。\n\n### 4. 结果计算原理\n\n对于每个点 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6),如果存在 `v` 个点与它距离相同(`v>1`),则可以从这 `v` 个点中选择 2 个点与点 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 组成回旋镖,选择方式有 `v*(v-1)` 种。\n\n\n## 代码\n```javascript\n/**\n * @param {number[][]} points\n * @return {number}\n */\nvar numberOfBoomerangs = function(points) {\n let n = points.length;\n if(n < 3) return 0;\n let map = new Array(n).fill(0).map(()=>new Map());\n for(let i = 0;i < n;i++){\n for(let j = i + 1;j < n;j++){\n let dis = calc(i,j);\n addMap(i,dis);\n addMap(j,dis);\n }\n }\n let ans = 0;\n for(let i = 0;i < n;i++){\n for(let [k,v] of map[i]){\n if(v <= 1) continue;\n ans += v * (v - 1);\n }\n }\n\n return ans;\n\n \n\n\n // ------------------------------\n function calc(i,j){\n let a = Math.abs(points[i][0] - points[j][0]),b = Math.abs(points[i][1] - points[j][1]);\n return a * a + b * b;\n }\n\n function addMap(i,dis){\n let m = map[i];\n m.set(dis,(m.get(dis) || 0) + 1);\n\n }\n};\n```\n\n## 算法复杂度\n- 时间复杂度:O(n²)\n- 空间复杂度:O(n²)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3152979976","body":"## 思路\n\n### 核心思想\n使用**滑动窗口**(Sliding Window)技术配合**哈希表**来解决这个问题。\n\n### 关键变量说明\n- [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31): 滑动窗口的左边界\n- [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6): 滑动窗口的右边界(循环变量)\n- [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5): 用于记录窗口内每个字符出现的次数\n- `ans`: 记录最长无重复子串的长度\n\n### 算法步骤\n\n1. **初始化**:设置左边界 `l = 0`,创建字符计数的 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5),初始化结果 `ans = 0`\n\n2. **扩展窗口**:使用 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 从左到右遍历字符串,逐步扩展窗口右边界\n\n3. **处理重复字符**:\n - 当遇到重复字符时(`map.has(c)` 为 true),不断右移左边界 [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31)\n - 移动过程中减少对应字符的计数,如果计数为0则从 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5) 中删除\n - 直到窗口中不再包含当前字符为止\n\n4. **更新结果**:\n - 计算当前窗口长度 `i - l + 1`\n - 与历史最大值比较,更新 `ans`\n\n5. **维护窗口状态**:将当前字符加入 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5) 并增加其计数\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @return {number}\n */\nvar lengthOfLongestSubstring = function(s) {\n let l = 0, map = new Map(),n = s.length,ans = 0;\n for(let i = 0;i < n;i++){\n let c = s[i]\n while(map.has(c)){\n map.set(s[l],map.get(s[l]) - 1);\n if(map.get(s[l]) === 0) map.delete(s[l]);\n l++;\n }\n // console.log(l,i,s.slice(l,i + 1));\n ans = Math.max(i - l + 1,ans);\n map.set(c,(map.get(c) || 0 ) + 1)\n }\n return ans;\n};\n```\n\n\n## 复杂度分析\n- **时间复杂度**: O(n),其中 n 是字符串长度,每个字符最多被访问两次\n- **空间复杂度**: O(min(m,n)),其中 m 是字符集大小","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3157255368","body":"## 思路\n\n### 1. 建立单词频次映射\n```javascript\nlet map = new Map();\nwords.forEach((word,i)=>{\n map.set(word,(map.get(word) || 0) + 1);\n});\n```\n\n- 使用 `Map` 统计 `words` 数组中每个单词的出现次数\n- 处理 `words` 中可能存在重复单词的情况\n\n### 2. 初始化参数\n```javascript\nlet n = s.length,m = words.length,k = words[0].length,l = k * m;\n```\n\n- [n](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6): 字符串 [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 的长度\n- `m`: 单词数组的长度\n- `k`: 每个单词的长度(题目保证所有单词等长)\n- [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31): 所有单词连接后的总长度\n\n### 3. 遍历可能的起始位置\n```javascript\nfor(let i = 0;i <= n - l;i++){}\n```\n\n- 只需检查到 `n - l` 位置,因为更后面不可能容纳完整的连接串\n\n### 4. 检查每个窗口\n```javascript\nlet j = i,result = new Map(),total = 0;\nwhile(j < i + l){\n let c = s.slice(j,j + k);\n if(map.has(c) === false) break;\n let found = false;\n result.set(c,(result.get(c) || 0) + 1);\n if(result.get(c) <= map.get(c)) found = true;\n if(found === false) break;\n j += k;\n total++;\n}\n```\n\n- 从位置 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 开始,每次取长度为 `k` 的子串进行匹配\n- 使用 `result` 记录当前窗口中各单词的出现次数\n- 如果遇到不在 `words` 中的单词或某个单词出现次数超过要求,则提前终止\n- `total` 记录成功匹配的单词数\n\n### 5. 判断结果\n```javascript\nif(total === m) ans.push(i);\n```\n\n- 当成功匹配的单词数等于 `words` 长度时,说明找到了一个有效子串\n\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string[]} words\n * @return {number[]}\n */\nvar findSubstring = function(s, words) {\n let map = new Map();\n words.forEach((word,i)=>{\n map.set(word,(map.get(word) || 0) + 1);\n });\n let n = s.length,m = words.length,k = words[0].length,l = k * m;\n if(n < l) return [];\n let ans = [];\n for(let i = 0;i <= n - l;i++){\n let j = i,result = new Map(),total = 0;\n while(j < i + l){\n // console.log('check',s.slice(i,i + m * k));\n let c = s.slice(j,j + k);\n if(map.has(c) === false) break;\n let found = false;\n result.set(c,(result.get(c) || 0) + 1);\n if(result.get(c) <= map.get(c)) found = true;\n if(found === false) break;\n j += k;\n total++;\n }\n if(total === m) ans.push(i); \n }\n return ans;\n};\n```\n## 复杂度分析\n### 时间复杂度\n- 外层循环: O(n - l)\n- 内层循环: O(m)\n- 总体复杂度: O((n - l) × m)\n### 空间复杂度\nO(n):存储单词频次映射和结果数组\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3162347437","body":"## 思路\n\n使用前缀和 + 哈希表的方法,基于以下数学原理:\n\n1. 如果总和 `totalSum % p = delta`,我们需要找到一个子数组,其和模 `p` 也等于 `delta`\n2. 这样删除该子数组后,剩余元素和就能被 `p` 整除\n\n## 代码步骤分析\n\n### 1. 前缀和计算\n```javascript\nlet n = nums.length, sum = new Array(n + 1).fill(0);\nfor(let i = 0; i < n; i++) sum[i + 1] = sum[i] + nums[i];\n```\n\n- 构建前缀和数组 `sum`,其中 `sum[i]` 表示前 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 个元素的和\n- `sum[0] = 0`,`sum[i] = nums[0] + nums[1] + ... + nums[i-1]`\n\n### 2. 计算目标余数\n```javascript\nlet delta = sum[n] % p;\nif(delta === 0) return 0;\n```\n\n- `sum[n]` 是所有元素的总和\n- `delta` 是总和对 `p` 的余数\n- 如果 `delta` 为 0,说明总和已能被 `p` 整除,返回 0\n\n### 3. 寻找最短子数组\n```javascript\nlet ans = Infinity;\nlet map = new Map();\nfor(let i = 0; i <= n; i++){\n let b = sum[i], a = (b % p - delta % p + p) % p;\n map.set(b % p, i);\n if(map.has(a)) ans = Math.min(ans, i - map.get(a));\n}\n```\n\n\n关键数学关系:\n- 对于子数组 `nums[j...i-1]`,其和为 `sum[i] - sum[j]`\n- 我们希望 `(sum[i] - sum[j]) % p = delta`\n- 即 `sum[i] % p = (sum[j] + delta) % p`\n- 变形得:`sum[j] % p = (sum[i] % p - delta) % p`\n\n具体实现:\n- `b = sum[i]`:当前前缀和\n- `a = (b % p - delta % p + p) % p`:需要找到的前缀和余数\n- 用 [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5) 记录每个余数值最后一次出现的位置\n- 如果找到对应的余数 [a](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L27-L27),则更新最短长度\n\n### 4. 返回结果\n```javascript\nreturn ans === n ? -1 : ans;\n```\n\n- 如果最短长度等于数组长度,说明需要删除整个数组,返回 -1\n- 否则返回找到的最短子数组长度\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} p\n * @return {number}\n */\nvar minSubarray = function(nums, p) {\n let n = nums.length,sum = new Array(n + 1).fill(0);\n for(let i = 0;i < n;i++) sum[i + 1] = sum[i] + (nums[i]);\n // p = BigInt(p);\n let delta = sum[n] % p;\n if(delta === 0) return 0;\n let ans = Infinity;\n let map = new Map();\n for(let i = 0;i <= n;i++){\n let b = sum[i],a = (b % p - delta % p + p) % p;\n map.set(b % p,i);\n if(map.has(a)) ans = Math.min(ans,i - map.get(a));\n }\n return ans === n ? -1 : ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),只需遍历一次数组\n- 空间复杂度:O(n),用于存储前缀和数组和哈希表","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3166424389","body":"\n## 思路\n使用了经典的**快慢指针**(龟兔赛跑)算法。\n\n1. **双指针技巧**:\n - `slow` 指针每次移动一步\n - `fast` 指针每次移动两步\n - 当 `fast` 到达链表末尾时,`slow` 正好在中间位置\n\n## 代码执行流程\n\n- **初始化**:两个指针 `slow` 和 `fast` 都指向链表头节点 [head](file://E:\\其他项目\\algorithm_exercises\\程序员面试金典\\面试题02.04.分割链表\\main.js#L50-L50)\n- **循环条件**:`while (fast && fast.next)` 确保 `fast` 可以安全地移动两步\n- **指针移动**:\n - `fast` 连续移动两步:`fast = fast.next; fast = fast.next;`\n - `slow` 移动一步:`slow = slow.next;`\n- **返回结果**:当循环结束时,`slow` 指向中间节点\n\n## 处理奇偶数节点的情况\n\n- **奇数个节点**:返回正中间的节点\n- **偶数个节点**:返回第二个中间节点(如链表有4个节点,则返回第3个节点)\n\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar middleNode = function(head) {\n let slow = head,fast = head;\n while(fast && fast.next){\n fast = fast.next;\n fast = fast.next;\n slow = slow.next;\n }\n return slow;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是链表的节点数。\n- 空间复杂度:O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3169628215","body":"## 思路\n\n1. 使用双指针技术:\n - [r](file:///E:/力扣刷题/algorithm_exercises/周赛/456/2.js#L10-L17) 指针(慢指针):指向不重复序列的最后一个元素位置\n - [i](file:///E:/力扣刷题/algorithm_exercises/程序员面试金典/面试题08.07.无重复字符串的排列组合/main.js#L9-L22) 指针(快指针):用于遍历整个数组\n\n2. 初始化:\n - [r](file:///E:/力扣刷题/algorithm_exercises/周赛/456/2.js#L10-L17) 从 0 开始,表示第一个元素肯定是要保留的\n - [i](file:///E:/力扣刷题/algorithm_exercises/程序员面试金典/面试题08.07.无重复字符串的排列组合/main.js#L9-L22) 从 1 开始遍历\n\n3. 核心逻辑:\n - 当 `nums[i] > nums[r]` 时,说明找到了一个新的不重复元素\n - 此时将 [r](file:///E:/力扣刷题/algorithm_exercises/周赛/456/2.js#L10-L17) 向前移动一位,并将 `nums[i]` 与 `nums[r]` 交换\n - 由于数组是排序的,所以只需要比较大小就能判断是否是新元素\n\n4. 返回值:\n - 返回 [r](file:///E:/力扣刷题/algorithm_exercises/周赛/456/2.js#L10-L17) + 1,即不重复元素的个数\n\n### 示例演示:\n\n假设数组为 [0, 0, 1, 1, 2, 2]:\n\n1. 初始:r = 0, i = 1,nums[1] = 0, nums[0] = 0,不满足 `nums[i] > nums[r]`\n2. i = 2,nums[2] = 1, nums[0] = 0,满足 `nums[2] > nums[0]`,r 变为 1,交换 nums[2] 和 nums[1]\n - 数组变为 [0, 1, 0, 1, 2, 2],r = 1\n3. i = 3,nums[3] = 1, nums[1] = 1,不满足 `nums[i] > nums[r]`\n4. i = 4,nums[4] = 2, nums[1] = 1,满足 `nums[4] > nums[1]`,r 变为 2,交换 nums[4] 和 nums[2]\n - 数组变为 [0, 1, 2, 1, 0, 2],r = 2\n5. i = 5,nums[5] = 2, nums[2] = 2,不满足 `nums[i] > nums[r]`\n6. 结束,返回 r + 1 = 3\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar removeDuplicates = function(nums) {\n let n = nums.length,r = 0;\n for(let i = 1;i < n;i++){\n if(nums[i] > nums[r]) {\n r++;\n swap(i,r);\n }\n //console.log(nums);\n }\n return r + 1;\n // ------------------------\n function swap(i,j){\n [nums[i],nums[j]] = [nums[j],nums[i]]\n }\n};\n```\n\n### 复杂度分析:\n\n- 时间复杂度:O(n),只需要遍历一次数组\n- 空间复杂度:O(1),只使用了常数级别的额外空间\n- 利用了数组已经排序的特性,通过比较大小判断是否重复\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172297646","body":"## 思路\n经典的二分查找算法,用于在有序数组中找到目标值的插入位置\n1. **初始化变量**:\n - `n`:数组长度\n - `l`:左边界,初始为0\n - `r`:右边界,初始为n-1\n - `ans`:结果位置,初始为n(表示插入到数组末尾)\n\n2. **二分查找逻辑**:\n - 使用标准二分查找模板,当`l <= r`时继续查找\n - `mid = (l + r) >> 1`:计算中间位置(相当于除以2取整)\n - 关键判断:`if(nums[mid] >= target)`\n - 如果中间元素大于等于目标值,说明目标值应该在左半部分(包括mid位置)\n - 更新`ans = mid`,并将右边界移动到`mid - 1`\n - 否则,目标值在右半部分,将左边界移动到`mid + 1`\n\n3. **返回结果**:\n - 返回找到的插入位置`ans`\n\n### 特殊情况处理\n\n- 如果target小于所有元素,ans保持为0(正确位置)\n- 如果target大于所有元素,ans保持为n(数组长度,正确位置)\n- 如果target等于某个元素,ans为该元素的索引\n- 如果target介于两个元素之间,ans为较大元素的位置\n\n这个实现非常优雅,通过一个变量ans记录可能的答案,避免了在循环外再进行额外判断,使得代码简洁且易于理解。\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar searchInsert = function(nums, target) {\n let n = nums.length;\n let l = 0, r = n - 1,ans = n;\n while(l <= r){\n let mid = (l + r) >> 1;\n if(nums[mid] >= target){\n ans = mid;\n r = mid - 1;\n }else l = mid + 1;\n }\n return ans;\n};\n```\n\n### 复杂度分析\n\n1. **时间复杂度**:O(log n),典型的二分查找时间复杂度\n2. **空间复杂度**:O(1),只使用了常数级别的额外空间\n3. **核心思想**:寻找第一个大于等于target的元素位置","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173065451","body":"## 思路\n\n这段代码使用**单调队列**(双端队列)来解决滑动窗口最大值问题,时间复杂度为 O(n)。\n\n### 实现步骤\n\n1. **数据结构选择**\n - 使用 `q` 数组作为双端队列,存储数组元素的**索引**\n - 队列中保持索引对应的值**单调递减**的特性\n\n2. **维护单调性**\n ```javascript\n while(q.length && back() < nums[i]) q.pop();\n q.push(i);\n ```\n\n - 在每次添加新元素前,移除队尾所有小于当前元素的索引\n - 这样保证队首始终是当前窗口的最大值索引\n\n3. **窗口处理**\n ```javascript\n if(i >= k - 1){\n ans.push(nums[q[0]]); // 队首即为窗口最大值\n if(i - q[0] + 1 === k) q.shift(); // 移除窗口外的元素\n }\n ```\n\n - 当达到窗口大小时开始记录结果\n - 及时移除超出窗口范围的索引\n\n### 关键技巧\n\n- 存储索引而非值,便于判断元素是否在窗口范围内\n- 利用单调性快速获取窗口最大值(队首元素)\n- 通过索引差值判断元素是否需要移出窗口\n\n### 缺陷\n在javascript中,使用数组模拟双端队列,队首出队、入队的时间复杂度均为O(n),性能较差,可以考虑手动实现一个双端队列,例如使用双向链表,优化性能。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar maxSlidingWindow = function(nums, k) {\n let q = [],n = nums.length;\n let ans = [];\n for(let i = 0;i < n;i++){\n while(q.length && back() < nums[i]) q.pop();\n q.push(i);\n if(i >= k - 1){\n ans.push(nums[q[0]]);\n if(i - q[0] + 1 === k) q.shift();\n }\n }\n return ans;\n // ------------------------\n function back(){\n return nums[q[q.length - 1]];\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是数组的长度。单调队列的维护时间复杂度为 O(n),窗口处理时间复杂度为 O(n),因此总时间复杂度为 O(n)。\n- 空间复杂度:O(n),单调队列最多存储 n 个元素,因此空间复杂度为 O(n)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3177500710","body":"## 思路\n\n### 1. 数据结构设计\n- 使用两个数组 `ind` 和 `outd` 分别记录每个人的入度和出度\n- 数组长度为 `n+1` 是为了方便使用1到n的索引对应人编号\n\n### 2. 统计过程\n```javascript\nfor(let [a,b] of trust){\n outd[a]++; // a相信别人,出度+1\n ind[b]++; // b被别人相信,入度+1\n}\n```\n\n- 遍历信任关系数组,统计每个人的入度和出度\n\n### 3. 法官判断\n```javascript\nfor(let i = 1;i <= n;i++){\n if(outd[i] === 0 && ind[i] === n - 1) return i;\n}\n```\n\n- 遍历所有人,寻找满足条件的人:\n - `outd[i] === 0`:不相信任何人\n - `ind[i] === n - 1`:被其他所有人相信\n\n这是典型的图论中利用入度出度解决问题的方法。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} trust\n * @return {number}\n */\nvar findJudge = function(n, trust) {\n let ind = new Array(n + 1).fill(0),// 入度\n outd = new Array(n + 1).fill(0);// 出度\n for(let [a,b] of trust){\n outd[a]++;\n ind[b]++;\n }\n for(let i = 1;i <= n;i++){\n if(outd[i] === 0 && ind[i] === n - 1) return i;\n }\n return -1;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(T + N),其中T是信任关系数,N是人数\n- 空间复杂度:O(N),用于存储入度和出度数组","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182022991","body":"## 思路\n\n### 1. 图的构建\n- 使用邻接表`g`存储不喜欢关系\n- 对于每一对`[a,b]`,在[a](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L27-L27)的邻接表中添加`b`,在`b`的邻接表中添加[a](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L27-L27)\n- 这样构建出一个无向图,表示不喜欢关系\n\n### 2. 二分图判断\n- 使用染色法判断是否为二分图\n- `color`数组记录每个节点的颜色状态:\n - `0`表示未染色\n - `1`表示第一组\n - `2`表示第二组\n\n### 3. DFS遍历\n- 遍历所有节点,对未染色节点开始DFS\n- [f(i, val)](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17)函数:\n - 将节点[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6)染成颜色[val](file://E:\\其他项目\\algorithm_exercises\\libs\\LinkedList.js#L34-L34)\n - 遍历[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6)的所有邻居节点`j`\n - 如果邻居`j`已有颜色且与[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6)相同,返回`false`\n - 如果邻居`j`未染色,递归将其染成相反颜色\n - 所有情况满足则返回`true`\n\n### 4. 核心逻辑\n- 主函数中遍历所有节点,对未染色节点调用[f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17)函数\n- 如果任何一次调用返回`false`,说明无法二分,返回`false`\n- 全部成功则返回`true`\n\n这是典型的二分图判定问题,通过图的遍历和染色来解决。\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} dislikes\n * @return {boolean}\n */\nvar possibleBipartition = function(n, dislikes) {\n let g = new Array(n + 1).fill(0).map(()=>[]);\n for(let [a,b] of dislikes){\n g[a].push(b);\n g[b].push(a);\n }\n let color = new Array(n + 1).fill(0);\n for(let i = 1;i <= n;i++){\n if(color[i] === 0 && !f(i,1)) return false;\n }\n return true;\n\n // ------------------------\n function f(i,val){\n color[i] = val;\n for(let j of g[i]){\n if(color[j] && color[j] === val) return false;\n if(!color[j] && !f(j,val === 1 ? 2 : 1)) return false; \n }\n return true;\n }\n};\n```\n## 复杂度分析\n- 时间复杂度:O(n + dislikes.length) - 线性时间复杂度\n- 空间复杂度:O(n + dislikes.length) - 主要用于存储图结构和递归栈","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3186678361","body":"## 主要思路\n\n### 1. 预处理阶段\n- **处理未分配项目**:将 `group[i] === -1` 的项目分配给新的虚拟组\n- **构建组内项目映射**:建立 `groupItems` 数组,记录每个组包含的项目\n\n### 2. 构建依赖图\n- **项目依赖图** (`itemG`):记录项目间的依赖关系\n- **小组依赖图** (`groupG`):记录小组间的依赖关系\n- **计算入度**:\n - `inID`:每个项目的入度\n - `inGD`:每个小组的入度\n\n### 3. 双层拓扑排序\n- **组间拓扑排序**:先对小组进行拓扑排序\n- **组内拓扑排序**:对每个小组内的项目进行拓扑排序\n\n## 关键函数分析\n\n### 主函数流程\n```javascript\n// 初始化和构建图结构\n// ...\n\n// 组间拓扑排序\nfor(let i = 0;i <= m;i++){\n if(inGD[i] === 0) qG.enqueue(i);\n}\nwhile(qG.size()){\n let i = qG.dequeue();\n getItemsFromGroup(i); // 处理组内项目\n // 更新小组依赖\n}\n```\n\n\n### 组内拓扑排序函数 `getItemsFromGroup`\n```javascript\nfunction getItemsFromGroup(g){\n // 对特定组内的项目进行拓扑排序\n // 只处理组内依赖关系\n}\n```\n\n## 核心思想\n采用**分层拓扑排序**策略:\n1. 先确保小组间的依赖关系满足\n2. 再确保每个小组内部的项目依赖关系满足\n3. 通过双层 BFS 实现完整的排序逻辑\n\n这种解法有效地将复杂的依赖关系分解为两个相对简单的拓扑排序问题。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number} m\n * @param {number[]} group\n * @param {number[][]} beforeItems\n * @return {number[]}\n */\nvar sortItems = function(n, m, group, beforeItems) {\n for(let i = 0;i < n;i++){\n if(group[i] === -1) group[i] = m++;\n }\n\n let groupItems = new Array(m).fill(0).map(()=>[]);\n for(let i = 0;i < n;i++){\n groupItems[group[i]].push(i);\n }\n\n\n\n let itemG = new Array(n).fill(0).map(()=>[]);// 项目依赖关系建图\n let groupG = new Array(m).fill(0).map(()=>new Set());// 小组依赖关系建图\n let inID = new Array(n).fill(0);//每个项目的入度\n let inGD = new Array(m).fill(0);//每个小组的入度\n beforeItems.forEach((prevs,curr)=>{\n inID[curr] += prevs.length;\n for(let prev of prevs) {\n itemG[prev].push(curr);\n let u = group[prev],v = group[curr];\n if(u === v) continue;\n if(groupG[u].has(v)) continue;\n groupG[u].add(v);\n inGD[v]++;\n }\n });\n\n //console.log('小组依赖',groupG,groupItems);\n\n let ans = [],qG = new Queue();\n\n\n for(let i = 0;i <= m;i++){\n if(inGD[i] === 0) qG.enqueue(i);\n }\n while(qG.size()){\n let i = qG.dequeue();\n getItemsFromGroup(i);\n for(let j of groupG[i]){\n inGD[j]--;\n if(inGD[j] === 0) qG.enqueue(j);\n }\n }\n return ans.length === n ? ans : [];\n\n // ---------------------------------\n function getItemsFromGroup(g){\n let items = groupItems[g];\n let qI = new Queue();\n for(let i of items){\n if(inID[i] === 0) qI.enqueue(i);\n }\n while(qI.size()){\n let i = qI.dequeue();\n ans.push(i);\n for(let j of itemG[i]){\n inID[j]--;\n if(inID[j] === 0 && group[j] === g) qI.enqueue(j);\n }\n }\n }\n\n };\n```\n## 复杂度分析\n- **时间复杂度**:O(n + m + |beforeItems|) - 每个项目和依赖关系只被处理一次\n- **空间复杂度**:O(n + m) - 存储图结构和队列","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3190382685","body":"## 思路\n没啥好说的,模拟就完了\n## 代码\n```javascript\n/**\n * @param {string} moves\n * @return {boolean}\n */\nvar judgeCircle = function(moves) {\n let x = 0,y = 0;\n for(let move of moves){\n if(move === 'U') x--;\n else if(move === 'D') x++;\n else if(move === 'L') y--;\n else y++;\n } \n return x === 0 && y === 0\n};\n```\n## 复杂度分析\n- 时间复杂度O(n)\n- 空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193453621","body":"## 思路\n\n### 主要步骤:\n\n1. **数据预处理**:\n - 将原始任务数组 [enqueueTime, processingTime] 扩展为 [enqueueTime, processingTime, index],保留原始索引信息\n - 按照入队时间(enqueueTime)对任务进行排序\n\n2. **使用优先队列**:\n - 创建一个优先队列,排序规则是:\n - 首先按处理时间(processingTime)升序排列\n - 如果处理时间相同,则按下标(index)升序排列\n\n3. **任务处理逻辑**:\n - 初始化结果数组和当前时间点(end)\n - 当还有未处理任务或优先队列不为空时:\n - 如果优先队列为空,将当前时间点更新为下一个任务的入队时间\n - 将所有在当前时间点之前或刚好到达的未处理任务加入优先队列\n - 从优先队列中取出优先级最高的任务执行\n - 更新当前时间点(加上该任务的处理时间)\n - 将该任务的原始索引加入结果数组\n\n### 关键点解释:\n\n- **优先队列的作用**:确保在可执行的任务中,总是选择处理时间最短的任务执行(最短作业优先调度算法)\n- **时间管理**:通过 [end] 变量追踪当前时间点,确保任务按时间顺序被考虑\n- **边界处理**:当优先队列为空时,直接跳转到下一个任务的入队时间,避免不必要的循环\n\n## 代码\n```javascript\n/**\n * @param {number[][]} tasks\n * @return {number[]}\n */\nvar getOrder = function(tasks) {\n let data = [],n = tasks.length;\n // 按任务入队时间排序,同时不丢失下标信息。\n tasks.forEach((v,i)=>data.push([...v,i])); \n data.sort((a,b)=>a[0] - b[0]);\n // 优先队列,优先级为:先按任务时长,再按下标\n let i = 0,q = new PriorityQueue((a,b)=>{\n if(a[1] !== b[1]) return a[1] - b[1];\n return a[2] - b[2];\n });\n\n let ans = [],end = 0;\n while(i < n || q.size()){\n if(q.size() === 0) end = Math.max(end,data[i][0]);\n while(i < n && data[i][0] <= end) q.enqueue(data[i++]);\n let [_,p,index] = q.dequeue();\n ans.push(index);\n end += p;\n }\n return ans;\n};\n```\n\n## 复杂度分析\n### 时间复杂度:\n- 排序:O(n log n)\n- 优先队列操作:每个任务最多入队和出队一次,每次操作 O(log n)\n- 总体复杂度:O(n log n)\n### 空间复杂度:\n- 需要一个优先队列及一个数组保存数据,空间复杂度为 O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194152066","body":"## 思路\n\n### 主要函数功能\n\n1. [numberOfRounds](file:///E:/力扣刷题/algorithm_exercises/.md#L4-L13) - 主函数,计算从登录到登出之间的完整游戏回合数\n2. [parseTime](file:///E:/力扣刷题/algorithm_exercises/.md#L16-L18) - 辅助函数,将时间字符串解析为小时和分钟\n3. [calc](file:///E:/力扣刷题/algorithm_exercises/.md#L20-L37) - 核心计算函数,计算两个时间之间的回合数\n\n### 解题思路\n\n1. **时间解析**:首先将登录时间和登出时间解析为小时和分钟的数组\n2. **跨天处理**:如果登出时间早于登录时间,说明跨越了午夜,需要在登出时间上加24小时\n3. **回合计算**:\n - 将登录时间向上取整到最近的15分钟倍数(下一回合开始时间)\n - 计算登出时间和登录时间之间的15分钟间隔数\n - 如果结果为负数,则返回0\n\n### 代码细节\n\n```javascript\n// 时间取整逻辑\nif(m1 <= 0) m1 = 0;\nelse if(m1 <= 15) m1 = 15;\nelse if(m1 <= 30) m1 = 30;\nelse if(m1 <= 45) m1 = 45;\nelse {\n m1 = 0;\n h1++;\n}\n```\n\n这个逻辑将登录时间向上取整到下一个回合开始时间(每15分钟为一个回合)。\n\n```javascript\nlet ans = Math.floor((h2 * 60 + m2 - (h1 * 60 + m1)) / 15);\n```\n这行代码计算两个时间点之间有多少个完整的15分钟时间段。\n\n## 代码\n```javascript\n/**\n * @param {string} loginTime\n * @param {string} logoutTime\n * @return {number}\n */\nvar numberOfRounds = function(loginTime, logoutTime) {\n let [h1,m1] = parseTime(loginTime),[h2,m2] = parseTime(logoutTime);\n if(h1 < h2 || h1 === h2 && m1 < m2) return calc(h1,m1,h2,m2);\n return calc(h1,m1,h2 + 24,m2);\n // -------------------------\n function parseTime(time){\n return time.split(':').map(v=>Number(v));\n }\n\n function calc(h1,m1,h2,m2){\n if(m1 <= 0) m1 = 0;\n else if(m1 <= 15) m1 = 15;\n else if(m1 <= 30) m1 = 30;\n else if(m1 <= 45) m1 = 45;\n else {\n m1 = 0;\n h1++;\n }\n // console.log(h1,m1,h2,m2)\n let ans = Math.floor((h2 * 60 + m2 - (h1 * 60 + m1)) / 15);\n if(ans < 0) return 0;\n return ans;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(1),因为解析时间和计算都是常数时间操作。\n- 空间复杂度:O(1),因为只使用了常数个变量。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3195140726","body":"## 思路\n\n### 主函数 `minCharacters`\n- 通过比较三种情况的最小值来得到最终答案:\n - `altb(a,b)`: 使 a 中所有字符 < b 中所有字符需要的操作数\n - `altb(b,a)`: 使 b 中所有字符 < a 中所有字符需要的操作数\n - `aeqb(a,b)`: 使两个字符串都由同一字符组成需要的操作数\n\n### 辅助函数分析\n\n1. **`altb(a,b)` 函数**\n - 遍历分割点 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) (1-25,对应字符 'b'-'z')\n - 计算需要修改的字符数:\n - [a](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L27-L27) 中所有 ≥ i 的字符都需要修改\n - `b` 中所有 < i 的字符都需要修改\n - 返回最小操作数\n\n2. **`aeqb(a,b)` 函数**\n - 统计两个字符串中各字符出现次数\n - 找到出现频率最高的字符\n - 将其他所有字符都修改为该字符即为最少操作数\n\n3. **`getCharValue` 函数**\n - 将字符转换为对应的数值 (a=0, b=1, ..., z=25)\n\n## 代码\n```javascript\n/**\n * @param {string} a\n * @param {string} b\n * @return {number}\n */\nvar minCharacters = function(a, b) {\n return Math.min(altb(a,b),altb(b,a),aeqb(a,b));\n // --------------------------------------\n function altb(a,b){\n let ans = Infinity;\n for(let i = 1;i < 26;i++){\n let temp = 0;\n for(let c of a) if(getCharValue(c) >= i) temp++;\n for(let c of b) if(getCharValue(c) < i) temp++;\n ans = Math.min(ans,temp);\n }\n return ans;\n }\n\n function aeqb(a,b){\n let data = new Array(26).fill(0);\n for(let c of a) data[getCharValue(c)]++;\n for(let c of b) data[getCharValue(c)]++;\n let max = data.reduce((a,b)=>Math.max(a,b),0);\n return a.length + b.length - max;\n }\n\nfunction getCharValue(char){\n return char.charCodeAt(0) - 'a'.charCodeAt(0);\n }\n};\n```\n\n\n## 复杂度分析\n- 时间复杂度:O((m+n)×26) = O(m+n),其中 m 和 n 分别是字符串 a 和 b 的长度\n- 空间复杂度:O(1),只使用了固定大小的额外空间\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3199063845","body":"## 思路\n使用**三路快排(Three-way QuickSort)**的实现,主要通过以下步骤完成排序:\n1. **选择基准值(pivot)**:使用 `viot` 函数选择一个合适的基准值\n2. **分区操作(partition)**:将数组分为三部分:小于基准值、等于基准值、大于基准值\n3. **递归排序**:对小于和大于基准值的两个子数组递归进行快排\n\n## 关键函数分析\n\n### 1. 主排序函数 `quickSort`\n```javascript\nfunction quickSort(l,r){\n if(l >= r) return;\n let i = viot(l,r); // 选择基准值位置\n if(r - l === 1) return;\n if(i !== l) swap(i,l); // 将基准值移到最左边\n let [low,up] = partition(l,r); // 三路分区\n quickSort(l,low - 1); // 递归排序小于基准值的部分\n quickSort(up + 1,r); // 递归排序大于基准值的部分\n}\n```\n\n\n### 2. 基准值选择 `viot`\n```javascript\nfunction viot(l,r){\n // 选择左、中、右三个元素作为候选\n let a = nums[l], c = nums[r];\n let mid = (l + r) >> 1, b = nums[mid];\n \n // 通过比较这三个值选择一个较优的基准值位置\n // 实现了三数取中法的思想\n}\n```\n\n\n### 3. 三路分区 [partition](file://E:\\其他项目\\algorithm_exercises\\程序员面试金典\\面试题02.04.分割链表\\main.js#L15-L48)\n```javascript\nfunction partition(i,j){\n let viot = nums[i], l = i - 1, r = j + 1;\n for(let k = i; k < r; k++){\n let c = nums[k];\n if(c > viot){\n r--;\n swap(k,r);\n k--; // 交换后需要重新检查当前位置\n }else if(c < viot){\n l++;\n swap(k,l);\n }\n // c === viot 时,元素保持在中间区域\n }\n return [l + 1, r - 1]; // 返回等于基准值的区间边界\n}\n```\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar sortArray = function(nums) {\n quickSort(0,nums.length - 1);\n return nums;\n // -------------------------\n function quickSort(l,r){\n if(l >= r) return;\n // console.log(l,r,nums);\n // 找基准值位置\n let i = viot(l,r);\n if(r - l === 1) return;\n if(i !== l) swap(i,l);\n // console.log('viot',nums[l]);\n let [low,up] = partition(l,r);\n // console.log(mid,nums);\n quickSort(l,low - 1);\n quickSort(up + 1,r);\n }\n\n function partition(i,j){\n let viot = nums[i],l = i - 1,r = j + 1;\n for(let k = i;k < r;k++){\n let c = nums[k];\n if(c > viot){\n r--;\n swap(k,r);\n k--;\n }else if(c < viot){\n l++;\n swap(k,l);\n }\n }\n return [l + 1,r - 1];\n }\n\n function viot(l,r){\n let a = nums[l],c = nums[r];\n if(a > c){\n swap(l,r);\n a = nums[l];\n c = nums[r];\n }\n if(r - l === 1) return;\n let mid = (l + r) >> 1,b = nums[mid];\n // if(a === c && a === b) return l;\n if(a === c) return a < b ? l : mid;\n if(b === a || b === c) return l;\n else if(b < a) return l;\n else if(b > a && b < c) return mid;\n return r;\n }\n\n function swap(l,r){\n [nums[l],nums[r]] = [nums[r],nums[l]];\n }\n };\n```\n\n## 复杂度分析\n- **三路快排**:能够很好地处理有重复元素的数组,将相等元素聚集在一起\n- **优化的基准值选择**:使用三数取中法减少最坏情况的发生\n- **原地排序**:不需要额外的存储空间\n- **时间复杂度**:平均 O(n log n),最坏 O(n²)\n- **空间复杂度**:O(log n)(递归调用栈)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204104013","body":"## 思路\n\n### 2. 初始化变量\n- [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31):二分查找的左边界,初始值为 `0`。\n- `r`:二分查找的右边界,初始值为 `x`。\n- `ans`:用于记录当前找到的满足条件的最大整数平方根,初始值为 `0`。\n\n### 3. 二分查找过程\n- 循环条件为 `l <= r`,表示在左边界小于等于右边界时继续查找。\n- 计算中间值 `mid`:\n ```javascript\n let mid = l + ((r - l) >> 1);\n ```\n\n 这里使用了位运算 `>> 1` 来代替除以 `2` 的操作,目的是提高计算效率。\n- 判断逻辑:\n - 如果 `mid * mid <= x`,说明 `mid` 可能是答案,但还可能有更大的值满足条件,因此更新 `ans = mid` 并将左边界右移:`l = mid + 1`。\n - 否则,说明 `mid` 太大,需要将右边界左移:`r = mid - 1`。\n\n### 4. 返回结果\n- 最终返回 `ans`,即找到的满足条件的最大整数平方根。\n\n\n## 代码\n```javascript\n/**\n * @param {number} x\n * @return {number}\n */\nvar mySqrt = function(x) {\n let l = 0,r = x,ans = 0;\n while(l <= r){\n let mid = l + ((r - l) >> 1);\n if(mid * mid <= x){\n ans = mid\n l = mid + 1;\n }else{\n r = mid - 1;\n }\n }\n return ans;\n};\n```\n### 复杂度分析\n- 时间复杂度为 `O(log x)`,因为采用了二分查找策略。\n- 空间复杂度为 `O(1)`,只使用了常数级别的额外空间。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3208885502","body":"## 思路\n\n### 1. 二分查找策略\n- 使用 [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31) 和 `r` 维护搜索区间 `[1, n]`\n- 通过 `mid = l + ((r - l) >> 1)` 计算中点,避免整数溢出\n- 根据 `isBadVersion(mid)` 的结果调整搜索区间\n\n### 2. 搜索逻辑\n- 如果 `isBadVersion(mid)` 返回 `true`(当前版本是错误的):\n - 记录当前版本为候选答案 `ans = mid`\n - 在左半区间继续搜索 `r = mid - 1`\n- 如果返回 `false`(当前版本是正确的):\n - 在右半区间继续搜索 `l = mid + 1`\n\n\n\n## 代码\n```javascript\n/**\n * Definition for isBadVersion()\n * \n * @param {integer} version number\n * @return {boolean} whether the version is bad\n * isBadVersion = function(version) {\n * ...\n * };\n */\n\n/**\n * @param {function} isBadVersion()\n * @return {function}\n */\nvar solution = function(isBadVersion) {\n /**\n * @param {integer} n Total versions\n * @return {integer} The first bad version\n */\n return function(n) {\n let l = 1,r = n,ans = 1;\n while(l <= r){\n let mid = l + ((r - l) >> 1);\n if(isBadVersion(mid)){\n ans = mid;\n r = mid - 1;\n }else l = mid + 1;\n }\n return ans;\n };\n};\n```\n## 复杂度分析\n- 时间复杂度:O(log n)\n- 空间复杂度:O(1)\n- 通过不断缩小区间范围,最终找到第一个错误版本","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/42#issuecomment-3213065724","body":"## 思路\n\n1. **归并排序框架**:使用分治思想,将数组不断二分,递归处理左右两部分\n2. **关键逻辑**:在合并两个有序数组时,统计满足 `nums[i] > 2 * nums[j]` 条件的翻转对数量\n\n## 代码结构分析\n\n### 主函数 `reversePairs`\n- 初始化变量和临时数组\n- 调用 `sort` 函数进行归并排序\n- 返回统计结果 `ans`\n\n### 排序函数 `sort`\n- 标准的归并排序递归结构\n- 将数组 `[l, r]` 分为 `[l, mid]` 和 `[mid+1, r]` 两部分\n- 递归排序后调用 [merge](file://E:\\其他项目\\algorithm_exercises\\3.js#L27-L37) 合并\n\n### 合并函数 [merge](file://E:\\其他项目\\algorithm_exercises\\3.js#L27-L37)\n包含两个主要步骤:\n\n1. **统计翻转对**:\n ```javascript\n if(nums[i] / 2 > nums[j]){\n ans += mid - i + 1;\n j++;\n }else i++;\n ```\n\n - 利用左右两部分已排序的特性\n - 当 `nums[i] > 2 * nums[j]` 时,说明从 `i` 到 `mid` 的所有元素都与 `nums[j]` 构成翻转对\n\n2. **标准归并**:\n - 将两个有序数组合并为一个有序数组\n - 使用 `temp` 数组作为临时存储\n\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar reversePairs = function(nums) {\n let n = nums.length,ans = 0;\n let temp = new Array(n);\n sort(0,n - 1);\n return ans;\n // -----------------------\n function sort(l,r){\n if(l >= r) return;\n let mid = (l + r) >> 1;\n sort(l,mid);\n sort(mid + 1,r);\n merge(l,r,mid);\n }\n\n function merge(left,right,mid){\n let i = left,j = mid + 1,p = left;\n while(i <= mid && j <= right){\n if(nums[i] / 2 > nums[j]){\n ans += mid - i + 1;\n j++;\n }else i++;\n }\n\n i = left;\n j = mid + 1;\n while(i <= mid || j <= right){\n if(j > right || i <= mid && nums[i] < nums[j]) temp[p++] = nums[i++];\n else temp[p++] = nums[j++];\n }\n\n for(let i = left;i <= right;i++) nums[i] = temp[i];\n }\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(n log n)\n- 空间复杂度:O(n)\n- 利用归并排序过程中数组局部有序的特性,高效统计翻转对\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3216251902","body":"\n## 思路\n\n1. **排序处理**:\n - 首先对供暖器数组进行排序,这样便于后续的二分查找操作。\n\n2. **边界处理**:\n - 在供暖器数组的两端分别添加`-Infinity`和`Infinity`,这样可以简化边界条件的处理,避免在查找过程中需要特殊判断边界情况。\n\n3. **核心算法**:\n - 对每个房屋,通过[egt](file:///E:/力扣刷题/algorithm_exercises/91天学算法/day40/.md#L22-L33)函数找到第一个大于等于该房屋位置的供暖器位置\n - 然后比较该房屋与前一个供暖器和后一个供暖器的距离,取较小值作为该房屋所需的最小加热半径\n - 在所有房屋所需的最小加热半径中取最大值,就是能覆盖所有房屋的最小加热半径\n\n4. **二分查找优化**:\n - [egt](file:///E:/力扣刷题/algorithm_exercises/91天学算法/day40/.md#L22-L33)函数使用二分查找来快速定位第一个大于等于目标值的供暖器位置,时间复杂度从O(n)降低到O(log n)\n\n## 具体实现细节\n\n- `heaters[j] - house`表示房屋到右边最近供暖器的距离\n- `house - heaters[i]`表示房屋到左边最近供暖器的距离\n- `Math.min(heaters[j] - house, house - heaters[i])`得到该房屋需要的最小加热半径\n- `Math.max(ans, r)`维护所有房屋中需要的最大加热半径\n\n## 代码\n```javascript\n/**\n * @param {number[]} houses\n * @param {number[]} heaters\n * @return {number}\n */\nvar findRadius = function(houses, heaters) {\n const compare = (a,b) => a - b;\n heaters.sort(compare);\n heaters.push(Infinity);\n heaters.unshift(-Infinity);\n let ans = -Infinity;\n for(let house of houses){\n let j = egt(house),i = j - 1;\n r = Math.min(heaters[j] - house,house - heaters[i]);\n ans = Math.max(ans,r);\n }\n return ans;\n // -------------------------\n function egt(target){\n let l = 0,r = heaters.length - 1,ans = r + 1;\n while(l <= r){\n let mid = (l + r) >> 1\n if(heaters[mid] >= target){\n ans = mid;\n r = mid - 1;\n }else l = mid + 1;\n }\n return ans;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(mlogn + nlogn),其中m是房屋数量。排序的时间复杂度为O(nlogn),二分查找的时间复杂度为O(logn),因此总时间复杂度为O(nlogn + mlogn)。\n- 空间复杂度:O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3217776735","body":"## 思路\n\n使用了**二分搜索 + 双指针**的方法来解决问题:\n\n### 1. 排序\n```javascript\nnums.sort((a,b) => a - b);\n```\n\n首先对数组进行排序,这样可以方便后续计算距离和使用双指针技巧。\n\n### 2. 二分搜索框架\n```javascript\nlet n = nums.length;\nlet r = nums[n - 1] - nums[0], l = 0, ans = 0;\nwhile(l <= r){\n let mid = (l + r) >> 1;\n let cnt = calc(mid);\n if(cnt >= k){\n ans = mid;\n r = mid - 1;\n } else {\n l = mid + 1;\n }\n}\n```\n\n这里使用二分搜索来查找第k小的距离:\n- 搜索范围是 `[0, max_distance]`,其中 `max_distance = nums[n-1] - nums[0]`\n- 对于每个中间值 `mid`,计算有多少个数对的距离小于等于 `mid`\n- 如果数量大于等于 `k`,说明第k小的距离可能就是 `mid` 或者比 `mid` 更小\n- 如果数量小于 `k`,说明第k小的距离一定比 `mid` 更大\n\n### 3. 计算函数 calc\n```javascript\nfunction calc(mid){\n let l = 0, r = -1, ans = 0;\n while(l < n){\n while(r + 1 < n && nums[r + 1] - nums[l] <= mid) r++;\n if(r >= l) ans += r - l;\n l++;\n }\n return ans\n}\n```\n\n这个函数使用双指针技巧计算有多少个数对的距离小于等于给定值 [mid](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\462\\2.js#L20-L20):\n- 外层循环固定左指针 [l](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\461\\3.js#L34-L34)\n- 内层循环移动右指针 `r`,直到 `nums[r] - nums[l] > mid`\n- 此时对于固定的 [l](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\461\\3.js#L34-L34),有 `r - l` 个数对的距离小于等于 [mid](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\462\\2.js#L20-L20)\n- 累加所有可能的数对数量\n\n\n\n## 举例说明\n\n以 `nums = [1,3,1]`, `k = 1` 为例:\n1. 排序后:`[1,1,3]`\n2. 距离范围:`[0, 2]`\n3. 二分搜索过程:\n - `mid = 1`,计算距离 <= 1 的数对有 1 个(`(1,1)`)\n - 因为 1 >= k(1),所以 `ans = 1`,继续搜索左半部分\n - `mid = 0`,计算距离 <= 0 的数对有 1 个(`(1,1)`)\n - 因为 1 >= k(1),所以 `ans = 0`\n4. 返回结果 0\n\n这个解法非常巧妙地结合了二分搜索和双指针技巧,避免了直接计算所有数对距离的 O(n²) 复杂度。\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number}\n */\nvar smallestDistancePair = function(nums, k) {\n nums.sort((a,b) => a - b);\n let n = nums.length;\n let r = nums[n - 1] - nums[0],l = 0,ans = 0;\n while(l <= r){\n let mid = (l + r) >> 1;\n let cnt = calc(mid);\n if(cnt >= k){\n ans = mid;\n r = mid - 1;\n }else l = mid + 1;\n }\n return ans;\n // ----------------------\n function calc(mid){\n let l = 0,r = -1,ans = 0;\n while(l < n){\n while(r + 1 < n && nums[r + 1] - nums[l] <= mid) r++;\n if(r >= l) ans += r - l;\n l++;\n }\n return ans\n }\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(n log n + n log D),其中 n 是数组长度,D 是最大距离\n - 排序需要 O(n log n)\n - 二分搜索需要 log D 次,每次调用 calc 函数需要 O(n)\n- 空间复杂度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3218701829","body":"## 思路\n\n1. **使用优先队列的BFS**:\n - 采用 `MinPriorityQueue` 实现 Dijkstra 算法变体\n - 每个元素存储 `[行, 列, 高度]`,按高度排序\n\n2. **状态表示**:\n - `vis` 数组标记已访问的格子,防止重复访问\n - `ans` 记录到达当前位置所需的最大高度(即所需最低水位)\n\n3. **搜索过程**:\n - 从起点 `(0,0)` 开始,每次选择高度最低的相邻格子\n - 更新所需最低水位为路径上遇到的最大高度\n - 直到到达终点 `(n-1,n-1)`\n\n## 关键步骤\n\n- **初始化**:标记起点已访问,将起点加入优先队列\n- **主循环**:不断取出队列中高度最低的位置\n- **更新答案**:记录路径上的最大高度值\n- **探索邻居**:向四个方向扩展未访问的邻居节点\n- **终止条件**:到达右下角时结束搜索\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar swimInWater = function(grid) {\n let n = grid.length,vis = new Array(n).fill(0).map(()=>new Array(n).fill(0));\n vis[0][0] = 1;\n const q = new MinPriorityQueue(v=>v[2]);\n q.enqueue([0,0,grid[0][0]]);\n let ans = 0;\n const direction = [[0,1],[1,0],[0,-1],[-1,0]];\n while(q.size()){\n let [i,j,t] = q.dequeue();\n ans = Math.max(ans,t);\n if(i === n - 1 && j === n - 1) break;\n for(let d of direction){\n let x = d[0] + i,y = d[1] + j;\n if(x >= 0 && x < n && y >= 0 && y < n){\n if(vis[x][y]) continue;\n vis[x][y] = 1;\n q.enqueue([x,y,grid[x][y]]);\n }\n }\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n²logn),其中 n 是矩阵的边长。\n- 空间复杂度:O(n²),用于存储 vis 数组和优先队列。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3222257413","body":"## 思路\n\n使用**滑动窗口**(Sliding Window)技术来解决这个问题,通过维护一个固定大小为 `k` 的窗口来遍历整个字符串。\n\n## 关键变量说明\n\n- `r`: 右指针,初始化为 -1\n- [n](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6): 字符串 [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 的长度\n- `ans`: 记录找到的最大元音字母数\n- `total`: 当前窗口内元音字母的总数\n- [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6): 左指针,表示窗口的起始位置\n\n## 算法流程\n\n1. **外层循环**:[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 从 0 到 `n-k`,表示窗口的左边界\n ```javascript\n for(let i = 0; i <= n - k; i++)\n ```\n\n\n2. **扩展窗口**:使用 `while` 循环将右指针 `r` 向右扩展,直到窗口大小达到 `k`\n ```javascript\n while(r + 1 < n && r - i + 1 < k){\n r++;\n if(isYuanYin(s[r])) total++;\n }\n ```\n\n - 条件 `r + 1 < n` 确保不越界\n - 条件 `r - i + 1 < k` 确保窗口大小不超过 `k`\n - 每次扩展时检查新加入的字符是否为元音,并更新 `total`\n\n3. **更新最大值**:比较当前窗口的元音数量与历史最大值\n ```javascript\n ans = Math.max(ans, total);\n ```\n\n\n4. **收缩窗口**:移动左指针前,如果当前左边界字符是元音,则从总数中减去\n ```javascript\n if(isYuanYin(s[i])) total--;\n ```\n\n\n## 辅助函数\n\n```javascript\nfunction isYuanYin(c){\n return ['a','e','i','o','u'].includes(c);\n}\n```\n\n用于判断字符是否为元音字母。\n\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {number} k\n * @return {number}\n */\nvar maxVowels = function(s, k) {\n let r = -1, n = s.length,ans = 0,total = 0;\n for(let i = 0;i <= n - k;i++){\n while(r + 1 < n && r - i + 1 < k){\n r++;\n if(isYuanYin(s[r])) total++;\n }\n ans = Math.max(ans,total);\n if(isYuanYin(s[i])) total--;\n }\n return ans;\n // -------------------------\n function isYuanYin(c){\n return ['a','e','i','o','u'].includes(c);\n }\n };\n```\n## 复杂度分析\n\n- 时间复杂度:O(n),其中 n 是字符串长度,每个字符最多被访问两次\n- 空间复杂度:O(1),只使用了常数额外空间","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3227100052","body":"## 思路\n\n### 核心技巧\n- 维护一个大小为maxPts的滑动窗口\n- 使用`sum`变量维护当前窗口内所有可能结果的概率和\n- 通过`sum -= r`和`sum += dp[i]`维护窗口滑动\n\n### 1. 边界条件处理\n```javascript\nif(0 >= k) return 0 <= n ? 1 : 0;\n```\n\n- 当目标分数`k`为0或负数时,游戏一开始就结束\n- 如果[n](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6)非负,则概率为1,否则为0\n\n### 2. 初始化阶段\n```javascript\nlet sum = 0;\nfor(let i = k;i < k + maxPts;i++){\n if(i <= n) sum += 1;\n}\n```\n\n- 计算从刚好达到`k`分开始,可能到达的最高分数范围`[k, k+maxPts-1]`中满足≤n的数目\n- 这些状态的概率都是1(因为游戏结束)\n\n### 3. 动态规划倒推\n```javascript\nlet j = k + maxPts - 1, r = j <= n ? 1 : 0;\nlet dp = new Array(k).fill(0);\nfor(let i = k - 1;i >= 0;i--){\n dp[i] = sum / maxPts;\n sum -= r;\n sum += dp[i];\n j--;\n if(j >= k) r = j <= n ? 1 : 0;\n else r = dp[j];\n}\n```\n\n\n- 从`k-1`分开始倒推到0分\n- `dp[i]`表示从[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6)分开始游戏获胜的概率\n- 状态转移方程:`dp[i] = (dp[i+1] + dp[i+2] + ... + dp[i+maxPts]) / maxPts`\n- 使用滑动窗口优化:维护`sum`为窗口内所有概率之和\n\n\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number} k\n * @param {number} maxPts\n * @return {number}\n */\nvar new21Game = function(n, k, maxPts) {\n if(0 >= k) return 0 <= n ? 1 : 0;\n \n let sum = 0;\n for(let i = k;i < k + maxPts;i++){\n if(i <= n) sum += 1;\n }\n let j = k + maxPts - 1, r = j <= n ? 1 : 0;\n let dp = new Array(k).fill(0);\n for(let i = k - 1;i >= 0;i--){\n dp[i] = sum / maxPts;\n sum -= r;\n sum += dp[i];\n j--;\n if(j >= k) r = j <= n ? 1 : 0;\n else r = dp[j];\n }\n return dp[0];\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(k + maxPts),其中k为`k`的取值范围\n- 空间复杂度:O(k)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3231026577","body":"## 思路\n\n1. **滑动窗口 + 字符频次统计**\n - 使用两个长度为26的数组(`pMap` 和 `sMap`)分别统计模式串 `p` 和当前窗口内子串的字符频次\n - 通过滑动窗口在 [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 中寻找与 `p` 字符频次完全相同的子串\n\n2. **算法流程**\n - 首先调用 `getPmap()` 统计 `p` 中各字符出现次数\n - 初始化滑动窗口左右边界 `l=0, r=-1`\n - 在每次循环中:\n - 扩展右边界直到窗口大小等于 `p` 的长度\n - 比较当前窗口字符频次与 `p` 的字符频次是否相同\n - 如果相同,则将左边界位置加入结果数组\n - 移动左边界,更新窗口字符频次\n\n## 关键函数说明\n\n- `getPmap()`: 统计模式串 `p` 中每个字符的出现次数\n- `equal(arr1, arr2)`: 比较两个字符频次数组是否完全相同\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string} p\n * @return {number[]}\n */\nvar findAnagrams = function(s, p) {\n const pMap = new Array(26).fill(0),k = p.length;\n getPmap();\n let ans = []\n let n = s.length,l = 0,r = -1,sMap = new Array(26).fill(0);\n while(l <= n - k){\n while(r + 1 < n && r - l + 1 < k){\n r++;\n let c = s[r]\n sMap[c.charCodeAt(0) - 'a'.charCodeAt(0)]++;\n }\n if(equal(pMap,sMap)) ans.push(l);\n let c = s[l++];\n sMap[c.charCodeAt(0) - 'a'.charCodeAt(0)]--;\n }\n return ans;\n // --------------------------------------------------------\n function getPmap(){\n for(let c of p){\n pMap[c.charCodeAt(0) - 'a'.charCodeAt(0)]++;\n }\n }\n function equal(arr1,arr2){\n for(let i = 0;i < 26;i++){\n if(arr1[i] !== arr2[i]) return false;\n }\n return true;\n }\n };\n```\n## 复杂度分析\n\n- 时间复杂度:O(n),其中 n 是字符串 [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 的长度\n- 空间复杂度:O(1),只使用了固定大小的数组存储字符频次","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3235816649","body":"## 思路\n\n### 核心思想\n- 使用**滑动窗口**技术\n- 维护一个动态窗口 `[l, r]`,通过双指针扩展和收缩窗口\n- 统计窗口内字符频次,确保包含 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 中所有字符及其所需数量\n\n### 主要步骤\n\n1. **初始化阶段**\n - `tMap`:统计字符串 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 中各字符出现次数\n - `LIMIT`:记录 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 中不同字符的数量\n - `sMap`:统计当前窗口中各字符出现次数\n - `total`:记录窗口中已满足数量要求的字符种类数\n\n2. **滑动窗口主循环**\n - 外层循环移动左指针 [l](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\1.js#L31-L31)\n - 内层循环扩展右指针 `r`,直到窗口包含 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 的所有字符\n - 当窗口满足条件时,尝试更新最优解\n\n3. **结果更新**\n - 使用 `check` 函数比较当前窗口与历史最优解\n - 选择更短的子串,长度相同时选择字典序更小的\n\n### check函数作用\n用于比较两个子串,选择更优的结果:\n- 优先选择长度更短的子串\n- 长度相同时选择字典序更小的\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string} t\n * @return {string}\n */\nvar minWindow = function(s, t) {\n let tMap = {},ans = '';\n for(let c of t) tMap[c] = (tMap[c] || 0) + 1;\n const LIMIT = Object.keys(tMap).length;\n let n = s.length,l = 0,r = -1,total = 0,sMap = {};\n while(l < n){\n while(r + 1 < n && total < LIMIT){\n r++;\n let c = s[r];\n sMap[c] = (sMap[c] || 0) + 1;\n if(sMap[c] === tMap[c]) total++;\n }\n if(total === LIMIT){\n let tmp = s.slice(l,r + 1);\n if(check(tmp)) ans = tmp;\n }\n let c = s[l];\n if(sMap[c] === tMap[c]) total--;\n sMap[c]--;\n l++;\n }\n return ans;\n // ------------------------\n function check(tmp){\n if(ans === '') return true;\n if(tmp.length < ans.length) return true;\n if(tmp.length > ans.length) return false;\n for(let i = 0;i < tmp.length;i++){\n let a = tmp.charCodeAt(i),b = ans.charCodeAt(i);\n if(a < b) return true;\n if(a === b) continue;\n if(a > b) return false;\n }\n return false;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),其中 n 是字符串 [s](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 的长度。\n- 空间复杂度:O(t),其中 t 是字符串 [t](file://E:\\其他项目\\algorithm_exercises\\leetcode\\editor\\cn\\[101]对称二叉树20243107.txt) 的字符串种类。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/50#issuecomment-3238889944","body":"## 思路\n\n1. **前缀和与后缀和预处理**:\n - [preSum](file:///E:/力扣刷题/algorithm_exercises/周赛/458/2.js#L10-L10)数组存储从左端开始的前缀和\n - [sufSum](file:///E:/力扣刷题/algorithm_exercises/周赛/458/2.js#L15-L15)数组存储从右端开始的后缀和\n\n2. **核心思想**:\n - 我们需要从两端取k张卡牌,可以是左边取i张,右边取k-i张(i从0到k)\n - 通过预处理的前缀和与后缀和数组,可以快速计算任意数量卡牌的点数和\n\n3. **遍历所有可能的组合**:\n - 遍历i从0到k,表示从左边取i张卡牌\n - 对应从右边取k-i张卡牌\n - 计算总和并更新最大值\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} cardPoints\n * @param {number} k\n * @return {number}\n */\nvar maxScore = function(cardPoints, k) {\n let n = cardPoints.length;\n const preSum = new Array(n + 1).fill(0),sufSum = new Array(n + 1).fill(0);\n for(let i = 0;i < n;i++){\n preSum[i + 1] = preSum[i] + cardPoints[i];\n sufSum[i + 1] = sufSum[i] + cardPoints[n - i - 1];\n }\n let ans = -Infinity;\n for(let i = 0;i <= k;i++){\n ans = Math.max(ans,preSum[i] + sufSum[k - i]);\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度是O(n+k),\n- 空间复杂度是O(n),其中n是数组长度。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/51#issuecomment-3239927488","body":"## 代路\n\n采用预计算和枚举的方法来解决问题:\n\n1. **预计算 *<60* 以内每个数字的二进制1的个数**:\n ```javascript\n const CNT = new Array(60).fill(0);\n for(let i = 0;i <= 59;i++){\n let n = i,t = 0;\n while(n){\n if(n & 1) t++;\n n >>= 1;\n }\n CNT[i] = t;\n }\n ```\n\n\n2. **枚举小时和分钟的分配**:\n ```javascript\n for(let i = 0;i <= 4;i++){\n let j = turnedOn - i;\n if(j > 6) continue;\n // ...\n }\n ```\n\n 这里将turnedOn个LED灯分为两部分:i个给小时部分,j个给分钟部分。由于小时最多由4个LED表示,分钟最多由6个LED表示,所以i最多为4,j最多为6。\n\n3. **获取符合条件的小时和分钟**:\n 通过`getHour(cnt)`和`getM(cnt)`函数获取二进制中恰好有cnt个1的小时数和分钟数。\n\n4. **组合时间**:\n 将符合条件的小时和分钟组合成时间字符串,格式为`H:MM`。\n\n## 代码优点\n\n1. **预计算优化**:提前计算所有0-59数字的二进制1的个数,避免重复计算\n2. **分离关注点**:将获取小时和分钟的逻辑分别封装在独立函数中\n3. **合理的边界处理**:考虑到小时(0-11)和分钟(0-59)的范围限制\n4. **正确的格式化**:分钟数始终显示为两位数\n\n\n## 代码\n```javascript\nconst CNT = new Array(60).fill(0);\nfor(let i = 0;i <= 59;i++){\n let n = i,t = 0;\n while(n){\n if(n & 1) t++;\n n >>= 1;\n }\n CNT[i] = t;\n}\n/**\n * @param {number} turnedOn\n * @return {string[]}\n */\nvar readBinaryWatch = function(turnedOn) {\n let ans = []\n for(let i = 0;i <= 4;i++){\n let j = turnedOn - i;\n if(j > 6) continue;\n for(let h of getHour(i)){\n for(let m of getM(j)){\n ans.push(`${h}:${m}`)\n }\n }\n }\n return ans;\n\n // ------------------------------\n function getHour(cnt){\n let ans = [];\n for(let i = 0;i <= 11;i++){\n if(CNT[i] === cnt) ans.push(i);\n }\n return ans\n }\n\n function getM(cnt){\n let ans = [];\n for(let i = 0;i <= 59;i++){\n if(CNT[i] === cnt) ans.push(i < 10 ? '0' + i : i);\n }\n return ans\n }\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**:O(1),因为小时和分钟的范围是固定的(12*60种组合)\n- **空间复杂度**:O(1),只使用了固定大小的额外空间\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3240725656","body":"\n## 思路\n\n### 1. 位运算优化\n- 使用位运算来表示和检查约束条件:\n - `colSet`:记录已被占用的列\n - `pieSet`:记录已被占用的主对角线(撇)\n - `naSet`:记录已被占用的副对角线(捺)\n\n### 2. 对角线编号\n- 主对角线(撇):用 `i + j` 编号\n- 副对角线(捺):用 `i - j + N` 编号(确保非负)\n\n### 3. DFS 回溯过程\n- 逐行放置皇后(第 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 行)\n- 对每行的每一列 `j` 检查是否可放置:\n - 通过位运算检查列、主对角线、副对角线是否冲突\n- 若无冲突则放置皇后并更新状态,递归处理下一行\n- 回溯时撤销状态更改\n\n### 4. 位操作技巧\n- `(x >> k) & 1`:检查第 k 位是否为 1\n- `x ^= (1 << k)`:翻转第 k 位(设置或取消占用)\n\n当成功放置完所有 n 行皇后时,返回 1(找到一种方案),最终统计所有可行方案数。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @return {number}\n */\nvar totalNQueens = function(n) {\n let colSet = 0,N = 2 * n - 1,pieSet = 0,naSet = 0;\n return dfs(0);\n // -------------------\n function dfs(i){\n if(i === n) return 1;\n let ans = 0;\n for(let j = 0;j < n;j++){\n let col = j,pie = i + j,na = (i - j + N) % N;\n if(((colSet >> col) & 1) || ((pieSet >> pie) & 1) ||((naSet >> na) & 1)) continue;\n colSet ^= (1 << col);\n pieSet ^= (1 << pie);\n naSet ^= (1 << na);\n ans += dfs(i + 1);\n colSet ^= (1 << col);\n pieSet ^= (1 << pie);\n naSet ^= (1 << na);\n }\n return ans;\n }\n};\n```\n## 复杂度分析\n- 时间复杂度:O(N!),其中 N 为输入的行数。\n- 空间复杂度:O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3243912780","body":"## 思路\n\n1. **初始化**:\n - 获取网格的行数(m)和列数(n)\n - 创建访问标记数组vis,避免重复访问\n - 初始化最大面积ans为0\n\n2. **遍历网格**:\n - 遍历每个格子,如果当前格子是0(海洋)或已被访问,则跳过\n - 否则,从当前位置开始进行BFS搜索整个岛屿\n\n3. **BFS搜索**:\n - 使用队列实现广度优先搜索\n - 从起始点开始,向四个方向扩展\n - 对于每个有效的相邻陆地格子(值为1且未访问),标记为已访问并加入队列\n - 统计当前岛屿的面积\n\n4. **更新结果**:\n - 每次BFS完成后,比较当前岛屿面积和已知最大面积,保留较大值\n\n## 具体实现细节\n\n- 使用Queue数据结构实现BFS\n- 四个方向数组dirs用于简化方向处理\n- vis数组防止重复访问同一格子\n- 边界检查确保不越界\n\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar maxAreaOfIsland = function(grid) {\n let m = grid.length,n = grid[0].length;\n let ans = 0;\n let vis = new Array(m).fill(0).map(()=>new Array(n).fill(0));\n for(let i = 0;i < m;i++){\n for(let j = 0;j = 0 && r < m && c >= 0 && c < n){\n if(grid[r][c] === 0) continue;\n if(vis[r][c]) continue;\n vis[r][c] = 1;\n q.enqueue([r,c]);\n }\n }\n }\n return ans;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度是O(m×n)\n- 空间复杂度是O(m×n)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3247579876","body":"## 思路\n\n这是一个典型的多源BFS(广度优先搜索)问题。代码采用逆向思维,不是从海洋格子找最近的陆地,而是从所有陆地格子出发,向外扩展到海洋格子,计算每个海洋格子到最近陆地的距离。\n\n## 算法步骤\n\n1. 初始化一个与原网格同样大小的距离矩阵`dis`,所有值初始化为无穷大\n2. 遍历原网格,将所有陆地格子(值为1)的坐标和距离0加入队列,作为BFS的起点\n3. 使用BFS遍历:\n - 从队列中取出一个位置\n - 如果当前位置的距离小于记录的距离,则更新距离\n - 如果当前位置是海洋,则更新最大距离\n - 向四个方向扩展,将合法的海洋格子加入队列\n4. 返回找到的最大距离,如果不存在海洋或陆地则返回-1\n\n## 代码\n\n```javascript\nvar maxDistance = function(grid) {\n let n = grid.length;\n // 创建一个距离矩阵,初始化为无穷大\n let dis = new Array(n).fill(0).map(()=>new Array(n).fill(Infinity));\n let q = new Queue();\n \n // 将所有陆地格子(值为1)作为BFS的起始点\n for(let i = 0;i < n;i++){\n for(let j = 0;j < n;j++){\n if(grid[i][j] === 0) continue;\n q.enqueue([i,j,0]); // [行, 列, 距离]\n }\n }\n\n // 四个方向的移动:右、下、左、上\n const dirs = [[0,1],[1,0],[0,-1],[-1,0]];\n let ans = -Infinity;\n \n // BFS遍历\n while(q.size()){\n let [i,j,d] = q.dequeue();\n \n // 如果当前距离大于等于已记录的距离,则跳过\n if(d >= dis[i][j]) continue;\n \n // 更新当前位置的距离\n dis[i][j] = d;\n \n // 如果当前位置是海洋(值为0),更新最大距离\n if(grid[i][j] === 0) ans = Math.max(ans,dis[i][j]);\n \n // 向四个方向扩展\n for(let [x,y] of dirs.map(v=>[v[0] + i,v[1] + j])){\n // 检查边界\n if(x < 0 || x >= n || y < 0 || y >= n) continue;\n // 如果是陆地则跳过\n if(grid[x][y] === 1) continue;\n // 如果新距离大于等于已记录距离则跳过\n if(d + 1 >= dis[x][y]) continue;\n // 将新位置加入队列\n q.enqueue([x,y,d + 1]);\n }\n }\n \n // 返回结果,如果没找到海洋格子则返回-1\n return ans === -Infinity ? -1 : ans === Infinity ? -1 : ans; \n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(n²),每个格子最多被访问一次\n- 空间复杂度:O(n²),需要存储距离矩阵和队列\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3251721463","body":"## 问题理解\n\n这个问题是一个图遍历问题,涉及以下概念:\n- 有n个盒子,每个盒子可能包含糖果、钥匙和内部盒子\n- 某些盒子是打开的(status[i] = 1),某些是关闭的(status[i] = 0)\n- 只有拿到钥匙才能打开关闭的盒子\n- 初始时有一些盒子(initialBoxes)\n- 目标是获得尽可能多的糖果\n\n## 思路\n\n### 1. 初始化阶段\n```javascript\nlet n = status.length, ans = 0,\nhas_key = new Array(n).fill(0),\nhas_box = new Array(n).fill(0);\n```\n\n- `n`: 盒子总数\n- `ans`: 最终获得的糖果总数\n- `has_key`: 标记是否拥有某个盒子的钥匙\n- `has_box`: 标记是否拥有某个盒子\n\n### 2. 设置初始状态\n```javascript\nfor(let i = 0; i < n; i++) if(status[i]) has_key[i] = 1;\nfor(let i of initialBoxes) has_box[i] = 1;\n```\n\n- 将所有本来就是打开状态的盒子(status[i] = 1)标记为拥有钥匙\n- 将初始拥有的盒子标记为已拥有\n\n### 3. DFS遍历获取糖果\n```javascript\nlet vis = new Array(n).fill(0);\nfor(let i of initialBoxes){\n if(has_box[i] && has_key[i] && !vis[i]) dfs(i);\n}\n```\n\n- `vis`: 标记盒子是否已经访问过\n- 对于每个初始盒子,如果既拥有盒子又有钥匙且未访问过,则进行DFS\n\n### 4. DFS函数实现\n```javascript\nfunction dfs(i){\n ans += candies[i]; // 收集当前盒子的糖果\n vis[i] = 1; // 标记为已访问\n for(let j of keys[i]){ // 遍历当前盒子中的钥匙\n has_key[j] = 1; // 获得钥匙\n if(has_box[j] && !vis[j]) dfs(j); // 如果拥有对应盒子且未访问,则继续DFS\n }\n for(let j of containedBoxes[i]){ // 遍历当前盒子中的内部盒子\n has_box[j] = 1; // 获得盒子\n if(has_key[j]&& !vis[j]) dfs(j); // 如果拥有对应钥匙且未访问,则继续DFS\n }\n}\n```\n\n\n## 算法流程总结\n\n1. **初始化状态**:记录每个盒子的初始状态(是否打开)和初始拥有的盒子\n2. **深度优先搜索**:从初始盒子开始,只有当同时拥有盒子和钥匙时才能打开盒子\n3. **收集资源**:打开盒子后获得糖果、钥匙和内部盒子\n4. **继续探索**:利用新获得的钥匙或盒子继续打开新的盒子\n5. **避免重复**:使用vis数组确保每个盒子只被访问一次\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} status\n * @param {number[]} candies\n * @param {number[][]} keys\n * @param {number[][]} containedBoxes\n * @param {number[]} initialBoxes\n * @return {number}\n */\nvar maxCandies = function(status, candies, keys, containedBoxes, initialBoxes) {\n let n = status.length,ans = 0,\n has_key = new Array(n).fill(0),\n has_box = new Array(n).fill(0);\n for(let i = 0;i < n;i++) if(status[i]) has_key[i] = 1;\n for(let i of initialBoxes) has_box[i] = 1;\n let vis = new Array(n).fill(0);\n for(let i of initialBoxes){\n if(has_box[i] && has_key[i] && !vis[i]) dfs(i);\n }\n return ans;\n // ----------------------------------------\n function dfs(i){\n ans += candies[i];\n vis[i] = 1;\n for(let j of keys[i]){\n has_key[j] = 1;\n if(has_box[j] && !vis[j]) dfs(j);\n }\n for(let j of containedBoxes[i]){\n has_box[j] = 1;\n if(has_key[j]&& !vis[j]) dfs(j);\n }\n }\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度为O(N + E),其中N是盒子数量,E是钥匙和内部盒子的总数。\n- 空间复杂度为O(N)。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/56#issuecomment-3257477257","body":"\n## 思路\n\n1. **坐标系统设定**:\n - 为每个节点分配坐标,根节点为原点(0, 0)\n - 向左子树移动时,列坐标减1;向右子树移动时,列坐标加1\n - 行坐标随着深度增加而增加(向下为正方向)\n\n2. **DFS遍历收集信息**:\n - 使用深度优先搜索遍历所有节点\n - 记录每个节点的值、行坐标、列坐标\n\n3. **自定义排序**:\n - 按列坐标升序排列(从左到右)\n - 列相同时按行坐标升序(从上到下)\n - 行列都相同时按节点值升序\n\n4. **分组输出**:\n - 将相同列坐标的节点值归为一组\n - 每组构成结果数组中的一个子数组\n\n## 代码:\n\n```javascript\nvar verticalTraversal = function(root) {\n let ans = [] // 存储[节点值, 行, 列]信息\n \n // DFS遍历,收集每个节点的值和坐标\n dfs(root,0,0);\n \n // 自定义排序:先按列,再按行,最后按值\n ans.sort((a,b)=>a[2] - b[2] || a[1] - b[1] || a[0] - b[0]);\n \n let col = Infinity, res = [];\n // 按列分组,将相同列的节点值组成子数组\n for(let [v,r,c] of ans){\n if(col === c) res[res.length - 1].push(v);\n else{\n res.push([v]);\n col = c;\n }\n }\n return res;\n \n // 辅助函数:深度优先遍历并记录坐标\n function dfs(root,row,col){\n if(!root) return;\n ans.push([root.val,row,col]);\n dfs(root.left,row + 1,col - 1) // 左子树:行+1,列-1\n dfs(root.right,row + 1,col + 1) // 右子树:行+1,列+1\n }\n};\n```\n## 复杂度分析\n### 时间复杂度:\n- DFS遍历:O(N),N为节点数\n- 排序:O(N log N)\n- 分组:O(N)\n- 总体:O(N log N)\n\n### 空间复杂度:\n- 存储信息:O(N)\n- 递归栈:O(H),H为树高度\n- 总体:O(N)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/57#issuecomment-3260240769","body":"\n\n## 思路\n\n使用了动态规划的思想,并进行了空间优化:\n\n## 具体分析\n\n1. **状态定义**:\n - `prevprev` 表示到达第 i-2 个位置的最小花费\n - `prev` 表示到达第 i-1 个位置的最小花费\n - `curr` 表示到达当前位置的最小花费\n\n2. **状态转移方程**:\n - `curr = v + Math.min(prevprev, prev)`\n - 其中 v 是当前位置的花费(顶部为0)\n\n3. **优化点**:\n - 使用滚动数组优化空间复杂度,从O(n)降到O(1)\n - 只保存前两个状态值,而不是整个dp数组\n\n4. **边界处理**:\n - 当 i < n 时,v = cost[i](正常台阶费用)\n - 当 i = n 时,v = 0(到达楼顶,没有费用)\n - 最后的返回值根据数组长度做了特殊处理\n\n\n这是一个经典的空间优化动态规划解法,通过只保留必要的状态值来减少空间使用。\n## 代码\n```javascript\nvar minCostClimbingStairs = function(cost) {\n let n = cost.length,\n prevprev = cost[0], // 表示到达第0个台阶的最小花费\n prev = cost[1], // 表示到达第1个台阶的最小花费\n curr;\n \n // 从第2个台阶开始遍历到楼梯顶部\n for(let i = 2;i <= n;i++){\n let v = 0;\n // 当i[1,1]);\n```\n\n\n1. 创建一个二维DP数组`dp`,其中`dp[i][0]`表示以`nums[i]`结尾的最长递增子序列的长度,`dp[i][1]`表示以`nums[i]`结尾的最长递增子序列的个数。\n2. 初始时,每个元素自身构成一个长度为1的递增子序列,所以都初始化为`[1,1]`。\n\n```javascript\n for(let i = 1; i < n; i++){\n for(j = i - 1; j >= 0; j--){\n if(nums[i] > nums[j]){\n if(dp[j][0] + 1 > dp[i][0]){\n dp[i][0] = dp[j][0] + 1;\n dp[i][1] = dp[j][1];\n }else if(dp[j][0] + 1 === dp[i][0]){\n dp[i][1] += dp[j][1];\n }\n }\n }\n }\n```\n\n\n3. 对于每个位置[i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6),遍历它之前的所有位置`j`:\n - 如果`nums[i] > nums[j]`,说明可以将`nums[i]`接在以`nums[j]`结尾的递增子序列后面\n - 如果通过`j`得到的子序列长度(`dp[j][0] + 1`)比当前记录的长度(`dp[i][0]`)更长,则更新长度和数量\n - 如果长度相等,则将通过`j`得到的子序列数量加到当前的数量上\n\n```javascript\n let ans = 0, max = -Infinity;\n for(let [len,cnt] of dp){\n if(len > max){\n max = len;\n ans = cnt;\n }else if(max === len){\n ans += cnt;\n }\n }\n return ans;\n```\n\n\n4. 最后遍历整个DP数组,找出最长的递增子序列长度,并累加所有具有该长度的子序列的数量。\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar findNumberOfLIS = function(nums) {\n let n = nums.length,dp = new Array(n).fill(0).map(()=>[1,1]);\n for(let i = 1;i < n;i++){\n for(j = i - 1;j >= 0;j--){\n if(nums[i] > nums[j]){\n if(dp[j][0] + 1 > dp[i][0]){\n dp[i][0] = dp[j][0] + 1;\n dp[i][1] = dp[j][1];\n }else if(dp[j][0] + 1 === dp[i][0]){\n dp[i][1] += dp[j][1];\n }\n }\n }\n }\n let ans = 0,max = -Infinity;\n for(let [len,cnt] of dp){\n if(len > max){\n max = len;\n ans = cnt;\n }else if(max === len){\n ans += cnt;\n }\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度是O(n²),\n- 空间复杂度是O(n)。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3269148142","body":"\n## 思路\n\n### 1. 问题定义\n最长公共子序列是找出两个字符串中最长的共同子序列(不要求连续,但要保持相对顺序)。\n\n### 2. 动态规划状态定义\n```javascript\nlet m = text1.length, n = text2.length, dp = new Array(m).fill(0).map(() => new Array(n).fill(0));\n```\n\n创建一个二维数组 `dp[i][j]`,表示 `text1[0...i]` 和 `text2[0...j]` 的最长公共子序列长度。\n\n### 3. 初始化边界条件\n```javascript\nif(text1[0] === text2[0]) dp[0][0] = 1;\n\nfor(let i = 1;i < m;i++) {\n dp[i][0] = text1[i] === text2[0] ? 1 : dp[i - 1][0];\n}\nfor(let i = 1;i < n;i++) {\n dp[0][i] = text1[0] === text2[i] ? 1 : dp[0][i - 1];\n}\n```\n\n- 首先处理两个字符串的第一个字符,如果相同则 `dp[0][0] = 1`\n- 分别初始化第一列和第一行:\n - 如果当前字符匹配,则值为1\n - 否则继承前一个位置的值\n\n### 4. 状态转移方程\n```javascript\nfor(let i = 1;i < m;i++){\n for(let j = 1;j < n;j++){\n if(text1[i] === text2[j]) dp[i][j] = dp[i - 1][j - 1] + 1;\n else dp[i][j] = Math.max(\n dp[i - 1][j],\n dp[i][j - 1],\n dp[i - 1][j - 1]\n );\n }\n}\n```\n\n对于每个位置 `(i,j)`:\n- 如果 `text1[i] === text2[j]`,说明当前字符匹配,则 `dp[i][j] = dp[i-1][j-1] + 1`\n- 否则取三种情况的最大值:\n - `dp[i-1][j]`:text1[0...i-1] 与 text2[0...j] 的LCS长度\n - `dp[i][j-1]`:text1[0...i] 与 text2[0...j-1] 的LCS长度\n - `dp[i-1][j-1]`:text1[0...i-1] 与 text2[0...j-1] 的LCS长度\n\n### 5. 返回结果\n```javascript\nreturn dp[m - 1][n - 1];\n```\n\n返回 `dp[m-1][n-1]` 即为两个完整字符串的最长公共子序列长度。\n\n\n## 代码\n```javascript\n/**\n * @param {string} text1\n * @param {string} text2\n * @return {number}\n */\nvar longestCommonSubsequence = function(text1, text2) {\n let m = text1.length,n = text2.length,dp = new Array(m).fill(0).map(() => new Array(n).fill(0));\n if(text1[0] === text2[0]) dp[0][0] = 1;\n\n for(let i = 1;i < m;i++) {\n dp[i][0] = text1[i] === text2[0] ? 1 : dp[i - 1][0];\n }\n for(let i = 1;i < n;i++) {\n dp[0][i] = text1[0] === text2[i] ? 1 : dp[0][i - 1];\n }\n for(let i = 1;i < m;i++){\n for(let j = 1;j < n;j++){\n if(text1[i] === text2[j]) dp[i][j] = dp[i - 1][j - 1] + 1;\n else dp[i][j] = Math.max(\n dp[i - 1][j],\n dp[i][j - 1],\n dp[i - 1][j - 1]\n );\n }\n }\n return dp[m - 1][n - 1];\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(m×n),其中 m 和 n 分别是两个字符串的长度\n- 空间复杂度:O(m×n),用于存储 dp 数组","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/61#issuecomment-3273217746","body":"## 思路\n使用了组合数学的方法来解决不同路径问题:\n\n1. **问题转换**:\n - 机器人需要从左上角走到右下角,总共需要向右走 (n-1) 步,向下走 (m-1) 步\n - 总共需要走 (m-1)+(n-1) = m+n-2 步\n - 问题转化为:在这 m+n-2 步中,如何选择 m-1 步向下走(或 n-1 步向右走)\n\n2. **数学公式**:\n - 这是一个组合问题,答案是 C(m+n-2, m-1) 或 C(m+n-2, n-1)\n - 组合数公式:C(n,k) = n! / (k! * (n-k)!)\n - 为了避免计算阶乘导致的溢出,代码采用了逐步相乘的方式\n\n3. **实现细节**:\n - `k = m + n - 2` 表示总步数\n - `t = m - 1` 表示需要选择的步数(向下走的步数)\n - 通过循环计算组合数,每次将 `k/t` 的值乘到结果中,并递减 k 和 t\n - 最后使用 `Math.round()` 是为了处理浮点数计算可能产生的精度误差\n\n\n\n\n## 代码\n```javascript\n/**\n * @param {number} m\n * @param {number} n\n * @return {number}\n */\nvar uniquePaths = function(m, n) {\n let k = m + n - 2;\n if(k === 0) return 1;\n let t = Math.min(m - 1,n - 1), ans = 1;\n while (t){\n ans *= k / t;\n k--;\n t--;\n }\n return Math.round(ans);\n};\n```\n\n## 复杂度分析\n- 时间复杂度为 O(min(m,n)),\n- 空间复杂度为 O(1)。\n相比动态规划方法,这种方法更加高效。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/62#issuecomment-3277237117","body":"## 思路\n\n### 问题理解\n1. 骑士按照象棋规则移动(日字形,8个方向)\n2. 骑士从 (row, column) 位置开始\n3. 骑士进行 K 次随机移动\n4. 求骑士最终仍在棋盘上的概率\n\n### 解决方案\n使用记忆化递归(动态规划):\n\n1. **状态定义**:f(i, j, k) 表示骑士在位置 (i, j) 并且还能移动 k 步时,在棋盘上的概率\n\n2. **边界条件**:\n - 当 k = 0 时,如果位置在棋盘内则返回 1,否则返回 0\n - 当位置超出棋盘边界时,返回 0\n\n3. **状态转移**:\n - 对于骑士的 8 个可能移动方向,递归计算每个方向移动后的情况\n - 结果为所有可能移动结果的平均值(除以 8)\n\n4. **记忆化优化**:\n - 使用 memo 三维数组存储已经计算过的结果,避免重复计算\n\n## 代码\n\n```javascript\nvar knightProbability = function(n, k, row, column) {\n // 骑士的8个移动方向\n const dirs = [[1,2],[2,1],[1,-2],[2,-1],[-1,2],[-2,1],[-1,-2],[-2,-1]];\n \n // 记忆化数组,存储 (i,j,k) 状态下的结果\n const memo = new Array(n + 1).fill(0).map(()=>{\n return new Array(n + 1).fill(0).map(()=>{\n return new Array(k + 1).fill(-1);\n })\n })\n \n // 调用递归函数\n return f(row, column, k);\n \n function f(i, j, k) {\n // 基础情况:没有移动次数了\n if (k === 0) return i >= 0 && i < n && j >= 0 && j < n ? 1 : 0;\n \n // 超出边界\n if (i < 0 || i >= n || j < 0 || j >= n) return 0;\n \n // 已经计算过该状态\n if (memo[i][j][k] !== -1) return memo[i][j][k];\n \n let ans = 0;\n // 遍历8个方向\n for (let d of dirs) {\n let x = d[0] + i, y = d[1] + j;\n ans += f(x, y, k - 1);\n }\n \n // 每个方向的概率是 1/8,所以取平均值\n memo[i][j][k] = ans / 8;\n return ans / 8;\n } \n};\n```\n\n\n### 复杂度分析\n- 时间复杂度:O(N²×K),因为有 N×N 个位置和 K 步\n- 空间复杂度:O(N²×K),用于存储记忆化数组\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/63#issuecomment-3283550644","body":"## 思路\n\n### 1. 初始判断\n```javascript\nif((1 + maxChoosableInteger) * maxChoosableInteger / 2 < desiredTotal) return false;\n```\n\n首先计算所有可选数字的总和,如果总和小于目标值,则无论如何都无法达到目标,返回false。\n\n### 2. 核心递归函数f\n```javascript\nfunction f(type,total,state){}\n```\n\n- `type`: 当前玩家类型(0表示我方,1表示对方)\n- `total`: 剩余需要达到的目标值\n- `state`: 用位掩码表示的已选择数字状态\n\n### 3. 记忆化搜索\n使用`memo`来存储已经计算过的状态结果,避免重复计算。通过`query`和[add](file://E:\\其他项目\\algorithm_exercises\\9.js#L13-L21)函数来操作这个多层Map结构。\n\n### 4. 状态转移\n对于每个未选择的数字:\n- 如果选择该数字可以直接获胜(`i + 1 >= total`),则当前玩家获胜\n- 否则,递归调用[f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17)计算对手在新状态下的结果\n- 如果存在一种选择使得对手必败,则当前玩家必胜\n\n### 5. 博弈论思想\n这是一个典型的极小化极大算法应用:\n- 当前玩家希望找到至少一种选择使得对手必败(返回false)\n- 如果所有选择都导致对手必胜(都返回false),则当前玩家必败\n\n## 代码\n```javascript\n/**\n * @param {number} maxChoosableInteger\n * @param {number} desiredTotal\n * @return {boolean}\n */\nvar canIWin = function(maxChoosableInteger, desiredTotal) {\n let memo = new Map();\n if((1 + maxChoosableInteger) * maxChoosableInteger / 2 < desiredTotal) return false;\n return f(0,desiredTotal,0);\n // -------------------------------\n function f(type,total,state){\n let params = [state];\n if(query(params) !== -1) return query(params);\n let ans = false;\n for(let i = 0;i < maxChoosableInteger;i++){\n if(state & (1 << i)) continue;\n if(i + 1 >= total) {\n ans = true;\n break;\n }\n let a = f(type === 0 ? 1 : 0,total - i - 1, state | (1 << i));\n if(a === false) {\n ans = true;\n break;\n }\n }\n add(params,ans)\n return ans;\n }\n\n function query(params){\n let ans = memo;\n for(let param of params){\n if(ans.has(param) === false) return -1;\n ans = ans.get(param);\n }\n return ans;\n }\n\n function add(params,val){\n let m = memo,n = params.length, rest = params.slice(0,n - 1),last = params[n - 1];\n for(let param of rest){\n if(m.has(param) === false) m.set(param,new Map());\n m = m.get(param);\n }\n m.set(last,val);\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:$O(n*2^{n})$\n- 空间复杂度:$O(n)$","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/64#issuecomment-3287375518","body":"## 思路\n\n\n1. **预处理**:\n - 计算数组总和,如果为奇数则直接返回false\n - 确定目标值target为总和的一半\n\n2. **初始化DP数组**:\n - dp[j]表示是否可以用数组中的元素组成和为j的子集\n - 初始时只考虑第一个元素nums[0],只有当j等于nums[0]时才为true\n\n3. **状态转移**:\n - 对于每个元素nums[i],更新dp数组\n - 从target到0逆序遍历,避免重复使用同一元素\n - 状态转移方程:`dp[j] = dp[j] || dp[j - nums[i]]`\n - 要么不使用当前元素,保持原来的状态dp[j]\n - 要么使用当前元素,前提是dp[j - nums[i]]为true\n\n4. **返回结果**:\n - 如果dp[target]为true,表示可以组成和为target的子集,返回true\n - 否则返回false\n\n\n## 代码\n```javascript\nvar canPartition = function(nums) {\n // 获取数组长度和总和\n let n = nums.length,sum = nums.reduce((a,b)=>a + b,0);\n \n // 如果总和是奇数,则无法分成两个相等的子集\n if(sum & 1) return false;\n \n // 目标是找到和为总和一半的子集\n const target = sum / 2;\n \n // 创建dp数组,dp[j]表示是否可以用前面的数字组成和为j的子集\n const dp = new Array(target + 1).fill(false);\n \n // 初始化:第一个数字能否组成和为j的子集\n for(let j = 0;j <= target;j++) dp[j] = nums[0] === j;\n \n // 从第二个数字开始遍历\n for(let i = 1;i < n;i++){\n // 从target到0逆序遍历(避免重复使用同一元素)\n for(let j = target;j >= 0;j--){\n // 状态转移方程:\n // dp[j] = dp[j] || dp[j - nums[i]]\n // 要么之前就能组成j,要么使用当前数字nums[i]组成j\n dp[j] = dp[j] || (j - nums[i] >= 0 ? dp[j - nums[i]] : false);\n }\n }\n \n // 返回是否能组成和为target的子集\n return dp[target];\n};\n```\n\n## 时间和空间复杂度\n\n- 时间复杂度:O(n × target),其中n是数组长度,target是数组元素和的一半\n- 空间复杂度:O(target),只使用了一维dp数组\n\n这是一个经典的0-1背包问题的应用,通过动态规划解决了分割等和子集问题。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289197873","body":"\n## 思路\n\n\n1. **递归函数 [f(i, total)](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\452\\2.js#L16-L29)**:\n - [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 表示当前处理到数组中的第 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 个元素\n - [total](file://E:\\力扣刷题\\algorithm_exercises\\双周赛\\165\\3.js#L5-L5) 表示前 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 个元素通过添加 '+' 或 '-' 符号后得到的总和\n - 函数返回从第 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 个元素开始到最后一个元素,能够得到目标值的方案数\n\n2. **边界条件**:\n - 当 `i === n` 时,表示已经处理完所有元素,如果 `total === target` 则找到一种有效方案,返回 1,否则返回 0\n\n3. **状态转移**:\n - 对于当前元素 `nums[i]`,可以选择加上它或减去它\n - 所以递归调用 `f(i+1, total-nums[i]) + f(i+1, total+nums[i])`\n\n4. **记忆化优化**:\n - 使用 [memo](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\430\\2.js#L7-L7) 数组存储已经计算过的状态,避免重复计算\n - `memo[i][total + abs_sum]` 中使用 `total + abs_sum` 是为了避免负数索引\n\n## 代码亮点\n\n1. 计算 `abs_sum` 来确定可能的和的范围,这样可以正确地映射负数到数组索引\n2. 使用记忆化递归避免重复计算,提高效率\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar findTargetSumWays = function(nums, target) {\n let n = nums.length;\n let abs_sum = nums.reduce((prev,curr)=>{\n if(curr >= 0) return curr + prev;\n return prev - curr;\n },0)\n // console.log(abs_sum);\n let memo = new Array(n + 1).fill(0).map(()=>new Array(2 * abs_sum + 1).fill(-1));\n return f(0,0);\n // ---------------------------\n function f(i,total){\n if(i === n) return target === total ? 1 : 0;\n let t = memo[i][total + abs_sum];\n // console.log(i,target,target + abs_sum,t);\n if(t !== -1) return t;\n let ans = f(i + 1,total - nums[i]) + f(i + 1,total + nums[i]);\n memo[i][total + abs_sum] = ans; \n return ans;\n }\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**:O(n × S),其中 n 是数组长度,S 是数组元素绝对值之和\n- **空间复杂度**:O(n × S),主要由 memo 数组占用","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/66#issuecomment-3290259438","body":"## 思路\n\n这是一个典型的完全背包问题:\n1. **状态定义**:`dp[i][j]` 表示使用前 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 种硬币凑成金额 `j` 所需的最少硬币数\n2. **状态转移**:对于第 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 种硬币,我们有两种选择:\n - 不使用该硬币:`dp[i-1][j]`\n - 使用该硬币:`1 + dp[i][j-coins[i-1]]`(因为硬币可以重复使用,所以是`dp[i]`而不是`dp[i-1]`)\n3. **边界条件**:`dp[0][0] = 0`,表示不使用任何硬币凑成金额0需要0个硬币\n## 代码\n\n```javascript\nvar coinChange = function(coins, amount) {\n let n = coins.length;\n // 创建二维DP数组,dp[i][j]表示使用前i种硬币凑成金额j的最少硬币数\n let dp = new Array(n + 1).fill(0).map(()=>new Array(amount + 1).fill(Infinity));\n // 初始状态:使用0种硬币凑成金额0需要0个硬币\n dp[0][0] = 0;\n \n // 遍历每种硬币\n for(let i = 1; i <= n; i++){\n // 遍历所有可能的金额\n for(let j = 0; j <= amount; j++){\n // 状态转移方程:\n // 1. 不使用第i种硬币:dp[i - 1][j]\n // 2. 使用第i种硬币:1 + dp[i][j - coins[i - 1]] (前提是j - coins[i - 1] >= 0)\n dp[i][j] = Math.min(\n dp[i - 1][j],\n j - coins[i - 1] >= 0 ? 1 + dp[i][j - coins[i - 1]] : Infinity\n );\n }\n }\n \n // 返回结果,如果为无穷大说明无法凑成,返回-1\n return dp[n][amount] === Infinity ? -1 : dp[n][amount]\n};\n```\n\n## 时间和空间复杂度\n- 时间复杂度:O(n × amount),其中 n 是硬币种类数\n- 空间复杂度:O(n × amount)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3295404263","body":"## 思路\n\n### 状态定义\n\n- `dp[i][j]` 表示使用前 i 种硬币凑成金额 j 的组合数\n\n### 初始化\n\n- `dp[0][0] = 1`:使用 0 种硬币凑成金额 0 的方法数为 1(即什么都不选)\n\n### 状态转移方程\n\n对于第 i 种硬币(面值为 c):\n\n- `dp[i][j] = dp[i-1][j] + (j-c >= 0 ? dp[i][j-c] : 0)`\n- 其中:\n - `dp[i-1][j]`:不使用第 i 种硬币,仅使用前 i-1 种硬币凑成金额 j 的组合数\n - `dp[i][j-c]`:使用第 i 种硬币,即在凑成金额 j-c 的基础上再加一个第 i 种硬币\n\n### 关键点\n\n1. 这是一个\"完全背包\"问题:每种硬币可以使用无限次\n2. 使用的是二维DP,其中行代表硬币种类,列代表金额\n3. 转移方程中 `dp[i][j-c]`(而非 `dp[i-1][j-c]`)体现了每种硬币可重复使用的特性\n\n## 代码\n\n```javascript\n/**\n * @param {number} amount\n * @param {number[]} coins\n * @return {number}\n */\nvar change = function (amount, coins) {\n let n = coins.length, dp = new Array(n + 1).fill(0).map(() => new Array(amount + 1).fill(0));\n dp[0][0] = 1;\n for (let i = 1; i <= n; i++) {\n let c = coins[i - 1]\n for (let j = 0; j <= amount; j++) dp[i][j] = dp[i - 1][j] + (j - c >= 0 ? dp[i][j - c] : 0);\n }\n return dp[n][amount];\n };\n```\n### 时间和空间复杂度\n\n- 时间复杂度:O(n × amount),其中 n 是硬币种类数\n- 空间复杂度:O(n × amount)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/68#issuecomment-3300884457","body":"## 思路\n\n1. **排序策略**:将孩子贪心值数组`g`和饼干尺寸数组[s](file://E:\\其他项目\\algorithm_exercises\\1.js)都按降序排列\n2. **贪心策略**:用最大的饼干去满足贪心值最大的孩子(即最难以满足的孩子)\n3. **双指针遍历**:使用两个指针分别遍历孩子和饼干数组\n4. **匹配逻辑**:如果当前饼干能满足当前孩子,则两个指针都前进;否则只移动孩子指针(尝试用同一块饼干满足贪心值更低的孩子)\n\n这种从最大到最小的分配方式体现了贪心思想:优先满足需求大的孩子,这样能保证整体效果最优。\n\n## 代码\n```javascript\n/**\n * @param {number[]} g\n * @param {number[]} s\n * @return {number}\n */\nvar findContentChildren = function(g, s) {\n const compare = (a,b)=>b - a;\n g.sort(compare);\n s.sort(compare);\n let i = 0,j = 0,m = g.length,n = s.length;\n let ans = 0;\n while(i < m && j < n){\n if(s[j] >= g[i]){\n ans++;\n j++;\n i++;\n }else i++;\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度为O(m log m + n log n),主要消耗在排序上,\n- 空间复杂度为O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/69#issuecomment-3305173933","body":"\n## 思路\n\n贪心策略是:**尽可能选择结束时间早的区间,这样能为后续区间留出更多空间**。\n\n\n1. **按结束时间排序**:\n ```javascript\n intervals.sort((a,b)=>a[1] - b[1]);\n ```\n\n 将所有区间按照结束时间升序排列,优先考虑结束早的区间。\n\n2. **贪心选择**:\n ```javascript\n let lastEnd = -Infinity;\n for(let [s,e] of intervals){\n if(s >= lastEnd) {\n ans++;\n lastEnd = e;\n }\n }\n ```\n\n 遍历排序后的区间,如果当前区间的开始时间不早于上一个选中区间的结束时间,就选择这个区间。这确保了选中的区间互不重叠。\n\n3. **计算结果**:\n ```javascript\n return n - ans;\n ```\n\n 返回总区间数减去可以保留的区间数,即需要移除的区间数。\n\n\n\n## 代码\n```javascript\n/**\n * @param {number[][]} intervals\n * @return {number}\n */\nvar eraseOverlapIntervals = function(intervals) {\n intervals.sort((a,b)=>a[1] - b[1]);\n let ans = 0,n = intervals.length;\n let lastEnd = -Infinity;\n for(let [s,e] of intervals){\n if(s >= lastEnd) {\n ans++;\n lastEnd = e;\n }\n }\n return n - ans;\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(n log n),主要消耗在排序上\n- 空间复杂度:O(1)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/70#issuecomment-3312499521","body":"## 思路-:动态规划\n\n1. **问题目标**:判断是否能从数组的第一个位置跳到最后一个位置\n2. **解法**:使用动态规划从后往前推导\n3. **状态定义**:`dp[i]` 表示从位置 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 是否能到达最后一个位置\n4. **状态转移**:\n - 从倒数第二个位置开始往前推导\n - 对于每个位置 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22),检查能否通过跳跃到达后续的某个可达位置\n - 如果能跳到某个 `dp[j]` 为 `true` 的位置,则 `dp[i]` 也为 `true`\n\n```javascript\n/**\n * @param {number[]} nums\n * @return {boolean}\n */\nvar canJump = function(nums) {\n let n = nums.length, dp = new Array(n).fill(false);\n dp[n - 1] = true;\n \n // 从倒数第二个位置开始向前遍历\n for(let i = n - 2; i >= 0; i--){\n let steps = nums[i];\n \n // 检查从当前位置 i 能否跳到某个可达的位置\n for(let delta = 1; delta <= steps && i + delta < n; delta++){\n let j = i + delta;\n if(dp[j]) {\n dp[i] = true;\n break;\n }\n }\n }\n \n return dp[0];\n};\n```\n\n\n## 思路总结\n\n1. **初始化**:创建一个布尔数组 [dp](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\467\\3.js#L22-L22),长度与输入数组相同,所有元素初始化为 `false`\n2. **边界条件**:最后一个位置默认为 `true`(已经在最后一个位置了)\n3. **状态转移**:从倒数第二个位置开始,对每个位置检查:\n - 根据当前位置的值,确定可以跳跃的步数范围\n - 在这个范围内,检查是否存在某个可达的位置(`dp[j]` 为 `true`)\n - 如果存在,则当前位置也是可达的\n4. **结果**:返回 `dp[0]`,即从起始位置是否可达\n\n## 复杂度分析\n这是一种典型的动态规划解法,\n- 时间复杂度为 O(n²),\n- 空间复杂度为 O(n)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/71#issuecomment-3314420253","body":"## 思路:\n\n1. **状态定义**:`dp[i]` 表示由 i 个不同节点能构成的不同二叉搜索树的数量\n\n2. **状态转移方程**:\n - 对于 i 个节点,我们可以让其中任意一个节点 j (1 ≤ j ≤ i) 作为根节点\n - 当节点 j 作为根时:\n - 左子树包含比 j 小的 j-1 个节点,能构成 `dp[j-1]` 种不同的二叉搜索树\n - 右子树包含比 j 大的 i-j 个节点,能构成 `dp[i-j]` 种不同的二叉搜索树\n - 根据乘法原理,以 j 为根的二叉搜索树总数为 `dp[j-1] * dp[i-j]`\n - 遍历所有可能的根节点,将结果累加得到 `dp[i]`\n\n3. **边界条件**:\n - `dp[0] = 1`:空树也算一种情况\n - `dp[1] = 1`:只有一个节点时,只能构成一种二叉搜索树\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @return {number}\n */\nvar numTrees = function(n) {\n // 创建dp数组,dp[i]表示由i个不同节点能构成的不同二叉搜索树的数量\n let dp = new Array(n + 1).fill(0);\n \n // 边界条件:0个节点可以构成1棵空树,1个节点只能构成1种二叉搜索树\n dp[0] = 1;\n dp[1] = 1;\n \n // 计算2到n个节点能构成的不同二叉搜索树数量\n for(let i = 2; i <= n; i++){\n // 对于i个节点,尝试让每个节点作为根节点\n for(let j = 1; j <= i; j++){\n // 当第j个节点作为根时:\n // 左子树有j-1个节点,可以构成dp[j-1]种不同的二叉搜索树\n // 右子树有i-j个节点,可以构成dp[i-j]种不同的二叉搜索树\n // 根据乘法原理,以j为根的二叉搜索树数量为dp[j-1] * dp[i-j]\n dp[i] += dp[j - 1] * dp[i - j]\n }\n }\n \n // 返回n个节点能构成的不同二叉搜索树数量\n return dp[n]\n};\n```\n\n\n\n\n\n## 复杂度分析\n- 时间复杂度为 O(n²),\n- 空间复杂度为 O(n)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/72#issuecomment-3315877464","body":"\n## 思路\n\n使用了**最小优先队列**来解决合并K个有序链表的问题,这是一种非常高效的解决方案。\n\n### 核心思想\n\n1. **使用最小优先队列维护所有链表的头部节点**:\n - 将K个链表的头节点都放入最小优先队列中\n - 优先队列会根据节点值进行排序,确保队首始终是最小值节点\n\n2. **逐步构建结果链表**:\n - 每次从优先队列中取出值最小的节点\n - 将该节点连接到结果链表末尾\n - 如果该节点还有后续节点,则将后续节点加入优先队列\n\n3. **重复过程直到优先队列为空**:\n - 当优先队列为空时,说明所有节点都已处理完毕\n\n### 代码详解\n\n```javascript\nvar mergeKLists = function(lists) {\n // 创建虚拟头节点,便于操作\n let dummy = new ListNode(), dh = dummy;\n \n // 创建最小优先队列,比较函数是基于节点值\n let q = new MinPriorityQueue(v => v.val);\n \n // 将所有非空链表的头节点加入优先队列\n for(let i = 0; i < lists.length; i++) \n if(lists[i]) q.enqueue(lists[i]);\n \n // 当优先队列不为空时继续处理\n while(q.size()){\n // 取出值最小的节点\n let n = q.dequeue();\n \n // 将该节点连接到结果链表\n dh.next = n;\n dh = dh.next;\n \n // 如果该节点有后续节点,将其加入优先队列\n if(n.next) q.enqueue(n.next);\n }\n \n // 返回合并后的链表\n return dummy.next;\n};\n```\n\n\n## 复杂度分析\n\n1. **时间复杂度优化**:\n - 时间复杂度为 O(N log K),其中 N 是所有节点总数,K 是链表数量\n\n2. **空间复杂度**:\n - 空间复杂度为 O(K),只需要存储K个链表的头部节点\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/73#issuecomment-3322038797","body":"## 思路:\n\n1. **分治思想**:\n - 将问题分解为两个子问题:分别处理奇数和偶数\n - `oushu = n >> 1` 计算偶数的个数(相当于 n/2 的整数部分)\n - `jishu = n - oushu` 计算奇数的个数\n\n2. **递归处理**:\n - `l1 = beautifulArray(jishu)` 递归生成奇数个数对应的漂亮数组\n - `l2 = beautifulArray(oushu)` 递归生成偶数个数对应的漂亮数组\n\n3. **映射构造**:\n - 对于奇数部分:`for(let i of l1) ans.push(2 * i - 1)` 将每个元素映射为奇数\n - 对于偶数部分:`for(let i of l2) ans.push(2 * i)` 将每个元素映射为偶数\n\n4. **核心思想**:\n - 通过将数组分为奇数和偶数两部分,确保不会在奇数和偶数之间形成等差数列\n - 因为如果一个数是奇数,另一个是偶数,那么它们的平均数不可能是整数,也就不可能在数组中找到第三个数构成等差数列\n\n## 关键点:\n\n- 基础情况:当 n=1 时,直接返回 [1]\n- 使用位运算 `>>` 实现整数除法,提高效率\n- 通过分别处理奇数和偶数部分,巧妙地避免了等差数列的形成\n\n\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @return {number[]}\n */\nvar beautifulArray = function(n) {\n if(n === 1) return [1];\n let oushu = n >> 1,jishu = n - oushu;\n let l1 = beautifulArray(jishu),l2 = beautifulArray(oushu);\n let ans = [];\n for(let i of l1) ans.push(2 * i - 1);\n for(let i of l2) ans.push(2 * i);\n return ans\n};\n```\n\n## 复杂度分析\n- 时间复杂度为 O(n log n)。\n- 空间复杂度为 O(n log n)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/74#issuecomment-3322078023","body":"## 思路:\n\n1. **异或运算的性质**:\n - 相同数字异或结果为0:`a ^ a = 0`\n - 任何数字与0异或等于自身:`a ^ 0 = a`\n - 异或运算满足交换律和结合律\n\n2. **第一步:计算所有数字的异或结果**:\n ```javascript\n let xor = 0;\n nums.forEach(n=>xor = xor ^ n);\n ```\n\n 这一步得到的是两个只出现一次的数字的异或结果,因为出现两次的数字都会相互抵消。\n\n3. **第二步:找到区分两个目标数字的位**:\n ```javascript\n let type = xor & (-xor);\n ```\n\n 这一步很关键,通过 `xor & (-xor)` 找到 `xor` 中最右边的1位。这个位必定在两个目标数字中一个为1,一个为0,因为只有这样它们的异或结果才会是1。\n\n4. **第三步:根据该位将数组分为两组**:\n ```javascript\n let a = 0, b = 0;\n for(let num of nums){\n if(type & num) a = a ^ num; // 该位为1的数字分为一组\n else b ^= num; // 该位为0的数字分为一组\n }\n ```\n\n 通过这种方式,将两个目标数字分到不同的组中,而相同的数字由于该位相同会被分到同一组,在组内异或后会被抵消,最终每组只剩下各自的目标数字。\n\n## 复杂度分析\n\n- 时间复杂度是 O(n),\n- 空间复杂度是 O(1),非常高效。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar singleNumber = function(nums) {\n let xor = 0;\n nums.forEach(n=>xor = xor ^ n);\n let type = xor & (-xor);\n let a = 0,b = 0;\n for(let num of nums){\n if(type & num) a = a ^ num;\n else b ^= num;\n }\n return [a,b];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/75#issuecomment-3326222352","body":"## 思路\n\n1. `let n = 1 << (nums.length)`:通过左移运算计算出子集的总数。对于长度为n的数组,其子集总数为2^n。这里使用位运算`1 << nums.length`等价于2的nums.length次方。\n\n2. 外层循环`for(let i = 0;i < n;i++)`:遍历从0到2^n-1的每个数字,每个数字代表一个子集。\n\n3. 对于每个数字i(用变量j来操作):\n - 使用`j & 1`检查j的最低位是否为1\n - 如果是1,则将nums[k]加入当前子集temp中\n - 然后将j右移一位(`j >>= 1`),检查下一位\n - 同时k递增,指向nums中的下一个元素\n\n4. 内层while循环结束后,将生成的子集temp添加到结果数组ans中。\n\n## 复杂度分析\n使用位运算生成所有子集的方法,\n- 时间复杂度为O(n*2^n),\n- 空间复杂度为O(n*2^n)。\n\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number[][]}\n */\nvar subsets = function(nums) {\n let n = 1 << (nums.length),ans = [];\n for(let i = 0;i < n;i++){\n let temp = [],j = i,k = 0;\n while(j){\n if(j & 1) temp.push(nums[k]);\n j >>= 1;\n k++;\n }\n ans.push(temp);\n }\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/76#issuecomment-3331626491","body":"## 思路\n\n1. **TrieNode(Trie节点)**\n - `isEnd`:标记该节点是否为某个单词的结尾\n - `children`:大小为26的数组,存储指向子节点的指针(对应26个小写字母)\n\n2. **辅助函数**\n - `getCharIndex(c)`:将字符转换为其在字母表中的索引(0-25)\n\n### 1. 初始化(`Trie`构造函数)\n- 创建一个根节点 `root`,作为整个Trie树的起点\n\n### 2. 插入单词(`insert`方法)\n- 从根节点开始,逐字符遍历要插入的单词\n- 对于每个字符:\n - 计算其在字母表中的索引\n - 如果对应子节点不存在,则创建新节点\n - 移动到该子节点\n- 遍历完所有字符后,将最后一个节点标记为单词结尾(`isEnd = true`)\n\n### 3. 搜索单词(`search`方法)\n- 从根节点开始,逐字符遍历要搜索的单词\n- 对于每个字符:\n - 计算索引并检查对应子节点是否存在\n - 如果不存在,返回 `false`\n - 如果存在,移动到该子节点\n- 遍历完所有字符后,检查最后一个节点是否为单词结尾(`isEnd`为`true`)\n\n### 4. 前缀匹配(`startsWith`方法)\n- 与`search`类似,但不检查最后一个节点是否为单词结尾\n- 只要能完整遍历前缀中的所有字符,就返回`true`\n\n## 时间复杂度\n- 插入和搜索操作的时间复杂度均为O(m),其中m为单词或前缀的长度\n\n## 空间复杂度\n- O(ALPHABET_SIZE × N × M),其中N为插入的单词数,M为平均单词长度\n\n## 代码\n```javascript\nfunction TrieNode(){\n this.isEnd = false;\n this.children = new Array(26);\n}\n\nfunction getCharIndex(c){\n return c.charCodeAt(0) - 'a'.charCodeAt(0);\n}\n\nvar Trie = function() {\n this.root = new TrieNode();\n};\n\n/** \n * @param {string} word\n * @return {void}\n */\nTrie.prototype.insert = function(word) {\n let root = this.root;\n for(let c of word){\n let i = getCharIndex(c);\n if(!root.children[i]) root.children[i] = new TrieNode();\n root = root.children[i];\n }\n root.isEnd = true;\n};\n\n/** \n * @param {string} word\n * @return {boolean}\n */\nTrie.prototype.search = function(word) {\n let root = this.root;\n for(let c of word){\n let i = getCharIndex(c);\n if(!root.children[i]) return false;\n root = root.children[i];\n }\n return root.isEnd;\n};\n\n/** \n * @param {string} prefix\n * @return {boolean}\n */\nTrie.prototype.startsWith = function(prefix) {\n let root = this.root;\n for(let c of prefix){\n let i = getCharIndex(c);\n if(!root.children[i]) return false;\n root = root.children[i];\n }\n return !!root\n};\n\n/** \n * Your Trie object will be instantiated and called as such:\n * var obj = new Trie()\n * obj.insert(word)\n * var param_2 = obj.search(word)\n * var param_3 = obj.startsWith(prefix)\n */\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/77#issuecomment-3336492052","body":"## 思路\n\n### 1. TrieNode 结构\n- `TrieNode` 是一个前缀树节点结构。\n- 每个节点包含:\n - `value`: 当前节点对应的值总和。\n - [end](file://E:\\其他项目\\algorithm_exercises\\程序员面试金典\\面试题05.08.绘制直线\\main.js#L14-L14): 标记该节点是否为某个单词的结尾。\n - `children`: 长度为26的数组,存储子节点(对应字母a-z)。\n\n### 2. MapSum 类\n- 使用前缀树(Trie)和哈希表(Map)实现键值映射与前缀求和功能。\n- `root`: Trie树的根节点。\n- [map](file://E:\\其他项目\\algorithm_exercises\\周赛\\459\\2.js#L5-L5): 存储已插入的键值对。\n\n## 核心方法\n\n### insert(key, val)\n- 插入或更新键值对:\n - 如果键已存在,更新所有相关节点的值(先减去旧值,再加上新值)。\n - 如果是新键,则在Trie中创建路径,并在路径上的每个节点累加值。\n - 最后更新哈希表中的键值对。\n\n### sum(prefix)\n- 查询指定前缀的所有键值总和:\n - 遍历前缀,在Trie中查找对应的节点。\n - 若找不到完整前缀则返回0。\n - 返回前缀末尾节点的 `value` 值(即以该前缀开头的所有键的值总和)。\n\n## 工具函数\n\n### getCharIndex(char)\n- 将字符转换为其在字母表中的索引(0-25)。\n\n\n\n\n## 代码\n```javascript\nfunction TrieNode(){\n this.value = 0;\n this.end = false;\n this.children = new Array(26);\n}\n\nfunction getCharIndex(a){return a.charCodeAt(0) - 'a'.charCodeAt(0)}\nvar MapSum = function() {\n this.root = new TrieNode();\n this.map = new Map();\n};\n\n/** \n * @param {string} key \n * @param {number} val\n * @return {void}\n */\nMapSum.prototype.insert = function(key, val) {\n if(this.map.has(key)){\n let root = this.root;\n for(let c of key){\n let i = getCharIndex(c);\n root.children[i].value -= this.map.get(key);\n root.children[i].value += val;\n root = root.children[i];\n }\n }else{\n let root = this.root;\n for(let c of key){\n let i = getCharIndex(c);\n if(!root.children[i]) root.children[i] = new TrieNode();\n root = root.children[i];\n root.value += val;\n }\n root.end = true;\n }\n this.map.set(key,val);\n};\n\n/** \n * @param {string} prefix\n * @return {number}\n */\nMapSum.prototype.sum = function(prefix) {\n let root = this.root;\n let ans = 0\n for(let c of prefix){\n let i = getCharIndex(c);\n if(!root.children[i]) return 0;\n root = root.children[i];\n }\n return root.value;\n};\n\n/** \n * Your MapSum object will be instantiated and called as such:\n * var obj = new MapSum()\n * obj.insert(key,val)\n * var param_2 = obj.sum(prefix)\n */\n```\n\n\n## 复杂度分析\n- 时间复杂度:O(n),n位单词的长度。\n- 空间复杂度:O(m * n),m为单词个数,n为单词长度。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/78#issuecomment-3340984021","body":"## 算法思路\n\n1. **构建 Trie 树**:\n - 将 `smalls` 数组中的所有字符串插入到 Trie 树中\n - 每个节点记录是否为单词结尾([end](file://E:\\力扣刷题\\algorithm_exercises\\程序员面试金典\\面试题05.08.绘制直线\\main.js#L14-L14) 标志)以及对应的索引位置([i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22))\n\n2. **搜索过程**:\n - 遍历 `big` 字符串的每个位置作为起始点\n - 对每个起始点,使用 [dfs](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\465\\2.js#L9-L25) 函数在 Trie 树中进行匹配\n - 当匹配到完整单词时,将起始位置记录到对应的结果数组中\n\n3. **Trie 树结构**:\n - `TrieNode`:包含 [end](file://E:\\力扣刷题\\algorithm_exercises\\程序员面试金典\\面试题05.08.绘制直线\\main.js#L14-L14) 标志、子节点数组和索引 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22)\n - `Trie`:提供插入方法,将单词和其索引存储到树中\n\n## 关键函数分析\n\n- **`multiSearch` 主函数**:\n - 初始化 Trie 树并插入所有 smalls 单词\n - 遍历 big 字符串每个位置进行搜索\n\n- **[dfs](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\465\\2.js#L9-L25) 辅助函数**:\n - 从当前 Trie 节点继续匹配字符\n - 找到匹配单词时记录位置信息\n\n## 时间复杂度\n\n- **构建 Trie**:O(∑|smalls[i]|),即所有 smalls 字符串长度之和\n- **搜索过程**:O(|big| × max_match_length)\n - 外层循环遍历 `big` 字符串:O(|big|)\n - 每次 dfs 最坏情况遍历到最长匹配:O(max_match_length)\n- **总体复杂度**:O(∑|smalls[i]| + |big| × max_match_length)\n\n## 空间复杂度\n\n- **Trie 树存储**:O(∑|smalls[i]| × 26) = O(∑|smalls[i]|)\n- **结果数组**:O(∑结果数量)\n- **总体空间复杂度**:O(∑|smalls[i]| + 结果数量)\n\n## 代码\n```javascript\n/**\n * @param {string} big\n * @param {string[]} smalls\n * @return {number[][]}\n */\nvar multiSearch = function(big, smalls) {\n let trie = new Trie(),n = smalls.length;\n for(let i = 0;i < n;i++) trie.insert(smalls[i],i);\n let ans = new Array(n).fill(0).map(()=>[]);\n for(let i = 0;i < big.length;i++){\n let root = trie.root;\n let c = big[i],j = getCharIndex(c);\n if(!root.children[j]) continue;\n dfs(root,i,i);\n }\n\n return ans;\n\n // --------------------------\n function dfs(root,index,j){\n if(index === big.length) return;\n let c = big[index],i = getCharIndex(c);\n if(!root.children[i]) return;\n root = root.children[i];\n if(root.end) ans[root.i].push(j);\n dfs(root,index + 1,j);\n }\n};\n\n\n\n\nfunction Trie(){\n this.root = new TrieNode();\n}\n\nTrie.prototype.insert = function(word,i){\n let root = this.root;\n for(let c of word){\n let j = getCharIndex(c);\n if(!root.children[j]) root.children[j] = new TrieNode();\n root = root.children[j]\n }\n root.i = i;\n root.end = true;\n}\n\n\nfunction TrieNode(){\n this.end = false;\n this.children = new Array(26);\n this.i = -1;\n}\n\nfunction getCharIndex(c){\n return c.charCodeAt(0) - 'a'.charCodeAt(0);\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/79#issuecomment-3342189359","body":"## 思路\n\n1. **并查集初始化**:\n - 创建一个长度为 [n](file://E:\\其他项目\\algorithm_exercises\\11.js#L6-L6) 的数组 [f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17),其中 [n](file://E:\\其他项目\\algorithm_exercises\\11.js#L6-L6) 是城市数量\n - 初始化时,每个城市都指向自己,即 `f[i] = i`,表示每个城市初始时都是独立的集合\n\n2. **连接城市**:\n - 遍历 `isConnected` 矩阵,对于每一对相连的城市 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 和 `j`\n - 调用 [merge(i, j)](file://E:\\其他项目\\algorithm_exercises\\libs\\UnionFind.js#L19-L28) 函数将它们合并到同一个集合中\n\n3. **并查集操作**:\n - [find(i)](file://E:\\其他项目\\algorithm_exercises\\3.js#L19-L24) 函数:查找城市 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 所属集合的根节点,并进行路径压缩优化\n - [merge(i, j)](file://E:\\其他项目\\algorithm_exercises\\libs\\UnionFind.js#L19-L28) 函数:将城市 [i](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day1\\js.js#L6-L6) 和 `j` 所在的集合合并\n\n## 关键点分析\n\n- **路径压缩**:在 [find](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\2.js#L26-L29) 函数中使用了 `f[i] = find(f[i])` 来压缩路径,提高查找效率\n- **集合合并**:每次成功合并两个不同的集合时,省份数量 [ans](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6) 减一\n- **初始值**:[ans](file://E:\\其他项目\\algorithm_exercises\\91天学算法\\day2\\js.js#L6-L6) 初始化为 [n](file://E:\\其他项目\\algorithm_exercises\\11.js#L6-L6),表示最坏情况下每个城市都是一个独立省份\n\n## 代码\n```javascript\n/**\n * @param {number[][]} isConnected\n * @return {number}\n */\nvar findCircleNum = function(isConnected) {\n let n = isConnected.length,f = new Array(n).fill(0).map((_,i)=>i);\n let ans = n;\n for(let i = 0;i < n;i++){\n for(let j = 0;j < n;j++){\n if(isConnected[i][j]) merge(i,j);\n }\n }\n return ans;\n // ------------------------\n function find(i){\n if(i !== f[i]) f[i] = find(f[i]);\n return f[i];\n }\n\n function merge(i,j){\n let fi = find(i),fj = find(j);\n if(fi === fj) return;\n f[fi] = fj;\n ans--;\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n^2),其中 n 是城市数量\n- 空间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/80#issuecomment-3344661787","body":"## 思路\n\n1. **并查集初始化**\n - 使用并查集(Union-Find)数据结构来管理节点连接关系\n - [f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17) 数组存储每个节点的父节点,初始时每个节点的父节点是自身\n - [s](file://E:\\其他项目\\algorithm_exercises\\1.js) 数组存储每个连通分量的大小,初始时每个分量大小为1\n\n2. **构建连通分量**\n - 遍历 `graph` 矩阵,对于每条边 `graph[i][j]`,将节点 i 和 j 合并到同一连通分量中\n - 通过 [merge](file://E:\\其他项目\\algorithm_exercises\\3.js#L27-L37) 函数实现节点合并,并更新连通分量大小\n\n3. **统计初始感染节点**\n - 使用 `initialMap` 统计每个连通分量中有多少个初始感染节点\n - 通过 [find](file://E:\\其他项目\\algorithm_exercises\\周赛\\447\\2.js#L26-L29) 函数找到每个初始感染节点所属的连通分量\n\n4. **选择最优移除节点**\n - 遍历所有初始感染节点,寻找满足以下条件的节点:\n - 所在连通分量只有1个初始感染节点(否则移除该节点无法减少传播)\n - 能够拯救最多节点的连通分量\n - 如果拯救数量相同,选择索引最小的节点\n\n5. **边界情况处理**\n - 如果所有初始感染节点所在的连通分量都包含多个感染节点,则返回 `initial` 中的最小索引\n\n## 关键函数\n\n- [find(i)](file://E:\\其他项目\\algorithm_exercises\\3.js#L19-L24): 查找节点 i 的根节点(带路径压缩优化)\n- [merge(i,j)](file://E:\\其他项目\\algorithm_exercises\\libs\\UnionFind.js#L19-L28): 合并节点 i 和 j 所在的连通分量\n\n\n\n## 代码\n```javascript\n/**\n * @param {number[][]} graph\n * @param {number[]} initial\n * @return {number}\n */\nvar minMalwareSpread = function(graph, initial) {\n let n = graph.length;\n let f = new Array(n).fill(0).map((_,i)=>i);\n let s = new Array(n).fill(1);\n for(let i = 0;i < n;i++){\n for(let j = 0;j < n;j++){\n if(graph[i][j]) merge(i,j);\n }\n }\n\n\n let initialMap = new Map();\n for(let i of initial){\n let fi = find(i);\n initialMap.set(fi,initialMap.has(fi) ? initialMap.get(fi) + 1 : 1);\n }\n let ans = n,max = 0;\n for(let i of initial){\n let fi = find(i);\n if(initialMap.get(fi) > 1) continue;\n if(s[fi] > max || s[fi] === max && i < ans) {\n max = s[fi];\n ans = i\n }\n }\n\n return ans === n ? initial.reduce((prev,curr)=>Math.min(prev,curr),n) : ans;\n\n\n\n // -----------------------\n function find(i){\n if(i !== f[i]) f[i] = find(f[i]);\n return f[i];\n }\n\n function merge(i,j){\n let fi = find(i),fj = find(j);\n if(fi === fj) return;\n f[fi] = fj;\n s[fj] += s[fi];\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n^2),\n- 空间复杂度:O(n),其中 n 是节点数。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/81#issuecomment-3349592362","body":"\n\n## 思路\n\n1. **并查集数据结构**:\n - 使用数组 [f](file://E:\\其他项目\\algorithm_exercises\\19.js#L10-L17) 实现并查集,初始化时每台计算机的父节点是自身\n - [size](file://E:\\其他项目\\algorithm_exercises\\libs\\Stack.js#L19-L21) 记录当前连通分量的数量,初始为 [n](file://E:\\其他项目\\algorithm_exercises\\11.js#L6-L6)\n\n2. **可行性判断**:\n - 如果连接数 `cnt` 小于 `n-1`,则无法连接所有计算机,返回 `-1`\n\n3. **连通分量合并**:\n - 遍历所有连接关系,通过 [merge](file://E:\\其他项目\\algorithm_exercises\\3.js#L27-L37) 函数合并对应的计算机\n - 每次成功合并都会减少连通分量数量\n\n4. **结果计算**:\n - 最终需要的操作次数等于连通分量数减一(`size - 1`)\n\n## 关键函数\n\n- [find(i)](file://E:\\其他项目\\algorithm_exercises\\3.js#L19-L24):查找计算机 [i](file://E:\\其他项目\\algorithm_exercises\\周赛\\469\\2.js#L23-L23) 所在集合的根节点(带路径压缩优化)\n- [merge(i,j)](file://E:\\其他项目\\algorithm_exercises\\libs\\UnionFind.js#L19-L28):合并计算机 [i](file://E:\\其他项目\\algorithm_exercises\\周赛\\469\\2.js#L23-L23) 和 `j` 所在的集合\n\n\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} connections\n * @return {number}\n */\nvar makeConnected = function(n, connections) {\n const cnt = connections.length;\n if(cnt < n - 1) return -1;\n const f = new Array(n).fill(0).map((_,i)=>i);\n let size = n;\n for(let [i,j] of connections) merge(i,j);\n return size - 1;\n\n // ----------------------------\n function find(i){\n if(i !== f[i]) f[i] = find(f[i]);\n return f[i];\n }\n\n function merge(i,j){\n const fi = find(i),fj = find(j);\n if(fi === fj) return;\n f[fi] = fj;\n size--;\n }\n};\n```\n\n## 复杂度分析\n\n- 时间复杂度:O(m×α(n)),其中 m 是连接数,α 是阿克曼函数的反函数\n- 空间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/82#issuecomment-3354314699","body":"## 思路\n\n使用**后序遍历**的方式递归处理二叉树,删除所有值为0的叶子节点及其所属的全0子树。\n\n## 具体实现分析\n\n1. **基础情况处理**\n - `if(!root) return root;` - 空节点直接返回\n - `if(root && !root.left && !root.right) return root.val === 0 ? null : root;` - 叶子节点判断:如果是值为0的叶子节点则删除\n\n2. **递归处理**\n - `let l = pruneTree(root.left), r = pruneTree(root.right);` - 递归处理左右子树\n - 处理后的左右子树结果保存在 [l](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\468\\2.js#L7-L7) 和 [r](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\447\\1.js#L31-L31) 中\n\n3. **当前节点判断**\n - `if(!l && !r && root.val === 0) return null;` - 如果左右子树都被删除且当前节点值为0,则删除当前节点\n - 否则更新当前节点的左右子树引用并返回当前节点\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {TreeNode} root\n * @return {TreeNode}\n */\nvar pruneTree = function(root) {\n if(!root) return root;\n if(root && !root.left && !root.right) return root.val === 0 ? null : root;\n\n let l = pruneTree(root.left),r = pruneTree(root.right);\n if(!l && !r && root.val === 0) return null;\n root.left = l;\n root.right = r;\n return root;\n};\n```\n\n## 复杂度分析\n\n- **时间复杂度**: O(n),需要访问每个节点一次\n- **空间复杂度**: O(h),h为树的高度,递归调用栈的深度\n- **关键点**: 后序遍历确保了从叶子节点开始处理,逐步向上删除符合条件的节点","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/83#issuecomment-3358681420","body":"## 思路\n\n- 使用**回溯算法**(Backtracking)来遍历所有可能的组合\n- 对于每个元素,有两种选择:选择它(可重复选择)或不选择它\n\n## 代码结构分析\n\n1. **初始化**\n - [ans](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\436\\2.js#L7-L7):存储所有符合条件的组合结果\n - `result`:存储当前正在构建的组合\n - [n](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\437\\2.js#L5-L5):`candidates` 数组的长度\n\n2. **递归函数 [f(i, target)](file://E:\\力扣刷题\\algorithm_exercises\\19.js#L10-L17)**\n - [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22):当前考虑的元素索引\n - [target](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\453\\1.js#L8-L8):剩余需要达到的目标值\n\n3. **递归终止条件**\n - `target === 0`:找到一个有效组合,将其加入结果集\n - `i === n || target < 0`:超出数组范围或目标值为负,直接返回\n\n4. **递归逻辑**\n - **选择当前元素**:如果 `target >= candidate`,将当前元素加入 `result`,然后递归调用 [f(i, target - candidate)](file://E:\\力扣刷题\\algorithm_exercises\\19.js#L10-L17)(注意这里是 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 而不是 `i+1`,允许重复选择同一元素)\n - **不选择当前元素**:递归调用 [f(i + 1, target)](file://E:\\力扣刷题\\algorithm_exercises\\19.js#L10-L17),考虑下一个元素\n\n## 关键特点\n\n- 通过 [f(i, target - candidate)](file://E:\\力扣刷题\\algorithm_exercises\\19.js#L10-L17) 而不是 `f(i + 1, target - candidate)` 实现元素的重复使用\n- 使用 `result.push()` 和 `result.pop()` 维护当前组合状态,体现回溯思想\n\n## 代码\n```javascript\n/**\n * @param {number[]} candidates\n * @param {number} target\n * @return {number[][]}\n */\nvar combinationSum = function(candidates, target) {\n let ans = [],n = candidates.length;\n let result = []\n f(0,target);\n return ans;\n // ----------------------------\n function f(i,target){\n if(target === 0) {\n ans.push([...result]);\n return\n }\n if(i === n || target < 0) return;\n\n let candidate = candidates[i];\n\n if(target >= candidate){\n result.push(candidate);\n f(i,target - candidate);\n result.pop();\n } \n\n f(i + 1,target);\n } \n};\n```\n\n## 时间复杂度分析\n\n- **最坏情况时间复杂度**: `O(N^(T/M))`\n - 其中 `N` 是 `candidates` 数组的长度\n - `T` 是目标值 [target](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\453\\1.js#L8-L8)\n - `M` 是 `candidates` 中的最小值\n - 在最坏情况下,递归树的深度为 `T/M`,每层最多有 `N` 个分支\n\n- **实际时间复杂度**: 会比上述上界小很多,因为剪枝操作(`target < 0`时提前返回)会减少大量无效搜索\n\n## 空间复杂度分析\n\n- **递归栈空间**: `O(T/M)`\n - 最坏情况下递归深度为 `T/M`(当一直选择最小元素时)\n\n- **存储结果空间**: `O(K × X)`\n - `K` 是平均每个组合的长度\n - `X` 是符合条件的组合数量\n - 这部分空间用于存储最终结果 [ans](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\436\\2.js#L7-L7)\n\n- **临时存储空间**: `O(T/M)`\n - 用于存储当前路径 `result` 的最大长度\n\n因此,总体空间复杂度为 `O(T/M + K × X)`。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/84#issuecomment-3364301395","body":"## 思路\n\n这段代码旨在解决 **组合总和 II** 问题,即从给定数组 `candidates` 中找出所有可以使数字和为 [target](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\453\\1.js#L8-L8) 的组合,且每个数字在每组中只能使用一次。\n\n### 主要逻辑\n\n1. **初始化与排序**:\n - [ans](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\436\\2.js#L7-L7) 存储最终结果\n - `result` 存储当前路径上的元素\n - 对 `candidates` 进行升序排序,便于后续剪枝操作\n\n2. **递归函数 [f(i, target)](file://E:\\力扣刷题\\algorithm_exercises\\19.js#L10-L17)**:\n - 参数 [i](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\451\\2.js#L22-L22) 表示当前考虑的起始位置\n - 参数 [target](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\453\\1.js#L8-L8) 表示剩余的目标值\n - 当 `target === 0` 时,找到一个有效组合,将其加入结果集\n - 如果 `i === n || target < 0` 则终止递归\n\n3. **去重机制**:\n - 使用局部 [map](file://E:\\力扣刷题\\algorithm_exercises\\周赛\\435\\1.js#L5-L5) 来记录已访问过的元素,避免同一层级重复选择相同值\n - 通过 `map.set(candidate, j)` 记录元素及其索引\n\n4. **遍历与回溯**:\n - 遍历候选元素,将元素加入路径,递归处理剩余目标值\n - 回溯时弹出元素以尝试其他可能\n\n## 代码\n```javascript\n/**\n * @param {number[]} candidates\n * @param {number} target\n * @return {number[][]}\n */\nvar combinationSum2 = function(candidates, target) {\n let ans = [],result = [],map = new Map();\n candidates.sort((a,b)=>a - b);\n const n = candidates.length;\n f(0,target);\n return ans;\n // -----------------------------\n function f(i,target){\n if(target === 0) {\n ans.push([...result]);\n return\n }\n if(i === n || target < 0) return;\n \n let map = new Map();\n for(let j = i;j < n;j++){\n let candidate = candidates[j]\n if(map.has(candidate)) continue;\n map.set(candidate,j);\n }\n\n for(let [r,j] of map){\n result.push(r);\n f(j + 1,target - r);\n result.pop();\n }\n }\n};\n```\n\n### 复杂度分析\n\n- **时间复杂度**:O(2^n * n)\n - 每个元素有两种状态(选或不选),最坏情况下需要遍历所有子集\n - 每次有效组合需要复制到结果集中,复制操作耗时 O(n)\n\n- **空间复杂度**:O(n)\n - 递归调用栈深度最多为 n\n - 存储路径的 `result` 数组最多包含 n 个元素\n","onTime":true},null,null,null,null,null,null,null,null,null,null],"haoyuliaocurb":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073435345","body":"```\n// Time Complexity: O(max(num.length, k))\n// Space Complexity: O(max(num.length, k))\n\n/**\n * @param {number[]} num\n * @param {number} k\n * @return {number[]}\n */\nvar addToArrayForm = function(num, k) {\n const num1 = num;\n const num2 = String(k).split('').map(v => Number(v));\n const sum = [];\n\n for (let i = 0; i < Math.max(num1.length, num2.length); i += 1) {\n const s = (num1[num1.length - 1 - i] ?? 0) + (num2[num2.length - 1 - i] ?? 0) + (sum[i] ?? 0);\n\n sum[i] = s % 10;\n sum[i + 1] = (s - (s % 10)) / 10;\n }\n\n if (sum[sum.length - 1] === 0) sum.pop();\n sum.reverse();\n\n return sum;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3078842293","body":"【解題方向】\n\n第一想法:對於每一個 s[i] 都遍歷一次找最近的 c,Time Complexity 為 O(n^2) \n\n第二想法:先遍歷一遍 s 找到所有的 c,然後從所有的 c 開始向兩邊走\n\t=> 不過想到如何記錄狀態就覺得太複雜,而且可能最糟情況還是 Time Complexity 為 O(n^2) \n\n第三想法:看了提示,想到正向遍歷、反向遍歷一次,記錄 s[i] 與左右兩邊的 c 的最小距離\n\t=> 由於題目保證至少有一個 s 中至少有一個 c,對於每個 s[i],其左或右必然會有一個 c\n\n【程式碼】\n```\n// Time Complexity: O(n), n = s.length;\n// Space Complexity: O(n), n = s.length;\n\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function(s, c) {\n const chars = s.split('');\n const res = new Array(chars.length).fill(Infinity);\n\n let leftTargetCharIndex = -1;\n for (let i = 0; i < chars.length; i += 1) {\n if (chars[i] === c) leftTargetCharIndex = i;\n if (leftTargetCharIndex > -1) {\n res[i] = Math.min(res[i], Math.abs(leftTargetCharIndex - i));\n }\n }\n\n let rightTargetCharIndex = -1;\n for (let i = chars.length - 1; i > -1; i -= 1) {\n if (chars[i] === c) rightTargetCharIndex = i;\n if (rightTargetCharIndex > -1) {\n res[i] = Math.min(res[i], Math.abs(rightTargetCharIndex - i));\n }\n }\n\n return res;\n};\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3089452516","body":"1. 第一個直覺是用 recursion 來解題,不過過程中會遇到很多 edge case 沒有考慮到而 error thrown\n2. 後來改用 stack 來實踐,也很清楚,不過需要搞懂什麼應該被放進 stack,以及 pop and push 的時機\n\n```\n// Time Complexity: O(n)\n// Space Complexity: O(n)\n\n/**\n * Recursive version of decodeString\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n const helper = (str, index) => {\n let result = '';\n let num = 0;\n \n while (index < str.length) {\n const char = str[index];\n \n if (char >= '0' && char <= '9') {\n num = num * 10 + parseInt(char);\n index++;\n } else if (char === '[') {\n // Recursively decode the content inside brackets\n const [decodedStr, newIndex] = helper(str, index + 1);\n result += decodedStr.repeat(num);\n num = 0; // Reset number after using it\n index = newIndex;\n } else if (char === ']') {\n // End of current bracket section - return result and current index\n return [result, index + 1];\n } else {\n // Regular character\n result += char;\n index++;\n }\n }\n \n return [result, index];\n };\n \n return helper(s, 0)[0];\n};\n\n// Time Complexity: O(n)\n// Space Complexity: O(n)\n\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n const stack = [];\n let currentStr = '';\n let currentNum = 0;\n \n for (let i = 0; i < s.length; i++) {\n const char = s[i];\n \n if (char >= '0' && char <= '9') {\n currentNum = currentNum * 10 + parseInt(char);\n } else if (char === '[') {\n // Push current state to stack\n stack.push([currentStr, currentNum]);\n currentStr = '';\n currentNum = 0;\n } else if (char === ']') {\n // Pop from stack and decode\n const [prevStr, num] = stack.pop();\n currentStr = prevStr + currentStr.repeat(num);\n } else {\n // Regular character\n currentStr += char;\n }\n }\n \n return currentStr;\n};\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091467280","body":"透過第二個 stack 倒轉第一個 in-stack 的順序,以達到 FIFO 的效果\n```\n// Time Complexity: O(1) for push, pop, peek, empty;\n// Space Complexity: O(n)\n\nclass MyQueue {\n constructor() {\n this.inStack = [];\n this.outStack = [];\n }\n\n /** \n * @param {number} x\n * @return {void}\n */\n push(x) {\n this.inStack.push(x);\n }\n\n /**\n * @return {number}\n */\n pop() {\n if (!this.outStack.length) {\n this.pushToOutStack();\n }\n\n return this.outStack.pop();\n }\n\n /**\n * @return {number}\n */\n peek() {\n if (!this.outStack.length) {\n this.pushToOutStack();\n }\n\n return this.outStack[this.outStack.length - 1];\n }\n\n /**\n * @return {boolean}\n */\n empty() {\n return this.peek() === undefined;\n }\n\n pushToOutStack() {\n while (this.inStack.length) {\n this.outStack.push(this.inStack.pop());\n }\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094426027","body":"// Time Complexity: O(n);\n// Space Complexity: O(n);\n\n```\n/**\n * @param {number[]} arr\n * @return {number}\n */\nvar maxChunksToSorted = function(arr) {\n const sortedArr = [...arr].sort((a, b) => a - b);\n let counts = {};\n let chunkAmount = 0;\n\n for (let i = 0; i < arr.length; i += 1) {\n counts[arr[i]] = (counts[arr[i]] ?? 0) + 1;\n counts[sortedArr[i]] = (counts[sortedArr[i]] ?? 0) - 1;\n\n if (Object.values(counts).every((value) => value === 0)) {\n chunkAmount += 1;\n }\n }\n\n return chunkAmount;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095908728","body":"```\n// Time Complexity: O(n);\n// Space Complexity: O(1);\n\nvar rotateRight = function (head, k) {\n if (!head || !head.next) return head;\n\n let length = 0;\n let cur = head;\n\n while (cur) {\n cur = cur.next;\n length += 1;\n }\n\n k = k % length;\n let left = head;\n let right = head;\n\n while (right.next) {\n if (k <= 0) left = left.next;\n right = right.next;\n k -= 1;\n }\n\n right.next = head; // Handle the case when left and right point to the same node.\n let res = left.next;\n left.next = null;\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3102283858","body":"建立一個 dummy 連結在 head 之前,便可以將 head 當作中間節點處理。每次互換節點會牽涉四個節點,pre, cur, next, next.next,其中 pre 的初始值為 dummy,因此在每個迴圈保證有值,而真正要互換的 cur, next,其兩有值為 while 迴圈繼續的必要條件,next.next 為 null 則沒關係。\n\n```\n// Time Complexity: O(n);\n// Space Complexity: O(1);\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar swapPairs = function(head) {\n const dummy = { val: 0, next: head };\n\n let pre = dummy;\n let cur = pre.next;\n let next = cur?.next;\n\n while (cur && next) {\n pre.next = next;\n cur.next = next.next;\n next.next = cur;\n\n [pre, cur, next] = [cur, cur.next, cur.next?.next];\n }\n\n return dummy.next;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3105649705","body":"# 想法\n轉換成 Height Balanced Binary Search Tree 會需要進行 Binary Search,考慮到單向鏈錶不方便直接存取 node,因此直接將鏈錶轉成數組,並直接以數組配合 Binary Search 遞迴建立樹。\n\n```\n\n// Time Complexity: O(n);\n// Space Complexity: O(n);\n\n/**\n * @param {ListNode} head\n * @return {TreeNode}\n */\nvar sortedListToBST = function(head) {\n if (head === null) return null;\n\n const dummy = new ListNode(0, head);\n const arr = [];\n\n let tail = dummy;\n\n while (tail) {\n const next = tail.next;\n next && arr.push(next.val);\n tail = next;\n }\n\n const inner = (l, r) => {\n if (l > r) return null;\n if (l === r) return new TreeNode(arr[r]);\n\n const m = Math.ceil((l + r) / 2);\n\n return new TreeNode(arr[m], inner(l, m - 1), inner(m + 1, r));\n };\n\n return inner(0, arr.length - 1);\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112936097","body":"## 思考方向\n### 雙指針\n用兩個指針分別從 headA, headB 開始走,走到盡頭換到另一個 head。過程中若指向同一個點則為兩鏈錶的交點,若皆遍歷一遍後無交點,則兩鏈錶無相交。\n\n```\n// Time Complexity: O(n);\n// Space Complexity: O(1);\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} headA\n * @param {ListNode} headB\n * @return {ListNode}\n */\nvar getIntersectionNode = function(headA, headB) {\n let pointerA = headA;\n let pointerB = headB;\n let switchCounts = 0;\n\n while (switchCounts < 3) {\n if (pointerA === pointerB) return pointerA;\n\n if (pointerA?.next) {\n pointerA = pointerA.next;\n } else {\n switchCounts += 1;\n pointerA = headB;\n }\n\n if (pointerB?.next) {\n pointerB = pointerB.next;\n } else {\n switchCounts += 1;\n pointerB = headA;\n }\n }\n\n return null;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3116343077","body":"## 解題方向\n- 快慢指針法\n\n## Edge Cases\n- 當快指針走到 null 代表沒有環\n\n```\n// Time Complexity: O(n);\n// Space Complexity: O(1);\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar detectCycle = function(head) {\n let fast = head;\n let slow = head;\n\n do {\n if (fast === null) return null;\n\n fast = fast?.next?.next ?? null;\n slow = slow?.next ?? null;\n } while (fast !== slow);\n\n fast = head;\n\n while (fast !== slow) {\n fast = fast?.next ?? null;\n slow = slow?.next ?? null;\n }\n\n return fast;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3121584769","body":"## 解題方向\n- 看到 FISO 的第一個想法是用 Queue,搭配 hash 也可以達到 get O(1) 的要求,不過 put 更新既有的值,就沒辦法 O(1)。\n若是 put 更新既有的值要 O(1),還是需要使用鏈表。\n- 中間有一度 debug 卡關,主要是原本在 put 時無論如何都先把既有的 node 刪掉再新增,但這可能造成一些 state 更新上的錯誤,後來簡化為直接移動 node 才 AC。\n\n```\n// Time Complexity: O(1) for LRUCache.prototype.get, put\n// Space Complexity: O(n)\n\nfunction ListNode(key, val) {\n this.key = key;\n this.val = val;\n this.next = null;\n this.pre = null;\n }\n\n/**\n * @param {number} capacity\n */\nvar LRUCache = function(capacity) {\n this.capacity = capacity;\n this.length = 0;\n this.head = new ListNode();\n this.tail = new ListNode();\n this.head.next = this.tail;\n this.tail.pre = this.head;\n this.map = {};\n};\n\n/** \n * @param {number} key\n * @return {number}\n */\nLRUCache.prototype.get = function(key) {\n const node = this.map[key];\n\n if (node !== undefined) {\n this.appendToTail(this.remove(node));\n return node.val\n };\n\n return -1;\n};\n\n/** \n * @param {number} key \n * @param {number} val\n * @return {void}\n */\nLRUCache.prototype.put = function(key, val) {\n const node = this.map[key];\n\n if (node !== undefined) {\n node.val = val;\n this.appendToTail(this.remove(node));\n } else {\n if (this.length === this.capacity) {\n const old = this.head.next;\n delete this.map[old.key];\n this.length -= 1;\n this.remove(old);\n }\n\n const node = new ListNode(key, val);\n this.map[key] = node;\n this.length += 1;\n this.appendToTail(node);\n }\n};\n\nLRUCache.prototype.appendToTail = function(node) {\n if (node.pre) node.pre.next = node.next;\n if (node.next) node.next.pre = node.pre;\n this.tail.pre.next = node;\n node.pre = this.tail.pre;\n node.next = this.tail;\n this.tail.pre = node;\n}\n\nLRUCache.prototype.remove = function(node) {\n node.pre.next = node.next;\n node.next.pre = node.pre;\n node.pre = null;\n node.next = null;\n\n return node;\n}\n\n/** \n * Your LRUCache object will be instantiated and called as such:\n * var obj = new LRUCache(capacity)\n * var param_1 = obj.get(key)\n * obj.put(key,value)\n */\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3123752698","body":"## 解題方向\n### DFS\n- 需注意當 helper 的 params root 為 null 時,應回傳 0\n\n```\n// Time Complexity: O(n), n for numbers of nodes.\n// Space Complexity: O(h), h for the max depth of tree.\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(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\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar maxDepth = function(root) {\n const helper = (root) => {\n if (!root) return 0;\n if (!root.left && !root.right) return 1;\n return Math.max(helper(root.left), helper(root.right)) + 1;\n };\n\n return helper(root);\n};\n```\n\n### Layer Iteration\n- 由於 stack 的起始值就有一個 root node,因此要先處理 root 為 null 的狀況\n\n```\n// Time Complexity: O(n), n for numbers of nodes.\n// Space Complexity: O(w), w for the max numbers of nodes in the same layer of tree.\n\n/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar maxDepth = function(root) {\n if (!root) return 0;\n\n const stack = [{ node: root, depth: 1 }];\n let maxDepth = 0;\n\n while (stack.length) {\n const { node, depth } = stack.shift();\n if (node.left) stack.push({ node: node.left, depth: depth + 1 });\n if (node.right) stack.push({ node: node.right, depth: depth + 1 });\n maxDepth = Math.max(maxDepth, depth);\n }\n\n return maxDepth;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125050709","body":"## 解題方向\n- 須理解兩棵樹一樣的意思是,其遍歷的結果會一樣,又題目有提到左右節點位置不同也不行,因此可以用多個遍歷結果來確認,或者可以將中間的空節點印出。可優化空間是不需要若於遍歷過程比較兩棵樹的節點,就不需要儲存遍歷結果。\n\n```javascript\n// Time Complexity: O(m + n), m, n are numbers of two tree nodes respectively.\n// Space Complexity: O(m + n)\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {TreeNode} p\n * @param {TreeNode} q\n * @return {boolean}\n */\nvar isSameTree = function(p, q) {\n const iterate = (root) => {\n const arr = [];\n const stack = [root];\n\n while (stack.length) {\n const node = stack.shift();\n\n arr.push(node?.val);\n\n if (node?.left || node?.right) {\n stack.push(node?.left);\n stack.push(node?.right);\n }\n }\n\n return arr;\n };\n\n return JSON.stringify(iterate(p)) === JSON.stringify(iterate(q));\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3131156971","body":"## 解題方向\n- 需要計算所有從 root 走到 leaf 的路線,這可以用 Recursion 來完成(回溯)\n- 用一個數字來紀錄 state:增加位數為「runningNumber * 10 + node.val」,減去位數為「Math.floor(runningNumber / 10)」\n\n```javascript\n// Time Complexity: O(n), n is the number of the tree nodes\n// Space Complexity: O(d), d is the depth of the tree\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar sumNumbers = function(root) {\n let sum = 0;\n let runningNumber = 0;\n\n const inner = (root) => {\n if (root) {\n runningNumber = runningNumber * 10 + root.val;\n\n if (!root.left && !root.right) {\n sum += runningNumber;\n } else {\n inner(root.left);\n inner(root.right);\n }\n\n runningNumber = Math.floor(runningNumber / 10);\n }\n };\n\n inner(root);\n\n return sum;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3134845036","body":"## 解題方向\n- 可以使用 DFS 或 BFS 來解題\n- DFS 記錄最深深度的第一個節點數值,深度可作為參數於每次遞迴時傳遞\n- BFS 紀錄每層第一個節點數值\n- 題目保證 root 一定不為 null\n\n### DFS\n```javascript\n// Time Complexity: O(n), n is the number of tree nodes.\n// Space Complexity: O(d), d is the max depth of tree.\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n let maxDepth = 0;\n let res = null;\n\n const dfs = (root, depth) => {\n if (depth > maxDepth) {\n maxDepth = depth;\n res = root.val;\n }\n\n root.left && dfs(root.left, depth + 1);\n root.right && dfs(root.right, depth + 1);\n };\n\n dfs(root, 1);\n\n return res;\n};\n```\n\n### BFS\n```javascript\n// Time Complexity: O(n), n is the number of tree nodes.\n// Space Complexity: O(w), w is the max width of tree.\n\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n const stack = [[root]];\n let res = null;\n\n while (stack.length) {\n const nodes = stack.pop();\n\n res = nodes[0].val;\n\n const nextNodes = [];\n\n for (const node of nodes) {\n node.left && nextNodes.push(node.left);\n node.right && nextNodes.push(node.right);\n }\n\n nextNodes.length && stack.push(nextNodes);\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3138426787","body":"## 解題方向\n* 使用 DNS 前序遍歷,在 deserialize 時透過遞迴建立樹會較 BFS 容易。\n* 使用原生的 JSON.stringify and JSON.parse 來轉換 array 及 string\n* 優化方向:優化 Space Complexity 至 O(h),h 為樹的高度\n * 能直接產生 serialized string 而非在最後轉化\n * 一邊 deserialize 需要的 string 部分,而不需要在一開始開一個 array 儲存\n\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val) {\n * this.val = val;\n * this.left = this.right = null;\n * }\n */\n\n// Time Complexity: O(n), n is number of tree nodes.\n// Space Complexity: O(n), n is number of tree nodes.\n\n/**\n * Encodes a tree to a single string.\n *\n * @param {TreeNode} root\n * @return {string}\n */\nvar serialize = function(root) {\n const preOrder = [];\n const dns = (root) => {\n preOrder.push(root?.val);\n if (root) {\n dns(root.left);\n dns(root.right);\n }\n };\n dns(root);\n\n return JSON.stringify(preOrder);\n};\n\n// Time Complexity: O(n), n is number of tree nodes.\n// Space Complexity: O(n), n is number of tree nodes.\n\n/**\n * Decodes your encoded data to tree.\n *\n * @param {string} data\n * @return {TreeNode}\n */\nvar deserialize = function(data) {\n const preOrder = JSON.parse(data);\n\n if (preOrder[0] === null || preOrder[0] === undefined) return preOrder[0];\n\n const createNode = () => {\n const val = preOrder.shift();\n\n if (val === null) return null;\n\n const node = new TreeNode(val);\n node.left = createNode();\n node.right = createNode();\n return node;\n };\n\n return createNode();\n};\n\n/**\n * Your functions will be called as such:\n * deserialize(serialize(root));\n */\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3144639245","body":"## 解題方向\n- 不一樣的遍歷方式會有差嗎? => 由於打算取值後再排序,因此沒差\n- 如何儲存最後的輸出最省力 => 用 hashmap\n\n```javascript\n// Time Complexity: O(nlogn), n is the number of tree.\n// Space Complexity: O(n), n is the number of tree.\n\n// /**\n// * Definition for a binary tree node.\n// * function TreeNode(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// /**\n// * @param {TreeNode} root\n// * @return {number[][]}\n// */\nvar verticalTraversal = function(root) {\n const map = {};\n\n const traverse = (root, row, col) => {\n if (!root) return;\n\n if (!map[col]) {\n map[col] = [];\n }\n\n map[col].push([row, root.val]);\n traverse(root.left, row + 1, col - 1);\n traverse(root.right, row + 1, col + 1);\n };\n\n traverse(root, 0, 0);\n\n const keys = Object.keys(map).sort((a, b) => a - b);\n\n const res = keys.map((k) => {\n const arr = map[k];\n\n return arr.sort(([rowA, valA], [rowB, valB]) => {\n if (rowA === rowB) return valA - valB;\n return rowA - rowB;\n }).map(([,val]) => val);\n });\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146092009","body":"## 解題方向\n- 遍歷 nums 時使用 hashmap 來記錄曾出現過的數字及其 index,並看 hashmap 是否記錄 target - nums[i] 是否曾出現過\n- 可以特別注意題目要求同個元素不能被使用兩次,所以應將配對到的元素移出 hashmap(不過因為題目也說只有一組數字為答案,所以不做也沒關係)\n\n```javascript\n// Time Complexity: O(n), n is nums.length.\n// Space Complexity: O(1) \n\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number[]}\n */\nvar twoSum = function(nums, target) {\n const map = {};\n const res = [];\n\n for (let i = 0; i < nums.length; i += 1) {\n const num = nums[i];\n\n if (map[target - num] !== undefined) {\n res.push(i, map[target - num]);\n delete map[target - num];\n } else {\n map[num] = i;\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3146907342","body":"## 解法\n- 第一個想法是遍歷後得到 num 與其 frequency 的 hashmap,將其轉成 array 後排序並取前 k 者\n- 看了題解後可優化部分是,由於題目允許回傳值不需要依據 frequency 排序,因此可將原解法 sort 的部分改成 quick selection,將平均時間複查度從 O(nlogn) 將至 O(n)\n```javascript\n// Time Complexity: O(nlogn), n is nums.length.\n// Space Complexity: O(n), n is nums.length.\n\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar topKFrequent = function (nums, k) {\n const map = {};\n\n for (const num of nums) {\n map[num] = (map[num] ?? 0) + 1;\n }\n\n return Object.entries(map)\n .sort(([numA, freqA], [numB, freqB]) => {\n return freqB - freqA;\n })\n .filter((_, i) => i < k)\n .map(([num]) => Number(num));\n};\n```\n\n## 解法\n- 找 max frequent num\n- 回傳 left, right index range\n- 需要考慮當兩個 num frequency 相等時,應保留 range 較小者!\n```javascript\n// Time Complexity: O(n), n is nums.length.\n// Space Complexity: O(n), n is nums.length.\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar findShortestSubArray = function (nums) {\n let maxFreqNum = nums[0];\n const map = {};\n\n for (let i = 0; i < nums.length; i += 1) {\n const num = nums[i];\n const { freq, left, right } = map[num] ?? { freq: 0, left: i, right: i };\n map[num] = {\n freq: freq + 1,\n left: i < left ? i : left,\n right: i > right ? i : right,\n };\n\n if (map[num].freq > map[maxFreqNum].freq) {\n maxFreqNum = num;\n } else if (map[num].freq === map[maxFreqNum].freq) {\n if (\n map[num].right - map[num].left <\n map[maxFreqNum].right - map[maxFreqNum].left\n ) {\n maxFreqNum = num;\n }\n }\n }\n\n const { left, right } = map[maxFreqNum];\n\n return right - left + 1;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3149617346","body":"```javascript\n// Time Complexity: O(n^2), n is points.length.\n// Space Complexity: O(n), n is points.length.\n\n/**\n * @param {number[][]} points\n * @return {number}\n */\nfunction numberOfBoomerangs(points) {\n const n = points.length;\n let ans = 0;\n \n for (let i = 0; i < n; i++) {\n const distanceMap = {};\n \n for (let j = 0; j < n; j++) {\n const dist = Math.pow(points[i][0] - points[j][0], 2) + Math.pow(points[i][1] - points[j][1], 2);\n distanceMap[dist] = (distanceMap[dist] ?? 0) + 1;\n }\n \n for (const count of Object.values(distanceMap)) {\n ans += count * (count - 1);\n }\n }\n \n return ans;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3153048738","body":"## 解法\n- 經典的滑動視窗題目,與用 hashmap 紀錄字元的出現次數,並於迴圈中判斷下個字元是否已出現過,無則加入,有則刪除。\n- 需要特別注意\n- (1) 迴圈的邊界條件應為 right < s.length - 1,不然會讓 right 跑到 s.length\n- (2) 應先刪掉 map[s[left]] 再 left++\n\n```javascript\n// Time Complexity: O(n), n is s.length.\n// Space Complexity: O(m), m is types of characters in s.\n\n/**\n * @param {string} s\n * @return {number}\n */\nvar lengthOfLongestSubstring = function(s) {\n if (!s.length) return 0;\n \n const chars = new Map();\n chars.set(s[0], 1);\n\n let max = 1;\n let left = 0;\n let right = 0;\n\n while (right < s.length - 1) {\n const cond = !chars.has(s[right + 1]);\n if (!chars.has(s[right + 1])) {\n right++;\n chars.set(s[right], 1);\n } else {\n chars.delete(s[left]);\n left++;\n }\n\n const number = right - left + 1;\n if (number > max) max = number;\n }\n\n return max;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3160434225","body":"## 解法\n- 一開始分析方向錯了,以為每個 substring 間不可重疊\n- 之後想到的是用 hashmap 存可能 substring 的結果,再遍歷一次,但是時間複雜度為階乘\n- 最後則是直接遍歷,再驗證 substring 是否正確,然而需考慮 words 的 element 是否會重複\n\n```javascript\n// Time Complexity: O(n * m * k), n is s.length, m is words[0].length, k is words.lenght.\n// Space Complexity: O(m).\n\n/**\n * @param {string} s\n * @param {string[]} words\n * @return {number[]}\n */\nvar findSubstring = function(s, words) {\n const defaultMap = (() => {\n const m = {};\n for (const word of words) {\n m[word] = (m[word] ?? 0) + 1;\n }\n return m;\n })();\n let map = JSON.parse(JSON.stringify(defaultMap));\n const wordLength = words[0].length;\n const substringLength = wordLength * words.length;\n\n const validate = (substring) => {\n let cur = 0;\n map = JSON.parse(JSON.stringify(defaultMap));\n\n while (cur < substring.length) {\n const target = substring.substring(cur, cur + wordLength);\n if (map[target]) {\n map[target] -= 1;\n cur += wordLength;\n } else return false;\n }\n\n return true;\n };\n\n const res = []\n\n for (let i = 0; i < s.length - substringLength + 1; i++) {\n const substring = s.substring(i, i + substringLength);\n if (validate(substring)) res.push(i);\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3164019442","body":"## 解法\n- 一開始漏看了連續短數組的條件,之後想到暴力法,也有個感覺優化必定涉及數學技巧,因此直接看題解\n- 需要理解兩個技巧:負數取模 floorMod 和 map.set(0, -1) 以處理欲從 sum[i] - sum[j] 計算 i 至 j 範圍時,當 j 為 0 遇到的計算問題\n\n```javasciprt\n// Time Complexity: O(n), n is nums.length.\n// Space Complexity: O(min(n, k))\n\n/**\n * @param {number[]} nums\n * @param {number} p\n * @return {number}\n */\nvar floorMod = function (a, b) {\n return ((a % b) + b) % b;\n};\n\nfunction minSubarray(nums, k) {\n var map = new Map();\n map.set(0, -1);\n var res = nums.length;\n var target = 0;\n var currSum = 0;\n for (let i = 0; i < nums.length; i++) {\n target += nums[i];\n }\n target = target % k;\n if (target === 0) return 0;\n for (let i = 0; i < nums.length; i++) {\n currSum = (nums[i] + currSum) % k;\n\n var prevSum = floorMod(currSum - target, k);\n if (map.has(prevSum)) {\n res = Math.min(res, i - map.get(prevSum));\n }\n map.set(currSum, i);\n }\n return res === nums.length ? -1 : res;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3168248088","body":"## 解法\n- 窮舉前面的例子就可以得到規律:先處理只有一個 node 的 edge case,當 fast.next?.next 不為 null,即存在下下個 node 的情況下移動快慢指針,不然慢指針的下個 node 即是中間節點。\n```javascript\n// 1 => 1\n\n// 1, 2 => 2 => slow 1, fast 2\n// 1, 2, 3 => 2 => slow 1, fast 2\n\n// 1, 2, 3, 4 => 3 => slow 2, fast 4\n// 1, 2, 3, 4, 5 => 3 => slow 2, fast 4\n\n// 1, 2, 3, 4, 5, 6 => 4\n// 1, 2, 3, 4, 5, 6, 7 => 4\n\n// 1, 2, 3, 4, 5, 6, 7, 8 => 5\n// 1, 2, 3, 4, 5, 6, 7, 8, 9 => 5\n```\n\n```javascript\n// Time Complexity: O(n), n is linked list length,\n// Space Complexity: O(1)\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar middleNode = function(head) {\n if (!head.next) return head;\n\n let slow = head;\n let fast = head.next;\n\n while (fast.next?.next) {\n slow = slow.next;\n fast = fast.next.next;\n };\n\n return slow.next;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3170547569","body":"## 解法\n- 一開始沒注意到 Space Complexity O(1) 的要求,因此用 map 來記錄曾遍歷過的數字,並使用 nums.splice 來原地刪除重複元素\n- 若限制 Space Complexity 為 O(1),則需要如題解用快慢指針來做\n\n```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar removeDuplicates = function(nums) {\n let slow = 0;\n let fast = 0;\n\n while (fast < nums.length) {\n if (nums[fast] !== nums[slow]) {\n slow++;\n nums[slow] = nums[fast];\n }\n \n fast++;\n }\n\n return slow + 1;\n};\n\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar removeDuplicates = function(nums) {\n const map = {};\n let res = 0;\n let i = nums.length - 1;\n\n while (i >= 0) {\n const num = nums[i];\n\n if (map[num]) {\n nums.splice(i, 1);\n } else {\n map[num] = 1;\n res += 1;\n };\n\n i--;\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172259657","body":"## 解法\n- 經典的二分查找,需注意沒有找到 target 的 edge case\n\n```javascript\n// Time Complexity: O(logn), n is nums.length\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar searchInsert = function(nums, target) {\n let l = 0;\n let r = nums.length - 1;\n let m = -1;\n\n while (l <= r) {\n m = l + Math.floor((r - l) / 2);\n\n if (nums[m] === target) return m;\n else if (nums[m] > target) r = m - 1;\n else l = m + 1;\n }\n\n return l;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173778506","body":"## 解法\n- 第一泡茶的確是暴力解,之後會想到 max heap,但每次 push 仍需要耗費 O(logn)\n- 有想過使用 monotonic stack 來做,但卡沒仔細想就覺得可能無法正確排除 sliding window 外的元素而作罷,而這其實可以靠題解中的 shift 來完成,又因為不是嚴格遞增棧,所以遇到相等數值時,前者仍會被保留,而確保 shift 的操作都是正確的\n\n```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(k)\n\nvar maxSlidingWindow = function (nums, k) {\n const res = [];\n const dequeue = new Dequeue([]);\n\n for (let i = 0; i < k - 1; i++) {\n dequeue.push(nums[i]);\n }\n\n for (let i = k - 1; i < nums.length; i++) {\n dequeue.push(nums[i]);\n res.push(dequeue.max());\n dequeue.shift(nums[i - k + 1]);\n }\n\n return res;\n};\n\nclass Dequeue {\n constructor(nums) {\n this.list = nums; // Should be implemented as a linked list to make time complexity of dequeue.shift() as O(1).\n }\n\n push(val) {\n const nums = this.list;\n\n while (nums[nums.length - 1] < val) {\n nums.pop();\n }\n\n nums.push(val);\n }\n\n shift(val) {\n let nums = this.list;\n\n if (nums[0] === val) {\n nums.shift();\n }\n }\n\n max() {\n return this.list[0];\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3178234382","body":"## 解法\n- 第一泡茶,可以透過紀錄一個人信任及被信任的人數來解題。其中可以不斷紀錄目前被信任人數最高者方便最後判斷是否為法官\n- 看了題解後發現可以用圖來解,之後補上\n\n```javascript\n// Time Complexity: O(n)\n// Space Complexity: O(n)\n\n/**\n * @param {number} n\n * @param {number[][]} trust\n * @return {number}\n */\nvar findJudge = function(n, trust) {\n const trustFroms = new Array(n).fill(0);\n const trustTos = new Array(n).fill(0);\n let maybeJudge = { index: 0, trustTo: 0 };\n\n for (const t of trust) {\n const [from, to] = [t[0] - 1, t[1] - 1];\n trustFroms[from]++;\n trustTos[to]++;\n if (trustTos[to] > maybeJudge.trustTo) maybeJudge = { index: to, trustTo: trustTos[to] };\n }\n\n if (maybeJudge.trustTo === n - 1) {\n if (trustFroms[maybeJudge.index] === 0) return maybeJudge.index + 1;\n }\n\n return -1;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3184149014","body":"```javascript\n// Time Complexity: O(v + e)\n// Space Complexity: O(v + e)\n\n/**\n * @param {number} n\n * @param {number[][]} dislikes\n * @return {boolean}\n */\nconst possibleBipartition = (n, dislikes) => {\n const graph = new Array(n + 1).fill().map(() => new Array())\n const colors = new Array(n + 1).fill(-1);\n\n for (const [a, b] of dislikes) {\n graph[a].push(b);\n graph[b].push(a);\n }\n\n const dfs = (cur, color = 0) => {\n colors[cur] = color;\n\n for (const nxt of graph[cur]) {\n if (colors[nxt] !== -1 && colors[nxt] === color) return false;\n if (colors[nxt] === -1 && !dfs(nxt, color ^ 1)) return false;\n }\n\n return true;\n };\n\n for (let i = 0; i < n + 1; i++) {\n if (colors[i] === -1 && !dfs(i, 0)) return false;\n }\n\n return true;\n};\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3186799518","body":"```javascript\n// Time Complexity: O(n + e), e is sum of beforeItems.flat().length\n// Space Complexity: O(n + e)\n\n/**\n * @param {number} n\n * @param {number} m\n * @param {number[]} group\n * @param {number[][]} beforeItems\n * @return {number[]}\n */\nvar sortItems = function(n, m, group, beforeItems) {\n const topologicalSort = (items, indegree, neighbors) => {\n const queue = [];\n const result = [];\n \n for (const item of items) {\n if (indegree[item] === 0) {\n queue.push(item);\n }\n }\n \n while (queue.length > 0) {\n const current = queue.shift();\n result.push(current);\n \n const currentNeighbors = neighbors[current] || [];\n for (const neighbor of currentNeighbors) {\n indegree[neighbor]--;\n if (indegree[neighbor] === 0) {\n queue.push(neighbor);\n }\n }\n }\n \n return result;\n };\n \n let maxGroupId = m;\n for (let item = 0; item < n; item++) {\n if (group[item] === -1) {\n group[item] = maxGroupId;\n maxGroupId++;\n }\n }\n \n const itemIndegree = Array.from({length: n}, () => 0);\n const groupIndegree = Array.from({length: maxGroupId}, () => 0);\n const itemNeighbors = Array.from({length: n}, () => []);\n const groupNeighbors = Array.from({length: maxGroupId}, () => []);\n const groupItems = Array.from({length: maxGroupId}, () => []);\n \n for (let item = 0; item < n; item++) {\n groupItems[group[item]].push(item);\n }\n \n for (let item = 0; item < n; item++) {\n const dependencies = beforeItems[item] || [];\n \n for (const dependency of dependencies) {\n if (group[dependency] !== group[item]) {\n groupIndegree[group[item]]++;\n groupNeighbors[group[dependency]].push(group[item]);\n } else {\n itemIndegree[item]++;\n itemNeighbors[dependency].push(item);\n }\n }\n }\n \n const groups = Array.from({length: maxGroupId}, (_, i) => i);\n const sortedGroups = topologicalSort(groups, groupIndegree, groupNeighbors);\n \n if (sortedGroups.length !== maxGroupId) {\n return [];\n }\n \n const result = [];\n \n for (const groupId of sortedGroups) {\n const items = groupItems[groupId];\n const sorteditems = topologicalSort(items, itemIndegree, itemNeighbors);\n \n if (sorteditems.length !== items.length) {\n return [];\n }\n \n result.push(...sorteditems);\n }\n \n return result;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3190479297","body":"```javascript\n// Time Complexity: O(n), n is moves.length\n// Space Complexity: O(1)\n\n/**\n * @param {string} moves\n * @return {boolean}\n */\nvar judgeCircle = function(moves) {\n let [x, y] = [0, 0];\n\n for (let i = 0; i < moves.length; i++) {\n const action = moves.substring(i, i + 1);\n if (action === 'R') x++;\n if (action === 'L') x--;\n if (action === 'U') y++;\n if (action === 'D') y--;\n }\n\n return x === 0 && y === 0;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193447956","body":"## 題解\n- 一開始使用 Array + Sort 的方法實作,不過由於 Time Complexity 為 O(n^2logn),在資料量 1 <= n <= 10^5 的條件下,會沒辦法 AC\n- 需要將資料結構改成 Min Heap 來降低時間複雜度\n\n```javascript\n// Min Heap\n// Time Complexity: O(nlogn)\n// Space Complexity: O(logn)\n\n/**\n * @param {number[][]} tasks\n * @return {number[]}\n */\nvar getOrder = function (tasks) {\n const indices = Array.from({ length: tasks.length }, (_, i) => i);\n\n indices.sort((a, b) => { return tasks[a][0] - tasks[b][0] });\n\n const minHeap = new PriorityQueue((a, b) => {\n if (tasks[a][1] !== tasks[b][1]) {\n return tasks[a][1] - tasks[b][1];\n }\n return a - b;\n });\n\n const res = [];\n let time = 0;\n let i = 0;\n\n while (!minHeap.isEmpty() || i < tasks.length) {\n while (i < tasks.length && tasks[indices[i]][0] <= time) {\n minHeap.enqueue(indices[i]);\n i++;\n }\n\n if (minHeap.size() === 0) {\n time = tasks[indices[i]][0];\n } else {\n const nextIndex = minHeap.dequeue();\n time += tasks[nextIndex][1];\n res.push(nextIndex);\n }\n }\n\n return res;\n};\n\n// Array + Sort\n// Time Complexity: O(n^2logn)\n// Space Complexity: O(n)\n\n/**\n * @param {number[][]} tasks\n * @return {number[]}\n */\nvar getOrder = function(tasks) {\n tasks = tasks.map((t, i) => [...t, i]);\n tasks.sort((a, b) => a[0] === b[0] ? a[2] - b[2] : a[0] - b[0]);\n\n let i = 0;\n let curTime = 0;\n const queue = [];\n const res = [];\n\n while (i < tasks.length || queue.length) {\n while (i < tasks.length && tasks[i][0] <= curTime) {\n queue.push(tasks[i]);\n queue.sort((a, b) => a[1] === b[1] ? a[2] - b[2] : a[1] - b [1]);\n i++;\n }\n\n if (!queue.length) {\n curTime = tasks[i][0];\n } else {\n const curTask = queue.shift();\n res.push(curTask[2]);\n curTime += curTask[1];\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194091917","body":"```javascript\n// Time Complexity: O(1)\n// Space Complexity: O(1)\n\n/**\n * @param {string} loginTime\n * @param {string} logoutTime\n * @return {number}\n */\nvar numberOfRounds = function(loginTime, logoutTime) {\n const getMinSum = (time, carry) => {\n let [hour, min] = time.split(':').map(s => Number(s));\n const remainer = min % 15;\n const q = (min - remainer) / 15;\n\n if (!carry) {\n return (hour * 60) + min;\n } else if (remainer && carry === 'ceil') {\n return (hour * 4 + q + 1) * 15;\n } else {\n return (hour * 4 + q) * 15;\n }\n };\n\n let [loginMinSum, logoutMinSum] = [getMinSum(loginTime, 'ceil'), getMinSum(logoutTime, 'floor')];\n\n if (getMinSum(loginTime) > getMinSum(logoutTime)) {\n logoutMinSum += 24 * 60;\n }\n\n return Math.max((logoutMinSum - loginMinSum) / 15, 0)\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3196057927","body":"## 題解\n- 原本想針對三種狀況,直接找 a 和 b 中最符合的 char 來做計算,但會發現很多 edge case 要考量,要一直修正\n- 看題解之後,在有限的解空間中(頂多常數 26),枚舉的確是一個簡單、可讀性更好的做法\n\n```javascript\n// Time Complexity: O(n + m), n is a.length, m is b.length\n// Space Complexity: O(26)\n\n/**\n * @param {string} a\n * @param {string} b\n * @return {number}\n */\nvar minCharacters = function(a, b) {\n const createCounter = (str) => {\n const counter = {};\n\n for (let i = 0; i < 26; i++) {\n counter[String.fromCharCode(97 + i)] = 0;\n }\n\n for (const char of str) {\n counter[char]++;\n }\n return counter;\n };\n \n const ca = createCounter(a);\n const cb = createCounter(b);\n\n const greaterCost = (ca, cb) => {\n let ans = Infinity;\n\n for (let i = 1; i < 26; i++) {\n let count = 0;\n \n for (let j = 0; j < i; j++) {\n count += ca[String.fromCharCode(97 + j)];\n }\n \n for (let j = i; j < 26; j++) {\n count += cb[String.fromCharCode(97 + j)];\n }\n ans = Math.min(ans, count);\n }\n return ans;\n };\n \n const equalCost = (ca, cb) => {\n let ans = Infinity;\n for (let i = 0; i < 26; i++) {\n const char = String.fromCharCode(97 + i);\n ans = Math.min(ans, a.length + b.length - ca[char] - cb[char]);\n }\n return ans;\n };\n \n return Math.min(\n greaterCost(ca, cb),\n greaterCost(cb, ca),\n equalCost(ca, cb)\n );\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3199125049","body":"## 題解\n- 直覺就是用快速排序來做,不過實踐上,這次發現 partition 有兩種方法可以做:hoarePartition、lomutoPartition。其中 lomutoPartition 普遍認為較簡單,但因為交換數值的次數較多,會遇到 TLE,因此此題需用 hoarePartition 來做。\n\n```javascript\nconst lomutoPartition = (nums, left, right) => {\n const pivot = nums[right];\n let i = left - 1;\n\n for (let j = left; j < right; j++) {\n if (nums[j] <= pivot) {\n i++;\n [nums[i], nums[j]] = [nums[j], nums[i]];\n }\n }\n\n i++;\n [nums[i], nums[right]] = [nums[right], nums[i]];\n\n return i;\n};\n\nconst hoarePartition = (nums, left, right) => {\n const p = left + ((right - left) >>> 1);\n const pivot = nums[p];\n let [i, j] = [left, right];\n\n while (i <= j) {\n while (nums[i] < pivot) i++;\n while (nums[j] > pivot) j--;\n if (i <= j) {\n [nums[i], nums[j]] = [nums[j], nums[i]];\n i++;\n j--;\n }\n }\n\n return [i, j];\n};\n\nconst quickSort = (nums, left, right) => {\n // if (left < right) {\n // const p = lomutoPartition(nums, left, right);\n // quickSort(nums, left, p - 1);\n // quickSort(nums, p + 1, right);\n // }\n\n if (left < right) {\n const [i, j] = hoarePartition(nums, left, right);\n quickSort(nums, left, j);\n quickSort(nums, i, right);\n }\n};\n\n// Time Complexity: O(nlogn), n is nums.length\n// Space Complexity: O(logn)\n\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar sortArray = function (nums) {\n quickSort(nums, 0, nums.length - 1);\n return nums;\n};\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204182883","body":"```javascript\n// Time Complexity: O(logn)\n// Space Complexity: O(1)\n\n/**\n * @param {number} x\n * @return {number}\n */\nvar mySqrt = function(x) {\n let res = 0;\n let l = 0;\n let r = x;\n\n while (l <= r) {\n const m = l + ((r - l) >>> 2);\n\n if (m * m > x) {\n r = m - 1;\n } else {\n res = m;\n l = m + 1;\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3209343494","body":"## 題解\n- 可以將這題轉化成「尋找最左邊符合條件者」,即可套入模板\n\n```javascript\n// Time Complexity: O(logn)\n// Space Complexity: O(1)\n\n/**\n * Definition for isBadVersion()\n * \n * @param {integer} version number\n * @return {boolean} whether the version is bad\n * isBadVersion = function(version) {\n * ...\n * };\n */\n\n/**\n * @param {function} isBadVersion()\n * @return {function}\n */\nvar solution = function(isBadVersion) {\n /**\n * @param {integer} n Total versions\n * @return {integer} The first bad version\n */\n return function(n) {\n let [l, r] = [1, n];\n\n while (l <= r) {\n const m = l + ((r - l) >>> 2);\n\n if (isBadVersion(m)) {\n r = m - 1;\n } else {\n l = m + 1;\n }\n }\n\n return l;\n };\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/42#issuecomment-3212999531","body":"## 題解\n- 二分:對於每一個元素前者排序,並找到大於 a * 2 者(重複 a * 2 的右界)。需注意是,應在每次加入新元素時,直接尋找其應該插入的位置,而非將整個陣列排序,不然會 TLE。\n\n```javascript\nclass SortedList {\n constructor() {\n this.arr = [];\n }\n\n bisectRight(target) {\n let [l, r] = [0, this.arr.length - 1];\n\n while (l <= r) {\n const mid = l + ((r - l) >>> 1);\n\n if (this.arr[mid] <= target) {\n l = mid + 1;\n } else {\n r = mid - 1;\n }\n }\n\n return l;\n }\n \n push(value) {\n const pos = this.bisectRight(value);\n this.arr.splice(pos, 0, value);\n }\n \n get length() {\n return this.arr.length;\n }\n}\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar reversePairs = function(nums) {\n const sortedRunningNums = new SortedList();\n sortedRunningNums.push(nums[0]);\n let ans = 0;\n\n for (let i = 1; i < nums.length; i++) {\n ans += (i - sortedRunningNums.bisectRight(nums[i] * 2));\n sortedRunningNums.push(nums[i]);\n }\n\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3216534944","body":"## 題解\n- 依序遍歷 houses,尋找每個 house 與 heater 最近距離,最大者為答案。其中尋找最近距離的實踐,可以使用 bisectRight 來做\n\n```javascript\n// Time Complexity: O(nlog m + mlog m), n is houses.length, m is heaters.length\n// Space Complexity: O(1)\n\nconst getHouseHeaterMinDistance = (house, heaters) => {\n if (heaters.length === 0) return Infinity;\n if (heaters.length === 1) return Math.abs(house - heaters[0]);\n\n let [l, r] = [0, heaters.length - 1];\n\n while (l <= r) {\n const m = l + ((r - l) >>> 1);\n\n if (house === heaters[m]) {\n return 0;\n } else if (house > heaters[m]) {\n l = m + 1;\n } else {\n r = m - 1;\n };\n }\n\n const leftDistance = l === 0 ? Infinity : house - heaters[l - 1];\n const rightDistance = r === heaters.length - 1 ? Infinity : heaters[l] - house;\n\n return Math.min(leftDistance, rightDistance);\n};\n\n/**\n * @param {number[]} houses\n * @param {number[]} heaters\n * @return {number}\n */\nvar findRadius = function(houses, heaters) {\n heaters.sort((a, b) => a - b);\n\n let maxRadius = 0;\n\n for (const house of houses) {\n const minDistance = getHouseHeaterMinDistance(house, heaters);\n maxRadius = Math.max(maxRadius, minDistance);\n }\n\n return maxRadius;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3217908480","body":"## 題解\n- 計數二分經典的題目,排序後解空間為 0 至 nums[lnums.ength - 1] - nums[0]\n\n```javascript\n// Time Complexity: O(nlogn)\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number}\n */\nvar smallestDistancePair = function(nums, k) {\n nums.sort((a, b) => a - b);\n\n const countDistanceNotGreaterThan = (maxDistance) => {\n let count = 0;\n let l = 0;\n\n for (let r = 1; r < nums.length; r++) {\n while (nums[r] - nums[l] > maxDistance) {\n l++;\n }\n\n count += r - l;\n }\n\n return count;\n };\n\n let [l, r] = [0, nums[nums.length - 1] - nums[0]];\n\n while (l <= r) {\n const m = l + ((r - l) >>> 1);\n\n if (countDistanceNotGreaterThan(m) >= k) {\n r = m - 1;\n } else {\n l = m + 1;\n }\n }\n\n return l;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3218836123","body":"## 題解\n- 用二分在解空間 [0, maxElevation] 中尋找答案,對於每個可能的 m,再 dns 尋找可能路徑\n- 需注意因為 dns 時多了 grid[ni][nj] <= elevation 的條件,不需重置 visited[i][j],因為就算從其他點進來該點,依舊會沒辦法繼續走下去,與尋找所有路徑的 dns 略有不同\n\n```javascript\n// Time Complexity: O(n^2logn)\n// Space Complexity: O(n^2)\n\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar swimInWater = function(grid) {\n const n = grid.length;\n\n const maxElevation = (() => {\n let e = 0;\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n e = Math.max(e, grid[i][j]);\n }\n }\n return e;\n })();\n\n const canReachBottomRight = (elevation) => {\n const visited = Array.from({ length: n}).map(() => Array.from({ length: n }).map(() => false));\n\n const dns = (i, j) => {\n if (i === n - 1 && j === n - 1) return true;\n\n visited[i][j] = true;\n\n const directions = [[0, 1], [1, 0], [0, -1], [-1, 0]];\n\n for (const [di, dj] of directions) {\n const ni = i + di;\n const nj = j + dj;\n\n if (ni >= 0 && ni < n && nj >= 0 && nj < n) {\n if (!visited[ni][nj] && grid[ni][nj] <= elevation) {\n if (dns(ni, nj)) return true;\n }\n }\n }\n\n // visited[i][j] = false;\n\n return false;\n };\n\n if (grid[0][0] <= elevation) return dns(0, 0);\n else return false;\n };\n\n let l = 0;\n let r = maxElevation;\n\n while (l <= r) {\n const m = l + ((r - l) >>> 1);\n\n if (canReachBottomRight(m)) {\n r = m - 1;\n } else {\n l = m + 1;\n }\n }\n\n return l;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3222489820","body":"## 題解\n- 典型的 sliding window 題型\n\n```javascript\n// Time Complexity: O(n)\n// Space Complexity: O(1)\n\n/**\n * @param {string} s\n * @param {number} k\n * @return {number}\n */\nvar maxVowels = function(s, k) {\n const vowel = 'aeiou';\n let l = 0;\n let r = 0;\n let cur = 0;\n let max = cur;\n\n while (r < s.length) {\n if (vowel.includes(s.charAt(r))) cur++;\n r++;\n\n if (r - l > k) {\n if (vowel.includes(s.charAt(l))) cur--;\n l++;\n }\n\n max = Math.max(max, cur);\n }\n\n return max;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3226683449","body":"```javascript\n// Time Complexity: O(k + maxPts)\n// Space Complexity: O(k + maxPts)\n\n/**\n * @param {number} n\n * @param {number} k\n * @param {number} maxPts\n * @return {number}\n */\nvar new21Game = function(n, k, maxPts) {\n const dp = Array.from({ length: k + maxPts }).map(() => 0);\n let sum = 0;\n\n for (let i = k; i < k + maxPts; i++) {\n if (i <= n) dp[i] = 1;\n sum += dp[i];\n }\n\n for (let j = k - 1; j >= 0; j--) {\n dp[j] = sum / maxPts;\n sum -= dp[j + maxPts];\n sum += dp[j];\n }\n\n return dp[0];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3234016259","body":"```javascript\n// Time Complexity: O(n), n is s.length\n// Space COmplexity: O(1)\n\n/**\n * @param {string} s\n * @param {string} p\n * @return {number[]}\n */\nfunction findAnagrams(s, p) {\n function arraysEqual(arr1, arr2) {\n for (let i = 0; i < 26; i++) {\n if (arr1[i] !== arr2[i]) return false;\n }\n return true;\n }\n\n const result = [];\n const sLen = s.length;\n const pLen = p.length;\n \n if (sLen < pLen) return result;\n \n const pCount = new Array(26).fill(0);\n const windowCount = new Array(26).fill(0);\n \n for (let i = 0; i < pLen; i++) {\n pCount[p.charCodeAt(i) - 97]++;\n }\n \n let left = 0;\n \n for (let right = 0; right < sLen; right++) {\n const rightIndex = s.charCodeAt(right) - 97;\n windowCount[rightIndex]++;\n \n if (right - left + 1 > pLen) {\n const leftIndex = s.charCodeAt(left) - 97;\n windowCount[leftIndex]--;\n left++;\n }\n \n if (right - left + 1 === pLen) {\n if (arraysEqual(windowCount, pCount)) {\n result.push(left);\n }\n }\n }\n \n return result;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3237104151","body":"```javascript\n// Time Complexity: O(n + m), n is s.length, m is t.length\n// Space Complexity: O(k), k is different char count in t\n\n/**\n * @param {string} s\n * @param {string} t\n * @return {string}\n */\nfunction minWindow(s, t) {\n let l = 0;\n const counter = {};\n const N = s.length;\n const ct = {};\n \n for (let char of t) {\n ct[char] = (ct[char] || 0) + 1;\n }\n \n let k = 0;\n let ret = Infinity;\n let ans = \"\";\n \n for (let r = 0; r < N; r++) {\n counter[s[r]] = (counter[s[r]] || 0) + 1;\n \n if (s[r] in ct && counter[s[r]] === ct[s[r]]) {\n k++;\n }\n \n while (k === Object.keys(ct).length) {\n if (r - l + 1 < ret) {\n ans = s.substring(l, r + 1);\n ret = r - l + 1;\n }\n \n counter[s[l]]--;\n if (s[l] in ct && counter[s[l]] === ct[s[l]] - 1) {\n k--;\n }\n l++;\n }\n }\n \n return ans;\n}\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/51#issuecomment-3239924106","body":"```javascript\n// Time Complexity: O(1)\n// Space Complexity: O(1)\n\n/**\n * @param {number} turnedOn\n * @return {string[]}\n */\nvar readBinaryWatch = function(turnedOn) {\n const countBits = (num) => {\n let count = 0;\n while (num) {\n count += num & 1;\n num >>= 1;\n }\n return count;\n };\n\n const res = [];\n\n for (let hour = 0; hour < 12; hour++) {\n for (let minute = 0; minute < 60; minute++) {\n if ((countBits(hour) + countBits(minute)) === turnedOn) {\n const formattedMinute = minute < 10 ? `0${minute}` : `${minute}`\n res.push(`${hour}:${formattedMinute}`);\n }\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3240825737","body":"```javascript\n// Time Complexity: O(n!)\n// Space Complexity: O(n)\n\n/**\n * @param {number} n\n * @return {number}\n */\nvar totalNQueens = function(n) {\n let count = 0;\n\n const backtrack = (row, cols, dias1, dias2) => {\n if (row === n) {\n count++;\n return;\n }\n\n let availablePostions = ((1 << n) - 1) & (~(cols | dias1 | dias2));\n\n while (availablePostions) {\n const position = availablePostions & (-availablePostions);\n availablePostions &= availablePostions - 1;\n\n backtrack(\n row + 1,\n cols | position,\n (dias1 | position) << 1,\n (dias2 | position) >> 1,\n );\n }\n };\n\n backtrack(0, 0, 0, 0);\n\n return count;\n};\n\n// Time Complexity: O(n!)\n// Space Complexity: O(n)\n\n/**\n * @param {number} n\n * @return {number}\n */\nvar totalNQueens = function(n) {\n let count = 0;\n const cols = new Array(n).fill(false);\n const dias1 = new Array(2 * n - 1).fill(false); // row - col\n const dias2 = new Array(2 * n - 1).fill(false); // row + col\n\n const backtrack = (row) => {\n if (row === n) {\n count++;\n return;\n }\n\n for (let col = 0; col < n; col++) {\n const d1 = row - col + n - 1;\n const d2 = row + col;\n\n if (cols[col] || dias1[d1] || dias2[d2]) continue;\n\n cols[col] = dias1[d1] = dias2[d2] = true;\n backtrack(row + 1);\n cols[col] = dias1[d1] = dias2[d2] = false;\n }\n };\n\n backtrack(0);\n\n return count;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3245083899","body":"## 題解\n- 遍歷每個 (i, j) 進行 dfs,遇到邊界或 grid[i][j] === 0 者即返回 0,反之則返回 1 加四個方向 dns 的結果\n- 優化:訪問過者可將原 grid[i][j] 改成 0,如此便不需要重新宣告一個空間來存取\n\n```javascript\n// Time Complexity: O(m * n)\n// Space Complexity: O(m * n)\n\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar maxAreaOfIsland = function(grid) {\n const [m, n] = [grid.length, grid[0].length];\n const direction = [[1, 0], [-1, 0], [0, 1], [0, -1]];\n let max = 0;\n\n const dfs = (x, y) => {\n if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y]) {\n grid[x][y] = 0;\n\n let area = 1;\n\n for (const [dx, dy] of direction) {\n area += dfs(x + dx, y + dy);\n }\n\n return area;\n }\n\n return 0;\n };\n\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n max = Math.max(max, dfs(i, j));\n }\n }\n\n return max;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3249843138","body":"```javascript\n// Time Complexity: O(n^2)\n// Space Complexity: O(n^2)\n\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nfunction maxDistance(grid) {\n const n = grid.length;\n const queue = [];\n \n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n if (grid[i][j] === 1) {\n queue.push([i, j, 0]);\n }\n }\n }\n \n if (queue.length === 0 || queue.length === n * n) {\n return -1;\n }\n \n const directions = [[0, 1], [1, 0], [0, -1], [-1, 0]];\n let maxDist = 0;\n \n while (queue.length > 0) {\n const [x, y, dist] = queue.shift();\n maxDist = Math.max(maxDist, dist);\n \n for (const [dx, dy] of directions) {\n const nx = x + dx;\n const ny = y + dy;\n \n if (nx >= 0 && nx < n && ny >= 0 && ny < n && grid[nx][ny] === 0) {\n grid[nx][ny] = 1;\n queue.push([nx, ny, dist + 1]);\n }\n }\n }\n \n return maxDist;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3251291240","body":"```javascript\n// Time Complexity: O(n + k), n is candies.length, k is number of keys\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} status\n * @param {number[]} candies\n * @param {number[][]} keys\n * @param {number[][]} containedBoxes\n * @param {number[]} initialBoxes\n * @return {number}\n */\nvar maxCandies = function(status, candies, keys, containedBoxes, initialBoxes) {\n const boxes = new Set(initialBoxes);\n const q = [];\n \n for (const i of boxes) {\n if (status[i]) {\n q.push(i);\n }\n }\n \n for (let idx = 0; idx < q.length; idx++) {\n const i = q[idx];\n \n for (const j of containedBoxes[i]) {\n boxes.add(j);\n if (status[j]) {\n q.push(j);\n }\n }\n \n for (const j of keys[i]) {\n if (status[j] === 0 && boxes.has(j)) {\n q.push(j);\n }\n status[j] = 1;\n }\n }\n \n return q.reduce((sum, i) => sum + candies[i], 0);\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/56#issuecomment-3258808498","body":"```javascript\n// Time Complexity: O(nlogn), n is the number of tree.\n// Space Complexity: O(n), n is the number of tree.\n\n// /**\n// * Definition for a binary tree node.\n// * function TreeNode(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// /**\n// * @param {TreeNode} root\n// * @return {number[][]}\n// */\nvar verticalTraversal = function(root) {\n const map = {};\n\n const traverse = (root, row, col) => {\n if (!root) return;\n\n if (!map[col]) {\n map[col] = [];\n }\n\n map[col].push([row, root.val]);\n traverse(root.left, row + 1, col - 1);\n traverse(root.right, row + 1, col + 1);\n };\n\n traverse(root, 0, 0);\n\n const keys = Object.keys(map).sort((a, b) => a - b);\n\n const res = keys.map((k) => {\n const arr = map[k];\n\n return arr.sort(([rowA, valA], [rowB, valB]) => {\n if (rowA === rowB) return valA - valB;\n return rowA - rowB;\n }).map(([,val]) => val);\n });\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/57#issuecomment-3262161616","body":"## 題解\n- 重點是找到 dp 的關鍵核心 d[i] = Math.min(d[i - 1] + cost[i], d[i - 2] + cost[i]);\n- 需注意 cost[i] 為空值的情況\n\n```javascript\n// Time Complexity: O(n)\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} cost\n * @return {number}\n */\nvar minCostClimbingStairs = function(cost) {\n const n = cost.length;\n const d = [];\n\n d[0] = cost[0];\n d[1] = Math.min(d[0] + cost[1], cost[1]);\n\n for (let i = 2; i <= n; i++) {\n const c = cost[i] ?? 0;\n d[i] = Math.min(d[i - 1] + c, d[i - 2] + c);\n }\n\n return d[n];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/58#issuecomment-3263843103","body":"## 解題\n- 一樣需要去辨認 dp 的關係式,d[i] = Math.max(d[i - 1], d[i - 2] + nums[i])\n- 需要特別注意 n 為 1, 2 的 edge case \n\n```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar rob = function(nums) {\n const n = nums.length;\n\n if (n === 1) return nums[0];\n if (n === 2) return Math.max(nums[0], nums[1]);\n\n const d = [];\n\n d[0] = nums[0];\n d[1] = Math.max(nums[0], nums[1]);\n\n for (i = 2; i < n; i++) {\n d[i] = Math.max(d[i - 1], d[i - 2] + nums[i])\n }\n\n return d[n - 1];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/59#issuecomment-3266927805","body":"```javascript\n// Time Complexity: O(n^2), n is nums.length\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar findNumberOfLIS = function(nums) {\n const n = nums.length;\n const dp = Array(n).fill(null).map(() => [1, 1]);\n let longest = 1;\n \n for (let i = 0; i < n; i++) {\n for (let j = i + 1; j < n; j++) {\n if (nums[j] > nums[i]) {\n if (dp[i][0] + 1 > dp[j][0]) {\n dp[j][0] = dp[i][0] + 1;\n dp[j][1] = dp[i][1];\n longest = Math.max(longest, dp[j][0]);\n } else if (dp[i][0] + 1 === dp[j][0]) {\n dp[j][1] += dp[i][1];\n }\n }\n }\n }\n \n return dp.reduce((sum, [length, count]) => {\n return length === longest ? sum + count : sum;\n }, 0);\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3270111521","body":"```javascript\n// Time Complexity: O(n^2)\n// Space Complexity: O(n)\n\n/**\n * @param {string} text1\n * @param {string} text2\n * @return {number}\n */\nvar longestCommonSubsequence = function(text1, text2) {\n const [n, m] = [text1.length, text2.length];\n const dp = Array.from({ length: n + 1 }).map(() => new Array(m + 1).fill(0));\n let res = 0;\n\n for (let i = 1; i <= n; i++) {\n for (let j = 1; j <= m; j++) {\n if (text1.charAt(i - 1) === text2.charAt(j - 1)) {\n dp[i][j] = dp[i - 1][j - 1] + 1;\n res = Math.max(res, dp[i][j]);\n } else {\n dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);\n }\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/61#issuecomment-3273250794","body":"## 題解\n- dp 的遞增式為 `d[i][j] = d[i - 1][j] + d[i][j - 1];`,意思是,dp[i][j] 表示能到達該格子的路線數量,其為 d[i - 1][j] 和 d[i][j - 1] 的總和(從其左或其上格子來)\n- 其中需注意當 i 或 j 為 0,即最上或最左列的格子,其 d[i][j] 值為 1,因為只可能從其上或其左格子而來\n\n```javascript\n// Time Complexity: O(m * n)\n// Space Complexity: O(m * n)\n\n/**\n * @param {number} m\n * @param {number} n\n * @return {number}\n */\nvar uniquePaths = function(m, n) {\n const d = Array.from({ length: m }).map(() => new Array(n).fill(1));\n\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n if (i !== 0 && j !== 0) {\n d[i][j] = d[i - 1][j] + d[i][j - 1];\n }\n }\n }\n\n return d[m - 1][n - 1];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/62#issuecomment-3279921315","body":"```javascript\n// Time Complexity: O(n^2 * k)\n// Space Complexity: O(n^2)\n\n/**\n * @param {number} n\n * @param {number} k\n * @param {number} row\n * @param {number} column\n * @return {number}\n */\nvar knightProbability = function(n, k, row, column) {\n let dp = Array.from({ length: n }, () => new Array(n).fill(0));\n const directions = [[2, 1], [1, 2], [-1, 2], [-2, 1], [-2, -1], [-1, -2], [1, -2], [2, -1]];\n\n dp[row][column] = 1;\n\n for (let step = 0; step < k; step++) {\n let dpTemp = Array.from({ length: n }, () => new Array(n).fill(0));\n\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n for (const [dx, dy] of directions) {\n const [px, py] = [i - dx, j - dy];\n\n if (px >= 0 && px < n && py >= 0 && py < n) {\n dpTemp[i][j] += dp[px][py] * 0.125;\n }\n }\n }\n }\n\n dp = dpTemp;\n }\n\n let sumProp = 0;\n\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n sumProp += dp[i][j];\n }\n }\n\n return sumProp;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/63#issuecomment-3285364984","body":"```javascript\n/**\n * @param {number} maxChoosableInteger\n * @param {number} desiredTotal\n * @return {boolean}\n */\nvar canIWin = function(maxChoosableInteger, desiredTotal) {\n if (maxChoosableInteger >= desiredTotal) {\n return true;\n }\n \n const totalSum = (maxChoosableInteger * (maxChoosableInteger + 1)) / 2;\n if (totalSum < desiredTotal) {\n return false;\n }\n \n const memo = new Map();\n \n const dfs = (used, currentSum) => {\n if (memo.has(used)) {\n return memo.get(used);\n }\n \n for (let i = 1; i <= maxChoosableInteger; i++) {\n const bit = 1 << (i - 1);\n \n if ((used & bit) === 0) {\n if (currentSum + i >= desiredTotal) {\n memo.set(used, true);\n return true;\n }\n \n if (!dfs(used | bit, currentSum + i)) {\n memo.set(used, true);\n return true;\n }\n }\n }\n \n memo.set(used, false);\n return false;\n };\n \n return dfs(0, 0);\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/64#issuecomment-3288487076","body":"```javascript\n// Time Complexity: O(n * k), n is nums.length, k is sum of nums / 2\n// Space Complexity: O(n * k)\n\n/**\n * @param {number[]} nums\n * @return {boolean}\n */\nvar canPartition = function (nums) {\n let sum = nums.reduce((acc, num) => acc + num, 0);\n\n if (sum % 2) return false;\n else sum = sum / 2;\n\n const dp = Array.from(nums).map(() => Array.from({ length: sum + 1 }).fill(false));\n\n for (let i = 0; i < nums.length; i++) {\n dp[i][0] = true;\n }\n\n for (let i = 0; i < dp.length - 1; i++) {\n for (let j = 0; j < dp[0].length; j++) {\n dp[i + 1][j] = j - nums[i] >= 0 ? dp[i][j] || dp[i][j - nums[i]] : dp[i][j];\n }\n }\n\n return dp[nums.length - 1][sum];\n};\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289632643","body":"```javascript\n// Time Complexity: O(n * k), n is nums.length, k is sum of nums\n// Space Complexity: O(k)\n\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar findTargetSumWays = function(nums, target) {\n const total = nums.reduce((sum, num) => sum + num, 0);\n \n if (Math.abs(target) > total || (total + target) % 2 !== 0) {\n return 0;\n }\n \n const sum = (total + target) / 2;\n const dp = new Array(sum + 1).fill(0);\n dp[0] = 1;\n \n for (const num of nums) {\n for (let j = sum; j >= num; j--) {\n dp[j] += dp[j - num];\n }\n }\n \n return dp[sum];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/66#issuecomment-3292845699","body":"```javascript\n/**\n * @param {number[]} coins\n * @param {number} amount\n * @return {number}\n */\nvar coinChange = function(coins, amount) {\n const dp = new Array(amount + 1).fill(Infinity);\n\n dp[0] = 0;\n\n for (i = 1; i <= amount; i += 1) {\n for (const coin of coins) {\n if (i - coin >= 0 && dp[i - coin] !== Infinity) {\n dp[i] = Math.min(dp[i - coin] + 1, dp[i]);\n }\n }\n }\n\n return dp[amount] === Infinity ? -1 : dp[amount];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3297467048","body":"```javascript\n// Time Complexity: O(n * m), n is amount, m is coins.length\n// Space Complexity: O(n)\n\n/**\n * @param {number} amount\n * @param {number[]} coins\n * @return {number}\n */\nvar change = function(amount, coins) {\n const dp = new Array(amount + 1).fill(0);\n dp[0] = 1;\n\n for (const coin of coins) {\n for (let i = coin; i <= amount; i++) {\n dp[i] += dp[i - coin];\n }\n }\n \n return dp[amount];\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/68#issuecomment-3303059077","body":"## 題解\n- 先排序,以 g[j] 為主,遍歷符合的 s[i]\n```javascript\n// Time Complexity: O(nlogn + mlogm), n is g.length, m is s.length\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} g\n * @param {number[]} s\n * @return {number}\n */\nvar findContentChildren = function(g, s) {\n g.sort((a, b) => a - b);\n s.sort((a, b) => a - b);\n\n let [i, j] = [0, 0];\n let ans = 0;\n\n while (i < s.length && j < g.length) {\n if (s[i] >= g[j]) {\n ans++;\n j++;\n }\n\n i++;\n }\n\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/69#issuecomment-3307711246","body":"```javascript\n// Time Complexity: O(nlogn)\n// Space Complexity: O(1)\n\n/**\n * @param {number[][]} intervals\n * @return {number}\n */\nfunction eraseOverlapIntervals(intervals) {\n if (intervals.length <= 1) return 0;\n \n intervals.sort((a, b) => a[1] - b[1]);\n \n let count = 0;\n let end = intervals[0][1];\n \n for (let i = 1; i < intervals.length; i++) {\n if (intervals[i][0] < end) {\n count++;\n } else {\n end = intervals[i][1];\n }\n }\n \n return count;\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/70#issuecomment-3311687568","body":"```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(1)\n/**\n * @param {number[]} nums\n * @return {boolean}\n */\nvar canJump = function (nums) {\n let max = 0;\n\n for (let i = 0; i < nums.length; i++) {\n if (max < i) return false;\n\n max = Math.max(nums[i] + i, max);\n }\n\n return max >= nums.length - 1;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/71#issuecomment-3314986282","body":"```javascript\n// Time Complexity: O(n^2)\n// Space Complexity: O(n)\n\n/**\n * @param {number} n\n * @return {number}\n */\nconst memories = {};\nvar numTrees = function(n) {\n if (memories[n] !== undefined) return memories[n];\n if (n <= 1) return 1;\n\n let ans = 0;\n\n for (let i = 1; i <= n; i++) {\n ans += numTrees(i - 1) * numTrees(n - i);\n }\n\n memories[n] = ans;\n\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/72#issuecomment-3316043984","body":"```javascript\n// Time Complexity: O(nlogk), n is total number of nodes across all lists, k is number of lists\n// Space Complexity: O(1)\n\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode[]} lists\n * @return {ListNode}\n */\nvar mergeKLists = function(lists) {\n if (!lists || lists.length === 0) return null;\n \n while (lists.length > 1) {\n let mergedLists = [];\n \n for (let i = 0; i < lists.length; i += 2) {\n let l1 = lists[i];\n let l2 = i + 1 < lists.length ? lists[i + 1] : null;\n mergedLists.push(mergeTwoLists(l1, l2));\n }\n \n lists = mergedLists;\n }\n \n return lists[0];\n};\n\nfunction mergeTwoLists(l1, l2) {\n let dummy = new ListNode(0);\n let current = dummy;\n \n while (l1 && l2) {\n if (l1.val <= l2.val) {\n current.next = l1;\n l1 = l1.next;\n } else {\n current.next = l2;\n l2 = l2.next;\n }\n current = current.next;\n }\n \n current.next = l1 || l2;\n return dummy.next;\n}\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/74#issuecomment-3324003764","body":"```javascript\n// Time Complexity: O(n), n is nums.length\n// Space Complexity: O(1)\n\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar singleNumber = function(nums) {\n let bitmask = 0;\n\n for (let n of nums) {\n bitmask ^= n;\n }\n\n bitmask &= -bitmask;\n\n const ans = [0, 0];\n\n for (let n of nums) {\n if ((n & bitmask) === 0) ans[0] ^= n;\n else ans[1] ^= n;\n }\n\n return ans;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/75#issuecomment-3327535650","body":"```javascript\n// Time Complexity: O(n * 2^n)\n// Space Complexity: O(n)\n\n/**\n * @param {number[]} nums\n * @return {number[][]}\n */\nfunction subsets(nums) {\n const result = [];\n \n function backtrack(start, current) {\n result.push([...current]);\n \n for (let i = start; i < nums.length; i++) {\n current.push(nums[i]);\n backtrack(i + 1, current);\n current.pop();\n }\n }\n \n backtrack(0, []);\n return result;\n}\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/77#issuecomment-3338173897","body":"```javascript\n// Time Complexity\n// - insert: O(k), k is key.length\n// - searchValue: O(k), k is key.length\n// - sum: O(p), p is prefix.length\n\n// Space Complexity: O(n * m), n is the number of unique keys inserted, m is the average length of the keys\n\nclass MapSum {\n constructor() {\n this.root = new TrieNode();\n }\n \n insert(key, val) {\n let temp = this.root;\n \n let oldVal = this.searchValue(key);\n \n for (let i = 0; i < key.length; i++) {\n if (temp.children[key.charCodeAt(i) - 97] == null)\n temp.children[key.charCodeAt(i) - 97] = new TrieNode();\n \n temp = temp.children[key.charCodeAt(i) - 97];\n \n temp.count = temp.count - oldVal + val;\n }\n \n temp.val = val;\n temp.isWord = true;\n }\n\n searchValue(key) {\n let temp = this.root;\n for (let i = 0; i < key.length; i++) {\n if (temp.children[key.charCodeAt(i) - 97] == null)\n return 0;\n \n temp = temp.children[key.charCodeAt(i) - 97];\n }\n \n return temp.isWord ? temp.val : 0;\n }\n\n sum(prefix) {\n let temp = this.root;\n \n for (let i = 0; i < prefix.length; i++) {\n if (temp.children[prefix.charCodeAt(i) - 97] == null)\n return 0;\n \n temp = temp.children[prefix.charCodeAt(i) - 97];\n }\n \n return temp.count;\n }\n}\n\nclass TrieNode {\n constructor() {\n this.count = 0;\n this.children = new Array(26);\n this.isWord = false;\n this.val = 0;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/78#issuecomment-3341802963","body":"```javascript\n// Time Complexity: O(n*m + b*b + n)\n// - Building Trie: O(n*m) where n = number of smalls, m = average length of smalls\n// - Searching: O(b*b) where b = length of big string (worst case: check every position against every possible substring)\n// - Converting result: O(n)\n\n// Space Complexity: O(n*m + n*k)\n// - Trie storage: O(n*m) for storing all small strings\n// - Result storage: O(n*k) where k = average number of matches per small string\n\n\nclass Node {\n constructor() {\n this.children = new Array(26).fill(null);\n this.isWord = false;\n this.id = 0;\n }\n}\n\nclass Solution {\n constructor() {\n this.root = new Node();\n }\n\n multiSearch(big, smalls) {\n const n = smalls.length;\n const res = Array(n).fill().map(() => []);\n \n for (let i = 0; i < smalls.length; i++) {\n this.insert(smalls[i], i);\n }\n\n for (let i = 0; i < big.length; i++) {\n let tmp = this.root;\n\n for (let j = i; j < big.length; j++) {\n if (tmp.children[big.charCodeAt(j) - 97] === null) {\n break;\n }\n\n tmp = tmp.children[big.charCodeAt(j) - 97];\n\n if (tmp.isWord) {\n res[tmp.id].push(i);\n }\n }\n }\n\n const ret = new Array(n);\n\n for (let i = 0; i < n; i++) {\n ret[i] = new Array(res[i].length);\n for (let j = 0; j < ret[i].length; j++) {\n ret[i][j] = res[i][j];\n }\n }\n\n return ret;\n }\n\n insert(word, id) {\n let tmp = this.root;\n\n for (let i = 0; i < word.length; i++) {\n if (tmp.children[word.charCodeAt(i) - 97] === null) {\n tmp.children[word.charCodeAt(i) - 97] = new Node();\n }\n\n tmp = tmp.children[word.charCodeAt(i) - 97];\n }\n\n tmp.isWord = true;\n tmp.id = id;\n }\n}\n```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/84#issuecomment-3364689816","body":"```javascript\n/**\n * @param {number[]} candidates\n * @param {number} target\n * @return {number[][]}\n */\nvar combinationSum2 = function (candidates, target) {\n const list = [];\n backtrack(\n list,\n [],\n candidates.sort((a, b) => a - b),\n target,\n 0\n );\n return list;\n};\n\nfunction backtrack(list, tempList, nums, remain, start) {\n if (remain < 0) return;\n else if (remain === 0) return list.push([...tempList]);\n for (let i = start; i < nums.length; i++) {\n if (i > start && nums[i] == nums[i - 1]) continue;\n tempList.push(nums[i]);\n backtrack(list, tempList, nums, remain - nums[i], i + 1);\n tempList.pop();\n }\n}\n```","onTime":true},null,null,null,null,null,null,null,null,null,null],"wutxuan":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073568207","body":"第一次思路:将num数组转换为int数字A,计算A+K,将A+K结果转换为List类型,但没有观察数据范围,导致int类型溢出,没有通过全部样例\n第二次思路:从后往前,逐位相加K%10,直到遍历完全部数组,再判断K是否还有,通过全部样例\n第三次思路:看完题解后,学习到了可以将k和某一位看作一个整体,不用每次计算k%10,而是k+num[i]","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3078154786","body":"第一次思路:遍历每个字符,在每个字符上向左向右移动,直到找到字符c,继续遍历下一个字符,但想到时间复杂度一定很高,因此继续想其他方法\n\n第二次思路:先遍历字符串,用List先记录每个字符c的索引。然后遍历字符串每个字符,计算这个字符的位置距离List中位置的最小距离,通过全部用例,时间复杂度O(N*K) N为字符串长度,K为c在字符串中出现的次数\n\n```java\nclass Solution {\n public int[] shortestToChar(String s, char c) {\n List indexList = new ArrayList<>();\n for(int i = 0;i < s.length();i++){\n if(s.charAt(i) == c){\n indexList.add(i);\n }\n }\n\n int[] res = new int[s.length()];\n Arrays.fill(res,10001);\n for(int i = 0;i < res.length;i++){\n for(int index : indexList){\n res[i] = Math.min(res[i],Math.abs(i - index));\n }\n \n }\n return res;\n }\n}\n\n```\n第三次思路:看完题解后,学习到了两次遍历求解,从左到右记录每个字符左侧最近的字符c的距离,记为left数组,从右到左记录每个字符右侧最近的字符c的距离,记为right数组。再遍历一遍整个字符串,在left数组和right数组中取最小值为最终结果。在代码实现时,省去了记录right数组再比较,而是直接比较。时间复杂度O(N)\n```java\nclass Solution {\n public int[] shortestToChar(String s, char c) {\n int index = -s.length();\n int[] left = new int[s.length()];\n for(int i = 0;i < s.length();i++){\n if(s.charAt(i) == c){\n index = i;\n }\n left[i] = i - index;\n }\n\n index = 2 * s.length();\n for(int i = s.length() - 1;i >= 0;i--){\n if(s.charAt(i) == c){\n index = i;\n }\n left[i] = Math.min(left[i],index - i);\n }\n return left;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3083567541","body":"因为要设计的栈有最大长度,因此使用数组来模拟栈。否则使用栈或List来模拟。\n使用数组模拟:使用一个指针变量,指向当前栈顶。入栈时,val存入栈顶处,指针++,出栈时,指针- -,返回栈顶元素。实现inc函数时,只需要对数组中0-k位置的数每个+val即可。通过全部样例\n```java\nclass CustomStack {\n int size = 0; // 指向第一个空位置\n int[] arr;\n\n public CustomStack(int maxSize) {\n arr = new int[maxSize];\n }\n \n public void push(int x) {\n if(size < arr.length){\n arr[size] = x;\n size++;\n }\n }\n \n public int pop() {\n if(size > 0){\n size--;\n return arr[size];\n }else{\n return -1;\n }\n }\n \n public void increment(int k, int val) {\n int cut = Math.min(k,size);\n\n for(int i = 0;i < cut;i++){\n arr[i] += val;\n }\n }\n}\n```\n\n看完题解后学会了前缀和方法:- 因为每次的increment函数都会对栈底[0,k]的数据val操作,而是否val操作了只有在pop时才会体现。所以我们可以通过一个数组incremental记录每个val,即第i位置下面的元素都要加incremental[i]。在pop第i个数的时候加上它需要加的所有val,即incremental[i]。 所以increment函数只需要维护incremental数组。但要记得记得pop后,incremental函数用过的地方要清零,并且得累加到前面一位\n\n```java\nclass CustomStack {\n\n Stack stack;\n int[] incremental;\n\n public CustomStack(int maxSize) {\n stack = new Stack();\n incremental = new int[maxSize];\n }\n \n public void push(int x) {\n if(stack.size() < incremental.length){\n stack.push(x);\n }\n }\n \n public int pop() {\n int cut = stack.size() - 1;\n if(cut < 0) return -1;\n\n int res = stack.pop() + incremental[cut];\n\n if(cut > 0){\n incremental[cut-1] += incremental[cut]; \n }\n incremental[cut] = 0;\n return res;\n\n }\n \n public void increment(int k, int val) {\n int cut = Math.min(k,stack.size())-1;\n if(cut >= 0){\n incremental[cut] += val;\n }\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3089071815","body":"看到有括号,需要对括号匹配,则优先想到栈。遍历字符串,当遇到非】字符时,全部入栈。当遇到】字符时,开始向回看,取出字符c,构成字符串s。再向回看,取出数字x,重复x次字符串s得到字符串ss,再将ss入栈,继续遍历,直到遍历结束。\n \n最后得到的栈,就是存储了最终解码后的字符串。取出栈后记得反转字符串\n```java\nclass Solution {\n public String decodeString(String s) {\n Stack stack = new Stack<>();\n for(int i = 0;i < s.length();i++){\n if(s.charAt(i) == ']'){\n StringBuilder sb = new StringBuilder();\n StringBuilder count = new StringBuilder();\n\n while(!stack.isEmpty() && stack.peek() != '['){\n sb.append(stack.pop());\n } \n sb.reverse();\n stack.pop();\n while(!stack.isEmpty() && stack.peek() >= '0' && stack.peek() <= '9'){\n count.append(stack.pop());\n }\n count.reverse();\n int t = Integer.valueOf(count.toString());\n StringBuilder res = new StringBuilder();\n res.repeat(sb,t);\n\n for(char c : res.toString().toCharArray()){\n stack.push(c);\n }\n \n }else{\n stack.push(s.charAt(i));\n }\n }\n StringBuilder re = new StringBuilder();\n while(!stack.isEmpty()){\n re.append(stack.pop());\n }\n re.reverse();\n return re.toString();\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3095194789","body":"- push操作:输入栈入栈\n- pop操作:如果输出栈不为空,则直接输出输出栈的元素。如果输出栈为空,则把输入栈的数据全部导入到输出栈中\n- peek操作:如果输出栈不为空,则直接peek输出栈的元素。如果输出栈为空,则把输入栈的数据全部导出到输入栈中\n```java\nclass MyQueue {\n Stack stackIn;\n Stack stackOut;\n\n public MyQueue() {\n stackIn = new Stack<>();\n stackOut = new Stack<>();\n }\n \n public void push(int x) {\n stackIn.push(x);\n }\n \n public int pop() {\n refresh();\n return stackOut.pop();\n }\n \n public int peek() {\n refresh();\n return stackOut.peek();\n }\n \n public boolean empty() {\n return stackIn.isEmpty() && stackOut.isEmpty();\n }\n\n public void refresh(){\n if(!stackOut.isEmpty()){\n return;\n }\n while(!stackIn.isEmpty()){\n stackOut.push(stackIn.pop());\n }\n }\n}\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094513644","body":"想象成将原始数组和排序后的数组并列排在一起,切一刀。如果这刀的左侧两个数组的数字出现的频次相同,那么右侧的频次也一定相同。这里就是一个分割点。\n继续向右,有同样情况就切一刀。直到走到最后,一定会切最后一刀。记录的每一个分割点,就是分的组数。\n```java\nclass Solution {\n public int maxChunksToSorted(int[] arr) {\n Map map = new HashMap<>();\n int[] sortedArr = new int[arr.length];\n for(int i = 0;i < arr.length;i++){\n sortedArr[i] = arr[i];\n }\n Arrays.sort(sortedArr);\n\n int res = 0;\n for(int i = 0;i < arr.length;i++){\n map.put(arr[i],map.getOrDefault(arr[i],0) + 1);\n if(map.get(arr[i]) == 0){\n map.remove(arr[i]);\n }\n map.put(sortedArr[i],map.getOrDefault(sortedArr[i],0) - 1);\n if(map.get(sortedArr[i]) == 0){\n map.remove(sortedArr[i]);\n }\n if(map.isEmpty()){\n res++;\n }\n }\n return res;\n }\n}\n```\n因为存在sort排序,时间复杂度O(NlogN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095217604","body":"先将链表连成一个环,再找到需要断开的位置断开即可\n```java\nclass Solution {\n public ListNode rotateRight(ListNode head, int k) {\n if(head == null) return null;\n ListNode dummy = head;\n int count = 1;\n while(dummy.next != null){\n count++;\n dummy = dummy.next;\n }\n dummy.next = head;\n\n k = k % count;\n dummy = head;\n count = count - k;\n for(int i = 1;i < count;i++){\n dummy = dummy.next;\n }\n ListNode res = dummy.next;\n dummy.next = null;\n return res;\n }\n}\n```\n\n因为遍历了链表,时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100949135","body":"因为要交换两个节点,所以需要记录两个节点+两个节点前的节点+两个节点后的节点,一共四个节点。分别用cur,one,two,three记录\n交换完后,cur指向下一组需要交换节点的前一个节点\n```java\nclass Solution {\n public ListNode swapPairs(ListNode head) {\n ListNode dummy = new ListNode(0);\n dummy.next = head;\n ListNode cur = dummy;\n ListNode one = null;\n ListNode two = null;\n ListNode three = null;\n while(cur.next != null && cur.next.next != null)\n {\n one = cur.next;\n two = cur.next.next;\n three = cur.next.next.next;\n cur.next = two;\n cur.next.next = one;\n cur.next.next.next = three;\n cur = cur.next.next;\n }\n return dummy.next;\n }\n}\n```\n遍历了链表,时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3105789931","body":"考验的是二分查找和分治构建二叉树,中间大小的数构成root根节点,左侧的数组部分分治构成左节点,右侧的数组部分分治构成右节点。这里用的是链表,只需要额外增加一些链表的操作(getMid函数)。也可以将链表转化为数组,再构造,查找起来就很快。以空间换时间\n```java\nclass Solution {\n public TreeNode sortedListToBST(ListNode head) {\n ListNode dummy = head;\n int end = 0;\n while(head != null){\n end++;\n head = head.next;\n }\n\n return dfs(dummy,0,end);\n }\n\n public TreeNode dfs(ListNode head,int start,int end){\n if(start >= end) return null;\n int mid = start + (end - start) / 2;\n ListNode midNode = getMid(head,mid);\n TreeNode node = new TreeNode(midNode.val);\n node.left = dfs(head,start,mid);\n node.right = dfs(head,mid+1,end);\n\n return node;\n }\n \n public ListNode getMid(ListNode head,int mid){\n while(mid > 0){\n mid--;\n head = head.next;\n }\n return head;\n }\n}\n```\n时间复杂度O(NlogN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3111943009","body":"两个指针从head出发同时往前移动,当某一个指针指向null的时候,使其指向另一个head。直至两个指针相遇,该节点为相遇节点。直到相遇,第一个指针走了A+C+B的路程,另一个指针走了B+C+A的路程\n```java\npublic class Solution {\n public ListNode getIntersectionNode(ListNode headA, ListNode headB) {\n ListNode A = headA;\n ListNode B = headB;\n while(A != B)\n {\n if(A == null) A = headB;\n else A = A.next;\n if(B == null) B = headA;\n else B = B.next;\n }\n return A;\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3116973002","body":"- 判断是否有环:两个快慢指针分别从头节点出发,慢指针一次走一格,快指针一次走两个,如果有环,则二者一定会在环内相遇,如果没环,则快指针会先到达null处。可以类比于跑步,跑得快的会套跑的慢的一圈\n- 判断环入口:快指针和慢指针相遇的时候,慢指针走了x+y步,快指针走了x+y+n*(y+z)步骤,n为圈数,大于等于1,如图所示,图片节选自代码随想录。因为快指针是慢指针的两倍速,所以2x+2y=x+y+n*(y+z)。化简后发现当n=1时,x=z,当n大于1时,x=z+(n-1)(y+z)。也就是说,头节点到环入口的距离等于z或z+多圈。因此,用两个指针,一个从头节点出发,一个从相遇节点出发,最终一定会相遇在环入口,无论第二个指针在环里绕了多少圈\n```java\npublic class Solution {\n public ListNode detectCycle(ListNode head) {\n ListNode fast = head;\n ListNode slow = head;\n while(fast != null && fast.next != null)\n {\n slow = slow.next;\n fast = fast.next.next;\n if(slow == fast){\n ListNode index1 = head;\n ListNode index2 = slow;\n while(index1 != index2)\n {\n index1 = index1.next;\n index2 = index2.next;\n }\n return index1;\n }\n }\n return null;\n }\n}\n```\n时间复杂度O(N) 空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3121046113","body":"Java可以使用LinkedHashMap实现LRU,内置的函数就可以实现按插入顺序排列的hashmap,手动实现LinkedHashMap代码如下:\n```java\npublic class LRUCache {\n class DLinkedNode {\n int key;\n int value;\n DLinkedNode prev;\n DLinkedNode next;\n public DLinkedNode() {}\n public DLinkedNode(int _key, int _value) {key = _key; value = _value;}\n }\n\n private Map cache = new HashMap();\n private int size;\n private int capacity;\n private DLinkedNode head, tail;\n\n public LRUCache(int capacity) {\n this.size = 0;\n this.capacity = capacity;\n head = new DLinkedNode();\n tail = new DLinkedNode();\n head.next = tail;\n tail.prev = head;\n }\n\n public int get(int key) {\n DLinkedNode node = cache.get(key);\n if (node == null) {\n return -1;\n }\n moveToHead(node);\n return node.value;\n }\n\n public void put(int key, int value) {\n DLinkedNode node = cache.get(key);\n if (node == null) {\n DLinkedNode newNode = new DLinkedNode(key, value);\n cache.put(key, newNode);\n addToHead(newNode);\n ++size;\n if (size > capacity) {\n DLinkedNode tail = removeTail();\n cache.remove(tail.key);\n --size;\n }\n }\n else {\n node.value = value;\n moveToHead(node);\n }\n }\n\n private void addToHead(DLinkedNode node) {\n node.prev = head;\n node.next = head.next;\n head.next.prev = node;\n head.next = node;\n }\n\n private void removeNode(DLinkedNode node) {\n node.prev.next = node.next;\n node.next.prev = node.prev;\n }\n\n private void moveToHead(DLinkedNode node) {\n removeNode(node);\n addToHead(node);\n }\n\n private DLinkedNode removeTail() {\n DLinkedNode res = tail.prev;\n removeNode(res);\n return res;\n }\n}\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3123845190","body":"递归,每一层返回max(左子树深度,右子树深度)+1\n```java\nclass Solution {\n public int maxDepth(TreeNode root) {\n if (root == null) {\n return 0;\n }\n int leftDepth = maxDepth(root.left);\n int rightDepth = maxDepth(root.right);\n return Math.max(leftDepth, rightDepth) + 1;\n }\n}\n```\n层序遍历,使用队列。每遍历一层,深度+1,直到遍历到最下面一层\n\n```java\nclass Solution {\n public int maxDepth(TreeNode root) {\n if(root == null) return 0;\n Queue queue = new LinkedList<>();\n queue.add(root);\n int depth = 0;\n while(!queue.isEmpty())\n {\n int size = queue.size();\n for(int i = 0;i < size;i++){\n TreeNode node = queue.poll();\n if(node.left != null) queue.add(node.left);\n if(node.right != null) queue.add(node.right);\n }\n depth++;\n }\n\n return depth;\n }\n}\n```\n时间复杂度O(N) N为二叉树节点个数","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125223416","body":"先判断当前两个节点是否相同,如果不同,直接返回false。如果相同无法得出最终结论,需要递归进入下一层继续判断子树\n```java\nclass Solution {\n public boolean isSameTree(TreeNode p, TreeNode q) {\n if(p == null && q != null) return false;\n if(p != null && q == null) return false;\n if(p == null && q == null) return true;\n if(p.val != q.val) return false;\n\n boolean l = isSameTree(p.left,q.left);\n boolean r = isSameTree(p.right,q.right);\n\n return l && r;\n }\n}\n```\n时间复杂度O(N) N为树的节点数量","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3130457949","body":"回溯维护一个List,当递归到叶子节点时,List中保存的数字就是一路从root到当前根节点的所有数字。使用StringBbuilder拼接所有数字,即是当前路径表示的数字\n\n```java\nclass Solution {\n List path = new ArrayList<>();\n int res = 0;\n public int sumNumbers(TreeNode root) {\n path.add(root.val);\n recursion(root);\n return res;\n }\n\n public void recursion(TreeNode root){\n if(root.left == null && root.right == null){\n StringBuilder sb = new StringBuilder();\n for(int num : path){\n sb.append(num);\n }\n res += Integer.parseInt(sb.toString());\n return;\n }\n\n if(root.left != null){\n path.add(root.left.val);\n recursion(root.left);\n path.remove(path.size() - 1);\n }\n\n if(root.right != null){\n path.add(root.right.val);\n recursion(root.right);\n path.remove(path.size() - 1);\n }\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3134853681","body":"层序遍历,记录每一层的最左侧的值,不断覆盖变量,最终记录的是最深一层的最左侧的值\n```java\nclass Solution {\n public int findBottomLeftValue(TreeNode root) {\n Queue queue = new LinkedList<>();\n queue.add(root);\n int res = 0;\n while(!queue.isEmpty())\n {\n int size = queue.size();\n for(int i = 0;i < size;i++){\n TreeNode node = queue.poll();\n if(i == 0){\n res = node.val;\n }\n if(node.left != null) queue.add(node.left);\n if(node.right != null) queue.add(node.right);\n }\n }\n\n return res;\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3138992061","body":"序列化时:前序遍历记录每个节点用逗号分开,空节点记为#\n反序列化:将序列化结果以逗号分开,存储进队列,用队列递归构造树\n```java\npublic class Codec {\n StringBuilder sb = new StringBuilder();\n int count = 1;\n\n public String serialize(TreeNode root) {\n if(root == null){\n sb.append(\"#\").append(\",\");\n return sb.toString();\n }\n\n sb.append(root.val).append(\",\");\n serialize(root.left);\n serialize(root.right);\n return sb.toString();\n }\n\n public TreeNode deserialize(String data) {\n Queue queue = new LinkedList<>();\n String[] pre = data.split(\",\");\n for(String s : pre){\n queue.offer(s);\n }\n return build(queue);\n }\n\n public TreeNode build(Queue queue){\n if(queue.isEmpty()) return null;\n String rootStringVal = queue.poll();\n if(rootStringVal.equals(\"#\")) return null;\n int rootVal = Integer.parseInt(rootStringVal);\n \n TreeNode root = new TreeNode(rootVal);\n root.left = build(queue);\n root.right = build(queue);\n\n return root;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3142198278","body":"遍历二叉树,记录一个三元组,分别表示列、行和节点的值。再按照要求进行排序,列升序,行升序,值升序。最后按规则放入List\n```java\nclass Solution {\n public List> verticalTraversal(TreeNode root) {\n List nodes = new ArrayList();\n dfs(root, 0, 0, nodes);\n Collections.sort(nodes, new Comparator() {\n public int compare(int[] tuple1, int[] tuple2) {\n if (tuple1[0] != tuple2[0]) {\n return tuple1[0] - tuple2[0];\n } else if (tuple1[1] != tuple2[1]) {\n return tuple1[1] - tuple2[1];\n } else {\n return tuple1[2] - tuple2[2];\n }\n }\n });\n List> ans = new ArrayList>();\n int size = 0;\n int lastcol = Integer.MIN_VALUE;\n for (int[] tuple : nodes) {\n int col = tuple[0], row = tuple[1], value = tuple[2];\n if (col != lastcol) {\n lastcol = col;\n ans.add(new ArrayList());\n size++;\n }\n ans.get(size - 1).add(value);\n }\n return ans;\n }\n\n public void dfs(TreeNode node, int row, int col, List nodes) {\n if (node == null) {\n return;\n }\n nodes.add(new int[]{col, row, node.val});\n dfs(node.left, row + 1, col - 1, nodes);\n dfs(node.right, row + 1, col + 1, nodes);\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146508830","body":"先将数组中所有值和其对应索引存入hashmap,再遍历一遍数组,如果遍历到的num对应的target-num在map中,即是找到的两个索引。注意要避免一个数算两次\n```java\nclass Solution {\n public int[] twoSum(int[] nums, int target) {\n Map map = new HashMap<>();\n for(int i = 0;i < nums.length;i++){\n map.put(nums[i],i);\n }\n\n for(int i = 0;i < nums.length;i++){\n if(map.containsKey(target - nums[i]) && map.get(target - nums[i]) != i){\n int[] res = new int[2];\n res[0] = i;\n res[1] = map.get(target - nums[i]);\n return res;\n }\n }\n return null;\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148286271","body":"遍历数组,先用hashmap记录每个数字出现的次数。用优先队列定义好排序规则,将map中的内容放入优先队列中,再按照要求从队列中取\n```java\nclass Solution {\n public int[] topKFrequent(int[] nums, int k) {\n Map map = new HashMap<>();\n for(int num : nums){\n map.put(num,map.getOrDefault(num,0)+1);\n }\n PriorityQueue p = new PriorityQueue<>((a,b) -> (b[1]-a[1]));\n for(Map.Entry m : map.entrySet()){\n p.add(new int[]{m.getKey(),m.getValue()});\n }\n int[] result = new int[k];\n for(int i = 0;i < k;i++){\n result[i] = p.poll()[0];\n }\n return result;\n }\n}\n```\n时间复杂度O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3149131512","body":"二层遍历,第一层遍历i,第二层遍历,使用map记录每个元组与第一层的i的距离dis出现的次数time。最终由i组成的回旋镖数量为time*(time-1)\n```java\nclass Solution {\n public int numberOfBoomerangs(int[][] points) {\n int res = 0;\n for(int[] a : points){\n Map map = new HashMap<>();\n for(int[] b : points){\n int dis = (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]);\n map.put(dis,map.getOrDefault(dis,0) + 1);\n }\n for(int key : map.keySet()){\n int val = map.get(key);\n res += val * (val - 1);\n }\n }\n return res;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3153104469","body":"滑动窗口,定义left指针和right指针,两个指针窗口内即是符合题目要求的子串。不断向右移right指针,如果窗口内的子串不符合题目要求了,就右移left指针缩小窗口直到符合题目要求。\n在遍历过程中,记录窗口长度最大值\n使用hashSet判断窗口内是否符合题目要求\n```java\nclass Solution {\n public int lengthOfLongestSubstring(String s) {\n Set set = new HashSet<>();\n int left = 0;\n int res = 0;\n for(int right = 0;right < s.length();right++){\n char c = s.charAt(right);\n while(set.contains(c)){\n set.remove(s.charAt(left));\n left++;\n }\n\n set.add(c);\n res = Math.max(res,right - left + 1); \n }\n return res;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3157250607","body":"滑动窗口\n```java\nclass Solution {\n public List findSubstring(String s, String[] words) {\n int wordLen = words[0].length(); \n int windowLen = wordLen * words.length; \n\n Map targetCnt = new HashMap<>();\n for (String w : words) {\n targetCnt.put(w,targetCnt.getOrDefault(w,0) + 1);\n }\n\n List ans = new ArrayList<>();\n for (int start = 0; start < wordLen; start++) {\n Map cnt = new HashMap<>();\n int overload = 0;\n for (int right = start + wordLen; right <= s.length(); right += wordLen) {\n String inWord = s.substring(right - wordLen, right);\n if (cnt.getOrDefault(inWord, 0).equals(targetCnt.getOrDefault(inWord, 0))) {\n overload++;\n }\n cnt.merge(inWord, 1, Integer::sum); \n\n int left = right - windowLen;\n if (left < 0) { \n continue;\n }\n if (overload == 0) {\n ans.add(left);\n }\n\n String outWord = s.substring(left, left + wordLen);\n cnt.merge(outWord, -1, Integer::sum); \n if (cnt.get(outWord).equals(targetCnt.getOrDefault(outWord, 0))) {\n overload--;\n }\n }\n }\n\n return ans;\n }\n}\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3162563860","body":"前缀和\n```java\nclass Solution {\n public int minSubarray(int[] nums, int p) {\n int n = nums.length;\n int[] s = new int[n + 1];\n for (int i = 0; i < n; i++) {\n s[i + 1] = (s[i] + nums[i]) % p;\n }\n int x = s[n];\n if (x == 0) {\n return 0; \n }\n\n int ans = n;\n Map last = new HashMap<>();\n for (int i = 0; i <= n; i++) {\n last.put(s[i], i);\n int j = last.getOrDefault((s[i] - x + p) % p, -n);\n ans = Math.min(ans, i - j);\n }\n return ans < n ? ans : -1;\n }\n}\n\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3170443755","body":"双指针,慢指针用于存数字,快指针用于检验数字是否重复\n```java\nclass Solution {\n public int removeDuplicates(int[] nums) {\n if(nums.length == 1) return 1;\n int slow = 0;\n for(int fast = 1;fasttarget){\n right = middle;\n }else if(nums[middle] queue;\n public MyQueue(){\n queue = new LinkedList<>();\n } \n\n public void add(int val){\n while(!queue.isEmpty() && val > queue.getLast()){\n queue.removeLast();\n }\n queue.add(val);\n }\n\n public void poll(int val){\n if(queue.peek() == val){\n queue.poll();\n }\n }\n\n public int max(){\n return queue.peek();\n }\n}\n```\n时间复杂度O(nlogn)\n优先队列插入的复杂度是logn","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3177951924","body":"两个数组计算每个人的入度和出度\n```java\nclass Solution {\n public int findJudge(int n, int[][] trust) {\n int[] inDegrees = new int[n + 1];\n int[] outDegrees = new int[n + 1];\n for (int[] edge : trust) {\n int x = edge[0], y = edge[1];\n ++inDegrees[y];\n ++outDegrees[x];\n }\n for (int i = 1; i <= n; ++i) {\n if (inDegrees[i] == n - 1 && outDegrees[i] == 0) {\n return i;\n }\n }\n return -1;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182597716","body":"染色法,如果染色过程冲突,则无法实现、返回false\n```java\nclass Solution {\n boolean[] visited;\n boolean[] color;\n boolean flag = false;\n public boolean possibleBipartition(int n, int[][] dislikes) {\n List[] graph = build(dislikes,n);\n visited = new boolean[graph.length];\n color = new boolean[graph.length];\n for(int i = 1;i < graph.length;i++){\n if(visited[i] == false){\n traverse(graph,i);\n }\n }\n return !flag;\n }\n\n public List[] build(int[][] dislikes,int n){\n List[] graph = new List[n + 1];\n for(int i = 0;i < n + 1;i++){\n graph[i] = new LinkedList<>();\n }\n\n for(int[] edge : dislikes){\n int x = edge[0];\n int y = edge[1];\n graph[x].add(y);\n graph[y].add(x);\n }\n return graph;\n }\n\n public void traverse(List[] graph,int s){\n if(flag) return;\n visited[s] = true;\n for(int x : graph[s]){\n if(visited[x] == false){\n color[x] = !color[s];\n traverse(graph,x);\n }else{\n if(color[x] == color[s]) flag = true;\n }\n }\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3186848399","body":"拓扑排序\n```java\nclass Solution {\n public int[] sortItems(int n, int m, int[] group, List> beforeItems) {\n List> groupItem = new ArrayList>();\n for (int i = 0; i < n + m; ++i) {\n groupItem.add(new ArrayList());\n }\n\n // 组间和组内依赖图\n List> groupGraph = new ArrayList>();\n for (int i = 0; i < n + m; ++i) {\n groupGraph.add(new ArrayList());\n }\n List> itemGraph = new ArrayList>();\n for (int i = 0; i < n; ++i) {\n itemGraph.add(new ArrayList());\n }\n\n // 组间和组内入度数组\n int[] groupDegree = new int[n + m];\n int[] itemDegree = new int[n];\n \n List id = new ArrayList();\n for (int i = 0; i < n + m; ++i) {\n id.add(i);\n }\n\n int leftId = m;\n // 给未分配的 item 分配一个 groupId\n for (int i = 0; i < n; ++i) {\n if (group[i] == -1) {\n group[i] = leftId;\n leftId += 1;\n }\n groupItem.get(group[i]).add(i);\n }\n // 依赖关系建图\n for (int i = 0; i < n; ++i) {\n int curGroupId = group[i];\n for (int item : beforeItems.get(i)) {\n int beforeGroupId = group[item];\n if (beforeGroupId == curGroupId) {\n itemDegree[i] += 1;\n itemGraph.get(item).add(i); \n } else {\n groupDegree[curGroupId] += 1;\n groupGraph.get(beforeGroupId).add(curGroupId);\n }\n }\n }\n\n // 组间拓扑关系排序\n List groupTopSort = topSort(groupDegree, groupGraph, id); \n if (groupTopSort.size() == 0) {\n return new int[0];\n }\n int[] ans = new int[n];\n int index = 0;\n // 组内拓扑关系排序\n for (int curGroupId : groupTopSort) {\n int size = groupItem.get(curGroupId).size();\n if (size == 0) {\n continue;\n }\n List res = topSort(itemDegree, itemGraph, groupItem.get(curGroupId));\n if (res.size() == 0) {\n return new int[0];\n }\n for (int item : res) {\n ans[index++] = item;\n }\n }\n return ans;\n }\n\n public List topSort(int[] deg, List> graph, List items) {\n Queue queue = new LinkedList();\n for (int item : items) {\n if (deg[item] == 0) {\n queue.offer(item);\n }\n }\n List res = new ArrayList();\n while (!queue.isEmpty()) {\n int u = queue.poll(); \n res.add(u);\n for (int v : graph.get(u)) {\n if (--deg[v] == 0) {\n queue.offer(v);\n }\n }\n }\n return res.size() == items.size() ? res : new ArrayList();\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3190861492","body":"模拟机器人移动\n```java\nclass Solution {\n public boolean judgeCircle(String moves) {\n int x = 0, y = 0;\n int length = moves.length();\n for (int i = 0; i < length; i++) {\n char move = moves.charAt(i);\n if (move == 'U') {\n y--;\n } else if (move == 'D') {\n y++;\n } else if (move == 'L') {\n x--;\n } else if (move == 'R') {\n x++;\n }\n }\n return x == 0 && y == 0;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193745750","body":"模拟\n```java\nclass Solution {\n public int[] getOrder(int[][] ts) {\n int n = ts.length;\n // 将 ts 转存成 nts,保留任务编号\n int[][] nts = new int[n][3];\n for (int i = 0; i < n; i++) nts[i] = new int[]{ts[i][0], ts[i][1], i};\n // 根据任务入队时间进行排序\n Arrays.sort(nts, (a,b)->a[0]-b[0]);\n // 根据题意,先按照「持续时间」排序,再根据「任务编号」排序\n PriorityQueue q = new PriorityQueue<>((a,b)->{\n if (a[1] != b[1]) return a[1] - b[1];\n return a[2] - b[2];\n });\n int[] ans = new int[n];\n for (int time = 1, j = 0, idx = 0; idx < n; ) {\n \t// 如果当前任务可以添加到「队列」中(满足入队时间)则进行入队\n while (j < n && nts[j][0] <= time) q.add(nts[j++]);\n if (q.isEmpty()) {\n\t // 如果当前「队列」没有任务,直接跳到下个任务的入队时间\n time = nts[j][0];\n } else {\n \t// 如果有可执行任务的话,根据优先级将任务出队(记录下标),并跳到该任务完成时间点\n int[] cur = q.poll();\n ans[idx++] = cur[2];\n time += cur[1];\n }\n }\n return ans;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194379645","body":"转化为分钟\n```java\nclass Solution {\n public int numberOfRounds(String loginTime, String logoutTime) {\n int loginHour = Integer.parseInt(loginTime.substring(0, 2));\n int loginMinute = Integer.parseInt(loginTime.substring(3));\n int logoutHour = Integer.parseInt(logoutTime.substring(0, 2));\n int logoutMinute = Integer.parseInt(logoutTime.substring(3));\n int loginTotalMinute = loginHour * 60 + loginMinute;\n int logoutTotalMinute = logoutHour * 60 + logoutMinute;\n if (loginTotalMinute > logoutTotalMinute) {\n logoutTotalMinute += 1440;\n }\n if (loginTotalMinute % 15 != 0) {\n loginTotalMinute += 15 - loginTotalMinute % 15;\n }\n logoutTotalMinute -= logoutTotalMinute % 15;\n return Math.max((logoutTotalMinute - loginTotalMinute) / 15, 0);\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3195332635","body":"分别模拟三个情况\n```java\nclass Solution {\n public int minCharacters(String a, String b) {\n int n = a.length(), m = b.length(), ans = 0x3f3f3f3f;\n int[] c1 = new int[26], c2 = new int[26];\n for (char c : a.toCharArray()) c1[c - 'a']++;\n for (char c : b.toCharArray()) c2[c - 'a']++;\n for (int i = 0; i < 26 && ans != 0; i++) {\n // 3\n int ca = n - c1[i], cb = m - c2[i];\n ans = Math.min(ans, ca + cb);\n if (i == 0) continue;\n int r1 = 0, r2 = 0;\n // 1\n for (int j = i; j < 26; j++) r1 += c1[j];\n for (int j = 0; j < i; j++) r1 += c2[j];\n // 2\n for (int j = i; j < 26; j++) r2 += c2[j];\n for (int j = 0; j < i; j++) r2 += c1[j];\n ans = Math.min(ans, Math.min(r1, r2));\n }\n return ans;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3199298563","body":"归并排序\n\n```java\nclass Solution {\n public int[] sortArray(int[] nums) {\n sort(nums,0,nums.length - 1);\n return nums;\n }\n\n public void sort(int[] nums,int start,int end){\n if(start >= end) return;\n int p = para(nums,start,end);\n\n sort(nums,start,p - 1);\n sort(nums,p + 1,end);\n }\n\n public int para(int[] nums,int l,int h){\n\n int x = nums[l];\n int i = l,j = h;\n while(i < j)\n {\n while(i < j && nums[j] >= x) j--;\n if(i < j) nums[i++] = nums[j];\n\n while(i < j && nums[i] < x) i++;\n if(i < j) nums[j--] = nums[i];\n }\n\n nums[i] = x;\n return i;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204106258","body":"二分查找\n```java\nclass Solution {\n public int mySqrt(int x) {\n if(x == 0) return 0;\n if(x == 1) return 1;\n int left = 0;\n int right = x;\n while(left < right)\n {\n int middle = left + (right - left) / 2;\n if(middle > x / middle){\n right = middle;\n }else if(middle < x / middle){\n left = middle + 1;\n }else{\n return middle;\n }\n }\n if(right == x / right){\n return right;\n }else{\n return right - 1;\n }\n\n \n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3208985528","body":"二分查找\n```java\npublic class Solution extends VersionControl {\n public int firstBadVersion(int n) {\n int left = 1, right = n;\n while (left < right) { \n int mid = left + (right - left) / 2; \n if (isBadVersion(mid)) {\n right = mid; \n } else {\n left = mid + 1; \n }\n }\n return left;\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/42#issuecomment-3213255556","body":"```java\nclass Solution {\n public int reversePairs(int[] nums) {\n if (nums.length == 0) {\n return 0;\n }\n return reversePairsRecursive(nums, 0, nums.length - 1);\n }\n\n public int reversePairsRecursive(int[] nums, int left, int right) {\n if (left == right) {\n return 0;\n } else {\n int mid = (left + right) / 2;\n int n1 = reversePairsRecursive(nums, left, mid);\n int n2 = reversePairsRecursive(nums, mid + 1, right);\n int ret = n1 + n2;\n\n // 首先统计下标对的数量\n int i = left;\n int j = mid + 1;\n while (i <= mid) {\n while (j <= right && (long) nums[i] > 2 * (long) nums[j]) {\n j++;\n }\n ret += j - mid - 1;\n i++;\n }\n\n // 随后合并两个排序数组\n int[] sorted = new int[right - left + 1];\n int p1 = left, p2 = mid + 1;\n int p = 0;\n while (p1 <= mid || p2 <= right) {\n if (p1 > mid) {\n sorted[p++] = nums[p2++];\n } else if (p2 > right) {\n sorted[p++] = nums[p1++];\n } else {\n if (nums[p1] < nums[p2]) {\n sorted[p++] = nums[p1++];\n } else {\n sorted[p++] = nums[p2++];\n }\n }\n }\n for (int k = 0; k < sorted.length; k++) {\n nums[left + k] = sorted[k];\n }\n return ret;\n }\n }\n}\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3216192351","body":"```java\nclass Solution {\n public int findRadius(int[] houses, int[] heaters) {\n int ans = 0;\n Arrays.sort(heaters);\n for (int house : houses) {\n int i = binarySearch(heaters, house);\n int j = i + 1;\n int leftDistance = i < 0 ? Integer.MAX_VALUE : house - heaters[i];\n int rightDistance = j >= heaters.length ? Integer.MAX_VALUE : heaters[j] - house;\n int curDistance = Math.min(leftDistance, rightDistance);\n ans = Math.max(ans, curDistance);\n }\n return ans;\n }\n\n public int binarySearch(int[] nums, int target) {\n int left = 0, right = nums.length - 1;\n if (nums[left] > target) {\n return -1;\n }\n while (left < right) {\n int mid = (right - left + 1) / 2 + left;\n if (nums[mid] > target) {\n right = mid - 1;\n } else {\n left = mid;\n }\n }\n return left;\n }\n}\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"falsity":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073705405","body":"# 思路\n\n从低位往高位计算, 每次计算保留进位数据,本位留下余数\n\n```python\nclass Solution(object):\n def addToArrayForm(self, num, k):\n \"\"\"\n :type num: List[int]\n :type k: int\n :rtype: List[int]\n \"\"\"\n result = []\n i = len(num) - 1\n while i >=0 or k > 0:\n if i >= 0:\n k += num[i]\n i -= 1\n result.append(k % 10)\n k = k // 10\n return result[::-1]\n```\n\n时间复杂度: O(n)\n\n空间复杂度: O(n)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3079013152","body":"# 【Day 2】821. 字符的最短距离\n\n## 思路\n\n先遍历一遍获取c的位置列表, 再遍历每个位置计算最近的距离\n\n```python\nclass Solution(object):\n def shortestToChar(self, s, c):\n \"\"\"\n :type s: str\n :type c: str\n :rtype: List[int]\n \"\"\"\n locations = []\n result = []\n for i, char in enumerate(s):\n if char == c:\n locations.append(i)\n \n for i in range(len(s)):\n shortest = min(abs(i - location) for location in locations)\n result.append(shortest)\n return result\n```\n\n时间复杂度: O(n*m), m为字符c出现次数,最差为O(n^2)\n\n空间复杂度: O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3084580543","body":"**【Day 3】1381. 设计一个支持增量操作的栈**\n\n*** 思路***\n\n用数组模拟栈\n\n```python\nclass CustomStack(object):\n\n # 时间复杂度: O(1)\n # 空间复杂度: O(n)\n def __init__(self, maxSize):\n \"\"\"\n :type maxSize: int\n \"\"\"\n self.stack = [0] * maxSize\n self.top = -1\n \n # 时间复杂度: O(1)\n # 空间复杂度: O(n)\n def push(self, x):\n \"\"\"\n :type x: int\n :rtype: None\n \"\"\"\n if self.top < len(self.stack) - 1:\n self.top += 1\n self.stack[self.top] = x\n \n # 时间复杂度: O(1)\n # 空间复杂度: O(n)\n def pop(self):\n \"\"\"\n :rtype: int\n \"\"\"\n if self.top == -1:\n return -1\n value = self.stack[self.top]\n self.top -= 1\n return value\n \n # 时间复杂度: O(k)\n # 空间复杂度: O(n)\n def increment(self, k, val):\n \"\"\"\n :type k: int\n :type val: int\n :rtype: None\n \"\"\"\n lim = min(k, self.top + 1)\n for i in range(lim):\n self.stack[i] += val\n \n\n\n# Your CustomStack object will be instantiated and called as such:\n# obj = CustomStack(maxSize)\n# obj.push(x)\n# param_2 = obj.pop()\n# obj.increment(k,val)\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3089882117","body":"**【Day 4】394. 字符串解码**\n\n**思路**\n\n参照[Krahets的字符串解码题解](https://leetcode.cn/problems/decode-string/solutions/19447/decode-string-fu-zhu-zhan-fa-di-gui-fa-by-jyd/)中的辅助栈解法,利用栈来存储每一层[]中的字符串和需要重复的次数逐层拼接字符串,最后得到结果.\n\n**代码**\n\n```python\nclass Solution(object):\n def decodeString(self, s):\n \"\"\"\n :type s: str\n :rtype: str\n \"\"\"\n stack, res, multi = [], \"\", 0\n for c in s:\n if c == '[':\n stack.append([multi, res])\n res, multi = \"\", 0\n elif c == ']':\n cur_multi, last_res = stack.pop()\n res = last_res + cur_multi * res\n elif '0' <= c <= '9':\n multi = multi * 10 + int(c)\n else:\n res += c\n return res \n```\n\n**复杂度分析**\n\n时间复杂度: O(N)\n空间复杂度: O(N)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092420487","body":"**【Day 5】232. 用栈实现队列**\n\n**思路**\n\n利用栈先进后出的性质,通过stack1完成元素的倒序放置,再将stack1的元素放入stack2中,前面的元素就放在了栈顶. 此时经过两次入栈出栈的操作stack2中的元素就满足了先进先出的要求.\n\n但是要注意以下问题:\n\n1. 只有在stack2中元素为空时才能将stack1中的元素放入stack2中,这样才能保证有序性\n2. 遍历list元素要使用while, 不能用for,否则会有元素被跳过\n\n**代码**\n\n```python\nclass MyQueue(object):\n\n def __init__(self):\n self.stack1, self.stack2 = [], []\n \n\n def push(self, x):\n \"\"\"\n :type x: int\n :rtype: None\n \"\"\"\n self.stack1.append(x)\n \n\n def pop(self):\n \"\"\"\n :rtype: int\n \"\"\"\n res = self.peek()\n return self.stack2.pop()\n \n\n def peek(self):\n \"\"\"\n :rtype: int\n \"\"\"\n if self.stack2:\n return self.stack2[-1]\n elif self.stack1:\n while self.stack1:\n self.stack2.append(self.stack1.pop())\n return self.stack2[-1]\n else:\n return -1\n \n\n def empty(self):\n \"\"\"\n :rtype: bool\n \"\"\"\n return not self.stack1 and not self.stack2\n \n\n\n# Your MyQueue object will be instantiated and called as such:\n# obj = MyQueue()\n# obj.push(x)\n# param_2 = obj.pop()\n# param_3 = obj.peek()\n# param_4 = obj.empty()\n```\n\n**复杂度分析**\n\n时间复杂度: push, empty 是O(1), pop, peek是O(N)\n空间复杂度: O(N)\n\n","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3097331008","body":"**【Day 7】61. 旋转链表**\n\n**思路**\n\nk可能会大于链表长度导致循环遍历链表. 所以真实的旋转偏移是k%n,n为链表长度. 使用双指针找到需要断开的节点位置,将链表进行断开和重新拼接即可得到结果\n\n```pyth\nclass Solution(object):\n def rotateRight(self, head, k):\n \"\"\"\n :type head: Optional[ListNode]\n :type k: int\n :rtype: Optional[ListNode]\n \"\"\"\n if k == 0 or not head or not head.next:\n return head\n\n node = head\n l = 0\n while node:\n l += 1\n node = node.next\n \n if k % l == 0:\n return head\n k = k % l\n slow = fast = head\n for i in range(k):\n fast = fast.next\n \n while fast.next:\n slow = slow.next\n fast = fast.next\n\n new_head = slow.next\n slow.next = None\n fast.next = head\n return new_head\n```\n\n**复杂度分析**\n\n时间复杂度: O(N)\n空间复杂度: O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3103411213","body":"**【Day 8】24. 两两交换链表中的节点**\n\n**思路**\n\n类似于反转链表, 用两个指针来对链表指向进行修改,唯一的区别是cur需要间隔一个进行遍历,而不是逐个遍历\n\n```python\nclass Solution(object):\n def swapPairs(self, head):\n \"\"\"\n :type head: Optional[ListNode]\n :rtype: Optional[ListNode]\n \"\"\"\n dummy = ListNode()\n dummy.next = head\n pre = dummy\n cur = head\n while cur and cur.next:\n nxt = cur.next\n cur.next = nxt.next\n nxt.next = cur\n pre.next = nxt\n pre = cur\n cur = cur.next\n \n return dummy.next\n```\n\n**复杂度分析**\n\n时间复杂度: O(N)\n空间复杂度: O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109176294","body":"**【Day 9】109. 有序链表转换二叉搜索树**\n\n**思路**\n\n首先获取链表的长度,再根据二叉树的中序遍历方式递归构建BST, 根节点的值在遍历完左子树后刚好移动了m次到达中间节点,即根节点位置\n\n\n\n```python\nclass Solution:\n def sortedListToBST(self, head: Optional[ListNode]) -> Optional[TreeNode]:\n def getLength(head: ListNode) -> int:\n count = 0\n while head:\n count += 1\n head = head.next\n return count\n\n def buildBST(left: int, right: int) -> TreeNode:\n if left > right:\n return None\n m = (left + right) // 2\n root = TreeNode()\n left_node = buildBST(left, m - 1)\n nonlocal head\n root.val = head.val\n head = head.next\n \n right_node = buildBST(m+1, right)\n root.left = left_node\n root.right = right_node\n return root\n\n l = getLength(head)\n return buildBST(0, l - 1)\n```\n\n**复杂度分析**\n\n时间复杂度: O(n)\n空间复杂度: O(log n)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3122088595","body":"**【Day 12】146. LRU 缓存机制**\n\n**思路**\n\n`get` 和 `put` 必须以 `O(1)` 的平均时间复杂度运行, 说明需要使用到map. 需要记录关键字使用过的顺序需要使用到链表\n\nget方法需要查询map, 如果key存在则返回值,如果不存在则返回-1. 查询完成后,需要把该节点移动到队首(删除后再插入队首)\n\nput方法需要先查询map容量,如果容量已满,需要通过list找到队尾元素删除, 并将新元素插入队首\n\nnode需要知道前后节点,所以使用双向链表,map和node之间建立映射方便查询数据\n\n\n\n需要的内部函数: 删除元素, 将元素插入队首\n\n```python\nclass LRUCache:\n class Node:\n def __init__(self, key: int, val: int):\n self.key = key\n self.val = val\n self.pre = pre\n self.next = next\n\n def __init__(self, capacity: int):\n self.capacity = capacity\n self.dummy = self.Node(-1, -1)\n self.dummy.pre = self.dummy\n self.dummy.next = self.dummy\n self.map = {}\n\n def add_node_to_head(self, node: Node):\n node.pre = self.dummy\n node.next = self.dummy.next\n self.dummy.next.pre = node\n self.dummy.next = node\n\n def remove_node(self, node: Node):\n node.pre.next = node.next\n node.next.pre = node.pre\n\n def get(self, key: int) -> int:\n if key not in self.map:\n return -1\n\n node = self.map[key]\n self.remove_node(node)\n self.add_node_to_head(node)\n return node.val\n\n def put(self, key: int, value: int) -> None:\n if key in self.map:\n node = self.map[key]\n node.val = value\n self.remove_node(node)\n self.add_node_to_head(node)\n return\n\n new_node = self.Node(key, value)\n self.map[key] = new_node\n self.add_node_to_head(new_node)\n\n if len(self.map) > self.capacity:\n tail = self.dummy.pre\n del self.map[tail.key]\n self.remove_node(tail)\n\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124440801","body":"**【Day 13】104. 二叉树的最大深度**\n\n**思路**\n\n二叉树的最大深度为max(左子树深度, 右子树深度) + 1, 这就变成了一个递归问题\n\n```python\nclass Solution(object):\n def maxDepth(self, root):\n \"\"\"\n :type root: Optional[TreeNode]\n :rtype: int\n \"\"\"\n if root is None:\n return 0\n if root is not None and root.left is None and root.right is None:\n return 1\n return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1\n\n```\n\n**复杂度分析**\n\n时间复杂度: O(N)\n空间复杂度: O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3127200969","body":"**【Day 14】100. 相同的树**\n\n**思路**\n\n相同的树一定根节点相同,并且左子树和右子树都相同, 可以进行递归判断所有子树是否相同\n\n```python\nclass Solution:\n def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:\n if p is None or q is None:\n return p is q\n \n if p.val == q.val:\n return self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)\n else:\n return False\n```\n\n**复杂度分析**\n\n时间复杂度: O(min(m,n)) m为p节点个数,n为q节点个数\n空间复杂度: O(min(m,n)) m为p节点个数,n为q节点个数","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3136787502","body":"**【Day 16】513. 找树左下角的值**\n\n**思路**\n\n从右往左层序遍历,最后一个节点就是左下角的点\n\n```python\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n q = deque([root])\n while q:\n node = q.popleft()\n if node.right: q.append(node.right)\n if node.left: q.append(node.left)\n return node.val\n```\n\n**复杂度分析**\n\n时间复杂度: O(n) \n空间复杂度: O(n)\n\n","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3151014729","body":"**【Day 21】447. 回旋镖的数量**\n\n**思路**\n\n首先计算距离相等的点的数量,在计算相同距离点之间的排列组合数量\n\n```python\nclass Solution:\n def numberOfBoomerangs(self, points: List[List[int]]) -> int:\n res = 0\n n = len(points)\n if n < 3:\n return 0\n \n for i in range(n):\n x0, y0 = points[i]\n dist_count = {}\n \n for j in range(n):\n if i == j:\n continue\n \n x1, y1 = points[j]\n dx = x1 - x0\n dy = y1 - y0\n dist_sq = dx * dx + dy * dy\n \n dist_count[dist_sq] = dist_count.get(dist_sq, 0) + 1\n \n for cnt in dist_count.values():\n res += cnt * (cnt - 1)\n \n return res\n```\n\n时间复杂度: O(n ^ 2)\n\n","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3175046868","body":"**【Day 28】239. 滑动窗口最大值**\n\n```python\nclass Solution:\n def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:\n n = len(nums)\n if n == 0 or k == 0:\n return []\n \n res = []\n q = deque() \n for i in range(n):\n while q and q[0] < i - k + 1:\n q.popleft()\n while q and nums[q[-1]] < nums[i]:\n q.pop()\n q.append(i)\n if i >= k - 1:\n res.append(nums[q[0]])\n return res\n```\n\n时间复杂度: O(n)\n\n空间复杂度: O(k)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3179722453","body":"\n\n```python\nclass Solution:\n def findJudge(self, n: int, trust: List[List[int]]) -> int:\n in_list = [0] * (n + 1)\n out_list = [0] * (n + 1)\n for i in trust:\n in_list[i[1]] += 1\n out_list[i[0]] += 1\n\n for i in range(1, n+1):\n if in_list[i] == n - 1 and out_list[i] == 0:\n return i\n\n return -1\n```\n\n时间复杂度: O(n + m), m为trust列表长度\n\n空间复杂度: O(n)","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194443006","body":"```python\nclass Solution:\n def numberOfRounds(self, loginTime: str, logoutTime: str) -> int:\n start = 60 * int(loginTime[:2]) + int(loginTime[3:])\n end = 60 * int(logoutTime[:2]) + int(logoutTime[3:])\n if start > end:\n end += 24 * 60\n start = math.ceil(start / 15) * 15\n end = end // 15 * 15\n return max(0, (end - start) // 15)\n```\n\n时间复杂度: O(1)\n\n空间复杂度: O(1)\n\n","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3200900420","body":"快排\n```java\n class Solution {\n public int[] sortArray(int[] nums) {\n quickSort(nums, 0, nums.length - 1);\n return nums;\n }\n\n private void quickSort(int[] nums, int low, int high){\n if(low < high){\n int mid = partition(nums, low, high);\n quickSort(nums, low, mid - 1);\n quickSort(nums, mid + 1, high);\n }\n }\n\n private int partition(int[] nums, int low, int high){\n int pivot = low + (int) (Math.random() * (high - low + 1));\n swap(nums, pivot, low);\n int i = low, j = low + 1;\n while (j <= high){\n if(nums[j] < nums[low]){\n swap(nums, j, ++i);\n }\n j++;\n }\n swap(nums, low, i);\n return i;\n }\n\n private void swap(int[] nums, int i, int j){\n int tmp = nums[i];\n nums[i] = nums[j];\n nums[j] = tmp;\n }\n}\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3224529913","body":"思路: 采用定长滑动窗口的做法, 先初始化定长窗口,再移动更新结果\n\n```python\nclass Solution:\n def maxVowels(self, s: str, k: int) -> int:\n ans = count = 0\n vowels = set(['a', 'e', 'i', 'o', 'u'])\n chars = list(s)\n n = len(chars)\n left = right = 0\n while right < k:\n if chars[right] in vowels:\n count += 1\n right += 1\n ans = count\n while right < n:\n if chars[right] in vowels:\n count += 1\n if chars[left] in vowels:\n count -= 1\n ans = max(count, ans)\n left += 1\n right += 1\n return ans\n```\n\n时间复杂度: O(n)\n\n空间复杂度: O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3228513919","body":"\n\n```java\nclass Solution {\n public double new21Game(int n, int k, int maxPts) {\n if( k > n){\n return 0;\n }\n if((k == 0 && n >= 0) && n > k + maxPts){\n return 1;\n }\n\n int len = k + maxPts;\n double[] dp = new double[len];\n double sum = 0;\n\n for(int i = k; i < len && i <= n; i++){\n dp[i] = 1;\n sum++;\n }\n\n for(int i = k - 1; i >= 0; i--){\n dp[i] = sum / maxPts;\n sum = sum - dp[i + maxPts] + dp[i];\n }\n return dp[0];\n }\n}\n```\n\n时间复杂度: O(n)\n\n空间复杂度: O(n)","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/51#issuecomment-3240213950","body":"**\n\n```python\nclass Solution:\n def readBinaryWatch(self, turnedOn: int) -> List[str]:\n ans = []\n for h in range(12):\n for m in range(60):\n if bin(h).count('1') + bin(m).count('1') == turnedOn:\n ans.append(f\"{h}:{m:02d}\")\n \n return ans\n```\n\n时间复杂度: O(1)\n\n空间复杂度: O(1)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3245665636","body":"\n\n```python\nclass Solution:\n def maxAreaOfIsland(self, grid: List[List[int]]) -> int:\n # 时间复杂度: O(mn)\n # 空间复杂度: O(mn)\n ans = 0\n m, n = len(grid), len(grid[0])\n\n def dfs(i: int, j: int) -> int:\n count = 1\n grid[i][j] = 0\n for x, y in (i-1, j), (i+1, j), (i, j-1), (i, j+1):\n if 0<= x < m and 0 <= y < n and grid[x][y]:\n count += dfs(x, y)\n return count\n\n for i, row in enumerate(grid):\n for j, x in enumerate(row):\n if x:\n ans = max(ans, dfs(i, j))\n\n return ans\n \n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3253854706","body":"\n```python\nclass Solution:\n def maxCandies(self, status: List[int], candies: List[int], keys: List[List[int]], containedBoxes: List[List[int]], initialBoxes: List[int]) -> int:\n # 时间复杂度: O(n)\n # 空间复杂度: O(n)\n ans = 0\n q = initialBoxes\n while q:\n p = []\n for i in q:\n if status[i] == 0:\n p.append(i)\n continue\n ans += candies[i]\n for key in keys[i]:\n status[key] = 1\n for c in containedBoxes[i]:\n p.append(c)\n if p == q or not p:\n break\n q = p\n return ans\n```","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3271174778","body":"\n\n```java\nclass Solution {\n public int longestCommonSubsequence(String text1, String text2) {\n # 时间复杂度: O(mn)\n # 空间复杂度: O(mn)\n int m = text1.length(), n = text2.length();\n int[][] dp = new int[m+1][n+1];\n for (int i = 1; i <= m; i++) {\n char c1 = text1.charAt(i - 1);\n for (int j = 1; j <= n; j++) {\n char c2 = text2.charAt(j - 1);\n if (c1 == c2){\n dp[i][j] = dp[i - 1][j-1] + 1;\n }else{\n dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);\n }\n\n }\n }\n return dp[m][n];\n }\n}\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/61#issuecomment-3275118967","body":"时间复杂度: O(m * n)\n\n空间复杂度: ~~O(n)~~ 题解指正行列可以交换, 所以为O(min(m, n))\n\n```python\nclass Solution:\n def uniquePaths(self, m: int, n: int) -> int:\n f = [1] * n\n\n for i in range(1, m):\n for j in range(1, n):\n f[j] += f[j - 1]\n return f[n - 1]\n \n```","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289638493","body":"```python\nclass Solution:\n def findTargetSumWays(self, nums: List[int], target: int) -> int:\n # 时间复杂度: O(n * target)\n # 空间复杂度: O(n * target)\n @cache\n def dfs(i: int, c: int) -> int:\n if i < 0:\n return 1 if c == 0 else 0\n \n return dfs(i - 1, c - nums[i]) + dfs(i - 1, c + nums[i])\n \n return dfs(len(nums) - 1, target)\n```","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3298968000","body":"```python\nclass Solution:\n def change(self, amount: int, coins: List[int]) -> int:\n \t# 时间复杂度(n * amount)\n # 空间复杂度(amount)\n f = [1] + [0] * amount\n for x in coins:\n for c in range(x, amount + 1):\n f[c] += f[c - x]\n return f[-1]\n```","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/72#issuecomment-3316065059","body":"```python\nclass Solution:\n def mergeTwoLists(self, list1:Optional[ListNode], list2:Optional[ListNode]) -> Optional[ListNode]:\n cur = dummy = ListNode()\n while list1 and list2:\n if list1.val < list2.val:\n cur.next = list1\n list1 = list1.next\n else:\n cur.next = list2\n list2 = list2.next\n cur = cur.next\n cur.next = list1 if list1 else list2\n return dummy.next\n\n def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:\n # 时间复杂度: O(L * logm) m 为 lists 的长度,L 为所有链表的长度之和\n # 空间复杂度: O(1)\n m = len(lists)\n if m == 0:\n return None\n step = 1\n while step < m:\n for i in range(0, m - step, step * 2):\n lists[i] = self.mergeTwoLists(lists[i], lists[i + step])\n step *= 2\n return lists[0]\n```","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/76#issuecomment-3334653673","body":"思路: 用Node来创建一个树, 每个node下面可以存下一个字母的node, 并且每个node有个end标志位,用来表示单词结尾\n\n```python\nclass Node:\n __slots__ = \"son\", \"end\"\n\n def __init__(self):\n self.son = {}\n self.end = False\n\n\nclass Trie:\n def __init__(self):\n self.root = Node()\n\n # 时间复杂度: O(n)\n def insert(self, word: str) -> None:\n cur = self.root\n for c in word:\n if c not in cur.son:\n cur.son[c] = Node()\n cur = cur.son[c]\n cur.end = True\n\n # 时间复杂度: O(n)\n def find(self, word: str) -> int:\n cur = self.root\n for c in word:\n if c not in cur.son:\n return 0\n cur = cur.son[c]\n return 2 if cur.end else 1\n \n # 时间复杂度: O(n)\n def search(self, word: str) -> bool:\n return self.find(word) == 2\n\n # 时间复杂度: O(n)\n def startsWith(self, prefix: str) -> bool:\n return self.find(prefix) != 0\n```\n\n空间复杂度: O(m * n) m为insert次数, n为单词长度","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/83#issuecomment-3361126397","body":"回溯算法\n\n剪枝优化: 先对candidates进行排序, 再进行回溯, 当left - candidates[i] < 0后不需要再遍历后续结果\n\n时间复杂度: O( n*logn + n^(target/min(candidates))), n为candidates长度\n\n空间复杂度: O(target)\n\n```python\nclass Solution:\n def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:\n candidates.sort()\n ans = list()\n path = list()\n\n def dfs(i: int, left) -> None:\n if left == 0:\n ans.append(path.copy())\n return\n \n if i == len(candidates) or left < candidates[i]:\n return\n\n dfs(i + 1, left)\n\n path.append(candidates[i])\n dfs(i, left - candidates[i])\n path.pop()\n\n dfs(0, target)\n return ans\n\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null],"yuetong3yu":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073754281","body":"```js\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar addToArrayForm = function(nums, k) {\n let str1 = '', str2 = String(k)\n for(let i = 0; i < nums.length; i++) {\n str1 += nums[i];\n }\n // swap to make sure str1 is longer than str2\n if (str1.length < str2.length) {\n const t = str1;\n str1 = str2;\n str2 = t;\n }\n const res = new Array(str1.length).fill(0);\n let p1 = str1.length - 1, p2 = str2.length - 1;\n while(p1 >= 0) {\n res[p1] = Number(str1[p1]) + Number(str2[p2] ?? 0);\n p1 --, p2 --;\n }\n const len = res.length\n let need_shift = false\n for (let i = len - 1; i >= 0; i--) {\n if (res[i] >= 10) {\n if (i === 0) {\n need_shift = true\n } else {\n res[i - 1] = res[i - 1] + 1;\n }\n res[i] = res[i] % 10\n }\n }\n if (need_shift) res.unshift(1)\n return res;\n};\n```\n\n尝试了几个不同的方法。。。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3078802551","body":"模拟题意AC,但感觉第二遍 for 循环没必要循环整个 indexes 数组,indexes 数组是天然有序的,应该可以用双指针优化\n\n```js\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function(s, c) {\n const indexes = []\n for(let i = 0; i < s.length; i++) {\n if (s[i] === c) indexes.push(i);\n }\n const res = [];\n for(let i = 0; i < s.length; i++) {\n let min = Infinity\n for(let j = 0; j < indexes.length; j++) {\n min = Math.min(min, Math.abs(i - indexes[j]));\n }\n res.push(min)\n }\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3082104676","body":"思路一直接模拟题意,increment 操作循环遍历一遍让元素自增:\n\n```js\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.stack = []\n this.size = 0\n this.maxSize = maxSize\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if (this.size === this.maxSize) return;\n this.stack.push(x);\n this.size ++\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if (this.size === 0) return -1\n const res = this.stack.pop();\n this.size --\n return res;\n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n for(let i = 0; i < this.size;i ++) {\n if (i < k) {\n this.stack[i] += val;\n }\n }\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n```\n\n---\n\n\n思路二使用一个 hashmap 维护自增量,只有在 pop 操作的时候才去运算:\n\n```js\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.stack = []\n this.size = 0\n this.maxSize = maxSize\n this.map = {}\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if (this.size === this.maxSize) return;\n this.stack.push(x);\n this.size ++\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if (this.size === 0) return -1\n const inc = this.map[this.size - 1] || 0;\n const res = this.stack.pop();\n // update inc\n if (inc) {\n this.map[this.size - 1] = 0;\n this.map[this.size - 2] = this.map[this.size - 2] ? this.map[this.size - 2] + inc : inc;\n }\n this.size --\n\n return res + inc;\n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n const key = Math.min(k - 1, this.size - 1);\n this.map[key] = this.map[key] ? this.map[key] + val : val;\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n```\n\n🥲 结果跑出来只打败了 18% 的人,应该是题目给的数据量量太小了 <= 1000,操作 hashmap 的 cost 超过了循环 stack 的时间,不如方法一暴力循环。。。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3089570929","body":"用栈秒了\n\n```js\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n const stack = [];\n let i = 0;\n while(i < s.length) {\n const char = s[i];\n if (char !== ']') {\n stack.push(char)\n i ++\n } else {\n let repeatStr = ''\n while(stack[stack.length - 1] !== '[') {\n const new_char = stack.pop();\n repeatStr = new_char + repeatStr;\n }\n // pop '['\n stack.pop()\n // get number \n let repeat_times = ''\n while(/[0-9]/.test(stack[stack.length - 1])) {\n repeat_times = stack.pop() + repeat_times\n }\n repeat_times = Number(repeat_times)\n stack.push(repeatStr.repeat(repeat_times));\n i ++\n }\n }\n let res = ''\n while(stack.length) {\n res = stack.pop() + res;\n }\n return res\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091373955","body":"思路:用两个栈模拟操作,在 peek 的时候出第二个栈的顶部即可\n\n\n```js\nvar MyQueue = function() {\n this.a = [];\n this.b = [];\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nMyQueue.prototype.push = function(x) {\n this.a.push(x);\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.pop = function() {\n this.peek();\n return this.b.pop();\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.peek = function() {\n if (this.b.length) {\n return this.b[this.b.length - 1]\n } else {\n while(this.a.length) {\n this.b.push(this.a.pop())\n }\n return this.peek()\n }\n};\n\n/**\n * @return {boolean}\n */\nMyQueue.prototype.empty = function() {\n return !this.a.length && !this.b.length\n};\n\n/** \n * Your MyQueue object will be instantiated and called as such:\n * var obj = new MyQueue()\n * obj.push(x)\n * var param_2 = obj.pop()\n * var param_3 = obj.peek()\n * var param_4 = obj.empty()\n */\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094511265","body":"用了一个简单的前缀和 AC 了,时间复杂度也是 NlogN\n\n```js\n/**\n * @param {number[]} arr\n * @return {number}\n */\nvar maxChunksToSorted = function(arr) {\n const sorted_arr = [...arr].sort((a, b) => a - b);\n let count_a = count_b = res = 0;\n\n for(let i = 0; i < arr.length;i ++) {\n count_a += sorted_arr[i];\n count_b += arr[i];\n\n if (count_a === count_b) res ++ \n }\n\n return res\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3096927980","body":"```js\nvar rotateRight = function(head, k) {\n if (!head || !head.next || k === 0) return head;\n\n // Count the length of the list\n let length = 1;\n let tail = head;\n while (tail.next) {\n tail = tail.next;\n length++;\n }\n\n // Normalize k\n k %= length;\n if (k === 0) return head;\n\n // Find the new tail: (length - k - 1)th node\n let newTail = head;\n for (let i = 0; i < length - k - 1; i++) {\n newTail = newTail.next;\n }\n\n // Rotate\n let newHead = newTail.next;\n newTail.next = null;\n tail.next = head;\n\n return newHead;\n};\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100186608","body":"考察交换链表节点的基本操作,需要注意的是“什么时候使用 dummy 节点”的技巧。我的理解是在需要涉及到头节点操作的时候,就创建 dummy 节点。比如这一题 - 交换头两个节点的时候就会涉及到头节点的变更。\n\n\n```js\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar swapPairs = function(head) {\n const dummy = new ListNode(null, head);\n let p = dummy;\n while(p.next && p.next.next) {\n const p1 = p.next, p2 = p.next.next;\n p.next = p2;\n p1.next = p2.next;\n p2.next = p1;\n p = p1\n }\n return dummy.next;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3108866758","body":"Same solution with Problem108. But this problem is giving List instead plain array. So will need to use the trick of two pointers to get the mid node of a Single List.\n\n```js\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {ListNode} head\n * @return {TreeNode}\n */\nvar sortedListToBST = function(head) {\n if (!head) return null\n return helper(head, null)\n\n function helper(head, tail) {\n if (head === tail) return null;\n let fast = head;\n let slow = head;\n while(fast !== tail && fast.next !== tail) {\n fast = fast.next.next;\n slow = slow.next;\n }\n const root = new TreeNode(slow.val);\n root.left = helper(head, slow);\n root.right = helper(slow.next, tail);\n return root\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3111667789","body":"A small trick here is `pa !== pb` and `return pa`. For negative scenarios, if given Lists were not intersected, then one of the Lists must be pointing to `null`, and then returning `null` is expected answer. \n\n```js\nvar getIntersectionNode = function(headA, headB) {\n let pa = headA, pb = headB;\n while(pa !== pb) {\n pa = pa ? pa.next : headB;\n pb = pb ? pb.next : headA;\n }\n return pa\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3115364562","body":"Find the intersection node first, and move the slow pointer to the head, and slowly move both of the pointers till they meet each other(can be proved)\n\n```js\nvar detectCycle = function(head) {\n if (!head) return head;\n let fast = head, slow = head;\n // step1: find the intersection node\n while(fast && fast.next) {\n fast = fast.next.next;\n slow = slow.next;\n // step2: find the entry of the cycle\n if (fast === slow) {\n slow = head;\n while(fast !== slow) {\n fast = fast.next\n slow = slow.next\n }\n return slow;\n }\n }\n return null;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3120830111","body":"In JS, we need to build a double linked list data structure by our own. The rest of the logic is quite straight forward - which use hashmap to save key-node, and use linked list to store access frequency. \n\n```js\nclass DoubleLinkedListNode {\n constructor(key, value) {\n this.key = key;\n this.value = value;\n this.prev = null;\n this.next = null;\n }\n}\n\nclass LRUCache {\n constructor(capacity) {\n this.capacity = capacity;\n this.usedSpace = 0;\n\n this.hashmap = {};\n this.dummyHead = new DoubleLinkedListNode(null, null);\n this.dummyTail = new DoubleLinkedListNode(null, null);\n this.dummyHead.next = this.dummyTail;\n this.dummyTail.prev = this.dummyHead;\n }\n\n _isFull() {\n return this.usedSpace === this.capacity;\n }\n _addToHead(node) {\n const currentHead = this.dummyHead.next;\n\n node.next = currentHead;\n node.prev = this.dummyHead;\n currentHead.prev = node;\n this.dummyHead.next = node;\n\n return node;\n }\n _removeNode(node) {\n node.prev.next = node.next;\n node.next.prev = node.prev;\n node.next = null\n node.prev = null\n return node\n }\n\n get(key) {\n if (this.hashmap[key] !== undefined) {\n const node = this.hashmap[key];\n this._addToHead(this._removeNode(node));\n return node.value\n } else {\n return -1\n }\n }\n put(key, value) {\n if (this.hashmap[key] !== undefined) {\n const node = this.hashmap[key];\n node.value = value;\n this._addToHead(this._removeNode(node))\n } else {\n if (this._isFull()) {\n const nodeNeedToEvict = this.dummyTail.prev;\n delete this.hashmap[nodeNeedToEvict.key];\n this._removeNode(nodeNeedToEvict);\n this.usedSpace --\n }\n const node = new DoubleLinkedListNode(key, value);\n this.hashmap[key] = node;\n this._addToHead(node);\n this.usedSpace ++\n }\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3123671763","body":"Easy\n\n```js\nvar maxDepth = function(root) {\n if (!root) return 0\n return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3124879038","body":"DFS\n\n```js\nvar isSameTree = function(p, q) {\n if (!p && !q) return true\n if (!p || !q) return false\n return p.val === q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right)\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3130312988","body":"DFS will be much simpler. BFS will need to pass a lot of context(params) into helper function which I don't like and not maintainable as well.\n\n\n```js\nvar sumNumbers = function(root) {\n const res = [];\n dfs(root, '')\n return res.reduce((prev, cur) => prev + cur, 0);\n\n\n function dfs(node, str) {\n if (!node.left && !node.right) {\n res.push(+`${str}${node.val}`);\n return;\n }\n if (node.left) dfs(node.left, `${str}${node.val}`);\n if (node.right) dfs(node.right, `${str}${node.val}`);\n } \n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3135220392","body":"Using BFS when accessing the first in the queue, that's the leftest node. And because BFS is looping thru by level, so the last time going thru the queue is the most bottom level. \n\n```js\nvar findBottomLeftValue = function(root) {\n const queue = [root];\n let min = null;\n while(queue.length) {\n const size = queue.length;\n for(let i = 0; i < size; i++) {\n const node = queue.shift();\n if (i === 0) min = node.val\n \n\n if (node.left) queue.push(node.left);\n if (node.right) queue.push(node.right);\n }\n }\n return min;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3138261960","body":"Can use either `DFS` or `BFS` to solve the problem. DFS is more simple to me: \n\n```js\n/**\n * Encodes a tree to a single string.\n *\n * @param {TreeNode} root\n * @return {string}\n */\nvar serialize = function(root) {\n let res = [];\n function dfs(node) {\n if (!node) {\n res.push('null');\n return;\n }\n res.push(String(node.val));\n dfs(node.left)\n dfs(node.right)\n }\n dfs(root);\n console.log(res.join(','))\n return res.join(',')\n};\n\n/**\n * Decodes your encoded data to tree.\n *\n * @param {string} data\n * @return {TreeNode}\n */\nvar deserialize = function(data) {\n const datas = data.split(',');\n let i = 0;\n return dfs()\n\n function dfs() {\n const char = datas[i];\n if (char === 'null') {\n i ++\n return null\n }\n const node = new TreeNode(+char);\n i ++\n node.left = dfs()\n node.right = dfs()\n return node;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3144933267","body":"Use BFS to save the row and column as index, and then sort these indexes. I think the complexity of this problem is how to mange those keys, 2 dimensions keys are quite intricate. \n\nRuntime complexity: O(nlogn), looping over the nodes is O(n), and using `sort` functions are O(nlogn), the bottle neck is sorting functions\nMemory complexity: O(n), use a hashmap to store all nodes\n\n```js\nvar verticalTraversal = function(root) {\n const map = {}\n const queue = [{\n node: root,\n col: 0,\n }];\n let row = 0;;\n while(queue.length) {\n const size = queue.length;\n for(let i = 0; i < size; i++) {\n const cur = queue.shift();\n const node = cur.node;\n if (map[cur.col]?.[row] === undefined) {\n map[cur.col] = {\n ...map[cur.col],\n [row]: [node.val]\n }\n } else {\n map[cur.col][row].push(node.val);\n }\n if (node.left) queue.push({\n node: node.left, \n col: cur.col - 1,\n })\n if (node.right) queue.push({\n node: node.right,\n col: cur.col + 1\n })\n }\n row ++\n }\n const orderByColumn = Object.entries(map).sort(([key1, _], [key2, __]) => Number(key1) - Number(key2));\n const flatternByColumn = orderByColumn.map(i => {\n const column = i[1];\n const arr = [];\n Object.entries(column).sort(([row1], [row2]) => row1 - row2).forEach(([_row, nodes]) => {\n const orderedNodes = nodes.sort((a, b) => a - b);\n arr.push(...orderedNodes)\n })\n return arr\n })\n return flatternByColumn\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146516199","body":"```js\nvar twoSum = function(nums, target) {\n const map = {}\n for(let i = 0; i < nums.length; i ++) {\n const num = nums[i];\n const diff = target - num\n if (map[diff] !== undefined) {\n return [map[diff], i];\n } else {\n map[num] = i;\n }\n }\n return [-1, -1]\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148419003","body":"```js\nvar topKFrequent = function(nums, k) {\n const map = {};\n for(let i = 0; i < nums.length; i++) {\n map[nums[i]] = map[nums[i]] ? map[nums[i]] + 1 : 1;\n }\n const maxCnt = Math.max(...Object.values(map));\n\n const buckets = Array.from({length: maxCnt + 1}, () => []);\n for(let [num, count] of Object.entries(map)) {\n buckets[count].push(num);\n }\n\n const res = [];\n for(let i = maxCnt; i >= 0 && res.length < k; i--) {\n res.push(...buckets[i])\n }\n \n return res.map(i => +i)\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3149124973","body":"Using brute force at the beginning, and didn't think of can use map to reduce runtime: \n\n```js\nvar numberOfBoomerangs = function(points) {\n let res = 0;\n let map = {}\n for(let [x1, y1] of points) {\n map = {}\n for(let [x2, y2] of points) {\n const distance = (x1 - x2) ** 2 + (y1 - y2) ** 2;\n const count = map[distance] ?? 0;\n res += count * 2;\n map[distance] = count + 1 \n }\n }\n return res\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3155367267","body":"Two pointers classic problem (sliding window): \n\n```js\nvar lengthOfLongestSubstring = function(s) {\n let left = 0, right = 0, res = 0\n const window = {};\n while(right < s.length) {\n const right_char = s[right ++];\n window[right_char] = window[right_char] ? window[right_char] + 1 : 1;\n while (window[right_char] > 1) {\n let remove_char = s[left ++];\n window[remove_char] --;\n }\n res = Math.max(right - left, res);\n }\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3160227870","body":"so hard: \n\n\n```js\nvar findSubstring = function(s, words) {\n\n const wordLen = words[0].length;\n const numWords = words.length;\n const totalLen = wordLen * numWords;\n const n = s.length;\n const res = [];\n\n if (n < totalLen) return [];\n\n const wordCount = new Map();\n for (let word of words) {\n wordCount.set(word, (wordCount.get(word) || 0) + 1);\n }\n\n // we loop over wordLen offsets\n for (let offset = 0; offset < wordLen; offset++) {\n let left = offset, count = 0;\n const seen = new Map();\n\n for (let right = offset; right + wordLen <= n; right += wordLen) {\n const word = s.slice(right, right + wordLen);\n\n if (wordCount.has(word)) {\n seen.set(word, (seen.get(word) || 0) + 1);\n count++;\n\n // we shrink window if word is overused\n while (seen.get(word) > wordCount.get(word)) {\n const leftWord = s.slice(left, left + wordLen);\n seen.set(leftWord, seen.get(leftWord) - 1);\n left += wordLen;\n count--;\n }\n\n // Valid window\n if (count === numWords) {\n res.push(left);\n const firstWord = s.slice(left, left + wordLen);\n seen.set(firstWord, seen.get(firstWord) - 1);\n left += wordLen;\n count--;\n }\n } else {\n seen.clear();\n count = 0;\n left = right + wordLen;\n }\n }\n }\n\n return res;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3164450266","body":"```js\nvar minSubarray = function(nums, p) {\n let totalSum = nums.reduce((a, b) => a + b, 0);\n\n // Find the remainder when total sum is divided by p\n let rem = totalSum % p;\n if (rem === 0) return 0; // If the remainder is 0, no subarray needs to be removed\n\n let prefixMod = new Map();\n prefixMod.set(0, -1); // Initialize to handle full prefix\n let prefixSum = 0;\n let minLength = nums.length;\n\n for (let i = 0; i < nums.length; i++) {\n prefixSum += nums[i];\n let currentMod = prefixSum % p;\n let targetMod = (currentMod - rem + p) % p;\n\n if (prefixMod.has(targetMod)) {\n minLength = Math.min(minLength, i - prefixMod.get(targetMod));\n }\n\n prefixMod.set(currentMod, i);\n }\n\n return minLength === nums.length ? -1 : minLength;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3168150001","body":"```js\nvar middleNode = function(head) {\n if (!head || !head.next) return head;\n let fast = head, slow = head;\n while(fast && fast.next) {\n fast = fast.next.next;\n slow = slow.next\n } \n return slow;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3170748221","body":"```js\nvar removeDuplicates = function(nums) {\n let fast = 0, slow = 0;\n while(fast < nums.length) {\n if (nums[slow] !== nums[fast]) {\n nums[++slow] = nums[fast];\n }\n fast ++\n }\n return slow + 1\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172646559","body":"Binary Search\n\n```js\nvar searchInsert = function(nums, target) {\n let left = 0, right = nums.length;\n while(left < right) {\n const mid = left + Math.floor((right - left) / 2);\n if (nums[mid] >= target) {\n right = mid\n } else {\n left = mid + 1\n }\n }\n return left;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173319860","body":" Too long to put down DeQueue implementation in JS. Don't think this will be asked in an interview: \n\n```js\nvar maxSlidingWindow = function (nums, k) {\n const res = [];\n const dequeue = new Dequeue([]);\n // 前 k - 1 个数入队\n for (let i = 0; i < k - 1; i++) {\n dequeue.push(nums[i]);\n }\n\n // 滑动窗口\n for (let i = k - 1; i < nums.length; i++) {\n dequeue.push(nums[i]);\n res.push(dequeue.max());\n dequeue.shift(nums[i - k + 1]);\n }\n return res;\n};\n\nclass Dequeue {\n constructor(nums) {\n this.list = nums;\n }\n\n push(val) {\n const nums = this.list;\n // 保证数据从队头到队尾递减\n while (nums[nums.length - 1] < val) {\n nums.pop();\n }\n nums.push(val);\n }\n\n // 队头出队\n shift(val) {\n let nums = this.list;\n if (nums[0] === val) {\n // 这里的js实现shift()理论上复杂度应该是O(k), 就不去真实实现一个O(1)出队的队列了,意思到位即可\n nums.shift();\n }\n }\n\n max() {\n return this.list[0];\n }\n}\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3179501468","body":"```js\nvar findJudge = function (n, trust) {\n const count = new Array(n + 1).fill(0);\n for (const edge of trust) {\n const x = edge[0];\n const y = edge[1];\n count[y]++;\n count[x]--;\n }\n for (let i = 1; i <= n; ++i) {\n if (count[i] === n - 1) {\n return i;\n }\n }\n return -1;\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3184086046","body":"```js\nvar possibleBipartition = function(N, dislikes) {\n const graph = [...Array(N+1)].map(() => []);\n const visited = Array(N+1).fill(false);\n const color = Array(N+1).fill(0);\n\n for(let [u, v] of dislikes) {\n graph[u].push(v);\n graph[v].push(u);\n }\n\n for(let i = 1; i <= N; i++) {\n if(!colorNodes(i)) return false;\n }\n return true;\n\n function colorNodes(node) {\n if(visited[node]) return true;\n const currColor = new Set([1, 2]);\n\n\t\t// remove colors used by neighbors\n for(let child of graph[node]) {\n if(color[child] === 1) currColor.delete(1);\n if(color[child] === 2) currColor.delete(2);\n }\n\n\t\t// no color is available return false\n if(currColor.size === 0) return false;\n\t\t\n\t\t// assign the smallest available color\n color[node] = Math.min(...currColor);\n visited[node] = true; \n\n for(let child of graph[node]) {\n if(!colorNodes(child)) return false; \n }\n return true;\n }\n};\n```","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"stonehl":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3073791924","body":"C++代码:\n`class Solution {\npublic:\n vector addToArrayForm(vector& num, int k) {\n vector res;\n int n = num.size();\n for (int i=n-1; i>=0; --i) {\n int sum = num[i] + k % 10;\n k /= 10;\n if (sum >= 10) {\n k++;\n sum -= 10;\n }\n res.push_back(sum);\n }\n for (; k > 0; k /= 10) {\n res.push_back(k % 10);\n }\n reverse(res.begin(), res.end());\n return res;\n }\n};`","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3097159903","body":"### 思路:\n1. 异常情况判断;\n2. 统计链表长度, 同时将链表的收尾相连;\n3. 将k对链表长度取余,余数为0表示刚好旋转了链表长度的整数倍,链表节点位置不变;\n4. 新的链表头节点是原链表中第 n - k 个节点。\n### C++代码\n```\nclass Solution {\npublic:\n ListNode* rotateRight(ListNode* head, int k) {\n if (head == nullptr || head->next == nullptr || k == 0)\n return head;\n int count = 1; // 用来统计链表长度\n ListNode* tmp = head;\n while (tmp->next != nullptr) {\n count++;\n tmp = tmp->next; // 滑动到链表尾部\n }\n k %= count;\n //如果刚好是链表长度的倍数,则不进行旋转\n if (k == 0)\n return head;\n tmp->next = head;\n // \n for (int i=0; i < count - k; i++) {\n tmp = tmp->next;\n }\n ListNode* newHead = tmp->next;\n tmp->next = nullptr;\n return newHead;\n }\n};\n```\n### 时间复杂度\nO(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3103550594","body":"### 思路:\n使用递归的方法解题\n1. 找递归终止条件,当链表为空或链表只有一个元素时,没法交换,终止递归,返回当前节点;\n2. 每一次递归需要返回的值是交换后的子链表的头节点;\n\n### 代码:\n```\nclass Solution {\npublic:\n ListNode* swapPairs(ListNode* head) {\n if (head == nullptr || head->next == nullptr) {\n return head;\n }\n ListNode* next = head->next;\n head->next = swapPairs(next->next);\n next->next = head;\n return next;\n }\n};\n\n```","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3127754666","body":"### 思路:\n使用深度优先搜索的方法,\n1. 先找返回条件, 如果两个节点都为空,则返回true;\n2. 如果两个节点都不为空,并且这两个节点的值相等则分别递归判断这两个节点的左子树和右子树的值是否相等,如果相等,则返回true, 否则返回false。\n\n### 代码:\n```\nclass Solution {\npublic:\n bool isSameTree(TreeNode* p, TreeNode* q) {\n if(p==nullptr && q==nullptr) {\n return true;\n }\n if (p && q && (p->val == q->val)) {\n return isSameTree(p->right, q->right) && isSameTree(p->left, q->left);\n }\n return false;\n\n }\n};\n```\n### 复杂度分析:\n时间复杂度O(N),N为两棵树节点的最小值","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3151160755","body":"### 思路:\n将每个距离的出现次数记录在哈希表中,然后遍历哈希表,计算并累加回旋镖的个数。\n\n### 代码:\n```\nclass Solution {\npublic:\n int numberOfBoomerangs(vector>& points) {\n int n = points.size();\n int res = 0;\n if (n < 3)\n return res;\n\n int ans = 0;\n for (auto &p : points) {\n unordered_map cnt;\n for (auto &q : points) {\n int dis = (p[0] - q[0]) * (p[0] - q[0]) + (p[1] - q[1]) * (p[1] - q[1]);\n ++cnt[dis];\n }\n for (auto &[_, m] : cnt) {\n ans += m * (m - 1);\n }\n }\n return ans;\n\n }\n};\n```\n时间复杂度:O(n2)","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3174960911","body":"### 思路:\n使用双端队列来维护滑动窗口内的最大值\n### 代码:\n```\nclass Solution {\npublic:\n vector maxSlidingWindow(vector& nums, int k) {\n deque q;\n int n = nums.size();\n vector res;\n for(int i = 0; i < n; i++) {\n if(q.size() && i - q.front() >= k)\n q.pop_front();\n while(q.size() && nums[q.back()] <= nums[i]) q.pop_back();\n q.push_back(i);\n if(i >= k - 1) {\n res.push_back(nums[q.front()]);\n }\n }\n return res;\n }\n};\n```\n### 复杂度:\n时间复杂度:O(n)","onTime":true},null,null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3201130868","body":"### 思路:\n基数排序\n### 代码:\n```\nclass Solution {\npublic:\n vector sortArray(vector& nums) {\n const int NUM = 50000;\n int arr[NUM*10+10];\n bzero(arr,sizeof(arr));\n for(int&num:nums){\n num+=NUM;\n arr[num]+=1;\n }\n int cur = 0;\n for(int i = 0;i<(NUM*10+10);++i){\n int tmp = arr[i];\n while(tmp--){\n nums[cur++] = i-NUM;\n }\n }\n return nums;\n }\n};\n```\n### 时间复杂度: O(N)","onTime":true},null,null,null,null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3234026083","body":"### 思路:\n1. 先统计t中每个字符出现的次数;\n2. 初始化左右指针,以及记录答案的变量;\n3. 右指针移动,更新计数。如果当前字符是t中的字符(即计数大于0),则减小cntT;\n4. 当cntT为0时,说明当前窗口包含了t的所有字符,然后尝试移动左指针缩小窗口;\n5. 在缩小窗口时,如果移除了t中的字符,则增加cntT,并更新答案;\n6. 最后根据是否找到答案返回相应的子串。\n### 代码:\n```\nclass Solution {\npublic:\n string minWindow(string s, string t) {\n vector cnt(128, 0);\n for (char c : t) {\n cnt[c]++;\n }\n \n int l = 0, r = 0, ansL = 0, ansR = 0, ans = INT_MAX, cntT = t.length();\n \n while (r < s.length()) {\n if (cnt[s[r]]-- > 0) {\n cntT--;\n }\n r++;\n \n while (cntT == 0) {\n if (r - l < ans) {\n ans = r - l;\n ansL = l;\n ansR = r;\n }\n if (cnt[s[l]]++ == 0) {\n cntT++;\n }\n l++;\n }\n }\n \n return ans == INT_MAX ? \"\" : s.substr(ansL, ansR - ansL);\n }\n};\n```\n### 时间复杂度:O(n)","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3245701951","body":"### 思路:\n1. 初始化标记数组 visited,避免重复访问;\n2. 遍历每个格子,使用DFS搜索整个岛屿。\n\n### 代码:\n```\nclass Solution {\nprivate:\n int count;\n int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向\n void dfs(vector>& grid, vector>& visited, int x, int y) {\n for (int i = 0; i < 4; i++) {\n int nextx = x + dir[i][0];\n int nexty = y + dir[i][1];\n if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过\n if (!visited[nextx][nexty] && grid[nextx][nexty] == 1) { // 没有访问过的 同时 是陆地的\n\n visited[nextx][nexty] = true;\n count++;\n dfs(grid, visited, nextx, nexty);\n }\n }\n }\n\npublic:\n int maxAreaOfIsland(vector>& grid) {\n int n = grid.size(), m = grid[0].size();\n vector> visited = vector>(n, vector(m, false));\n\n int result = 0;\n for (int i = 0; i < n; i++) {\n for (int j = 0; j < m; j++) {\n if (!visited[i][j] && grid[i][j] == 1) {\n count = 1;\n visited[i][j] = true;\n dfs(grid, visited, i, j); // 将与其链接的陆地都标记上 true\n result = max(result, count);\n }\n }\n }\n return result;\n }\n};\n```\n### 时间复杂度: O(MN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3249613575","body":"### 思路:\n使用多源广度优先搜索,先找到所有陆地放入队列,然后从陆地开始向外搜索,最后被触及的海洋就是离所有陆地最远的海洋。\n### 代码:\n```\nclass Solution {\npublic:\n int maxDistance(vector>& grid) {\n int n = grid.size();\n vector> directions = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};\n queue> q;\n \n for (int i = 0; i < n; i++) {\n for (int j = 0; j < n; j++) {\n if (grid[i][j] == 1) {\n q.push({i, j});\n }\n }\n }\n \n // 如果全是海洋或者全是陆地\n if (q.empty() || q.size() == n * n) return -1;\n \n int distance = -1;\n \n // 2. 多源 BFS\n while (!q.empty()) {\n int size = q.size();\n distance++;\n \n for (int s = 0; s < size; s++) {\n auto [x, y] = q.front();\n q.pop();\n \n for (auto [dx, dy] : directions) {\n int nx = x + dx, ny = y + dy;\n if (nx >= 0 && nx < n && ny >= 0 && ny < n && grid[nx][ny] == 0) {\n grid[nx][ny] = 1; // 标记为已访问(变为陆地)\n q.push({nx, ny});\n }\n }\n }\n }\n \n return distance;\n }\n};\n```\n### 时间复杂度: O(N²)","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3271218211","body":"### 代码:\n```\nclass Solution {\npublic:\n int longestCommonSubsequence(string text1, string text2) {\n int m = text2.length();\n vector f(m + 1);\n for (char x : text1) {\n for (int j = 0, pre = 0; j < m; j++) {\n int tmp = f[j + 1];\n f[j + 1] = x == text2[j] ? pre + 1 : max(f[j + 1], f[j]);\n pre = tmp;\n }\n }\n return f[m];\n }\n};\n```\n### 时间复杂度:O(nm)","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289595360","body":"\n### 代码:\n```\nclass Solution {\npublic:\n int findTargetSumWays(vector& nums, int target) {\n int s = reduce(nums.begin(), nums.end()) - abs(target);\n if (s < 0 || s % 2) {\n return 0;\n }\n\n int m = s / 2; // 背包容量\n int n = nums.size();\n vector memo(n, vector(m + 1, -1)); // -1 表示没有计算过\n\n // lambda 递归函数\n auto dfs = [&](this auto&& dfs, int i, int c) -> int {\n if (i < 0) {\n return c == 0;\n }\n int& res = memo[i][c]; // 注意这里是引用\n if (res != -1) { // 之前计算过\n return res;\n }\n if (c < nums[i]) {\n return res = dfs(i - 1, c); // 只能不选\n }\n return res = dfs(i - 1, c) + dfs(i - 1, c - nums[i]); // 不选 + 选\n };\n\n return dfs(n - 1, m);\n }\n};\n```\n时间复杂度:O(nm)","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/72#issuecomment-3316013499","body":"### 代码:\n```\nclass Solution {\npublic:\n ListNode* mergeKLists(vector& lists) {\n auto cmp = [](const ListNode* a, const ListNode* b) {\n return a->val > b->val; // 最小堆\n };\n priority_queue, decltype(cmp)> pq;\n for (auto head : lists) {\n if (head) {\n pq.push(head); // 把所有非空链表的头节点入堆\n }\n }\n\n ListNode dummy{}; // 哨兵节点,作为合并后链表头节点的前一个节点\n auto cur = &dummy;\n while (!pq.empty()) { // 循环直到堆为空\n auto node = pq.top(); // 剩余节点中的最小节点\n pq.pop();\n if (node->next) { // 下一个节点不为空\n pq.push(node->next); // 下一个节点有可能是最小节点,入堆\n }\n cur->next = node; // 把 node 添加到新链表的末尾\n cur = cur->next; // 准备合并下一个节点\n }\n return dummy.next; // 哨兵节点的下一个节点就是新链表的头节点\n }\n};\n```\n### 时间复杂度:\nO(Llogm),其中 m 为 lists 的长度,L 为所有链表的长度之和。","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"shuyuanzhang118":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074090351","body":"## 算法思路分析\n\n这是一个将数组形式的整数与普通整数相加的算法,采用了模拟手工加法的思路:\n\n### 核心思路\n1. **从右到左逐位相加**:模拟手工加法,从最低位开始处理\n2. **处理进位**:当两位数字相加结果 ≥ 10 时,产生进位\n3. **处理不同长度**:通过 `num[len-1] || 0` 处理数组已遍历完的情况\n4. **逆序构建结果**:由于是从低位到高位计算,最后需要反转数组\n\n```JavaScript\n/**\n * @param {number[]} num\n * @param {number} k\n * @return {number[]}\n */\nvar addToArrayForm = function(num, k) {\n let res = []\n let len = num.length\n let carry = 0\n while(len > 0 || k > 0) {\n let a = num[len - 1] || 0\n let b = k % 10\n let sum = a + b + carry\n res.push(sum % 10)\n carry = sum >= 10 ? 1 : 0\n len--\n k = Math.floor(k / 10)\n }\n if (carry) {\n res.push(1)\n }\n return res.reverse()\n};\n```\n\n### 时间复杂度\n**O(max(N, log K))**\n- N 是数组 `num` 的长度\n- log K 是整数 k 的位数\n- 循环次数取决于较长的那个数\n\n### 空间复杂度\n**O(max(N, log K))**\n- 结果数组 `res` 的长度最多为 max(N, log K) + 1\n- 其他变量占用常数空间","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3079209775","body":"## 算法思路分析\n核心思想:双向遍历\n\n这个算法使用了一种巧妙的双向遍历方法来解决问题:\n\n1. 第一次遍历(从左到右) :\n \n - 记录每个位置到其左边最近字符c的距离\n - 使用变量 prev 记录上一个字符c的位置\n - 对于每个位置i,距离为 i - prev\n2. 第二次遍历(从右到左) :\n \n - 计算每个位置到其右边最近字符c的距离\n - 与第一次遍历的结果取最小值,得到最终答案\n - 对于每个位置i,距离为 prev - i\n\n## 代码\n```Javascript\n/**\n * @param {string} s\n * @param {character} c\n * @return {number[]}\n */\nvar shortestToChar = function(s, c) {\n const n = s.length;\n const answer = new Array(n).fill(Infinity);\n \n // 第一次遍历:从左到右,记录每个位置到左边最近字符c的距离\n let prev = -Infinity;\n for (let i = 0; i < n; i++) {\n if (s[i] === c) {\n prev = i;\n }\n answer[i] = i - prev;\n }\n \n // 第二次遍历:从右到左,更新每个位置到右边最近字符c的距离\n prev = Infinity;\n for (let i = n - 1; i >= 0; i--) {\n if (s[i] === c) {\n prev = i;\n }\n answer[i] = Math.min(answer[i], prev - i);\n }\n \n return answer;\n};\n```\n\n## 复杂度分析\n\n时间复杂度:O(n)\n- 需要遍历字符串两次,每次遍历都是O(n)\n- 总时间复杂度为O(n) + O(n) = O(n)\n- 这是最优的时间复杂度,因为至少需要访问每个字符一次\n\n空间复杂度:O(n)\n- 需要创建一个长度为n的结果数组 answer\n- 除了结果数组外,只使用了常数个额外变量( prev , i , n )\n- 如果不计算返回值所需的空间,额外空间复杂度为O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3084609047","body":"### 算法设计思路\n\n**核心数据结构:**\n- 使用数组 `stack` 作为底层存储结构\n- 使用 `maxSize` 记录栈的最大容量\n- 数组索引 0 为栈底,数组末尾为栈顶\n\n### 代码\n\n```JavaScript\n/**\n * @param {number} maxSize\n */\nvar CustomStack = function(maxSize) {\n this.maxSize = maxSize;\n this.stack = [];\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nCustomStack.prototype.push = function(x) {\n if (this.stack.length < this.maxSize) {\n this.stack.push(x);\n }\n};\n\n/**\n * @return {number}\n */\nCustomStack.prototype.pop = function() {\n if (this.stack.length === 0) {\n return -1;\n }\n return this.stack.pop();\n};\n\n/** \n * @param {number} k \n * @param {number} val\n * @return {void}\n */\nCustomStack.prototype.increment = function(k, val) {\n // 对栈底的k个元素进行增量操作\n // 如果栈中元素总数小于k,则对所有元素进行增量操作\n const elementsToIncrement = Math.min(k, this.stack.length);\n for (let i = 0; i < elementsToIncrement; i++) {\n this.stack[i] += val;\n }\n};\n\n/** \n * Your CustomStack object will be instantiated and called as such:\n * var obj = new CustomStack(maxSize)\n * obj.push(x)\n * var param_2 = obj.pop()\n * obj.increment(k,val)\n */\n```\n\n### 时间复杂度分析\n\n| 方法 | 时间复杂度 | 分析 |\n|------|------------|------|\n| **构造函数** | O(1) | 仅初始化两个变量 |\n| **push(x)** | O(1) | 数组末尾添加元素,均摊时间复杂度为 O(1) |\n| **pop()** | O(1) | 数组末尾删除元素 |\n| **increment(k, val)** | O(min(k, n)) | 需要遍历栈底的 k 个元素,n 为当前栈大小 |\n\n### 空间复杂度分析\n\n| 方面 | 空间复杂度 | 分析 |\n|------|------------|------|\n| **整体空间** | O(maxSize) | 最坏情况下数组存储 maxSize 个元素 |\n| **辅助空间** | O(1) | 除了存储栈元素外,只使用常数额外空间 |\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3092430277","body":"### 算法思路分析\n\n**核心思想:使用栈处理嵌套结构**\n\n这是一个典型的括号匹配问题,需要处理嵌套的编码结构。算法的关键在于:\n1. **识别模式** - `k[encoded_string]` 表示重复 k 次\n2. **处理嵌套** - 可能存在多层嵌套,如 `3[a2[c]]`\n3. **状态管理** - 需要记录当前的数字、字符串和历史状态\n\n**算法步骤:**\n1. 遍历字符串的每个字符\n2. 遇到数字:累积构建重复次数(支持多位数)\n3. 遇到 `[`:将当前状态(字符串和数字)压入栈,重置当前状态\n4. 遇到 `]`:从栈中弹出之前的状态,重复当前字符串并拼接\n5. 遇到字母:直接添加到当前字符串\n\n### 代码实现\n\n```javascript\n/**\n * @param {string} s\n * @return {string}\n */\nvar decodeString = function(s) {\n const stack = [];\n let currentNum = 0;\n let currentStr = '';\n \n for (let i = 0; i < s.length; i++) {\n const char = s[i];\n \n if (char >= '0' && char <= '9') {\n // 构建数字(可能是多位数)\n currentNum = currentNum * 10 + parseInt(char);\n } else if (char === '[') {\n // 遇到左括号,将当前状态入栈\n stack.push([currentStr, currentNum]);\n currentStr = '';\n currentNum = 0;\n } else if (char === ']') {\n // 遇到右括号,出栈并重复字符串\n const [prevStr, num] = stack.pop();\n currentStr = prevStr + currentStr.repeat(num);\n } else {\n // 普通字符,直接添加到当前字符串\n currentStr += char;\n }\n }\n \n return currentStr;\n};\n```\n\n### 复杂度分析\n\n**时间复杂度:O(n + m)**\n- n:输入字符串长度\n- m:输出字符串长度\n- 每个字符最多被处理一次\n- 字符串重复操作的总时间与最终输出长度成正比\n\n**空间复杂度:O(n + m)**\n- **栈空间**:O(d) - d 为最大嵌套深度,最坏情况 O(n)\n- **字符串存储**:O(m) - 存储中间结果和最终结果\n- **总空间**:O(n + m)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092434643","body":"## 核心算法思路\n\n使用两个栈实现队列:\n- `inStack`: 用于接收新元素的输入\n- `outStack`: 用于输出元素\n\n当需要 pop 或 peek 时,如果 outStack 为空,就将 inStack 中的所有元素转移到 outStack 中,这样就实现了先入先出的特性。\n\n## 代码实现\n\n```javascript\n\nvar MyQueue = function() {\n this.inStack = []; // 用于输入的栈\n this.outStack = []; // 用于输出的栈\n};\n\n/** \n * @param {number} x\n * @return {void}\n */\nMyQueue.prototype.push = function(x) {\n this.inStack.push(x);\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.pop = function() {\n if (this.outStack.length === 0) {\n // 将inStack中的所有元素转移到outStack\n while (this.inStack.length > 0) {\n this.outStack.push(this.inStack.pop());\n }\n }\n return this.outStack.pop();\n};\n\n/**\n * @return {number}\n */\nMyQueue.prototype.peek = function() {\n if (this.outStack.length === 0) {\n // 将inStack中的所有元素转移到outStack\n while (this.inStack.length > 0) {\n this.outStack.push(this.inStack.pop());\n }\n }\n return this.outStack[this.outStack.length - 1];\n};\n\n/**\n * @return {boolean}\n */\nMyQueue.prototype.empty = function() {\n return this.inStack.length === 0 && this.outStack.length === 0;\n};\n\n/** \n * Your MyQueue object will be instantiated and called as such:\n * var obj = new MyQueue()\n * obj.push(x)\n * var param_2 = obj.pop()\n * var param_3 = obj.peek()\n * var param_4 = obj.empty()\n */\n```\n\n## 复杂度分析\n\n**时间复杂度**:\n- push: O(1)\n- pop: 均摊 O(1)\n- peek: 均摊 O(1) \n- empty: O(1)\n\n**空间复杂度**: O(n)\n\n**均摊 O(1) 的原理**:虽然单次 pop 或 peek 操作在最坏情况下可能需要 O(n) 时间,但每个元素最多只会被转移一次,所以 n 个操作的总时间复杂度为 O(n),均摊下来每个操作为 O(1)。\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094581867","body":"## 算法思路\n- 关键观察:如果前缀[0...i]的最大值 ≤ 后缀[i+1...n-1]的最小值,则可以在位置i处分块\n- 这保证了前面块的所有元素都不大于后面块的任何元素,分别排序后连接仍然有序\n\n## 代码\n```javascript\n/**\n * @param {number[]} arr\n * @return {number}\n */\nvar maxChunksToSorted = function(arr) {\n const n = arr.length;\n if (n <= 1) return n;\n \n // 计算前缀最大值数组\n const prefixMax = new Array(n);\n prefixMax[0] = arr[0];\n for (let i = 1; i < n; i++) {\n prefixMax[i] = Math.max(prefixMax[i-1], arr[i]);\n }\n \n // 计算后缀最小值数组\n const suffixMin = new Array(n);\n suffixMin[n-1] = arr[n-1];\n for (let i = n-2; i >= 0; i--) {\n suffixMin[i] = Math.min(suffixMin[i+1], arr[i]);\n }\n \n let chunks = 1; // 至少有一个分块\n \n // 检查每个可能的分块点\n for (let i = 0; i < n-1; i++) {\n // 如果前缀最大值 <= 后缀最小值,可以在i处分块\n if (prefixMax[i] <= suffixMin[i+1]) {\n chunks++;\n }\n }\n \n return chunks;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) - 需要三次遍历数组\n- 空间复杂度:O(n) - 需要两个额外数组","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3097244383","body":"## 核心思路 :\n- 计算链表长度并找到尾节点\n- 优化k值避免重复旋转\n- 找到新的尾节点(第length-k个节点)\n- 重新连接:断开新尾节点与新头节点,原尾节点连接原头节点\n\n## 代码:\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @param {number} k\n * @return {ListNode}\n */\nvar rotateRight = function(head, k) {\n // 边界情况处理\n if (!head || !head.next || k === 0) {\n return head;\n }\n \n // 1. 计算链表长度并找到尾节点\n let length = 1;\n let tail = head;\n while (tail.next) {\n tail = tail.next;\n length++;\n }\n \n // 2. 优化k值,避免不必要的旋转\n k = k % length;\n if (k === 0) {\n return head;\n }\n \n // 3. 找到新的尾节点(从头开始第length-k个节点)\n let newTail = head;\n for (let i = 0; i < length - k - 1; i++) {\n newTail = newTail.next;\n }\n \n // 4. 新的头节点是新尾节点的下一个节点\n let newHead = newTail.next;\n \n // 5. 断开连接并重新连接\n newTail.next = null; // 断开新尾节点与新头节点的连接\n tail.next = head; // 原尾节点连接到原头节点\n \n return newHead;\n};\n```\n\n## 复杂度分析 :\n- 时间复杂度 :O(n) - 需要遍历链表计算长度和找到切分点\n- 空间复杂度 :O(1) - 只使用常数个额外变量","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3103625610","body":"## 算法思路\n- 虚拟头节点技巧: 简化边界条件处理\n- 三指针法: prev, first, second 精确控制交换过程\n- 原地交换: 只修改指针,不创建新节点\n- 边界处理: 空链表和单节点的特殊情况\n\n## 代码实现\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar swapPairs = function(head) {\n // 边界情况:空链表或只有一个节点\n if (!head || !head.next) {\n return head;\n }\n \n // 创建虚拟头节点,简化操作\n let dummy = new ListNode(0);\n dummy.next = head;\n let prev = dummy;\n \n // 当存在至少两个节点时进行交换\n while (prev.next && prev.next.next) {\n // 定义要交换的两个节点\n let first = prev.next;\n let second = prev.next.next;\n \n // 执行交换操作\n // 步骤:prev -> first -> second -> ... \n // 变为:prev -> second -> first -> ...\n prev.next = second;\n first.next = second.next;\n second.next = first;\n \n // 移动prev指针到已交换的第二个节点(现在是first)\n prev = first;\n }\n \n return dummy.next;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) \n- 空间复杂度:O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109219828","body":"## 算法思路\n- 算法的核心思想是利用有序链表的特性:\n- 选择中间节点作为根节点,保证树的平衡性\n- 递归地将左半部分构建为左子树,右半部分构建为右子树\n- 最优解使用中序遍历的特性,避免重复遍历链表\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {ListNode} head\n * @return {TreeNode}\n */\nvar sortedListToBST = function(head) {\n // 计算链表长度\n function getLength(head) {\n let length = 0;\n while (head) {\n length++;\n head = head.next;\n }\n return length;\n }\n \n const length = getLength(head);\n let current = head;\n \n // 中序遍历构建BST\n function buildBST(start, end) {\n if (start > end) return null;\n \n const mid = Math.floor((start + end) / 2);\n \n // 先构建左子树\n const left = buildBST(start, mid - 1);\n \n // 创建根节点(当前链表节点)\n const root = new TreeNode(current.val);\n current = current.next;\n \n // 再构建右子树\n const right = buildBST(mid + 1, end);\n \n root.left = left;\n root.right = right;\n \n return root;\n }\n \n return buildBST(0, length - 1);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) - 每个节点只访问一次\n- 空间复杂度:O(log n) - 仅递归栈深度","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3117083288","body":"## 算法思路\n双指针法 :让两个指针分别从两个链表头部开始遍历,当指针到达链表末尾时跳转到另一个链表的头部。这样可以消除两个链表的长度差异,如果有交点,两个指针会在交点相遇;如果没有交点,两个指针最终都会变成 null。\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} headA\n * @param {ListNode} headB\n * @return {ListNode}\n */\nvar getIntersectionNode = function(headA, headB) {\n // 如果任一链表为空,直接返回null\n if (!headA || !headB) {\n return null;\n }\n \n // 双指针法:让两个指针分别遍历两个链表\n // 当指针到达链表末尾时,跳转到另一个链表的头部\n // 这样可以消除长度差,如果有交点,两指针会在交点相遇\n let pA = headA;\n let pB = headB;\n \n // 当两个指针不相等时继续遍历\n while (pA !== pB) {\n // 如果pA到达末尾,跳转到headB;否则继续下一个节点\n pA = pA === null ? headB : pA.next;\n // 如果pB到达末尾,跳转到headA;否则继续下一个节点\n pB = pB === null ? headA : pB.next;\n }\n \n // 返回交点(如果没有交点,两指针都会变成null)\n return pA;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(m + n),其中 m 和 n 分别是两个链表的长度。每个指针最多遍历两个链表一次。\n- 空间复杂度 :O(1),只使用了两个指针变量,没有使用额外的数据结构。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3117100989","body":"## 算法思路\n- 第一阶段 :使用快慢指针检测是否有环\n- 慢指针每次移动1步,快指针每次移动2步\n- 如果有环,快慢指针必定会相遇\n- 第二阶段 :找到环的起始节点\n- 基于数学原理:从头节点到环入口的距离等于从相遇点到环入口的距离\n- 将一个指针重置到头节点,两指针同速移动直到相遇\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val) {\n * this.val = val;\n * this.next = null;\n * }\n */\n\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar detectCycle = function(head) {\n // 边界情况:空链表或只有一个节点且无环\n if (!head || !head.next) {\n return null;\n }\n \n // 第一阶段:使用快慢指针检测是否有环\n let slow = head;\n let fast = head;\n \n // 快指针每次走两步,慢指针每次走一步\n while (fast && fast.next) {\n slow = slow.next;\n fast = fast.next.next;\n \n // 如果快慢指针相遇,说明存在环\n if (slow === fast) {\n break;\n }\n }\n \n // 如果没有环,返回null\n if (!fast || !fast.next) {\n return null;\n }\n \n // 第二阶段:找到环的起始节点\n // 将一个指针重置到头节点,两个指针同时以相同速度移动\n // 它们相遇的地方就是环的起始节点\n slow = head;\n while (slow !== fast) {\n slow = slow.next;\n fast = fast.next;\n }\n \n return slow; // 返回环的起始节点\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 最多遍历链表两次\n- 空间复杂度 :O(1) - 只使用常数个额外变量,满足进阶要求","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3124469572","body":"## 算法思路\n这个LRU(Least Recently Used)缓存实现采用了 哈希表 + 双向链表 的经典设计模式:\n数据结构组合 :\n - Map :用于O(1)时间复杂度的键值查找\n - 双向链表:用于维护访问顺序,支持O(1)的插入和删除操作\n - 虚拟头尾节点:简化边界条件处理\n\n## 代码\n```javascript\n/**\n * @param {number} capacity\n */\nvar LRUCache = function(capacity) {\n this.capacity = capacity;\n this.cache = new Map(); // 使用Map存储键值对\n this.head = {}; // 虚拟头节点\n this.tail = {}; // 虚拟尾节点\n this.head.next = this.tail;\n this.tail.prev = this.head;\n};\n\n/** \n * @param {number} key\n * @return {number}\n */\nLRUCache.prototype.get = function(key) {\n if (!this.cache.has(key)) {\n return -1;\n }\n \n // 存在则将节点移到链表头部(表示最近使用)\n const node = this.cache.get(key);\n this.removeFromList(node);\n this.addToHead(node);\n \n return node.value;\n};\n\n/** \n * @param {number} key \n * @param {number} value\n * @return {void}\n */\nLRUCache.prototype.put = function(key, value) {\n // 如果已存在,先删除旧节点\n if (this.cache.has(key)) {\n const oldNode = this.cache.get(key);\n this.removeFromList(oldNode);\n this.cache.delete(key);\n }\n \n // 创建新节点并添加到头部\n const newNode = { key, value, prev: null, next: null };\n this.cache.set(key, newNode);\n this.addToHead(newNode);\n \n // 如果超出容量,删除尾部节点(最久未使用)\n if (this.cache.size > this.capacity) {\n const tailNode = this.tail.prev;\n this.removeFromList(tailNode);\n this.cache.delete(tailNode.key);\n }\n};\n\n// 辅助方法:将节点添加到链表头部\nLRUCache.prototype.addToHead = function(node) {\n node.next = this.head.next;\n node.prev = this.head;\n this.head.next.prev = node;\n this.head.next = node;\n};\n\n// 辅助方法:从链表中删除节点\nLRUCache.prototype.removeFromList = function(node) {\n node.prev.next = node.next;\n node.next.prev = node.prev;\n};\n\n/** \n * Your LRUCache object will be instantiated and called as such:\n * var obj = new LRUCache(capacity)\n * var param_1 = obj.get(key)\n * obj.put(key,value)\n */\n```\n\n## 复杂度分析\n- 时间复杂度:O(1)\n- 空间复杂度:O(capacity)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124496973","body":"## 算法思路\n使用广度优先搜索(BFS)的方法来计算二叉树的最大深度:\n- 初始化 :如果根节点为空,直接返回0\n- 队列存储 :使用队列存储节点和对应的深度信息,初始将根节点和深度1入队\n- 层序遍历 :通过队列进行层序遍历,每次取出队首元素\n- 深度更新 :更新最大深度值,并将当前节点的左右子节点(如果存在)连同深度+1一起入队\n- 返回结果 :遍历完成后返回记录的最大深度\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar maxDepth = function(root) {\n if (!root) return 0;\n let queue = [[root, 1]];\n let maxDepth = 0;\n\n while (queue.length > 0) {\n let [node, depth] = queue.shift();\n if (node) {\n maxDepth = Math.max(maxDepth, depth);\n if (node.left) queue.push([node.left, depth + 1]);\n if (node.right) queue.push([node.right, depth + 1]);\n }\n }\n\n return maxDepth;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 O(n) ,其中n是二叉树中节点的总数\n- 空间复杂度 O(w) ,其中w是二叉树的最大宽度","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3126191127","body":"## 算法思路\n使用递归的深度优先搜索(DFS)方法:\n- 基本情况 :如果两个节点都为空,返回 true\n- 边界情况 :如果只有一个节点为空,返回 false\n- 值比较 :如果两个节点的值不相等,返回 false\n- 递归检查 :同时检查左子树和右子树是否相同\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {TreeNode} p\n * @param {TreeNode} q\n * @return {boolean}\n */\nvar isSameTree = function(p, q) {\n if (p === null && q === null) {\n return true;\n }\n if (p === null || q === null || p.val !== q.val) {\n return false;\n }\n return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(min(m, n)),其中 m 和 n 分别是两棵树的节点数。在最坏情况下需要遍历较小树的所有节点。\n- 空间复杂度 :O(min(m, n)),递归调用栈的深度取决于树的高度。在完全平衡的树中为 O(log(min(m, n))),在完全不平衡的树中为 O(min(m, n))。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3133136375","body":"## 算法思路\n这是一个典型的二叉树深度优先搜索(DFS)问题。核心思想是:\n- 从根节点开始,沿着每条路径向下遍历\n- 在遍历过程中,将当前路径形成的数字逐步构建(当前数字 = 之前数字 × 10 + 当前节点值)\n- 当到达叶节点时,将该路径形成的完整数字加入总和\n- 递归处理左右子树,最终返回所有路径数字的总和\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar sumNumbers = function(root) {\n // 深度优先搜索函数\n function dfs(node, currentSum) {\n // 如果节点为空,返回0\n if (!node) {\n return 0;\n }\n \n // 计算当前路径的数字:之前的数字*10 + 当前节点值\n currentSum = currentSum * 10 + node.val;\n \n // 如果是叶节点(没有左右子树),返回当前路径形成的数字\n if (!node.left && !node.right) {\n return currentSum;\n }\n \n // 递归计算左右子树的路径数字之和\n return dfs(node.left, currentSum) + dfs(node.right, currentSum);\n }\n \n return dfs(root, 0);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) ,其中 n 是二叉树中节点的数量,需要访问每个节点一次\n- 空间复杂度:O(h) ,其中 h 是二叉树的高度,递归调用栈的深度等于树的高度\n - 最坏情况(完全不平衡的树):O(n)\n - 最好情况(完全平衡的树):O(log n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3136794752","body":"## 算法思路\n广度优先搜索(BFS)\n- 使用层序遍历,从右到左遍历每一层\n- 通过队列实现,先添加右子节点再添加左子节点\n- 最后访问到的节点就是最底层最左边的节点\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {TreeNode} root\n * @return {number}\n */\nvar findBottomLeftValue = function(root) {\n // 使用层序遍历(BFS)从右到左遍历每一层\n // 最后访问到的节点就是最底层最左边的节点\n let queue = [root];\n let result = root.val;\n \n while (queue.length > 0) {\n let levelSize = queue.length;\n \n // 遍历当前层的所有节点\n for (let i = 0; i < levelSize; i++) {\n let node = queue.shift();\n result = node.val; // 更新结果为当前节点值\n \n // 先添加右子节点,再添加左子节点\n // 这样在同一层中,左边的节点会后被访问到\n if (node.right) {\n queue.push(node.right);\n }\n if (node.left) {\n queue.push(node.left);\n }\n }\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n),需要遍历所有节点\n- 空间复杂度:O(w),w为树的最大宽度(队列空间)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3140223821","body":"## 算法思路\n序列化过程 :\n- 采用前序遍历(根-左-右)的方式遍历二叉树\n- 空节点用 'null' 字符串表示\n- 所有节点值用逗号连接成字符串\n- 前序遍历的优势是根节点总在最前面,便于重构\n\n反序列化过程 :\n- 将字符串按逗号分割成数组\n- 使用递归按前序遍历顺序重构二叉树\n- 维护索引指针依次处理数组元素\n- 遇到 'null' 返回空节点,否则创建新节点并递归构建左右子树\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(val) {\n * this.val = val;\n * this.left = this.right = null;\n * }\n */\n\n/**\n * Encodes a tree to a single string.\n *\n * @param {TreeNode} root\n * @return {string}\n */\nvar serialize = function(root) {\n const result = [];\n \n function preorder(node) {\n if (node === null) {\n result.push('null');\n return;\n }\n \n result.push(node.val.toString());\n preorder(node.left);\n preorder(node.right);\n }\n \n preorder(root);\n return result.join(',');\n};\n\n/**\n * Decodes your encoded data to tree.\n *\n * @param {string} data\n * @return {TreeNode}\n */\nvar deserialize = function(data) {\n if (!data || data === 'null') {\n return null;\n }\n \n const values = data.split(',');\n let index = 0;\n \n function buildTree() {\n if (index >= values.length || values[index] === 'null') {\n index++;\n return null;\n }\n \n const node = new TreeNode(parseInt(values[index]));\n index++;\n \n node.left = buildTree();\n node.right = buildTree();\n \n return node;\n }\n \n return buildTree();\n};\n\n/**\n * Your functions will be called as such:\n * deserialize(serialize(root));\n */\n```\n\n## 复杂度分析\n时间复杂度 :\n- 序列化:O(n) - 需要访问每个节点一次\n- 反序列化:O(n) - 需要处理每个序列化值一次\n\n空间复杂度 :\n- 序列化:O(n) - 递归栈深度最坏情况为O(n),结果数组大小为O(n)\n- 反序列化:O(n) - 递归栈深度最坏情况为O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3148418818","body":"## 算法思路\n- DFS遍历 :使用深度优先搜索遍历二叉树,记录每个节点的坐标(row, col)和值\n- 坐标规则 :根据题目要求,左子节点坐标为(row+1, col-1),右子节点坐标为(row+1, col+1)\n- 分组排序 :将节点按列索引分组,对每列内的节点先按行排序,同行按值排序\n- 结果输出 :按列索引从小到大的顺序返回垂序遍历结果\n\n## 代码\n```javascript\n/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {TreeNode} root\n * @return {number[][]}\n */\nvar verticalTraversal = function(root) {\n if (!root) return [];\n \n // 存储节点信息:[row, col, val]\n const nodes = [];\n \n // DFS遍历,记录每个节点的坐标和值\n function dfs(node, row, col) {\n if (!node) return;\n \n nodes.push([row, col, node.val]);\n \n // 左子节点:row+1, col-1\n dfs(node.left, row + 1, col - 1);\n // 右子节点:row+1, col+1\n dfs(node.right, row + 1, col + 1);\n }\n \n // 从根节点开始遍历,根节点坐标为(0, 0)\n dfs(root, 0, 0);\n \n // 按列索引分组\n const columnMap = new Map();\n for (const [row, col, val] of nodes) {\n if (!columnMap.has(col)) {\n columnMap.set(col, []);\n }\n columnMap.get(col).push([row, val]);\n }\n \n // 获取所有列索引并排序\n const columns = Array.from(columnMap.keys()).sort((a, b) => a - b);\n \n const result = [];\n for (const col of columns) {\n const columnNodes = columnMap.get(col);\n // 对每列内的节点排序:先按行排序,同行按值排序\n columnNodes.sort((a, b) => {\n if (a[0] !== b[0]) {\n return a[0] - b[0]; // 按行排序\n }\n return a[1] - b[1]; // 同行按值排序\n });\n \n // 提取值\n result.push(columnNodes.map(node => node[1]));\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n log n),其中n是节点数,主要消耗在排序操作\n- 空间复杂度 :O(n),用于存储节点信息和分组数据","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3148426517","body":"## 算法思路\n- 使用哈希表存储已遍历的数值和索引\n- 对每个数值计算其配对数值,在哈希表中O(1)时间查找\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number[]}\n */\nvar twoSum = function(nums, target) {\n // 创建哈希表,key为数值,value为索引\n const map = new Map();\n \n for (let i = 0; i < nums.length; i++) {\n // 计算当前数值需要配对的数值\n const complement = target - nums[i];\n \n // 在哈希表中查找配对数值\n if (map.has(complement)) {\n // 找到配对,返回两个索引\n return [map.get(complement), i];\n }\n \n // 将当前数值和索引存入哈希表\n map.set(nums[i], i);\n }\n \n return []; // 题目保证有解,这里不会执行到\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n)\n- 空间复杂度:O(n)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148432520","body":"## 算法思路\n采用桶排序的思想来实现:\n- 频率统计 :使用哈希表统计每个元素的出现频率\n- 桶排序 :创建频率桶,桶的索引表示频率,桶中存储具有该频率的元素\n- 结果收集 :从最高频率的桶开始遍历,收集前k个元素\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar topKFrequent = function(nums, k) {\n // 步骤1: 统计频率\n const freqMap = new Map();\n for (const num of nums) {\n freqMap.set(num, (freqMap.get(num) || 0) + 1);\n }\n \n // 步骤2: 创建频率桶\n // 桶的索引表示频率,桶中存储具有该频率的元素\n const buckets = new Array(nums.length + 1).fill(null).map(() => []);\n \n for (const [num, freq] of freqMap) {\n buckets[freq].push(num);\n }\n \n // 步骤3: 从高频率到低频率收集前k个元素\n const result = [];\n for (let i = buckets.length - 1; i >= 0 && result.length < k; i--) {\n if (buckets[i].length > 0) {\n result.push(...buckets[i]);\n }\n }\n \n // 返回前k个元素\n return result.slice(0, k);\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 满足题目要求的优于O(n log n)\n- 统计频率:O(n)\n- 创建桶并填充:O(n)\n- 收集结果:O(n)\n\n- 空间复杂度 :O(n)\n- 哈希表:O(n)\n- 桶数组:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3153115326","body":"## 算法思路\n- 核心思想 :枚举每个点作为回旋镖的中心点i\n- 距离计算 :计算中心点到所有其他点的欧式距离(使用距离平方避免开方运算)\n- 哈希统计 :使用Map统计相同距离的点的数量\n- 组合计算 :如果有n个点到中心点距离相同,可形成n×(n-1)个回旋镖\n- 顺序考虑 :回旋镖(i,j,k)和(i,k,j)是不同的,需要考虑j和k的顺序\n\n## 代码\n```javascript\n/**\n * @param {number[][]} points\n * @return {number}\n */\nvar numberOfBoomerangs = function(points) {\n let count = 0;\n \n // 遍历每个点作为回旋镖的中心点i\n for (let i = 0; i < points.length; i++) {\n // 使用Map记录从点i到其他点的距离及对应的点的数量\n const distanceMap = new Map();\n \n // 计算点i到其他所有点的距离\n for (let j = 0; j < points.length; j++) {\n if (i !== j) {\n // 计算欧式距离的平方(避免开方运算,提高效率)\n const distance = getDistanceSquared(points[i], points[j]);\n \n // 记录该距离对应的点的数量\n distanceMap.set(distance, (distanceMap.get(distance) || 0) + 1);\n }\n }\n \n // 对于每个距离,如果有n个点,则可以形成n*(n-1)个回旋镖\n // 因为回旋镖(i,j,k)中j和k的顺序是有意义的\n for (const [distance, pointCount] of distanceMap) {\n if (pointCount >= 2) {\n count += pointCount * (pointCount - 1);\n }\n }\n }\n \n return count;\n};\n\n/**\n * 计算两点间欧式距离的平方\n * @param {number[]} point1 \n * @param {number[]} point2 \n * @return {number}\n */\nfunction getDistanceSquared(point1, point2) {\n const dx = point1[0] - point2[0];\n const dy = point1[1] - point2[1];\n return dx * dx + dy * dy;\n}\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n²) - 外层循环n次,内层循环n-1次\n- 空间复杂度 :O(n) - 最坏情况下Map存储n-1个不同距离","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3153126755","body":"## 算法思路\n- 滑动窗口技术 :使用双指针 left 和 right 构成滑动窗口\n- 哈希表优化 :记录每个字符最后出现的位置\n- 动态调整 :遇到重复字符时,将左指针移动到重复字符的下一个位置\n- 实时更新 :持续更新最大长度\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @return {number}\n */\nvar lengthOfLongestSubstring = function(s) {\n if (s.length === 0) return 0;\n \n let left = 0; // 滑动窗口左指针\n let maxLength = 0; // 记录最大长度\n let charMap = new Map(); // 哈希表:字符 -> 最后出现的索引\n \n for (let right = 0; right < s.length; right++) {\n const char = s[right];\n \n // 如果字符已存在且在当前窗口内,移动左指针\n if (charMap.has(char) && charMap.get(char) >= left) {\n left = charMap.get(char) + 1;\n }\n \n // 更新字符的最新位置\n charMap.set(char, right);\n \n // 更新最大长度\n maxLength = Math.max(maxLength, right - left + 1);\n }\n \n return maxLength;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 每个字符最多被访问两次\n- 空间复杂度 :O(min(m,n)) - m是字符集大小,n是字符串长度","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3158322222","body":"## 算法思路\n- 滑动窗口 + 哈希表 :避免生成所有排列组合,直接在原字符串上滑动匹配\n- 分层遍历 :由于words中所有单词长度相同,按单词长度为步长进行遍历\n- 频次匹配 :使用哈希表记录words中单词频次,滑动窗口中维护当前单词频次\n- 智能重置 :遇到不在words中的单词时,直接重置窗口位置\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string[]} words\n * @return {number[]}\n */\nvar findSubstring = function(s, words) {\n if (!s || !words || words.length === 0) return [];\n \n const wordLen = words[0].length;\n const totalLen = wordLen * words.length;\n const result = [];\n \n // 创建words的频次映射\n const wordCount = new Map();\n for (const word of words) {\n wordCount.set(word, (wordCount.get(word) || 0) + 1);\n }\n \n // 对于每个可能的起始位置(0到wordLen-1),使用滑动窗口\n for (let i = 0; i < wordLen; i++) {\n let left = i;\n let right = i;\n let validWords = 0;\n const windowCount = new Map();\n \n while (right + wordLen <= s.length) {\n // 扩展右边界,添加新单词\n const rightWord = s.substring(right, right + wordLen);\n right += wordLen;\n \n if (wordCount.has(rightWord)) {\n windowCount.set(rightWord, (windowCount.get(rightWord) || 0) + 1);\n if (windowCount.get(rightWord) <= wordCount.get(rightWord)) {\n validWords++;\n }\n \n // 如果窗口大小超过目标长度,收缩左边界\n while (right - left > totalLen) {\n const leftWord = s.substring(left, left + wordLen);\n left += wordLen;\n \n if (wordCount.has(leftWord)) {\n if (windowCount.get(leftWord) <= wordCount.get(leftWord)) {\n validWords--;\n }\n windowCount.set(leftWord, windowCount.get(leftWord) - 1);\n }\n }\n \n // 检查是否找到有效的串联子串\n if (validWords === words.length && right - left === totalLen) {\n result.push(left);\n }\n } else {\n // 遇到不在words中的单词,重置窗口\n windowCount.clear();\n validWords = 0;\n left = right;\n }\n }\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n × m),其中n是字符串s的长度,m是单词长度\n- 外层循环m次(每个可能的起始偏移)\n- 内层每个字符最多被访问2次(加入和移出窗口)\n\n- 空间复杂度 :O(k),其中k是words数组的长度\n- 主要用于存储单词频次的哈希表","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3162949952","body":"## 算法思路\n- 数学原理 :如果数组总和 sum % p = remainder ,需要找到一个子数组,其和也等于 remainder ,移除后剩余部分就能被p整除\n- 技术方案 :使用前缀和 + 哈希表来高效查找目标子数组\n- 关键公式 : prefixSum[i] % p = (prefixSum[j] % p - remainder + p) % p\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} p\n * @return {number}\n */\nvar minSubarray = function(nums, p) {\n // 计算数组总和\n const totalSum = nums.reduce((sum, num) => sum + num, 0);\n \n // 如果总和已经能被p整除,不需要移除任何元素\n const remainder = totalSum % p;\n if (remainder === 0) {\n return 0;\n }\n \n // 使用哈希表记录前缀和的余数及其对应的索引\n const prefixMap = new Map();\n prefixMap.set(0, -1); // 初始化,前缀和为0时索引为-1\n \n let prefixSum = 0;\n let minLength = nums.length; // 初始化为数组长度(最坏情况)\n \n for (let i = 0; i < nums.length; i++) {\n prefixSum += nums[i];\n const currentRemainder = prefixSum % p;\n \n // 我们需要找到一个前缀和,使得当前前缀和减去它等于remainder\n // 即:currentRemainder - targetRemainder = remainder (mod p)\n // 所以:targetRemainder = (currentRemainder - remainder + p) % p\n const targetRemainder = (currentRemainder - remainder + p) % p;\n \n if (prefixMap.has(targetRemainder)) {\n const prevIndex = prefixMap.get(targetRemainder);\n const subarrayLength = i - prevIndex;\n minLength = Math.min(minLength, subarrayLength);\n }\n \n // 更新当前前缀和余数的索引\n prefixMap.set(currentRemainder, i);\n }\n \n // 如果最小长度等于数组长度,说明无法找到合适的子数组\n return minLength === nums.length ? -1 : minLength;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 只需要遍历数组一次,哈希表操作为O(1)\n- 空间复杂度 :O(min(n, p)) - 哈希表最多存储min(n, p)个不同的余数","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3166733694","body":"## 算法思路\n使用 快慢指针 (Floyd's Tortoise and Hare Algorithm)技术:\n- 设置两个指针:慢指针每次移动一步,快指针每次移动两步\n- 当快指针到达链表末尾时,慢指针恰好位于链表的中间位置\n- 对于偶数长度的链表,返回第二个中间节点\n\n## 代码\n```javascript\n/**\n * Definition for singly-linked list.\n * function ListNode(val, next) {\n * this.val = (val===undefined ? 0 : val)\n * this.next = (next===undefined ? null : next)\n * }\n */\n/**\n * @param {ListNode} head\n * @return {ListNode}\n */\nvar middleNode = function(head) {\n // 使用快慢指针法(Floyd's Tortoise and Hare Algorithm)\n // 慢指针每次移动一步,快指针每次移动两步\n // 当快指针到达链表末尾时,慢指针正好在中间位置\n \n let slow = head; // 慢指针\n let fast = head; // 快指针\n \n // 当快指针和快指针的下一个节点都不为空时继续循环\n while (fast !== null && fast.next !== null) {\n slow = slow.next; // 慢指针移动一步\n fast = fast.next.next; // 快指针移动两步\n }\n \n // 当循环结束时,slow指针指向中间节点\n // 如果链表长度为奇数,slow指向唯一的中间节点\n // 如果链表长度为偶数,slow指向第二个中间节点\n return slow;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n) - 需要遍历链表一次,其中n是链表的长度\n- 空间复杂度:O(1) - 只使用了两个额外的指针变量,不随输入规模增长","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3172634872","body":"## 算法思路\n- 双指针技术 :使用 slow 指针指向当前不重复元素的位置, fast 指针遍历数组\n- 原地修改 :当发现不重复元素时,将其复制到 slow+1 位置\n- 利用排序特性 :由于数组已排序,相同元素必然相邻,只需比较相邻元素\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar removeDuplicates = function(nums) {\n // 边界情况:空数组或只有一个元素\n if (nums.length <= 1) {\n return nums.length;\n }\n \n // slow指针指向当前不重复元素的位置\n let slow = 0;\n \n // fast指针遍历数组,从第二个元素开始\n for (let fast = 1; fast < nums.length; fast++) {\n // 如果当前元素与前一个不重复元素不同\n if (nums[fast] !== nums[slow]) {\n // 将slow指针向前移动一位\n slow++;\n // 将当前不重复元素复制到slow位置\n nums[slow] = nums[fast];\n }\n // 如果相同,fast继续向前,slow保持不变\n }\n \n // 返回不重复元素的个数(slow指向最后一个不重复元素的索引)\n return slow + 1;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 只需遍历数组一次\n- 空间复杂度 :O(1) - 只使用常数额外空间,符合原地修改要求","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172638327","body":"## 算法思路\n- 二分查找核心思想 :通过比较中间元素与目标值,每次排除一半搜索空间\n- 查找逻辑 :如果找到目标值返回索引,否则返回应插入的位置\n- 关键实现 :循环结束时left指针就是插入位置\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} target\n * @return {number}\n */\nvar searchInsert = function(nums, target) {\n let left = 0;\n let right = nums.length - 1;\n \n // 二分查找\n while (left <= right) {\n // 计算中间位置,避免整数溢出\n let mid = Math.floor(left + (right - left) / 2);\n \n if (nums[mid] === target) {\n // 找到目标值,返回索引\n return mid;\n } else if (nums[mid] < target) {\n // 目标值在右半部分\n left = mid + 1;\n } else {\n // 目标值在左半部分\n right = mid - 1;\n }\n }\n \n // 没找到目标值,left就是应该插入的位置\n return left;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(log n) - 满足题目要求,每次迭代将搜索范围缩小一半\n- 空间复杂度 :O(1) - 只使用常数级别的额外变量","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3174034461","body":"## 算法思路\n使用双端队列维护一个单调递减的队列,队列中存储数组元素的索引:\n\n- 队首始终是当前窗口的最大值索引\n- 移除超出窗口范围的元素\n- 维护单调性:移除队尾所有小于等于当前元素的索引\n- 当窗口形成时,队首就是最大值\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number[]}\n */\nvar maxSlidingWindow = function(nums, k) {\n if (!nums || nums.length === 0 || k <= 0) {\n return [];\n }\n \n const result = [];\n const deque = []; // 存储数组索引的双端队列\n \n for (let i = 0; i < nums.length; i++) {\n // 移除队列中超出窗口范围的元素\n while (deque.length > 0 && deque[0] <= i - k) {\n deque.shift();\n }\n \n // 维护单调递减队列:移除队尾所有小于当前元素的索引\n while (deque.length > 0 && nums[deque[deque.length - 1]] <= nums[i]) {\n deque.pop();\n }\n \n // 将当前元素索引加入队尾\n deque.push(i);\n \n // 当窗口大小达到k时,开始记录结果\n if (i >= k - 1) {\n result.push(nums[deque[0]]); // 队首是当前窗口最大值\n }\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n) - 每个元素最多进队列和出队列各一次\n- 空间复杂度 :O(k) - 队列最多存储k个元素","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3178188012","body":"## 算法思路:\n- 使用度数统计法,将问题转化为图论中的入度和出度计算\n- 法官的特征:不信任任何人(出度=0)+ 被所有其他人信任(入度=n-1)\n- 通过计算每个人的\"信任度\"(入度-出度)来找到法官\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} trust\n * @return {number}\n */\nvar findJudge = function(n, trust) {\n // 特殊情况:只有一个人且没有信任关系,那么这个人就是法官\n if (n === 1 && trust.length === 0) {\n return 1;\n }\n \n // 初始化信任度数组,trustScore[i] = 入度 - 出度\n const trustScore = new Array(n + 1).fill(0);\n \n // 遍历所有信任关系\n for (const [a, b] of trust) {\n trustScore[a]--; // a信任别人,出度+1,所以信任度-1\n trustScore[b]++; // b被信任,入度+1,所以信任度+1\n }\n \n // 查找信任度为n-1的人(法官候选人)\n for (let i = 1; i <= n; i++) {\n if (trustScore[i] === n - 1) {\n return i;\n }\n }\n \n // 没有找到法官\n return -1;\n};\n```\n\n## 算法复杂度分析\n- 时间复杂度: O(E + n)\n- 遍历trust数组:O(E),其中E是信任关系数量\n- 查找法官:O(n)\n\n- 空间复杂度: O(n)\n- 需要额外的信任度数组存储每个人的统计信息","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182100538","body":"## 算法思路\n这是一个经典的二分图判断问题。核心思想是:\n\n- 将问题转化为图着色问题\n- 构建无向图,其中dislikes数组中的每一对表示图中的一条边\n- 使用DFS图着色算法判断是否能用两种颜色给所有节点着色\n- 如果相邻节点都能着不同颜色,则可以分成两组\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number[][]} dislikes\n * @return {boolean}\n */\nvar possibleBipartition = function(n, dislikes) {\n // 构建邻接表表示图\n const graph = new Array(n + 1).fill(null).map(() => []);\n for (const [a, b] of dislikes) {\n graph[a].push(b);\n graph[b].push(a);\n }\n \n // 用于记录每个节点的颜色,0表示未着色,1和-1表示两种不同的颜色\n const colors = new Array(n + 1).fill(0);\n \n // DFS着色函数\n const dfs = (node, color) => {\n colors[node] = color;\n \n // 遍历所有邻接节点\n for (const neighbor of graph[node]) {\n if (colors[neighbor] === 0) {\n // 如果邻接节点未着色,给它着相反的颜色\n if (!dfs(neighbor, -color)) {\n return false;\n }\n } else if (colors[neighbor] === color) {\n // 如果邻接节点已经着色且颜色相同,说明不能构成二分图\n return false;\n }\n }\n return true;\n };\n \n // 遍历所有节点,处理可能存在的多个连通分量\n for (let i = 1; i <= n; i++) {\n if (colors[i] === 0) {\n if (!dfs(i, 1)) {\n return false;\n }\n }\n }\n \n return true;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(V + E),其中V是节点数量(n个人),E是边的数量(dislikes数组长度)\n- 空间复杂度 :O(V + E),主要用于邻接表存储、颜色数组和DFS递归栈","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3186630947","body":"## 算法思路分析:\n这是一个双层拓扑排序问题\n- 首先需要对小组进行拓扑排序,确保依赖的小组在前面\n- 然后对每个小组内的项目进行拓扑排序\n- 最后按小组顺序合并结果\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number} m\n * @param {number[]} group\n * @param {number[][]} beforeItems\n * @return {number[]}\n */\nvar sortItems = function(n, m, group, beforeItems) {\n // 为没有小组的项目分配虚拟小组ID\n let groupId = m;\n for (let i = 0; i < n; i++) {\n if (group[i] === -1) {\n group[i] = groupId++;\n }\n }\n \n // 构建小组图和项目图\n const groupGraph = new Array(groupId).fill(0).map(() => []);\n const groupIndegree = new Array(groupId).fill(0);\n const itemGraph = new Array(n).fill(0).map(() => []);\n const itemIndegree = new Array(n).fill(0);\n \n // 构建依赖关系图\n const groupEdges = new Set(); // 用于去重小组间的边\n \n for (let i = 0; i < n; i++) {\n for (const beforeItem of beforeItems[i]) {\n const beforeGroup = group[beforeItem];\n const currentGroup = group[i];\n \n // 项目依赖关系\n itemGraph[beforeItem].push(i);\n itemIndegree[i]++;\n \n // 小组依赖关系(只有当项目属于不同小组时)\n if (beforeGroup !== currentGroup) {\n const edgeKey = `${beforeGroup}->${currentGroup}`;\n if (!groupEdges.has(edgeKey)) {\n groupEdges.add(edgeKey);\n groupGraph[beforeGroup].push(currentGroup);\n groupIndegree[currentGroup]++;\n }\n }\n }\n }\n \n // 拓扑排序函数\n function topologicalSort(graph, indegree) {\n const queue = [];\n const result = [];\n \n // 找到所有入度为0的节点\n for (let i = 0; i < indegree.length; i++) {\n if (indegree[i] === 0) {\n queue.push(i);\n }\n }\n \n while (queue.length > 0) {\n const node = queue.shift();\n result.push(node);\n \n // 更新相邻节点的入度\n for (const neighbor of graph[node]) {\n indegree[neighbor]--;\n if (indegree[neighbor] === 0) {\n queue.push(neighbor);\n }\n }\n }\n \n return result.length === graph.length ? result : [];\n }\n \n // 对小组进行拓扑排序\n const sortedGroups = topologicalSort(groupGraph, [...groupIndegree]);\n if (sortedGroups.length === 0) {\n return []; // 小组间存在循环依赖\n }\n \n // 对项目进行拓扑排序\n const sortedItems = topologicalSort(itemGraph, [...itemIndegree]);\n if (sortedItems.length === 0) {\n return []; // 项目间存在循环依赖\n }\n \n // 按小组分类项目\n const groupToItems = new Map();\n for (const item of sortedItems) {\n const itemGroup = group[item];\n if (!groupToItems.has(itemGroup)) {\n groupToItems.set(itemGroup, []);\n }\n groupToItems.get(itemGroup).push(item);\n }\n \n // 按小组顺序合并结果\n const result = [];\n for (const groupId of sortedGroups) {\n if (groupToItems.has(groupId)) {\n result.push(...groupToItems.get(groupId));\n }\n }\n \n return result;\n};\n```\n\n## 复杂度分析\n时间复杂度:O(n + E)\n- 构建图:O(E),E为所有依赖关系总数\n- 小组拓扑排序:O(V_g + E_g)\n- 项目拓扑排序:O(V_i + E_i)\n- 结果合并:O(n)\n\n空间复杂度:O(n + E + m)\n- 图存储:O(n + E)\n- 入度数组:O(n + m)\n- 辅助数据结构:O(n + m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3191484423","body":"## 算法思路\n机器人要回到原点(0,0),必须满足两个条件:\n- 向左移动的次数 = 向右移动的次数\n- 向上移动的次数 = 向下移动的次数\n\n## 代码\n```javascript\n/**\n * @param {string} moves\n * @return {boolean}\n */\nvar judgeCircle = function(moves) {\n let x = 0, y = 0; // 当前坐标\n \n for (let move of moves) {\n switch (move) {\n case 'L':\n x--;\n break;\n case 'R':\n x++;\n break;\n case 'U':\n y++;\n break;\n case 'D':\n y--;\n break;\n }\n }\n \n return x === 0 && y === 0;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n),其中n是moves字符串的长度,需要遍历一次字符串\n- 空间复杂度 :O(1),只使用了常数个额外变量,不随输入规模变化","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3194108225","body":"## 算法思路\n- 预处理 :为每个任务添加原始索引,按进入时间排序\n- 模拟执行 :使用最小堆维护可执行任务队列,按执行时间最短优先、索引最小优先的规则选择任务\n- 时间管理 :CPU空闲时直接跳转到下一个任务的进入时间,避免无效等待\n\n## 代码\n```javascript\n/**\n * @param {number[][]} tasks\n * @return {number[]}\n */\nvar getOrder = function(tasks) {\n const n = tasks.length;\n \n // 为每个任务添加原始索引,然后按进入时间排序\n const taskWithIndex = tasks.map((task, index) => [task[0], task[1], index]);\n taskWithIndex.sort((a, b) => a[0] - b[0]); // 按enqueueTime排序\n \n const result = [];\n // 优先队列:按执行时间升序,相同时按索引升序\n const availableTasks = new MinHeap((a, b) => {\n if (a[0] !== b[0]) {\n return a[0] - b[0]; // 按processingTime升序\n }\n return a[1] - b[1]; // 按originalIndex升序\n });\n \n let currentTime = 0;\n let taskIndex = 0; // 指向下一个要加入队列的任务\n \n while (result.length < n) {\n // 将所有在当前时间或之前进入队列的任务加入可执行队列\n while (taskIndex < n && taskWithIndex[taskIndex][0] <= currentTime) {\n const [enqueueTime, processingTime, originalIndex] = taskWithIndex[taskIndex];\n availableTasks.push([processingTime, originalIndex]);\n taskIndex++;\n }\n \n if (availableTasks.size() === 0) {\n // CPU空闲,直接跳到下一个任务的进入时间\n if (taskIndex < n) {\n currentTime = taskWithIndex[taskIndex][0];\n }\n } else {\n // 从可执行任务中选择执行时间最短的(相同时选择索引最小的)\n const [processingTime, originalIndex] = availableTasks.pop();\n result.push(originalIndex);\n currentTime += processingTime;\n }\n }\n \n return result;\n};\n\n// 最小堆实现\nclass MinHeap {\n constructor(compareFn) {\n this.heap = [];\n this.compare = compareFn || ((a, b) => a - b);\n }\n \n push(val) {\n this.heap.push(val);\n this.bubbleUp(this.heap.length - 1);\n }\n \n pop() {\n if (this.heap.length === 0) return undefined;\n if (this.heap.length === 1) return this.heap.pop();\n \n const top = this.heap[0];\n this.heap[0] = this.heap.pop();\n this.bubbleDown(0);\n return top;\n }\n \n size() {\n return this.heap.length;\n }\n \n bubbleUp(index) {\n while (index > 0) {\n const parentIndex = Math.floor((index - 1) / 2);\n if (this.compare(this.heap[index], this.heap[parentIndex]) >= 0) break;\n \n [this.heap[index], this.heap[parentIndex]] = [this.heap[parentIndex], this.heap[index]];\n index = parentIndex;\n }\n }\n \n bubbleDown(index) {\n while (true) {\n let minIndex = index;\n const leftChild = 2 * index + 1;\n const rightChild = 2 * index + 2;\n \n if (leftChild < this.heap.length && \n this.compare(this.heap[leftChild], this.heap[minIndex]) < 0) {\n minIndex = leftChild;\n }\n \n if (rightChild < this.heap.length && \n this.compare(this.heap[rightChild], this.heap[minIndex]) < 0) {\n minIndex = rightChild;\n }\n \n if (minIndex === index) break;\n \n [this.heap[index], this.heap[minIndex]] = [this.heap[minIndex], this.heap[index]];\n index = minIndex;\n }\n }\n}\n```\n\n## 复杂度分析\n- 时间复杂度 :O(n log n)\n - 排序:O(n log n)\n - 堆操作:每个任务最多进出堆一次,总计O(n log n)\n- 空间复杂度 :O(n)\n - 存储任务信息、最小堆和结果数组","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194111949","body":"## 算法核心思路\n- 1.时间转换 :将 \"HH:MM\" 格式转换为分钟数便于计算\n- 2.对局编号计算 :\n - 开始时间: Math.ceil(minutes / 15) 确保只计算完整参与的对局\n - 结束时间: Math.floor(minutes / 15) 确保只计算完整参与的对局\n- 3.分情况处理 :\n - 同一天:结束时间对局编号 - 开始时间对局编号\n - 跨夜:(96 - 开始时间对局编号) + 结束时间对局编号\n\n## 代码\n```javascript\n/**\n * @param {string} loginTime\n * @param {string} logoutTime\n * @return {number}\n */\nvar numberOfRounds = function(loginTime, logoutTime) {\n // 将时间字符串转换为分钟数\n function timeToMinutes(time) {\n const [hours, minutes] = time.split(':').map(Number);\n return hours * 60 + minutes;\n }\n \n const startMinutes = timeToMinutes(loginTime);\n const endMinutes = timeToMinutes(logoutTime);\n \n // 如果结束时间早于开始时间,说明跨越了午夜\n if (endMinutes < startMinutes) {\n // 跨夜情况:从开始时间到午夜 + 从午夜到结束时间\n // 计算从开始时间到午夜能完成的对局数\n const roundsBeforeMidnight = 96 - Math.ceil(startMinutes / 15);\n // 计算从午夜到结束时间能完成的对局数\n const roundsAfterMidnight = Math.floor(endMinutes / 15);\n return roundsBeforeMidnight + roundsAfterMidnight;\n } else {\n // 同一天情况\n // 能完成的对局数 = 结束时间所在的对局编号 - 开始时间所在的对局编号\n const result = Math.floor(endMinutes / 15) - Math.ceil(startMinutes / 15);\n return Math.max(0, result); // 确保不返回负数\n }\n};\n```\n\n## 复杂度分析\n- 时间复杂度 :O(1) - 所有操作都是常数时间的数学计算\n- 空间复杂度 :O(1) - 只使用固定数量的变量","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3197064559","body":"## 算法思路\n- 1.统计字符频率\n- 2.条件三:变成同一个字母\n- 3.条件一 & 条件二:字母严格大小比较\n- 4.综合最优解\n\n## 代码\n```javascript\n/**\n * @param {string} a\n * @param {string} b\n * @return {number}\n */\nvar minCharacters = function(a, b) {\n let n = a.length, m = b.length;\n\n let freqA = new Array(26).fill(0);\n let freqB = new Array(26).fill(0);\n\n for (let ch of a) freqA[ch.charCodeAt(0) - 97]++;\n for (let ch of b) freqB[ch.charCodeAt(0) - 97]++;\n\n // 前缀和\n let prefixA = new Array(27).fill(0);\n let prefixB = new Array(27).fill(0);\n for (let i = 0; i < 26; i++) {\n prefixA[i+1] = prefixA[i] + freqA[i];\n prefixB[i+1] = prefixB[i] + freqB[i];\n }\n\n // 条件三:相同字母\n let ops3 = Infinity;\n for (let i = 0; i < 26; i++) {\n ops3 = Math.min(ops3, n + m - (freqA[i] + freqB[i]));\n }\n\n // 条件一 & 二\n let ops1 = Infinity, ops2 = Infinity;\n for (let c = 0; c < 25; c++) { // 0~24,分割点\n // a < b\n ops1 = Math.min(ops1, (n - prefixA[c+1]) + prefixB[c+1]);\n // b < a\n ops2 = Math.min(ops2, (m - prefixB[c+1]) + prefixA[c+1]);\n }\n\n return Math.min(ops1, ops2, ops3);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(n + m)\n- 空间复杂度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3199072283","body":"## 算法思路\n- 1.将数组构建为一个 最大堆(heapify)\n 最大堆性质:父节点值 ≥ 子节点值。\n- 2.交换堆顶(最大值)和堆尾元素,把最大值放到最终位置。\n- 3.缩小堆的范围(长度减 1),重新 heapify。\n- 4.重复步骤 2–3,直到整个数组有序。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number[]}\n */\nvar sortArray = function(nums) {\n let n = nums.length;\n\n // 建堆(从最后一个非叶子节点开始向下调整)\n for (let i = Math.floor(n / 2) - 1; i >= 0; i--) {\n heapify(nums, n, i);\n }\n\n // 不断取出堆顶(最大值)放到数组末尾\n for (let i = n - 1; i > 0; i--) {\n // 交换堆顶和堆尾\n [nums[0], nums[i]] = [nums[i], nums[0]];\n // 调整剩余部分\n heapify(nums, i, 0);\n }\n\n return nums;\n};\n\n// 调整为最大堆\nfunction heapify(arr, heapSize, root) {\n let largest = root;\n let left = 2 * root + 1;\n let right = 2 * root + 2;\n\n if (left < heapSize && arr[left] > arr[largest]) {\n largest = left;\n }\n\n if (right < heapSize && arr[right] > arr[largest]) {\n largest = right;\n }\n\n if (largest !== root) {\n [arr[root], arr[largest]] = [arr[largest], arr[root]];\n heapify(arr, heapSize, largest);\n }\n}\n```\n\n## 复杂度分析\n- 时间复杂度\n建堆:O(n)\n每次取出最大值并 heapify:O(log n),共 n 次\n总计:O(n log n)\n- 空间复杂度\n堆排序在原数组上操作,只需要 O(1) 额外空间","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204787436","body":"## 算法思路:\n- 平方根一定在 1 ~ x/2 之间(除了 0 和 1 特殊处理)。\n- 用二分查找,比较 mid * mid 与 x。\n- 如果等于就直接返回。\n- 如果小于,就把 mid 作为候选答案,继续往右找。\n- 如果大于,就往左缩。\n\n## 代码\n```javascript\n/**\n * @param {number} x\n * @return {number}\n */\nvar mySqrt = function(x) {\n if (x < 2) return x; // 0 -> 0, 1 -> 1\n\n let left = 1, right = Math.floor(x / 2), ans = 0;\n while (left <= right) {\n let mid = Math.floor((left + right) / 2);\n let square = mid * mid;\n\n if (square === x) {\n return mid;\n } else if (square < x) {\n ans = mid; // mid 可能是答案\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- 时间复杂度 O(log n)\n- 空间复杂度 O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3209498631","body":"## 算法思路\n- 设定搜索区间 [1, n]。\n- 取中点 mid = Math.floor((left + right) / 2)。\n- 调用 isBadVersion(mid):\n- 如果是坏的(true),说明答案在 左边或就是 mid,更新 right = mid。\n- 如果不是坏的(false),说明答案在 右边,更新 left = mid + 1。\n- 循环直到 left == right,此时 left 就是第一个坏版本。\n\n## 代码\n```javascript\n/**\n * Definition for isBadVersion()\n * \n * @param {integer} version number\n * @return {boolean} whether the version is bad\n * isBadVersion = function(version) {\n * ...\n * };\n */\n\n/**\n * @param {function} isBadVersion()\n * @return {function}\n */\nvar solution = function(isBadVersion) {\n /**\n * @param {integer} n Total versions\n * @return {integer} The first bad version\n */\n return function(n) {\n let left = 1, right = n;\n while (left < right) {\n let mid = Math.floor((left + right) / 2);\n if (isBadVersion(mid)) {\n // mid 可能是第一个坏版本,所以不能跳过它\n right = mid;\n } else {\n // mid 不是坏的,第一个坏版本在右边\n left = mid + 1;\n }\n }\n return left; // 或者 right,二者相等\n };\n};\n```\n\n## 复杂度分析\n- 时间复杂度:每次二分区间缩小一半,最多调用 isBadVersion O(log n) 次。\n- 空间复杂度:我们只用到了几个变量,额外空间复杂度是 O(1)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/42#issuecomment-3214357168","body":"## 算法思路\n- 1.分治思想(归并排序)\n- 把数组分为两半,分别统计左半部分和右半部分的翻转对数量。\n- 在合并的时候,再统计「跨左右两部分」的翻转对数量。\n- 2.跨区间统计方法\n- 假设左半部分是 left[],右半部分是 right[],它们都是有序的。\n- 对于每个 left[i],我们需要统计右边有多少个 right[j] 满足left[i]>2×right[j]\n- 因为 right[] 已经排序,可以用一个指针 双指针扫描,避免嵌套循环。\n- 3.合并排序\n- 统计完跨区间的翻转对数量后,把两个有序数组合并,递归回溯。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @return {number}\n */\nvar reversePairs = function(nums) {\n if (!nums || nums.length === 0) return 0;\n\n const mergeSort = (arr, left, right) => {\n if (left >= right) return 0;\n\n let mid = Math.floor((left + right) / 2);\n let count = mergeSort(arr, left, mid) + mergeSort(arr, mid + 1, right);\n\n // 统计跨区间翻转对\n let j = mid + 1;\n for (let i = left; i <= mid; i++) {\n while (j <= right && arr[i] > 2 * arr[j]) {\n j++;\n }\n count += (j - (mid + 1));\n }\n\n // 合并两个有序数组\n let temp = [];\n let p1 = left, p2 = mid + 1;\n while (p1 <= mid && p2 <= right) {\n if (arr[p1] <= arr[p2]) {\n temp.push(arr[p1++]);\n } else {\n temp.push(arr[p2++]);\n }\n }\n while (p1 <= mid) temp.push(arr[p1++]);\n while (p2 <= right) temp.push(arr[p2++]);\n\n for (let i = 0; i < temp.length; i++) {\n arr[left + i] = temp[i];\n }\n\n return count;\n };\n\n return mergeSort(nums, 0, nums.length - 1);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:O(nlogn)\n- 空间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3218651000","body":"## 算法思路\n\n- 排序\n- 对 houses 和 heaters 进行排序,方便二分查找。\n- 二分查找\n- 对于每个房屋 h,在 heaters 中二分查找,找到最接近 h 的供暖器位置。\n- 计算 |h - heater_left| 和 |h - heater_right| 的最小值。\n- 得到该房屋的最小供暖距离。\n- 取最大值\n- 遍历所有房屋,取最小距离的最大值。\n\n## 代码\n```javascript\n/**\n * @param {number[]} houses\n * @param {number[]} heaters\n * @return {number}\n */\nvar findRadius = function(houses, heaters) {\n houses.sort((a, b) => a - b);\n heaters.sort((a, b) => a - b);\n\n let radius = 0;\n\n for (let house of houses) {\n // 二分查找\n let left = 0, right = heaters.length - 1;\n while (left <= right) {\n let mid = Math.floor((left + right) / 2);\n if (heaters[mid] < house) {\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n }\n\n // left 是第一个 >= house 的位置\n let dist1 = (left < heaters.length) ? Math.abs(heaters[left] - house) : Infinity;\n let dist2 = (right >= 0) ? Math.abs(heaters[right] - house) : Infinity;\n\n let nearest = Math.min(dist1, dist2);\n radius = Math.max(radius, nearest);\n }\n\n return radius;\n};\n```\n\n## 复杂度分析\n- 排序\n- houses 排序:O(n log n)\n- heaters 排序:O(m log m)\n- 二分查找\n- 每个房屋做一次二分:O(log m)\n- 共 n 个房屋:O(n log m)\n- 总时间复杂度:O(nlogn+mlogm+nlogm)\n- 空间复杂度:O(1)(除了排序外,常数额外空间)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3218659174","body":"## 排序数组\n- 先对 nums 排序。这样数对距离 = 两个数的差,可以利用单调性。\n- 二分查找答案\n- 距离范围:最小值 0,最大值 max(nums) - min(nums)。\n- 设二分中间值为 mid,问题转化为:\n- 数组中有多少对数对距离 ≤ mid。\n- 双指针统计 ≤ mid 的数对数量\n- 排序后数组 nums 单调递增。\n- 用两个指针 i、j:\n- 固定右端点 j,向左找满足 nums[j] - nums[i] <= mid 的最小 i。\n- 那么从 i 到 j-1 的所有元素都和 j 构成合法数对,总数是 j - i。\n- 整个过程是 O(n)。\n- 二分逻辑\n- 如果 ≤ mid 的数对数目 ≥ k,说明答案可能更小,右边界收缩。\n- 否则说明距离太小,左边界右移。\n\n## 代码\n```javascript\n/**\n * @param {number[]} nums\n * @param {number} k\n * @return {number}\n */\nvar smallestDistancePair = function(nums, k) {\n nums.sort((a, b) => a - b);\n\n // 统计差值 <= mid 的数对个数\n function countPairs(mid) {\n let count = 0;\n let i = 0;\n for (let j = 0; j < nums.length; j++) {\n while (nums[j] - nums[i] > mid) {\n i++;\n }\n count += j - i;\n }\n return count;\n }\n\n let left = 0, right = nums[nums.length - 1] - nums[0];\n while (left < right) {\n let mid = Math.floor((left + right) / 2);\n if (countPairs(mid) >= k) {\n right = mid; // 答案可能是 mid 或更小\n } else {\n left = mid + 1;\n }\n }\n return left;\n};\n```\n\n## 复杂度分析\n- 时间复杂度\n- 排序:O(n log n)\n- 二分查找:查找范围是 max(nums) - min(nums),最大 1e6,二分次数约 log(1e6) ≈ 20。\n- 每次 countPairs:O(n)(双指针扫描一遍)。\n- 总复杂度:O(n log n + n log W),其中 W = max(nums) - min(nums)。对 n = 1e4,完全可行。\n- 空间复杂度\n- 只用了常数级变量,O(1)(不算排序)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3218668542","body":"## 算法思路\n- 二分 + BFS/DFS\n- 时间范围是 [max(grid[0][0], grid[n-1][n-1]), n^2-1]。\n- 二分水位 mid,检查是否能在 mid 水位下从 (0,0) 到 (n-1,n-1)。\n- 如果可以,则收缩右边界,否则收缩左边界。\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar swimInWater = function(grid) {\n const n = grid.length;\n const directions = [[1,0],[-1,0],[0,1],[0,-1]];\n \n // 检查是否能在水位 t 下到达终点\n function canReach(t) {\n if (grid[0][0] > t) return false;\n const visited = Array.from({length: n}, () => Array(n).fill(false));\n const queue = [[0,0]];\n visited[0][0] = true;\n\n while (queue.length > 0) {\n const [x, y] = queue.shift();\n if (x === n-1 && y === n-1) return true;\n for (const [dx, dy] of directions) {\n const nx = x + dx, ny = y + dy;\n if (nx >= 0 && nx < n && ny >= 0 && ny < n &&\n !visited[nx][ny] && grid[nx][ny] <= t) {\n visited[nx][ny] = true;\n queue.push([nx, ny]);\n }\n }\n }\n return false;\n }\n\n // 二分查找最小可行水位\n let low = Math.max(grid[0][0], grid[n-1][n-1]);\n let high = n * n - 1;\n let ans = high;\n\n while (low <= high) {\n const mid = Math.floor((low + high) / 2);\n if (canReach(mid)) {\n ans = mid;\n high = mid - 1; // 尝试更小的水位\n } else {\n low = mid + 1;\n }\n }\n return ans;\n};\n```\n\n## 复杂度分析\n- BFS 最多访问 n^2 个格子,复杂度 O(n^2)。\n- 二分查找 范围大小约为 n^2,二分次数 O(log(n^2)) = O(log n)。\n- 总时间复杂度:O(n^2 log n)。\n- 空间复杂度:需要 visited 数组 O(n^2)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3226685252","body":"## 核心思路\n- 滑动窗口(Sliding Window)\n- 定义元音集合\n- vowels = new Set(['a','e','i','o','u'])\n- 初始化窗口\n- 先统计前 k 个字符里元音的数量 count。\n- 这就是第一个窗口的元音数。\n- 滑动窗口\n- 从 i = k 开始,窗口向右滑动:\n- 移除窗口最左边的字符(如果它是元音则 count--)。\n- 加入窗口最右边的字符(如果它是元音则 count++)。\n- 每次更新最大值 maxCount = Math.max(maxCount, count)。\n- 提前终止\n- 如果 maxCount === k,说明某个窗口里全是元音,直接返回结果(不可能更大了)。\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {number} k\n * @return {number}\n */\nvar maxVowels = function(s, k) {\n const vowels = new Set(['a', 'e', 'i', 'o', 'u']);\n let count = 0, maxCount = 0;\n\n // 初始化前 k 个字符\n for (let i = 0; i < k; i++) {\n if (vowels.has(s[i])) count++;\n }\n maxCount = count;\n\n // 滑动窗口\n for (let i = k; i < s.length; i++) {\n if (vowels.has(s[i - k])) count--; // 移除最左边\n if (vowels.has(s[i])) count++; // 加入最右边\n maxCount = Math.max(maxCount, count);\n if (maxCount === k) return k; // 提前终止\n }\n\n return maxCount;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 初始化前 k 个字符统计需要 O(k)。\n- 然后遍历整个字符串一次 O(n)。\n- 总体复杂度:O(n)。\n- 空间复杂度:\n- 仅使用一个集合 Set 存元音,空间 O(1)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3226702074","body":"## 思路分析\n- 边界情况\n- 如果 k == 0:Alice 一开始就停,不抽牌,分数是 0。如果 0 <= n,返回 1;否则返回 0。\n- 如果 n >= k - 1 + maxPts:Alice 不可能超过 n,因为最大分数就是 k-1 + maxPts。此时概率是 1。\n- 动态规划建模\n- 定义 dp[i] = 从分数 i 出发,Alice 最终分数不超过 n 的概率。\n- 最终答案是 dp[0]。\n- 如果 i >= k:表示 Alice 已经停了。\n- 如果 i <= n:返回 1(安全)。\n- 否则返回 0(爆掉)。\n- 如果 i < k:Alice 会继续抽。\n- 优化:滑动窗口\n- 用一个变量 windowSum 维护滑动和,就能做到 O(n)。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @param {number} k\n * @param {number} maxPts\n * @return {number}\n */\nvar new21Game = function(n, k, maxPts) {\n // 速返:一开始就停;或最高可能分也不超过 n\n if (k === 0 || n >= k - 1 + maxPts) return 1.0;\n\n const dp = new Array(n + 1).fill(0.0);\n // 终止区间:达到/超过 k 后立即停;在 [k, n] 内都是成功状态\n for (let i = k; i <= n; i++) dp[i] = 1.0;\n\n // 初始窗口和:dp[k]..dp[k+maxPts-1],这些里面只有 <= n 的是 1\n let windowSum = Math.min(n - k + 1, maxPts);\n\n // 从后往前做滑动平均\n for (let i = k - 1; i >= 0; i--) {\n dp[i] = windowSum / maxPts;\n // 更新窗口:加上新放入的 dp[i],减去滑出窗口的 dp[i + maxPts](越界视为 0)\n windowSum += dp[i] - (i + maxPts <= n ? dp[i + maxPts] : 0);\n // 也可写成:windowSum += dp[i] - (dp[i + maxPts] ?? 0);\n }\n return dp[0];\n};\n```\n\n## 复杂度分析\n- 时间复杂度\n- 只遍历了一次数组,每个状态 O(1) 计算。\n- 时间复杂度:O(n)\n- 空间复杂度\n- 需要一个 dp 数组大小为 O(n)。\n- 也可以优化成 O(maxPts)(因为只依赖一个窗口)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3231363055","body":"## 算法思路\n- 核心观察\n- 一个字符串的异位词就是 字符相同但顺序不同 的字符串。\n- 如果子串和 p 的 字符频率统计完全相同,那么它就是一个异位词。\n- 滑动窗口\n- 用两个数组(或哈希表)存放字符频率:\n- pCount 记录 p 中各字符出现次数。\n- sCount 记录当前窗口(长度等于 p.length)的各字符出现次数。\n- 每次窗口滑动:\n- 移入一个字符,更新 sCount。\n- 移出一个字符,更新 sCount。\n- 如果 sCount 和 pCount 相等,则记录当前窗口起始位置。\n- 优化比较\n- 不需要每次都完整比较两个数组(O(26))。\n- 但因为字符集仅 26 个,比较成本很小,可以直接比较数组,整体复杂度依旧可接受。\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string} p\n * @return {number[]}\n */\nvar findAnagrams = function(s, p) {\n let res = [];\n let m = p.length, n = s.length;\n if (n < m) return res;\n\n // 频次数组,26个小写字母\n let pCount = new Array(26).fill(0);\n let sCount = new Array(26).fill(0);\n\n // 统计 p 的频率\n for (let ch of p) {\n pCount[ch.charCodeAt(0) - 97]++;\n }\n\n // 初始化第一个窗口\n for (let i = 0; i < m; i++) {\n sCount[s.charCodeAt(i) - 97]++;\n }\n\n // 比较初始窗口\n if (sCount.join() === pCount.join()) res.push(0);\n\n // 滑动窗口\n for (let i = m; i < n; i++) {\n sCount[s.charCodeAt(i) - 97]++; // 加入右边字符\n sCount[s.charCodeAt(i - m) - 97]--; // 移出左边字符\n\n if (sCount.join() === pCount.join()) {\n res.push(i - m + 1);\n }\n }\n\n return res;\n};\n```\n\n## 复杂度分析\n- 时间复杂度\n- 初始化统计频率:O(m)\n- 滑动窗口遍历 s:O(n)\n- 每次比较频率数组:O(26) = O(1)\n- 总复杂度:O(n + m)\n- 空间复杂度\n- 两个长度为 26 的数组:O(26) ≈ O(1)\n- 结果数组存储下标,最坏情况 O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3236034367","body":"## 算法思路\n- 核心思想:滑动窗口\n- 我们在字符串 s 上维护一个动态窗口 [left, right)。\n- 用 need 记录字符串 t 中每个字符需要的次数。\n- 用 window 记录当前窗口中每个字符出现的次数。\n- 不断扩展 right 指针,直到窗口内满足 t 的要求。\n- 然后收缩 left,尽量缩小窗口,直到不满足要求为止。\n- 在满足要求的情况下,更新最小子串。\n- 满足条件的判断\n- 我们可以维护一个 valid 变量,表示窗口中满足 need 的字符种类数。\n- 当 valid === need.size 时,说明窗口包含了所有需要的字符。\n\n## 代码\n```javascript\n/**\n * @param {string} s\n * @param {string} t\n * @return {string}\n */\nvar minWindow = function(s, t) {\n let need = new Map();\n let window = new Map();\n\n for (let c of t) {\n need.set(c, (need.get(c) || 0) + 1);\n }\n\n let left = 0, right = 0;\n let valid = 0;\n let start = 0, len = Infinity;\n\n while (right < s.length) {\n let c = s[right];\n right++;\n if (need.has(c)) {\n window.set(c, (window.get(c) || 0) + 1);\n if (window.get(c) === need.get(c)) {\n valid++;\n }\n }\n\n // 收缩左边界\n while (valid === need.size) {\n if (right - left < len) {\n start = left;\n len = right - left;\n }\n let d = s[left];\n left++;\n if (need.has(d)) {\n if (window.get(d) === need.get(d)) {\n valid--;\n }\n window.set(d, window.get(d) - 1);\n }\n }\n }\n\n return len === Infinity ? \"\" : s.substr(start, len);\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 每个字符最多被左右指针访问一次,所以是 O(m + n),其中 m = s.length, n = t.length。\n- 空间复杂度:\n- 哈希表 need 和 window 至多包含全部字符,大小为 O(Σ),Σ 是字符集大小(对英文就是 O(26) 或 O(52) 或 O(128))。\n- 所以空间复杂度 O(Σ)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/50#issuecomment-3247555036","body":"## 算法思路\n- 一共要拿 k 张牌,可以从数组两端取。\n- 等价于:我们留下 n - k 张牌(连续子数组),这些是不能拿的。\n- 因此,最大得分 = 总和 - 最小的长度为 (n - k) 的子数组的和。\n- 先计算数组总和 total。\n- 如果 k == n,那就直接返回 total。\n- 否则,使用滑动窗口大小为 (n - k),找到 最小窗口和。\n- 答案就是 total - min_window_sum。\n\n## 代码\n```javascript\n/**\n * @param {number[]} cardPoints\n * @param {number} k\n * @return {number}\n */\nvar maxScore = function(cardPoints, k) {\n const n = cardPoints.length;\n const total = cardPoints.reduce((a, b) => a + b, 0);\n \n // 特殊情况:拿所有卡牌\n if (k === n) return total;\n \n const windowSize = n - k;\n // 初始化窗口和\n let windowSum = 0;\n for (let i = 0; i < windowSize; i++) {\n windowSum += cardPoints[i];\n }\n let minWindowSum = windowSum;\n \n // 滑动窗口\n for (let i = windowSize; i < n; i++) {\n windowSum += cardPoints[i] - cardPoints[i - windowSize];\n minWindowSum = Math.min(minWindowSum, windowSum);\n }\n \n return total - minWindowSum;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 计算总和 O(n)\n- 滑动窗口遍历一次数组 O(n)\n- 总复杂度 O(n)\n- 空间复杂度:\n- 只用常数级变量存储 O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/51#issuecomment-3247564267","body":"## 算法思路\n- 枚举所有可能的小时和分钟\n- 小时范围:0–11\n- 分钟范围:0–59\n- 总共 12 × 60 = 720 种组合。\n- 统计二进制表示中 1 的个数\n- bitCount(h) + bitCount(m) == turnedOn 才是合法解。\n- 其中 bitCount(x) 表示数字 x 的二进制中 1 的数量。\n- 格式化输出\n- 小时 h 直接转成字符串(不能有前导零)。\n- 分钟 m 必须是两位数,若小于 10 需在前面补 0。\n\n## 代码\n```javascript\n/**\n * @param {number} turnedOn\n * @return {string[]}\n */\nvar readBinaryWatch = function(turnedOn) {\n const res = [];\n // 遍历所有可能的时间\n for (let h = 0; h < 12; h++) {\n for (let m = 0; m < 60; m++) {\n // 检查是否满足亮灯数量\n if (bitCount(h) + bitCount(m) === turnedOn) {\n // 格式化分钟(必须两位数)\n const time = `${h}:${m.toString().padStart(2, '0')}`;\n res.push(time);\n }\n }\n }\n return res;\n};\n\n// 计算二进制数中 1 的个数\nfunction bitCount(num) {\n let count = 0;\n while (num > 0) {\n count += num & 1;\n num >>= 1;\n }\n return count;\n}\n```\n\n## 复杂度分析\n- 外层遍历所有 12 × 60 = 720 种时间组合 → O(720) ≈ O(1) (常数级,最多 720 次)。\n- 每次计算 bitCount(h) 和 bitCount(m),\n- h < 12(最多 4 bit),m < 60(最多 6 bit),所以计算一次 bitCount 的复杂度 ≤ 10。\n- 总复杂度依然是常数级。\n- 时间复杂度:O(1) (严格来说是 O(720×10),但近似常数)\n- 空间复杂度:O(1) (除返回结果外仅使用常量存储)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3247575227","body":"## 算法思路(回溯法)\n- 逐行放置:从第 0 行开始,尝试在每一列放置皇后。\n- 约束检查:放置前,检查当前列和对角线是否已有皇后。\n- 列冲突:用一个集合 cols 记录已占用的列。\n- 主对角线冲突:行号 - 列号 相同的点在同一主对角线上,用 diag1 集合。\n- 副对角线冲突:行号 + 列号 相同的点在同一副对角线上,用 diag2 集合。\n- 递归搜索:如果当前行放置成功,递归尝试下一行。\n- 回溯:如果无法继续,撤销放置,尝试下一个位置。\n- 统计解法数:当所有行都成功放置皇后时,计数 +1。\n\n## 代码\n```javascript\n/**\n * @param {number} n\n * @return {number}\n */\nvar totalNQueens = function(n) {\n let count = 0;\n const cols = new Set(); // 记录已占用的列\n const diag1 = new Set(); // 记录主对角线 (row - col)\n const diag2 = new Set(); // 记录副对角线 (row + col)\n\n function backtrack(row) {\n if (row === n) { \n count++;\n return;\n }\n for (let col = 0; col < n; col++) {\n if (cols.has(col) || diag1.has(row - col) || diag2.has(row + col)) {\n continue; // 冲突,不能放\n }\n // 选择\n cols.add(col);\n diag1.add(row - col);\n diag2.add(row + col);\n\n backtrack(row + 1);\n\n // 回溯\n cols.delete(col);\n diag1.delete(row - col);\n diag2.delete(row + col);\n }\n }\n\n backtrack(0);\n return count;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 每行必须放置一个皇后,因此每一行尝试 n 种列的可能性。\n- 在冲突检测 O(1) 的情况下,最坏情况回溯树的大小接近 O(n!)。\n- 实际上,由于剪枝(冲突检测),复杂度会远小于 n!,但仍然是 指数级。\n- 时间复杂度:O(n!) (上界)。\n- 空间复杂度:\n- cols、diag1、diag2 最多各存储 n 个元素。\n- 递归栈深度最大为 n。\n- 空间复杂度:O(n)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3247583590","body":"## 算法思路\n- 遍历整个网格,当遇到值为 1 的格子时,说明找到了新的岛屿。\n- 使用 DFS(深度优先搜索)或 BFS(广度优先搜索)来扩展整个岛屿,计算其面积,并更新最大值。\n- 为避免重复计算,我们要将访问过的格子标记为 0(淹没)或使用 visited 数组。\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar maxAreaOfIsland = function(grid) {\n let m = grid.length, n = grid[0].length;\n let maxArea = 0;\n\n function dfs(i, j) {\n // 边界条件\n if (i < 0 || i >= m || j < 0 || j >= n || grid[i][j] === 0) {\n return 0;\n }\n // 标记访问过\n grid[i][j] = 0;\n let area = 1;\n // 四个方向\n area += dfs(i + 1, j);\n area += dfs(i - 1, j);\n area += dfs(i, j + 1);\n area += dfs(i, j - 1);\n return area;\n }\n\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n if (grid[i][j] === 1) {\n maxArea = Math.max(maxArea, dfs(i, j));\n }\n }\n }\n\n return maxArea;\n};\n```\n\n## 复杂度分析\n- 时间复杂度:\n- 遍历整个矩阵,每个元素最多被访问一次(因为访问后会被置为 0)。\n- 每个格子在 DFS 中的递归调用也是 O(1)(最多 4 次相邻扩展)。\n- 总时间复杂度: O(m * n)\n- 空间复杂度:\n- 递归栈的深度,最坏情况是整个矩阵都是 1,即 O(m * n)。\n- 如果用 BFS + 队列,也需要 O(m * n) 的空间。\n- 空间复杂度: O(m * n)(递归栈 / 队列空间)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3247593268","body":"## 算法思路\n- 使用多源 BFS(广度优先搜索)来解决。\n- 找到所有陆地格子,放入队列(多源 BFS 起点)。\n- 从陆地开始向外扩展,遇到海洋格子时更新它的距离。\n- 记录 BFS 扩展到的最大层数,即最大距离。\n- 最后如果没有海洋或没有陆地,返回 -1。\n\n## 代码\n```javascript\n/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar maxDistance = function(grid) {\n const n = grid.length;\n const directions = [[1,0],[-1,0],[0,1],[0,-1]];\n const queue = [];\n\n // 1. 把所有陆地加入队列\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n if (grid[i][j] === 1) {\n queue.push([i, j]);\n }\n }\n }\n\n // 如果全是海洋或者全是陆地\n if (queue.length === 0 || queue.length === n * n) return -1;\n\n let distance = -1;\n\n // 2. 多源 BFS\n while (queue.length > 0) {\n let size = queue.length;\n distance++; // 每一层扩展一次\n for (let s = 0; s < size; s++) {\n const [x, y] = queue.shift();\n for (let [dx, dy] of directions) {\n const nx = x + dx, ny = y + dy;\n if (nx >= 0 && nx < n && ny >= 0 && ny < n && grid[nx][ny] === 0) {\n grid[nx][ny] = 1; // 标记为已访问(变为陆地)\n queue.push([nx, ny]);\n }\n }\n }\n }\n\n return distance;\n};\n```\n\n## 复杂度分析\n- BFS 遍历整个网格,每个格子最多入队一次。\n- 时间复杂度:O(n^2)\n- 空间复杂度(队列 + 访问标记):O(n^2)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3270177258","body":"## 思路\n- 一开始手上有一些 初始盒子,目标是最大化能获得的糖果数。关键点是:\n- 盒子可能是 开着的(status[i] = 1)或者 关着的(status[i] = 0)。\n- 你只有在盒子开着时,才能取走里面的糖果。\n- 打开盒子后,你可能获得 钥匙,可以解锁更多盒子。\n- 打开盒子后,你可能获得 更多盒子,这些盒子可能要等钥匙解锁才能用。\n- 所以整个过程就是一个 BFS / 队列模拟,类似 “不断解锁和探索”的过程。\n\n## 代码\n```javascript\n/**\n * @param {number[]} status\n * @param {number[]} candies\n * @param {number[][]} keys\n * @param {number[][]} containedBoxes\n * @param {number[]} initialBoxes\n * @return {number}\n */\nvar maxCandies = function(status, candies, keys, containedBoxes, initialBoxes) {\n let n = status.length;\n let res = 0;\n\n let haveKey = new Set();\n let haveBox = new Set(initialBoxes);\n let visited = new Array(n).fill(false);\n\n let queue = [...initialBoxes];\n\n while (queue.length > 0) {\n let box = queue.shift();\n if (visited[box]) continue;\n\n // 如果箱子是锁着的且没钥匙 -> 跳过\n if (status[box] === 0 && !haveKey.has(box)) continue;\n\n // 打开箱子\n visited[box] = true;\n res += candies[box];\n\n // 获得钥匙\n for (let k of keys[box]) {\n if (!haveKey.has(k)) {\n haveKey.add(k);\n // 如果之前已经有这个盒子但是打不开,现在可以打开了\n if (haveBox.has(k) && !visited[k]) {\n queue.push(k);\n }\n }\n }\n\n // 获得新的盒子\n for (let b of containedBoxes[box]) {\n if (!haveBox.has(b)) haveBox.add(b);\n if ((status[b] === 1 || haveKey.has(b)) && !visited[b]) {\n queue.push(b);\n }\n }\n }\n\n return res;\n};\n```\n\n## 复杂度分析\n- 时间复杂度\n- 每个盒子最多被处理一次,O(n)。\n- 钥匙和 containedBoxes 总长度之和最多 O(n)。\n- 所以总 时间复杂度 = O(n)。\n- 空间复杂度分析\n- visited / haveKey / haveBox 都是 O(n)。\n- 队列最多 O(n)。\n- 所以 空间复杂度 = O(n)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/56#issuecomment-3270189042","body":"/**\n * Definition for a binary tree node.\n * function TreeNode(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/**\n * @param {TreeNode} root\n * @return {number[][]}\n */\nvar verticalTraversal = function(root) {\n if (!root) return [];\n \n // 存储节点信息:[row, col, val]\n const nodes = [];\n \n // DFS遍历,记录每个节点的坐标和值\n function dfs(node, row, col) {\n if (!node) return;\n \n nodes.push([row, col, node.val]);\n \n // 左子节点:row+1, col-1\n dfs(node.left, row + 1, col - 1);\n // 右子节点:row+1, col+1\n dfs(node.right, row + 1, col + 1);\n }\n \n // 从根节点开始遍历,根节点坐标为(0, 0)\n dfs(root, 0, 0);\n \n // 按列索引分组\n const columnMap = new Map();\n for (const [row, col, val] of nodes) {\n if (!columnMap.has(col)) {\n columnMap.set(col, []);\n }\n columnMap.get(col).push([row, val]);\n }\n \n // 获取所有列索引并排序\n const columns = Array.from(columnMap.keys()).sort((a, b) => a - b);\n \n const result = [];\n for (const col of columns) {\n const columnNodes = columnMap.get(col);\n // 对每列内的节点排序:先按行排序,同行按值排序\n columnNodes.sort((a, b) => {\n if (a[0] !== b[0]) {\n return a[0] - b[0]; // 按行排序\n }\n return a[1] - b[1]; // 同行按值排序\n });\n \n // 提取值\n result.push(columnNodes.map(node => node[1]));\n }\n \n return result;\n};","onTime":false},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"ariana850409":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074225557","body":"思維:\n以十進位的相加方式,將 k 拆解成字串,從個位數開始與 num 相加,最後再處理一次 num 的進位\n\n代碼:\n```\nclass Solution(object):\n def addToArrayForm(self, num, k):\n k = str(k)\n for i in range(-1, -(len(k)+1), -1):\n number = int(k[i])\n if abs(i) > len(num):\n num.insert(0, number)\n else:\n num[i] = num[i] + number\n\n for i in range(-1, -(len(num)+1), -1):\n temp = num[i]\n if temp >= 10:\n num[i] = temp - 10\n if abs(i-1) > len(num):\n num.insert(0, 1)\n else:\n num[i-1] += 1\n\n return num\n```\n\n時間複雜度:O(N)
\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3078087647","body":"思維:\n先找出所有符合字符 c 的 index,再判斷字符串 s 中每個字符跟要拿來比較的 index 的最短距離\n\n代碼:\n```\nclass Solution:\n def shortestToChar(self, s: str, c: str) -> List[int]:\n target = []\n for i, char in enumerate(s):\n if char == c:\n target.append(i)\n\n res = []\n t = 0\n for i in range(len(s)):\n tar = target[t]\n if i < tar:\n res.append(tar-i)\n elif i == tar:\n res.append(0)\n elif t+1 >= len(target):\n res.append(i-tar)\n else:\n next_tar = target[t+1]\n res.append(min(i-tar, next_tar-i))\n if i == next_tar:\n t += 1\n return res\n```\n\n時間複雜度:O(N)
\n空間複雜度:O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3083166293","body":"思維一:單純依照題義用最直接的想法來實作各函式,increment 用遍歷去直接改變列表中的值\n\n代碼:\n```python\nclass CustomStack:\n def __init__(self, maxSize: int):\n self.maxSize = maxSize\n self.stack = []\n \n def push(self, x: int) -> None:\n if if len(self.stack) < self.maxSize:\n self.stack.append(x)\n\n def pop(self) -> int:\n if not self.stack:\n return -1\n return self.stack.pop()\n \n def increment(self, k: int, val: int) -> None:\n k = min(k, len(self.stack))\n for i in range(k):\n self.stack[i] += val\n```\n時間複雜度:push, pop: O(1) / increment: O(N)\n\n空間複雜度:O(N)\n\n-----\n思維二:優化 increment 的時間複雜度,將 increment value 另存在一個列表,等 pop 時才判斷需加多少值\n\n代碼:\n```python\nclass CustomStack:\n def __init__(self, maxSize: int):\n self.maxSize = maxSize\n self.stack = []\n self.inc = [0] * maxSize\n \n def push(self, x: int) -> None:\n if not len(self.stack) >= self.maxSize:\n self.stack.append(x)\n\n def pop(self) -> int:\n if not self.stack:\n return -1\n inc_idx = len(self.stack)-1\n inc_val = self.inc[inc_idx]\n if inc_idx > 0:\n self.inc[inc_idx-1] += inc_val\n self.inc[inc_idx] = 0\n return self.stack.pop() + inc_val\n \n def increment(self, k: int, val: int) -> None:\n k = min(k, len(self.stack))\n if k > 0:\n self.inc[k-1] += val\n```\n時間複雜度:push, pop, increment: O(1)\n\n空間複雜度:O(N)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3087613442","body":"思維:使用兩個 stack 模擬進入與退出重複區塊的過程,每遇到 [ 就壓入當下狀態,遇到 ] 就彈出並拼接,逐步建立出完整的解碼字串\n\n代碼:\n```python\nclass Solution:\n def decodeString(self, s: str) -> str:\n cnt_stack = []\n str_stack = []\n cnt = ''\n temp = ''\n for c in s:\n if c.isdigit():\n cnt += c\n elif c == '[':\n cnt_stack.append(int(cnt))\n str_stack.append(temp)\n cnt = ''\n temp = ''\n elif c == ']':\n times = cnt_stack.pop()\n prev_str = str_stack.pop()\n temp = prev_str + temp * times\n else:\n temp += c\n\n return temp\n```\n時間複雜度:O(N)\n\n空間複雜度:O(N)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091473302","body":"思維一:以暴力解的方式在 peek 或 pop 的操作時,用另一個陣列依序存目前 stack pop 出來的所有元素,操作結果後再依序新增回去,時間及空間複雜度皆為 O(N)(無實作)
\n思維二:使用兩個 stack 來操作存取,當有 peek 或 pop 的操作時,從 out_stack 拿取,判斷 out_stack 為空時再一次性的把當前 in_stack 的所有元素倒進 out_stack\n\n代碼:\n```python\nclass MyQueue(object):\n\n def __init__(self):\n self.in_stack = []\n self.out_stack = []\n \n def push(self, x):\n \"\"\"\n :type x: int\n :rtype: None\n \"\"\"\n self.in_stack.append(x)\n \n def pop(self):\n \"\"\"\n :rtype: int\n \"\"\"\n if not self.out_stack:\n while self.in_stack:\n self.out_stack.append(self.in_stack.pop())\n return self.out_stack.pop()\n \n def peek(self):\n \"\"\"\n :rtype: int\n \"\"\"\n if not self.out_stack:\n while self.in_stack:\n self.out_stack.append(self.in_stack.pop())\n return self.out_stack[-1]\n \n def empty(self):\n \"\"\"\n :rtype: bool\n \"\"\"\n return not (self.in_stack + self.out_stack)\n```\n時間複雜度:O(1) (Amortized)\n\n空間複雜度:O(N)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3096165781","body":"思維:\n1. 空串列直接回傳\n2. 先計算鏈結長度 length\n3. 把 k 對 length 取餘,因為旋轉 length 次等於沒動\n4. 用兩個指針 slow 和 fast 找到新的頭 new_head 的位置\n5. 將鏈結斷開重新連接,完成旋轉\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode(object):\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution(object):\n def rotateRight(self, head, k):\n \"\"\"\n :type head: Optional[ListNode]\n :type k: int\n :rtype: Optional[ListNode]\n \"\"\"\n if not head: \n return head\n\n length = 1\n temp = head\n while temp.next:\n length += 1\n temp = temp.next\n\n slow, fast = head, head\n for _ in range(k % length):\n if fast.next:\n fast = fast.next\n else:\n fast = head\n\n if slow == fast: \n return head\n\n while fast.next:\n slow = slow.next\n fast = fast.next\n\n new_head = slow.next\n slow.next = None\n fast.next = head\n return new_head\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3100848058","body":"思維:先處理無需交換的情況,透過一個 dummy 節點統一處理頭節點與後續節點的交換邏輯,每次迴圈交換一對相鄰節點,並用 pre 將已處理區與未處理區銜接起來,最後回傳 dummy 的下一個節點作為新鏈表的頭\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:\n if not head or not head.next:\n return head\n\n left = head\n right = head.next\n dummy = ListNode(None, head)\n pre = dummy\n while right:\n left.next = right.next\n right.next = left\n pre.next = right\n pre = left\n left = left.next\n right = left.next if left else None\n\n return dummy.next\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109165432","body":"思維:有想到要計算遞迴的中心點,但一開始解不出來,參考官方題解的思路加上畫圖後思路有比較清晰\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode(object):\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\n# Definition for a binary tree node.\n# class TreeNode(object):\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution(object):\n def sortedListToBST(self, head):\n \"\"\"\n :type head: Optional[ListNode]\n :rtype: Optional[TreeNode]\n \"\"\"\n if not head:\n return head\n\n pre, slow, fast = None, head, head\n while fast and fast.next:\n fast = fast.next.next\n pre = slow\n slow = slow.next\n if pre:\n pre.next = None\n\n node = TreeNode(slow.val)\n if slow == fast:\n return node\n \n node.left = self.sortedListToBST(head)\n node.right = self.sortedListToBST(slow.next)\n return node\n```\n時間複雜度:O(NlogN)\n\n空間複雜度:O(logN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112948103","body":"思維:\n1. 使用兩個指標 a 和 b,分別從 headA 和 headB 開始走。\n2. 每當指標走到自己 linked list 的結尾時,跳到另一條 linked list 的頭部繼續走。\n3. 最終:
\n a. 若兩條 list 有交點,a 和 b 會在同一個節點交會(因為走過的總長度相同)。
\n b. 若沒有交點,a 和 b 都會變成 None,同時結束迴圈。\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, x):\n# self.val = x\n# self.next = None\n\nclass Solution:\n def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:\n a, b = headA, headB\n a_switch, b_switch = False, False\n \n while a and b:\n if a == b:\n return a\n\n a = a.next if a.next else None\n if not a and not a_switch:\n a = headB\n a_switch = True\n \n b = b.next if b.next else None\n if not b and not b_switch:\n b = headA\n b_switch = True\n\n return None\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3114228960","body":"思維:使用快慢指針來偵測是否有環存在,若有找到相遇點的話,把 fast 指針重新指向 head 後找環的起點,兩個指針 slow 和 fast 都改成一次走一步,再次相遇時就是環的起始節點\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, x):\n# self.val = x\n# self.next = None\n\nclass Solution:\n def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:\n if not head or not head.next:\n return None\n\n slow, fast = head, head\n while fast:\n slow = slow.next\n fast = fast.next.next if fast.next else None\n if slow and slow == fast:\n fast = head \n while fast != slow:\n fast = fast.next\n slow = slow.next\n return fast\n\n return None\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3122031171","body":"思維:使用雙向鏈表搭配 Hash Map 實作 LRU Cache,讓每次的 get 和 put 操作都能在 O(1) 時間內完成。最近使用的節點會被移到鏈表頭部,當容量超過時,就從尾部刪除最久未使用的節點。\n\n代碼:\n```python\nclass ListNode:\n def __init__(self, key, value):\n self.key = key\n self.val = value\n self.next = None\n self.pre = None\n\nclass LRUCache:\n def __init__(self, capacity: int):\n self.capacity = capacity\n self.length = 0\n self.head = ListNode(None, None)\n self.tail = ListNode(None, None)\n self.head.next = self.tail\n self.tail.pre = self.head\n self.map = {}\n\n def _add_to_head(self, key: int, value: int):\n node = ListNode(key, value)\n node.next = self.head.next\n self.head.next = node\n node.next.pre = node\n node.pre = self.head\n self.map[key] = node\n self.length += 1\n\n def _remove_from_tail(self, key: int):\n remove_key = self.tail.pre.key\n self.tail.pre = self.tail.pre.pre\n self.tail.pre.next = self.tail\n self.map.pop(remove_key)\n self.length -= 1\n\n def _move_node_to_head(self, node: ListNode):\n node.pre.next = node.next\n node.next.pre = node.pre\n self.head.next.pre = node\n node.pre = self.head\n node.next = self.head.next\n self.head.next = node\n \n def get(self, key: int) -> int:\n if key in self.map:\n node = self.map[key]\n self._move_node_to_head(node)\n return self.map[key].val\n return -1\n \n def put(self, key: int, value: int) -> None:\n node = self.map.get(key)\n if node:\n self._move_node_to_head(node)\n node.val = value\n else:\n if self.length >= self.capacity:\n self._remove_from_tail(key) \n self._add_to_head(key, value)\n```\n時間複雜度:O(1)\n\n空間複雜度:O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124493359","body":"思維:DFS,透過遞迴分別計算左右子樹的最大深度,然後回傳較大的一邊再加 1(代表當前節點這一層),最終得到整棵樹的最大深度。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def maxDepth(self, root: Optional[TreeNode]) -> int:\n if not root:\n return 0\n return max(self.maxDepth(root.left), self.maxDepth(root.right))+1\n```\n時間複雜度:O(N)\n\n空間複雜度:O(h) (max depth of tree)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3127762191","body":"思維:DFS,透過遞歸比對兩棵樹的每個對應節點是否完全一樣,一層層往下檢查,直到整棵樹都比對完或中途不符合就結束。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:\n if not p and not q:\n return True\n \n if p and q and p.val == q.val:\n res_left = self.isSameTree(p.left, q.left)\n res_right = self.isSameTree(p.right, q.right)\n return res_left and res_right\n\n return False\n```\n時間複雜度:O(N)\n\n空間複雜度:O(h) (max depth of tree)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3133090654","body":"思維:DFS,透過遞歸保存當前數字的狀態,每走到下一層就把目前的 current_num 乘上 10 再加上當前節點的值,當走到葉子節點時就可以回傳目前這條路徑的數字,最後把左右子樹的 dfs 結果加總起來。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def sumNumbers(self, root: Optional[TreeNode]) -> int:\n def dfs(node, current_num):\n if not node:\n return 0\n current_num = current_num * 10 + node.val\n if not node.left and not node.right:\n return current_num\n return dfs(node.left, current_num) + dfs(node.right, current_num)\n return dfs(root, 0)\n```\n時間複雜度:O(N)\n\n空間複雜度:O(d) (max depth of tree)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3135855226","body":"思維一:BFS,使用廣度優先搜尋一層層遍歷二元樹節點,並記錄每一層最先遇到的節點。每當進入新的一層,就更新目前儲存的節點為該層最左側的節點。最終回傳的是最底層最左邊那個節點的值。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n q = deque()\n res = (root,0)\n q.append((root,0))\n while q:\n node, level = q.popleft()\n cur_level = res[1]\n if level > cur_level:\n res = (node, level)\n\n if node.left:\n q.append((node.left, level+1))\n if node.right:\n q.append((node.right, level+1))\n\n return res[0].val\n```\n\n時間複雜度:O(N)\n\n空間複雜度:O(w) (max width of tree)\n\n---------\n思維二:DFS,使用深度優先搜尋遍歷整顆樹,每當遇到更深層的節點,就更新目前記錄的最左邊節點值,最終返回的是整棵樹最深層最左邊的節點值。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n def dfs(node, cur_depth, leftmost, depthest):\n if cur_depth > depthest:\n leftmost = node.val\n depthest = cur_depth\n\n if node.left:\n leftmost, depthest = dfs(node.left, cur_depth+1, leftmost, depthest)\n if node.right:\n leftmost, depthest = dfs(node.right, cur_depth+1, leftmost, depthest)\n return leftmost, depthest\n\n leftmost, depthest = dfs(root, 1, root.val, 1)\n return leftmost\n```\n\n時間複雜度:O(N)\n\n空間複雜度:O(h) (max height of tree)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3140470104","body":"思維一:DFS
\nserialize: 使用 前序遍歷(DFS) 將樹的結構與節點值轉成 list,再轉為 JSON 字串,None 用來記錄空節點保證可逆。
\ndeserialize: 根據前序順序,遇到 None 表示空節點,遞迴還原出整棵樹的結構。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode(object):\n# def __init__(self, x):\n# self.val = x\n# self.left = None\n# self.right = None\n\nclass Codec:\n\n def serialize(self, root):\n \"\"\"Encodes a tree to a single string.\n \n :type root: TreeNode\n :rtype: str\n \"\"\"\n res = []\n def dfs(node):\n if not node:\n res.append(None)\n return\n\n res.append(node.val)\n dfs(node.left)\n dfs(node.right)\n\n dfs(root)\n return json.dumps(res)\n\n def deserialize(self, data):\n \"\"\"Decodes your encoded data to tree.\n \n :type data: str\n :rtype: TreeNode\n \"\"\"\n data = deque(json.loads(data))\n def dfs(data):\n val = data.popleft()\n if val is None:\n return\n\n node = TreeNode(val)\n node.left = dfs(data)\n node.right = dfs(data)\n return node\n \n return dfs(data)\n\n# Your Codec object will be instantiated and called as such:\n# ser = Codec()\n# deser = Codec()\n# ans = deser.deserialize(ser.serialize(root))\n```\n\n時間複雜度:O(N)
\n空間複雜度:O(N)\n\n-----------------\n\n思維二:BFS
\nserialize:利用 BFS(層序遍歷)將每層節點值與空位(None)一起寫入 list,最後轉成 JSON 字串。
\ndeserialize:讀回字串後同樣使用 BFS,按順序建立節點並接上左右子節點,重建出原始二叉樹。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode(object):\n# def __init__(self, x):\n# self.val = x\n# self.left = None\n# self.right = None\n\nclass Codec:\n\n def serialize(self, root):\n \"\"\"Encodes a tree to a single string.\n \n :type root: TreeNode\n :rtype: str\n \"\"\"\n res = []\n queue = deque([root])\n while queue:\n node = queue.popleft()\n if node:\n res.append(node.val)\n queue.append(node.left)\n queue.append(node.right)\n else:\n res.append(None)\n\n return json.dumps(res)\n\n def deserialize(self, data):\n \"\"\"Decodes your encoded data to tree.\n \n :type data: str\n :rtype: TreeNode\n \"\"\"\n data = deque(json.loads(data))\n root_val = data.popleft()\n if root_val is None:\n return None\n \n root = TreeNode(root_val)\n queue = deque([root])\n while queue:\n node = queue.popleft()\n if data:\n left_val = data.popleft()\n right_val = data.popleft()\n if left_val is not None:\n left_node = TreeNode(left_val)\n node.left = left_node\n queue.append(left_node)\n if right_val is not None:\n right_node = TreeNode(right_val)\n node.right = right_node\n queue.append(right_node)\n\n return root\n\n# Your Codec object will be instantiated and called as such:\n# ser = Codec()\n# deser = Codec()\n# ans = deser.deserialize(ser.serialize(root))\n```\n\n時間複雜度:O(N)
\n空間複雜度:O(N)","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/24#issuecomment-3148593193","body":"思維:\n1. 對每個點 i 當作中心,計算它與所有其他點的距離\n2. 用 distance_map 統計,有多少個點與 i 的距離相同(也就是距離為 d 的點出現了幾次)\n3. 如果某個距離出現了 count 次(基本上就是超過一次的次數才會被納入計算),就能組出 count * (count - 1) 種 (j, k) boomerang(因為 (j, k), (k, j) 視為兩種組合,(count - 1) 為要扣掉已經放在前一個位置的元素)\n4. 最後把所有距離的組合數加總起來即可\n\n代碼:\n```python\nclass Solution:\n def numberOfBoomerangs(self, points: List[List[int]]) -> int:\n res = 0\n for i, x in enumerate(points):\n distance_map = defaultdict(int)\n for j, y in enumerate(points):\n if i != j:\n distance_map[(y[0] - x[0])**2 + (y[1] - x[1])**2] += 1\n\n for count in distance_map.values():\n res += count * (count-1)\n\n return res\n```\n時間複雜度:O(N^2)\n\n空間複雜度:O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3153175756","body":"思維:\n1. 使用雙指針 left 和 right 維護一個「不含重複字元的滑動視窗」\n2. 不斷將 right 指向的字元加入 seen\n3. 一旦發現重複字元,就從 left 開始依序從 seen 移除字元,直到這個重複字元被清掉\n4. 每次 right 移動後,更新視窗大小 right - left,維護一個最大值 max_str\n\n代碼:\n```python\nclass Solution:\n def lengthOfLongestSubstring(self, s: str) -> int:\n max_str = 0\n left = 0\n right = 0\n seen = set()\n while right < len(s):\n while s[right] in seen:\n seen.remove(s[left])\n left += 1\n seen.add(s[right])\n right += 1\n max_str = max(max_str, right-left)\n return max_str\n```\n時間複雜度:O(N)\n\n空間複雜度:O(k) (k for number of character types)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3160705635","body":"思維:\n1. 多組偏移掃描:使用 i in range(word_len) 對字串做「分組」掃描,防止錯過合法起始點\n2. 滑動視窗掃描:每次從 j 開始擷取一個單字(長度 word_len),如果這個字在 words 裡,放進 window_counter,若某個單字超出次數,移動 left(左指針)來縮小視窗,如果視窗內剛好有 word_count 個單字,加入結果\n3. 如果不是合法單字,清空 window_counter,重設 count 和 left(下一次從這個位置繼續)\n\n代碼:\n```python\nclass Solution:\n def findSubstring(self, s: str, words: List[str]) -> List[int]:\n word_len = len(words[0])\n word_count = len(words)\n total_len = word_len * word_count\n target_counter = Counter(words)\n res = []\n\n for i in range(word_len):\n left = i\n window_counter = Counter()\n count = 0\n\n for j in range(i, len(s) - word_len + 1, word_len):\n word = s[j:j+word_len]\n if word in target_counter:\n window_counter[word] += 1\n count += 1\n\n while window_counter[word] > target_counter[word]:\n left_word = s[left:left+word_len]\n window_counter[left_word] -= 1\n count -= 1\n left += word_len\n\n if count == word_count:\n res.append(left)\n\n else:\n window_counter.clear()\n count = 0\n left = j + word_len\n\n return res\n```\n時間複雜度:O(N × W) (N is length of s, W is length of words)\n\n空間複雜度:O(W)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3166506559","body":"思維:使用快慢指標 (two pointers) 技巧,設兩個指標 slow 和 fast 同時指向鏈表頭,每次 slow 走一步、fast 走兩步,當 fast 到達鏈表尾時,slow 正好在中間節點。\n\n代碼:\n```python\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:\n slow = fast = head\n while fast and fast.next:\n slow = slow.next\n fast = fast.next.next\n\n return slow \n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172494360","body":"思維:使用雙指針來實行二分搜尋法,設定左右邊界取中間位置\n1. 如果 nums[mid] == target,直接回傳 mid(找到目標)。\n2. 如果 nums[mid] > target,代表目標在左半邊,更新 right = mid - 1。\n3. 如果 nums[mid] < target,代表目標在右半邊,更新 left = mid + 1。\n4. 迴圈結束後(left > right),left 就是目標應插入的位置。\n\n代碼:\n```python\nclass Solution:\n def searchInsert(self, nums: List[int], target: int) -> int:\n left = 0\n right = len(nums)-1\n while left <= right:\n mid = (left+right)//2\n if nums[mid] == target:\n return mid\n elif nums[mid] > target:\n right = mid-1\n else:\n left = mid+1\n return left\n```\n時間複雜度:O(logN)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173687770","body":"思維:使用單調遞減隊列來維護視窗內最大值的 index\n1. 前 k 個元素先初始化隊列:維持隊列的遞減性,每次新來的元素會移除尾部比它小的元素,q[0] 永遠是最大值的 index\n2. 接下來從 k 到結尾,維持單調性並移除過期元素:新元素進來時維持單調隊列,移除滑出視窗的 index,每次把 nums[q[0]](視窗最大值)加入結果\n\n代碼:\n```python\nclass Solution:\n def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:\n res = []\n q = deque()\n for i in range(k):\n while q and nums[q[-1]] < nums[i]:\n q.pop()\n q.append(i)\n res.append(nums[q[0]])\n\n for i in range(k, len(nums)):\n while q and nums[q[-1]] < nums[i]:\n q.pop()\n q.append(i)\n while q[0] <= i-k:\n q.popleft()\n res.append(nums[q[0]])\n\n return res\n```\n時間複雜度:O(N)\n\n空間複雜度:O(k)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3178842909","body":"思維:\n1. 使用兩個表分別紀錄信任他人及被信任的計數\n2. 之後尋找一個人 x,滿足:trusted_tables[x] == n - 1(被其他人信任)以及 trust_tables[x] == 0:(自己沒信任任何人)\n3. 若找到這樣的人,回傳他的編號;否則回傳 -1\n\n代碼:\n```python\nclass Solution:\n def findJudge(self, n: int, trust: List[List[int]]) -> int:\n if n == 1:\n return 1\n\n trust_tables = defaultdict(int)\n trusted_tables = defaultdict(int)\n for [trust_a, trust_b] in trust:\n trust_tables[trust_a] += 1\n trusted_tables[trust_b] += 1\n\n for trusted_person, trusted_ticket in trusted_tables.items():\n if trusted_ticket == n-1 and trust_tables[trusted_person] == 0:\n return trusted_person\n return -1\n```\n時間複雜度:O(N)\n\n空間複雜度:O(N)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3188960333","body":"思維:\n1. 把沒群組的 item 分配新的唯一群組:這樣後面只需處理群組 id,不用特別分支處理 -1。\n2. 建立 item graph:由 prev -> curr(prev 必須在 curr 前面)。\n3. 建立 group graph:當 prev 與 curr 屬不同群組時,建立 g_prev -> g_curr 的依賴邊;用 set 避免重複邊。\n4. 對 group graph 做拓撲排序:得出 group 的一個合法順序;若有 cycle,無解回 []。\n5. 對 item graph 做拓撲排序:得出 items 在全域上的合法相對順序(若有 cycle,無解回 [])。\n6. 把 items 按 item_order 分桶到對應 group,再按 group_order 串接:同 group items 會連在一起且保持 item 之間的依賴。\n\n代碼:\n```python\nclass Solution:\n def sortItems(self, n: int, m: int, group: List[int], beforeItems: List[List[int]]) -> List[int]:\n new_group_id = m\n for i in range(n):\n if group[i] == -1:\n group[i] = new_group_id\n new_group_id += 1\n total_groups = new_group_id\n\n item_adj = [[] for _ in range(n)]\n item_indeg = [0] * n\n\n group_adj = [[] for _ in range(total_groups)]\n group_indeg = [0] * total_groups\n\n added_group_edges = set()\n\n for curr in range(n):\n for prev in beforeItems[curr]:\n item_adj[prev].append(curr)\n item_indeg[curr] += 1\n\n g_prev = group[prev]\n g_curr = group[curr]\n if g_prev != g_curr:\n if (g_prev, g_curr) not in added_group_edges:\n added_group_edges.add((g_prev, g_curr))\n group_adj[g_prev].append(g_curr)\n group_indeg[g_curr] += 1\n\n def topo_sort(num_nodes, adj, indeg):\n q = deque([i for i in range(num_nodes) if indeg[i] == 0])\n order = []\n while q:\n u = q.popleft()\n order.append(u)\n for v in adj[u]:\n indeg[v] -= 1\n if indeg[v] == 0:\n q.append(v)\n if len(order) == num_nodes:\n return order\n else:\n return []\n\n group_order = topo_sort(total_groups, group_adj, group_indeg[:])\n if not group_order:\n return []\n\n item_order = topo_sort(n, item_adj, item_indeg[:])\n if not item_order:\n return []\n\n items_by_group = defaultdict(list)\n for item in item_order:\n items_by_group[group[item]].append(item)\n\n result = []\n for g in group_order:\n result.extend(items_by_group[g])\n\n return result\n```\n時間複雜度:O(n + E)\n\n空間複雜度:O(n + m + E)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3191064414","body":"思維:依照題意模擬路徑\n\n代碼:\n```python\nclass Solution:\n def judgeCircle(self, moves: str) -> bool:\n spot = [0, 0]\n for move in moves:\n if move == 'R':\n spot[0] += 1\n elif move == 'L':\n spot[0] -= 1\n elif move == 'U':\n spot[1] += 1\n else:\n spot[1] -= 1\n \n return spot == [0, 0]\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3194164140","body":"思維:\n1. 解析登入、登出時間(時、分),如果登出時間早於登入時間,代表跨過午夜就加 24 小時。\n2. 重新計算登入時間:向上取整到最近的 15 分鐘倍數(因為要等到下一個完整的 15 分鐘才算開始一局)。\n3. 重新計算登出時間:向下取整到最近的 15 分鐘倍數(因為超過的部分不算完整一局)。\n4. 計算完整局數,如果結果為負數則返回 0。\n\n這裡用 (logout_hour-login_hour)*4 - login_minute/15 + logout_minute/15 直接換算成以「15 分鐘為單位」的差距。\n\n代碼:\n```python\nclass Solution:\n def numberOfRounds(self, loginTime: str, logoutTime: str) -> int:\n login_hour, login_minute = map(int, loginTime.split(':'))\n logout_hour, logout_minute = map(int, logoutTime.split(':'))\n if logout_hour < login_hour or logout_hour == login_hour and logout_minute < login_minute:\n logout_hour += 24\n\n login_hour, login_minute = self.narrow_down_time(login_hour, login_minute, True)\n logout_hour, logout_minute = self.narrow_down_time(logout_hour, logout_minute, False)\n\n return max(0, int((logout_hour-login_hour)*4 - login_minute/15 + logout_minute/15))\n\n def narrow_down_time(self, login_hour: int, login_minute: int, is_login: bool):\n if is_login:\n login_minute = ceil(login_minute/15) * 15\n if login_minute == 60:\n login_hour += 1\n login_minute = 0\n else:\n login_minute = floor(login_minute/15) * 15\n\n return login_hour, login_minute\n```\n時間複雜度:O(1)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3196258303","body":"思維:\n1. 函式 compare_less(a_counter, b_counter):模擬條件 1、2,對所有可能分界點 ch(從 'b' 到 'z')進行遍歷
\n讓 a 的所有字母 < ch,讓 b 的所有字母 ≥ ch,使用 prefix sum 避免重複運算,計算出最少需要修改的字元數\n2. 函式 compare_distinct(a_counter, b_counter):模擬條件 3,讓兩字串變成同一種字母
\n對所有字母出現次數總和 Counter 做合併,找出現次數最多的字母後,將其餘字母通通改成這個字母,修改次數 = 總數量 - 該字母出現次數\n3. 分別計算三個條件需要的修改次數,回傳三者中的最小值\n\n代碼:\n```python\nclass Solution:\n def minCharacters(self, a: str, b: str) -> int:\n a_counter = Counter(ord(ch) for ch in a)\n b_counter = Counter(ord(ch) for ch in b)\n\n goal_a = self.compare_less(a_counter, b_counter)\n goal_b = self.compare_less(b_counter, a_counter)\n goal_c = self.compare_distinct(a_counter, b_counter)\n return min(goal_a, goal_b, goal_c)\n\n def compare_less(self, a_counter, b_counter):\n a_freq = [0] * 26\n b_freq = [0] * 26\n for k, v in a_counter.items():\n a_freq[k - ord('a')] = v\n for k, v in b_counter.items():\n b_freq[k - ord('a')] = v\n\n a_prefix = list(itertools.accumulate(a_freq))\n b_prefix = list(itertools.accumulate(b_freq))\n move = float('inf')\n for ch in range(1, 26):\n move_a = a_prefix[25] - a_prefix[ch-1]\n move_b = b_prefix[ch-1]\n move = min(move, move_a + move_b)\n return move\n\n def compare_distinct(self, a_counter, b_counter):\n all_counter = a_counter + b_counter\n most_key = max(all_counter, key=all_counter.get)\n total = sum(all_counter.values())\n return total - all_counter[most_key]\n```\n時間複雜度:O(n+m)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3201266614","body":"思維:先把所有數字用 heappush 丟進最小堆,維護「父節點 ≤ 子節點」,接著每次 heappop 拿走堆頂(最小值),直到堆空,收集出來的數列 res 就是升序排序。\n\n代碼:\n```python\nclass Solution:\n def sortArray(self, nums: List[int]) -> List[int]:\n min_heap = []\n res = []\n for num in nums:\n self.heappush(min_heap, num)\n\n while min_heap:\n res.append(self.heappop(min_heap))\n\n return res\n \n def heappush(self, h, x):\n h.append(x)\n i = len(h)-1\n\n while i > 0:\n p = (i - 1) // 2\n if h[i] < h[p]:\n h[i], h[p] = h[p], h[i]\n i = p\n else:\n break\n\n def heappop(self, h):\n last = h.pop()\n if not h:\n return last\n root = h[0]\n h[0] = last\n i = 0\n n = len(h)\n while True:\n left = 2*i + 1\n right = 2*i + 2\n if left >= n:\n break\n\n child = left\n if right < n and h[right] < h[left]:\n child = right\n if h[child] < h[i]:\n h[i], h[child] = h[child], h[i]\n i = child\n else:\n break\n return root\n```\n時間複雜度:O(n log n)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3204542831","body":"思維:使用二分搜尋法,對於 x ≥ 2 的情況,設定搜尋範圍為 [1, x // 2],如果 mid^2 太大,就向左縮小範圍,如果太小,就向右移動範圍,當搜尋結束(left > right)時,right 就是最接近但不超過 √x 的整數\n\n代碼:\n```python\nclass Solution:\n def mySqrt(self, x: int) -> int:\n if x < 2:\n return x\n \n left, right = 1, x // 2\n while left <= right:\n mid = (left + right) // 2\n if mid * mid == x:\n return mid\n elif mid * mid > x:\n right = mid - 1\n else:\n left = mid + 1\n\n return right\n```\n時間複雜度:O(log x)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3211104911","body":"思維:使用二分搜尋法,如果 mid 是壞的:可能是答案,但還要往左找,right = mid - 1,如果 mid 是好的:答案一定在右邊,left = mid + 1,最後 left 會停在第一個壞版本的位置。\n\n代碼:\n```python\nclass Solution:\n def firstBadVersion(self, n: int) -> int:\n left, right = 1, n\n while left <= right:\n mid = (left + right) // 2\n if isBadVersion(mid):\n right = mid - 1\n else:\n left = mid + 1\n return left\n```\n時間複雜度:O(log n)\n\n空間複雜度:O(1)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/43#issuecomment-3216087383","body":"思維:\n1. 先對加熱器位置排序,才能用二分搜尋快速找到每個房子最近的加熱器\n2. 遍歷每個房子,使用二分搜尋找到第一個 heaters[mid] 大於等於當前 house 的位置(也就是最接近右邊的加熱器)\n3. 再往回看一個位置 heaters[r],也就是最接近左邊的加熱器\n4. 比較左右加熱器距離,選擇較小者\n5. 更新最大加熱半徑(最小距離中的最大值)\n\n代碼:\n```python\nclass Solution:\n def findRadius(self, houses: List[int], heaters: List[int]) -> int:\n res = 0\n heaters.sort()\n \n for house in houses:\n l, r = 0, len(heaters) - 1\n while l <= r:\n mid = (l + r) // 2\n if house <= heaters[mid]:\n r = mid - 1\n else:\n l = mid + 1\n\n l_res, r_res = inf, inf\n if 0 <= l <= len(heaters)-1:\n l_res = abs(heaters[l] - house)\n if 0 <= r <= len(heaters)-1:\n r_res = abs(heaters[r] - house)\n\n res = max(res, min(l_res, r_res))\n\n return res\n```\n時間複雜度:O(M log M + N log M) (M for length of heaters, N for length of houses)\n\n空間複雜度:O(1)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3223499698","body":"思維:先初始化前 k 個字元中有多少母音,用滑動視窗維持長度為 k 的區間往右滑動,每次移動一格,視窗左邊出去一個字元、右邊進來一個字元,如果左邊移出的是母音即減 1,如果右邊移入的是母音即加 1,並且更新最大值,直到滑到最後一格為止\n\n代碼:\n```python\nclass Solution:\n def maxVowels(self, s: str, k: int) -> int:\n vowels = set('aeiou')\n count = sum(1 for c in s[:k] if c in vowels)\n max_count = count\n\n for i in range(k, len(s)):\n if s[i-k] in vowels:\n count -= 1\n if s[i] in vowels:\n count += 1\n max_count = max(max_count, count)\n\n return max_count\n```\n時間複雜度:O(N)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3227824002","body":"思維:\n1. 邊界判斷:若 k == 0,不會抽牌,分數永遠是 0,且一定 ≤ n,直接回傳 1.0。若 n ≥ k + maxPts - 1,最多只能拿到 k - 1 + maxPts 分,而這些都 ≤ n,直接回傳 1.0\n2. 初始化:建立一個長度 n + 1 的 dp 陣列,dp[i] 表示拿到 i 分的機率,設定 dp[0] = 1.0(初始在 0 分),window_sum = 1.0 表示 dp[0] 的值,res = 0.0,用來累加最終結果(分數 ≥ k 的機率)\n3. 進入迴圈,從 i = 1 到 n:使用滑動視窗平均法計算 dp[i] = window_sum / maxPts,如果 i < k 代表還會繼續抽牌 → 將 dp[i] 加入 window_sum,影響後續機率,如果 i ≥ k,代表不能再抽牌了 → 將 dp[i] 加入 res,因為這是可能的最終分數\n4. 維護滑動視窗:若 i - maxPts ≥ 0,將前方的 dp[i - maxPts] 從 window_sum 中扣除,保持視窗大小為 maxPts\n5. 迴圈結束後,回傳累積的結果:回傳 res,即所有停在 k 到 n 分的總機率\n\n代碼:\n```python\nclass Solution:\n def new21Game(self, n: int, k: int, maxPts: int) -> float:\n if k == 0 or n >= k + maxPts - 1:\n return 1\n \n dp = [0.0] * (n + 1)\n dp[0] = 1.0\n window_sum = 1.0\n res = 0.0\n\n for i in range(1, n + 1):\n dp[i] = window_sum / maxPts\n if i < k:\n window_sum += dp[i]\n else:\n res += dp[i]\n\n if i - maxPts >= 0:\n window_sum -= dp[i-maxPts]\n\n return res\n```\n\n時間複雜度:O(N)\n\n空間複雜度:O(N)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3232431244","body":"思維:透過固定長度為 len(p) 的滑動視窗掃過整個字串 s,用 Counter 統計當前視窗的字元分佈\n1. 初始化兩個 Counter:target 記錄 p 的字元分佈,cur 動態維護視窗內的字元分佈\n2. 向右移動右指標 r 更新 cur,每次移動後如果 cur == target,代表此視窗是一個 anagram,res 加入 l\n3. 視窗長度若達到 len(p),就縮左邊,如果左邊的字元也在 p 中,從 cur 中減一,移動左指標 l,確保視窗長度維持為 len(p)\n\n代碼:\n```python\nclass Solution:\n def findAnagrams(self, s: str, p: str) -> List[int]:\n res = []\n target = Counter(p)\n cur = Counter()\n l, r = 0, 0\n\n while r < len(s):\n if s[r] in p:\n cur[s[r]] += 1\n \n if cur == target:\n res.append(l)\n\n r += 1\n if r - l >= len(p):\n if s[l] in p:\n cur[s[l]] -= 1\n l += 1\n\n return res\n```\n時間複雜度:O(N)\n\n空間複雜度:O(k)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3235535873","body":"思維:\n1. 使用 target 記錄 t 中每個字元需要出現幾次,required 為需要達成的字元種類數,formed 表示目前有多少種字元達到目標需求\n2. 用滑動視窗 [l, r] 掃過 s\n3. 視窗內使用 cur 統計目前出現的字元次數\n4. 每當 formed == required(即目前視窗內已滿足所有字元需求),就嘗試更新最短子字串\n5. 然後移動左指標 l,直到不再滿足條件,再往右擴張 r\n\n代碼:\n```python\nclass Solution:\n def minWindow(self, s: str, t: str) -> str:\n if not s or not t or len(t) > len(s):\n return ''\n\n res = ''\n target = Counter(t)\n cur = Counter()\n required = len(target)\n formed = 0\n l = 0\n\n for r in range(len(s)):\n char = s[r]\n if char in target:\n cur[char] += 1\n if cur[char] == target[char]:\n formed += 1\n\n while formed == required:\n window = s[l:r+1]\n if not res or len(window) < len(res):\n res = window\n\n if s[l] in target:\n cur[s[l]] -= 1\n if cur[s[l]] < target[s[l]]:\n formed -= 1\n l += 1\n\n return res\n```\n時間複雜度:O(N)\n\n空間複雜度:O(N)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3241211135","body":"思維:\n1. 每一層遞迴代表一個 row(橫列),每一層嘗試在該 row 的每一個 col(直行)上放一個 Q\n2. 使用三個集合記錄不能放的位置(剪枝):used_cols:欄位不能重複、used_diag1:↘ 對角線(row - col)不能重複、used_diag2:↙ 對角線(row + col)不能重複\n3. 如果當前格子合法:將當前 col 與對角線加入對應集合,進入下一 row 繼續放皇后\n4. 如果成功放到第 n 行,代表一種合法放法,count += 1\n5. 每個回合結束後回溯:移除當前狀態,嘗試下一個 col\n\n代碼:\n```python\nclass Solution:\n def totalNQueens(self, n: int) -> int:\n count = 0\n\n def backtracking(row, used_cols, used_diag1, used_diag2):\n if row == n:\n nonlocal count \n count += 1\n return\n\n for col in range(n):\n if col in used_cols or row - col in used_diag1 or row + col in used_diag2:\n continue\n \n used_cols.add(col)\n used_diag1.add(row - col)\n used_diag2.add(row + col)\n\n backtracking(row + 1, used_cols, used_diag1, used_diag2)\n\n used_cols.remove(col)\n used_diag1.remove(row - col)\n used_diag2.remove(row + col)\n\n backtracking(0, set(), set(), set())\n\n return count\n```\n時間複雜度:O(n!)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3244207256","body":"思維:深度優先搜尋(DFS)\n1. 初始化變數: seen 避免重複拜訪相同格子、max_area記錄最大島嶼面積\n2. 走過整張地圖: 雙層 for loop,遍歷每一格 (i, j)\n3. 找到新的島嶼起點就 DFS: 如果是還沒拜訪過的陸地,就從這裡開始 DFS,算面積,回傳面積後更新 max_area\n4. DFS 拜訪所有相連陸地: 每次進來的 (row, col) 都會標記為已拜訪,area = 1 表示這一格自己先算進面積\n5. 遞迴搜尋上下左右的相連格子: 檢查鄰近 4 格是否可以繼續走,遞迴地累加 area\n6. DFS 結束後回傳這座島的面積\n\n代碼:\n```python\nclass Solution:\n direction = [(1, 0), (-1, 0), (0, 1), (0, -1)]\n\n def maxAreaOfIsland(self, grid: List[List[int]]) -> int:\n seen = set()\n max_area = 0\n for i in range(len(grid)):\n for j in range(len(grid[0])):\n if grid[i][j] == 1 and (i, j) not in seen:\n area = self.dfs(i, j, seen, grid)\n max_area = max(max_area, area)\n \n return max_area\n\n def dfs(self, row, col, seen, grid):\n seen.add((row, col))\n area = 1\n for dx, dy in self.direction:\n x, y = row + dx, col + dy\n if 0 <= x < len(grid) and 0 <= y < len(grid[0]) and grid[x][y] == 1 and (x, y) not in seen:\n area += self.dfs(x, y, seen, grid)\n \n return area\n```\n時間複雜度:O(m × n)\n\n空間複雜度:O(m × n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3249687017","body":"思維:多源 BFS\n1. 把所有的陸地格(值為 1)當作起點,加入 queue 中\n2. 先判斷若陸地為空(全是水)或全是陸地,回傳 -1\n3. BFS 擴展每一層水格:每次從 queue 拿一個格子出來,對四個方向進行探索,如果是水(值為 0),就更新它為「距離 = 前一格 + 1」,並將它加入 queue,等下繼續擴展\n4. 最後回傳最大距離 -1:因為初始的陸地值是 1,所以水格的距離是從 2 開始計算,因此真正的距離 = 格子值 - 1\n\n代碼:\n```python\nclass Solution:\n def maxDistance(self, grid: List[List[int]]) -> int:\n q = deque()\n for i in range(len(grid)):\n for j in range(len(grid[0])):\n if grid[i][j] == 1:\n q.append((i, j))\n \n if not q or len(q) == len(grid) * len(grid):\n return -1\n\n directions = [(0, 1), (0, -1), (1, 0), (-1, 0)]\n max_dist = 0\n while q:\n x, y = q.popleft()\n for dx, dy in directions:\n nx = x + dx\n ny = y + dy\n if 0 <= nx < len(grid) and 0 <= ny < len(grid[0]) and grid[nx][ny] == 0:\n grid[nx][ny] = grid[x][y] + 1\n q.append((nx, ny))\n max_dist = max(max_dist, grid[nx][ny])\n\n return max_dist - 1\n```\n時間複雜度:O(n^2)\n\n空間複雜度:O(n^2)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3251575584","body":"思維:\n1. 把初始擁有箱子(initialBoxes)能打開的箱子(status = 1)加入 queue\n2. 使用 queue 處理可以打開的箱子,如果已經處理過的話則跳過\n3. 開箱拿糖果後,處理新拿到的箱子鑰匙,把鑰匙對應到已擁有且未開啟過的 box 加入 queue\n4. 處理新拿到的箱子,如果箱子可以直接打開或擁有鑰匙就加進 queue,否則放進 own_boxes 等待日後有拿到 key 再打開\n5. 整個流程直到 queue 為空,表示目前已經沒能力再開更多箱子了,回傳總糖果數量\n\n代碼:\n```python\nclass Solution:\n def maxCandies(self, status: List[int], candies: List[int], keys: List[List[int]], containedBoxes: List[List[int]], initialBoxes: List[int]) -> int:\n own_boxes = set(initialBoxes)\n own_keys = set()\n visited = set()\n q = deque()\n total_candies = 0\n\n for box in initialBoxes:\n if status[box] == 1:\n q.append(box)\n \n while q:\n box = q.popleft()\n if box in visited:\n continue\n\n total_candies += candies[box]\n visited.add(box)\n \n for key in keys[box]:\n own_keys.add(key)\n if key in own_boxes and key not in visited:\n q.append(key)\n\n for new_box in containedBoxes[box]:\n own_boxes.add(new_box)\n if (status[new_box] == 1 or new_box in own_keys) and new_box not in visited:\n q.append(new_box) \n\n return total_candies\n```\n時間複雜度:O(n+k)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/56#issuecomment-3256863525","body":"思維:\n1. 廣度優先搜尋 (BFS) 遍歷樹,使用 deque 從 root 開始,記錄每個節點的座標\n2. 收集節點資訊,每個節點存成 (x, y, val),加入 nodes 列表\n3. 排序節點,按照題目規則排序:y(由左到右),x(由上到下),val(同位置時數字小的先)\n4. 按列分組,掃描排序後的 nodes,根據 y 值變化劃分列表\n5. 回傳結果,res 即 vertical order traversal 的輸出。\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def verticalTraversal(self, root: Optional[TreeNode]) -> List[List[int]]:\n nodes = []\n q = deque([(root, 0, 0)])\n while q:\n node, x, y = q.popleft()\n nodes.append((x, y, node.val))\n if node.left:\n q.append((node.left, x+1, y-1))\n if node.right:\n q.append((node.right, x+1, y+1))\n\n nodes.sort(key=lambda x: (x[1], x[0], x[2]))\n res = []\n cur_y = None\n for _, y, val in nodes:\n if y != cur_y:\n res.append([val])\n cur_y = y\n else:\n res[-1].append(val)\n\n return res\n```\n時間複雜度:O(nlogn)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/57#issuecomment-3260998230","body":"思維:\n1. 定義狀態 dp[i] 表示「到達第 i 階的最小花費」\n2. 每次要到達第 i 階,有兩種方式:從第 i-1 階踩一階上來 → 花費 = dp[i-1] + cost[i-1] or 從第 i-2 階踩兩階上來 → 花費 = dp[i-2] + cost[i-2]\n3. 所以取較小值 dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])\n4. 我們要到達頂樓 = len(cost),因此答案是 dp[-1](即 dp[len(cost)])\n\n代碼:\n```python3\nclass Solution:\n def minCostClimbingStairs(self, cost: List[int]) -> int:\n dp = [0] * (len(cost) + 1)\n for i in range(2, len(cost) + 1):\n dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])\n\n return dp[-1]\n```\n時間複雜度:O(n)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/58#issuecomment-3263817074","body":"思維:\n1. 如果只有一間房子,直接回傳 nums[0]\n2. 初始化 dp 陣列,建立一個長度與 nums 相同的陣列 dp,dp[i] 表示考慮到第 i 間房子時,選擇偷這間房子,能得到的最大金額\n3. 填入前兩個房子:如果 i < 2,直接偷這間房子\n4. 狀態轉移(從 i=2 開始),偷第 i 間房的前提是不能偷相鄰的,所以考慮搭配 i-2 或搭配 i-3 的最佳解\n5. 最後答案一定是偷到倒數第 1 間(dp[-1])或倒數第 2 間(dp[-2]),取最大值\n\n代碼:\n```python\nclass Solution:\n def rob(self, nums: List[int]) -> int:\n if len(nums) == 1:\n return nums[0]\n\n dp = [0] * len(nums)\n for i, num in enumerate(nums):\n if i < 2:\n dp[i] = num\n else:\n dp[i] = max(dp[i-2] + num, dp[i-3] + num)\n\n return max(dp[-1], dp[-2])\n```\n時間複雜度:O(n)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/59#issuecomment-3264481892","body":"思維:\n1. dp[i]: 表示以 nums[i] 結尾的 LIS 最長長度、count[i]: 表示有多少組 LIS 長度等於 dp[i] 是以 nums[i] 結尾的\n2. 對每個 i,檢查它前面的每個 j,如果 nums[j] < nums[i],則可以將 nums[i] 接在 nums[j] 後面\n3. 如果接在 j 後面可以讓序列更長(dp[j] + 1 > dp[i]),則更新 dp[i] = dp[j] + 1,並且把組數設為 count[i] = count[j]\n4. 如果接在 j 後面剛好等長(dp[j] + 1 == dp[i]),則表示找到另一條一樣長的走法,所以把組數加進來 count[i] += count[j]\n5. 最後找出所有 dp[i] == max_len 的位置,把它們對應的 count[i] 加總起來\n\n代碼:\n```python\nclass Solution:\n def findNumberOfLIS(self, nums: List[int]) -> int:\n n = len(nums)\n dp = [1] * n\n count = [1] * n\n\n for i in range(n):\n for j in range(i):\n if nums[j] < nums[i]:\n if dp[j] + 1 > dp[i]:\n dp[i] = dp[j] + 1\n count[i] = count[j]\n elif dp[j] + 1 == dp[i]:\n count[i] += count[j]\n\n max_len = max(dp)\n return sum(c for i, c in enumerate(count) if dp[i] == max_len)\n```\n時間複雜度:O(n^2)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3269134596","body":"思維:\n1. 設 dp[i][j] = text1[:i] 與 text2[:j] 的最長共同子序列長度\n2. 如果其中一個字串長度為 0 → LCS = 0,所以 dp[0][*] 和 dp[*][0] 全部設為 0\n3. 如果 text1[i-1] == text2[j-1],這個字元可以加入 LCS → dp[i][j] = dp[i-1][j-1] + 1\n4. 否則這個字元不能同時出現在 LCS,只能丟掉其中一個字元,取兩種情況最大值 → dp[i][j] = max(dp[i-1][j], dp[i][j-1])\n5. 回傳 dp[-1][-1](表格右下角)就是最終答案\n\n代碼:\n```python\nclass Solution:\n def longestCommonSubsequence(self, text1: str, text2: str) -> int:\n m = len(text1)\n n = len(text2)\n dp = [[0]*(n+1) for _ in range(m+1)]\n \n for i in range(1, m+1):\n for j in range(1, n+1):\n if text1[i-1] == text2[j-1]:\n dp[i][j] = dp[i-1][j-1] + 1\n else:\n dp[i][j] = max(dp[i-1][j], dp[i][j-1])\n\n return dp[-1][-1]\n```\n時間複雜度:O(m * n)\n\n空間複雜度:O(m * n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/61#issuecomment-3273520377","body":"思維:\n1. 機器人從左上角走到右下角,只能往下或往右,所以每個格子的路徑數 = 從上方來的路徑數 + 從左方來的路徑數\n2. 狀態定義:dp[i][j] = 從起點 (0,0) 到 (i,j) 的路徑數\n3. 初始化所有路徑都是 1,主要是第一行、第一列只能直走一條路徑因此都是 1\n4. dp[i][j] 的路徑數就等於 dp[i−1][j] (從上方來的路徑數) + dp[i][j−1] (從左方來的路徑數)\n5. 最後答案取右下角 dp[m-1][n-1]\n\n代碼:\n```python\nclass Solution:\n def uniquePaths(self, m: int, n: int) -> int:\n dp = [[1] * n for _ in range(m)]\n for i in range(1, m):\n for j in range(1, n):\n dp[i][j] = dp[i-1][j] + dp[i][j-1]\n \n return dp[m-1][n-1]\n```\n時間複雜度:O(m * n)\n\n空間複雜度:O(m * n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/62#issuecomment-3278614246","body":"思維:\n1. 狀態定義:dp[r][c] = 騎士在走了 t 步之後,位於 (r,c) 的機率\n2. 初始化:t=0 時,起點 (row, column) 的機率 = 1.0,其他位置 = 0.0\n3. 狀態轉移:從 (r,c) 出發,分散到 8 個可能位置。每一個合法位置的機率 += dp[r][c] / 8\n4. 重複 k 次:每一步產生新的棋盤機率分佈,並用新的棋盤機率更新 dp 陣列\n5. 回傳答案:把整個棋盤上機率加總,就是騎士還在棋盤上的總機率\n\n代碼:\n```python\nclass Solution:\n def knightProbability(self, n: int, k: int, row: int, column: int) -> float:\n dp = [[0.0] * n for _ in range(n)]\n dp[row][column] = 1.0\n positions = [(-1, 2), (-1, -2), (-2, 1), (-2, -1), (1, 2), (1, -2), (2, 1), (2, -1)]\n\n for i in range(k):\n next_dp = [[0.0] * n for _ in range(n)]\n for r in range(n):\n for c in range(n):\n if dp[r][c] > 0:\n for dr, dc in positions:\n nr, nc = r + dr, c + dc\n if 0 <= nr < n and 0 <= nc < n:\n next_dp[nr][nc] += dp[r][c] / 8.0\n dp = next_dp \n\n return sum(sum(row) for row in dp)\n```\n時間複雜度:O(k * n^2)\n\n空間複雜度:O(n^2)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/63#issuecomment-3285759121","body":"思維:\n1. 如果 1+2+…+max < desiredTotal → 永遠湊不到目標 → return False\n2. 如果 desiredTotal ≤ maxChoosableInteger → 先手一次就贏 → return True\n3. 用 bitmask mask 記錄哪些數字已被選過,用 remain 記錄距離目標還差多少\n4. 遞迴判斷 (dfs) 嘗試每一個未被選過的數字 num\n5. 如果 num ≥ remain → 我馬上贏 → return True,否則進入新狀態 (new_mask, remain-num),讓對手繼續\n6. 如果對手在新狀態輸(dfs 回 False)→ 我必勝 → return True\n7. 如果沒有任何選擇能讓我贏 → return False\n\n代碼:\n```python\nclass Solution:\n def canIWin(self, maxChoosableInteger: int, desiredTotal: int) -> bool: \n total_sum = (1 + maxChoosableInteger) * maxChoosableInteger / 2\n if total_sum < desiredTotal:\n return False\n if desiredTotal <= maxChoosableInteger:\n return True\n \n @lru_cache(None)\n def dfs(mask, remain):\n for num in range(1, maxChoosableInteger + 1):\n if not mask & (1 << (num-1)):\n if num >= remain:\n return True\n new_mask = mask | (1 << (num-1))\n if not dfs(new_mask, remain - num):\n return True\n return False\n\n return dfs(0, desiredTotal)\n```\n時間複雜度:O(m * 2^m)\n\n空間複雜度:O(2^m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/64#issuecomment-3287665138","body":"思維:\n1. 如果 nums 的總和是奇數,不可能分成兩組相等 → return False\n2. 否則,目標和 = 總和 / 2\n3. 狀態定義:dp[i][j] = 是否可以用前 i 個數字湊出和 j\n4. 初始化:dp[0][0] = True(不用任何數字就能湊出 0),dp[0][j>0] = False(不用數字不可能湊出正數)\n5. 若 j < nums[i-1] → 這個數太大,不能用因此只能 → dp[i][j] = dp[i-1][j]\n6. 若 j ≥ nums[i-1] → 可以選用或不用這個數 → dp[i][j] = dp[i-1][j] or dp[i-1][j - nums[i-1]]\n7. 最後看 dp[n][target],如果 True → 代表能找到一個子集和 = target → 表示 nums 可分成兩組\n\n代碼:\n```python\nclass Solution:\n def canPartition(self, : List[int]) -> bool:\n if sum(nums) % 2 > 0:\n return False\n target = sum(nums) // 2\n\n dp = [[False] * (target + 1) for _ in range(len(nums) + 1)]\n dp[0][0] = True\n for i in range(1, len(nums) + 1):\n for j in range(target + 1):\n if j < nums[i-1]:\n dp[i][j] = dp[i-1][j]\n else:\n dp[i][j] = dp[i-1][j] or dp[i-1][j-nums[i-1]]\n\n return dp[len(nums)][target]\n```\n時間複雜度:O(n * m) (n for length of nums, m for target)\n\n空間複雜度:O(n * m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/65#issuecomment-3289413390","body":"思維:\n1. 要找能不能在 nums 前加上 + 或 -,最後湊成 target,等價於找一個子集,使總和 = (sum(nums)+target)/2 = p\n2. 如果 abs(target) > sum → 超過總和,必然無解,如果 sum + target 是奇數 → p 不是整數,也必然無解\n3. 狀態定義:dp[j] = 方法數,表示能湊出和為 j 的子集數量\n4. 初始化:dp[0] = 1 → 空集合能湊出 0 的方法只有 1 種\n5. 狀態轉移:遍歷每個數字 num,倒序更新,如果能湊出 j-num,再加上 num 就能湊出 j\n6. 答案回傳 dp[p],也就是湊出和為 p 的方法數\n\n代碼:\n```python\nclass Solution:\n def findTargetSumWays(self, nums: List[int], target: int) -> int:\n if abs(target) > sum(nums) or (sum(nums) + target) % 2 > 0:\n return 0\n\n p = (sum(nums) + target) // 2\n dp = [0] * (p + 1)\n dp[0] = 1\n for i in range(len(nums)):\n for j in range(p, nums[i]-1, -1):\n dp[j] += dp[j-nums[i]]\n\n return dp[p]\n``` \n時間複雜度:O(n * p) \n\n空間複雜度:O(p)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/66#issuecomment-3290383887","body":"思維:\n1. 初始化建立 dp 陣列,長度為 amount+1,全部設成無窮大 inf,代表一開始不可達\n2. 設 dp[0] = 0,表示湊 0 元不需要硬幣\n3. 外層金額 i 從 1 跑到 amount,內層對每個硬幣 coin 嘗試\n4. 如果 i - coin >= 0,表示可用這枚硬幣,更新 dp[i] = min(dp[i], dp[i - coin] + 1) (選湊出 i 元的最少硬幣數,看最後一枚硬幣選哪個面額)\n5. 回傳答案如果 dp[amount] 還是 inf,代表不可達回傳 -1,否則回傳 dp[amount]\n\n代碼:\n```python\nclass Solution:\n def coinChange(self, coins: List[int], amount: int) -> int:\n dp = [inf] * (amount + 1)\n dp[0] = 0\n for i in range(1, amount+1):\n for coin in coins:\n if i - coin >= 0:\n dp[i] = min(dp[i], dp[i - coin]+1)\n \n return dp[amount] if dp[amount] != inf else -1\n```\n時間複雜度:O(m × n) (m for amount, n for length of coins)\n\n空間複雜度:O(m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/67#issuecomment-3299125872","body":"思維:\n1. 昨天的題目需考慮排列數(考慮順序),今天的題目僅需考慮組合數(不考慮順序)\n2. 定義 dp[i] = 湊出金額 i 的 組合數\n3. dp[0] = 1:湊出 0 元只有一種方式,什麼都不拿,其餘 dp[i] = 0,表示一開始還沒有任何組合\n4. 外層迴圈:逐一考慮硬幣 coin,內層迴圈:從金額 coin 開始到 amount 逐步更新\n5. dp[i] += dp[i - coin]:若要湊出金額 i,可以先用一個 coin,剩下的 i - coin 由之前的組合補上\n6. 避免重複排列,因為外層是硬幣,每一種硬幣只能在自己之後加入,確保順序不會被重複計算\n7. 回傳答案 dp[amount] 即為湊出總金額的組合數\n\n代碼:\n```python\nclass Solution:\n def change(self, amount: int, coins: List[int]) -> int:\n dp = [0] * (amount + 1)\n dp[0] = 1\n for coin in coins:\n for i in range(coin, amount+1):\n dp[i] += dp[i - coin]\n\n return dp[amount]\n```\n時間複雜度:O(m × n) (m for amount, n for length of coins)\n\n空間複雜度:O(m)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/68#issuecomment-3301195823","body":"思維:\n1. 排序貪心:把 g(貪心值)與 s(餅乾大小)都排序\n2. 從大的開始配對:i 指向最大餅乾,j 指向最難滿足的小孩\n3. 若 s[i] >= g[j],就把這片大餅乾給這個小孩,否則,去嘗試滿足下一個(較不貪心)孩子\n5. 結束條件:任一方用完即停止,輸出成功配對數 res\n\n代碼:\n```python\nclass Solution:\n def findContentChildren(self, g: List[int], s: List[int]) -> int:\n g.sort()\n s.sort()\n i = len(s)-1\n j = len(g)-1\n res = 0\n \n while i >= 0 and j >= 0:\n if s[i] >= g[j]:\n res += 1\n i -= 1\n j -= 1\n\n return res\n```\n時間複雜度:O(nlogn+mlogm) (sorting)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/69#issuecomment-3305048523","body":"思維:\n1. 先依 start 排序,若 start 相同則依 end 排序\n2. 用 prev_end 記錄上一次保留的區間結束\n3. 遍歷:如果當前區間 cur_start < prev_end → 代表重疊\n4. 若 cur_end < prev_end → 保留更早結束的區間(更新 prev_end)\n5. 不管怎樣,重疊就要刪掉一個,res += 1\n6. 否則(不重疊) → 更新 prev_end = cur_end\n7. 回傳刪除數量\n\n代碼:\n```python\nclass Solution:\n def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:\n intervals = sorted(intervals)\n prev_end = intervals[0][1]\n res = 0\n\n for i in range(1, len(intervals)):\n cur_start, cur_end = intervals[i]\n if cur_start < prev_end:\n if cur_end < prev_end:\n prev_end = cur_end\n res += 1\n else:\n prev_end = cur_end\n \n return res\n```\n時間複雜度:O(nlogn)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/70#issuecomment-3310296356","body":"思維:\n1. 初始化設定 farthest = 0,代表目前能到達的最遠位置(初始只能到 index 0)\n2. 遍歷陣列依序檢查每個位置檢查是否可達:i = 當前所在索引,step = 在這個位置能往前跳的最大步數\n3. 如果 i > farthest,表示這個位置已經超過了之前能到的最遠範圍 → 代表根本走不到這裡 → 直接回傳 False\n4. 否則更新最遠範圍 farthest = max(farthest, i + step)\n5. 結束迴圈能完整跑完,代表沒有遇到無法到達的位置,直接回傳 True(一定能到達最後一格)\n\n代碼:\n```python\nclass Solution:\n def canJump(self, nums: List[int]) -> bool:\n farthest = 0\n for i, step in enumerate(nums):\n if i > farthest:\n return False\n farthest = max(farthest, i + step)\n return True\n```\n時間複雜度:O(n)\n\n空間複雜度:O(1)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/73#issuecomment-3317351262","body":"思維:\n1. Base Case: n=1 → [1]、n=2 → [1,2]\n2. 把問題拆成奇數子問題 (長度 = (n+1)//2) 和偶數子問題 (長度 = n//2),避免等差數列的產生\n3. 奇數組跟偶數組內分別都是從一個更小的 beautiful array 轉換來的,本身不會產生違規的等差數列\n4. 如果一邊是奇數、一邊是偶數,它們的平均數會是小數(不是整數),但我們的陣列只包含整數,不可能命中,所以跨組之間絕對安全\n5. 奇數子問題的結果全部轉換成奇數(2*x-1)\n6. 偶數子問題的結果全部轉換成偶數(2*x)\n7. 把奇數陣列與偶數陣列串接在一起,得到長度 n 的 beautiful array\n\n代碼:\n```python\nclass Solution:\n def beautifulArray(self, n: int) -> List[int]:\n if n == 1:\n return [1]\n if n == 2:\n return [1, 2]\n\n odd_arr = [x*2 -1 for x in self.beautifulArray((n+1) // 2)]\n even_arr = [x*2 for x in self.beautifulArray(n // 2)]\n \n return odd_arr + even_arr\n```\n時間複雜度:O(nlogn)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/74#issuecomment-3322731377","body":"思維:\n1. 所有數字 XOR 一遍,因為成對的數字會抵消掉 (a ^ a = 0),最後剩下的是 xor_all = x ^ y\n2. 這裡的 x, y 就是我們要找的兩個只出現一次的數字\n3. 找到一個區分 x, y 的 bit,因為 x != y,xor_all 至少有一個 bit = 1,代表 x 和 y 在那一位不同\n4. 用 diff_bit = xor_all & (-xor_all) 取出最低 set bit (最右邊的 1)\n5. 根據這個 diff_bit 把數字分組,如果 (num & diff_bit) != 0 → 放在組 A,否則 → 放在組 B\n6. 各組再 XOR 一遍,成對數字會互相抵消,只剩下唯一的 x 或 y\n7. 最後兩組結果就是 [x, y]\n\n代碼:\n```python\nclass Solution:\n def singleNumber(self, nums: List[int]) -> List[int]:\n xor_all = 0\n for num in nums:\n xor_all ^= num\n\n diff_bit = xor_all & (-xor_all)\n\n x, y = 0, 0\n for num in nums:\n if num & diff_bit:\n x ^= num\n else:\n y ^= num\n\n return [x, y]\n```\n時間複雜度:O(n)\n\n空間複雜度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/75#issuecomment-3326355904","body":"思維:\n1. 把長度為 n 的陣列 nums 想成有 n 個開關(bit),一個整數 mask 的二進位表示,就代表一個子集合,mask 從 0 走到 (1<> i) & 1 == 1,代表第 i 位被選中 → subset.append(nums[i]),最後把 subset 加進 res\n4. 回傳結果 res\n\n代碼:\n```python\nclass Solution:\n def subsets(self, nums: List[int]) -> List[List[int]]:\n n = len(nums)\n res = []\n for mask in range(1 << n):\n subset = []\n for i in range(n):\n if (mask >> i) & 1:\n subset.append(nums[i])\n res.append(subset)\n\n return res\n```\n時間複雜度:O(n · 2^n)\n\n空間複雜度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/76#issuecomment-3332654533","body":"思維:\n1. TrieNode 結構:children 字典,用來存放「下一個字元 → 子節點」,hasword 標記當前節點是否對應一個完整單詞\n2. Trie 主類別:insert(word) 從 root 出發逐字檢查,若不存在就新建節點,最後節點標記 hasword = True\n3. search(word) 從 root 出發逐字檢查,若遇到缺失字元,直接回傳 False,結束後檢查最後節點的 hasword,若 True 表示單詞存在\n4. startsWith(prefix) 與 search 類似,但不需檢查 hasword,只要能走到 prefix 的最後一個節點就回傳 True\n\n代碼:\n```python\nclass TrieNode:\n def __init__(self):\n self.children = {}\n self.hasword = False\n\n\nclass Trie:\n def __init__(self):\n self.head = TrieNode()\n \n def insert(self, word: str) -> None:\n cur = self.head\n for c in word:\n if c not in cur.children:\n cur.children[c] = TrieNode()\n cur = cur.children[c]\n cur.hasword = True\n\n def search(self, word: str) -> bool:\n cur = self.head\n for c in word:\n if c not in cur.children:\n return False\n cur = cur.children[c]\n\n return cur.hasword\n\n def startsWith(self, prefix: str) -> bool:\n cur = self.head\n for c in prefix:\n if c not in cur.children:\n return False\n cur = cur.children[c]\n return True\n \n\n# Your Trie object will be instantiated and called as such:\n# obj = Trie()\n# obj.insert(word)\n# param_2 = obj.search(word)\n# param_3 = obj.startsWith(prefix)\n```\n時間複雜度:O(n) (Insert, search, startsWith)\n\n空間複雜度:O(n) (Insert) / O(1) (search, startsWith)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/77#issuecomment-3337545631","body":"思維:\n1. TrieNode 結構:children 存子節點,precount 紀錄該節點以下所有 key 對應值的總和(前綴總和),count 紀錄如果這裡是完整單字,記錄它的 value\n2. insert(key, val):逐字往下走,若不存在就新建節點,每走過一個節點 → precount += val(加上新值)\n3. 如果這個 key 之前沒出現過 → 直接存 count = val,如果 key 已經存在 → 先取出舊值 deduct = cur.count,再更新 count = val\n4. 最後重新走一遍 key,把前綴總和扣掉原本的舊值 precount -= deduct\n5. sum(prefix):從 root 開始逐字走 prefix,如果 prefix 路徑不存在 → 回傳 0,如果存在 → 回傳最後節點的 precount\n\n代碼:\n```python\nclass TrieNode:\n def __init__(self):\n self.children = {}\n self.precount = 0\n self.count = 0\n\nclass MapSum:\n\n def __init__(self):\n self.head = TrieNode()\n\n def insert(self, key: str, val: int) -> None:\n cur = self.head\n for c in key:\n if c not in cur.children:\n cur.children[c] = TrieNode()\n cur = cur.children[c]\n cur.precount += val\n\n if not cur.count:\n cur.count = val\n else:\n deduct = cur.count\n cur.count = val\n cur = self.head\n for c in key:\n cur = cur.children[c]\n cur.precount -= deduct\n \n\n def sum(self, prefix: str) -> int:\n cur = self.head\n for c in prefix:\n if c not in cur.children:\n return 0\n cur = cur.children[c]\n return cur.precount\n\n\n# Your MapSum object will be instantiated and called as such:\n# obj = MapSum()\n# obj.insert(key,val)\n# param_2 = obj.sum(prefix)\n```\n時間複雜度:O(n) (Insert, sum)\n\n空間複雜度:O(n) (Insert) / O(1) (sum)","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/82#issuecomment-3355772609","body":"思維:\n1. 任何不包含 1 的子樹應該被刪掉,若節點值是 0,且左右子樹都不存在或都被刪光,那這個節點也該刪\n2. 從下往上考慮 → 遞迴後序遍歷 (post-order),先處理左右子樹,回傳「修剪後的子樹」,再決定當前節點要不要刪除\n3. 若節點是 None,直接回傳 None\n4. 遞迴:修剪左子樹 root.left = pruneTree(root.left)、修剪右子樹 root.right = pruneTree(root.right)\n5. 判斷若 root.val == 0 且 root.left == None 且 root.right == None → 回傳 None,否則保留節點\n\n代碼:\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\nclass Solution:\n def pruneTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:\n if not root:\n return None\n\n root.left = self.pruneTree(root.left)\n root.right = self.pruneTree(root.right)\n\n if root.val == 0 and not root.left and not root.right:\n return None\n\n return root\n```\n時間複雜度:O(n)\n\n空間複雜度:O(n)","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null],"zechengze":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074243047","body":"### Time complexity\nO(max(n, log₁₀(k)))\n\n### Space complexity\nO(max(n, log₁₀(k)))\n\n```python\nclass Solution:\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n ans = []\n n = len(num)\n carry = 0\n i = n - 1\n while k > 0 or i >= 0 or carry > 0:\n sum = carry\n if k > 0:\n rem = k % 10\n sum += rem\n k //= 10\n if i >= 0:\n sum += num[i]\n i -= 1\n carry = sum // 10\n ans.insert(0, sum % 10)\n return ans","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092419843","body":"使用兩個 stack:\n- in_stack: 用來接收 push\n- out_stack: 用來處理 pop 和 peek\n- 當 out_stack 為空時,將 in_stack 的所有元素彈出並倒序放入 out_stack,用來模擬 queue 的 FIFO\n\n - push:O(1)\n - pop:O(1)\n - peek:O(1)\n - empty :O(1)\n\n---\n\n### Python code\n\n```python\nclass MyQueue:\n\n def __init__(self):\n self.in_stack = []\n self.out_stack = []\n\n def push(self, x: int) -> None:\n self.in_stack.append(x)\n\n def pop(self) -> int:\n self.peek() # 確保 out_stack 有東西\n return self.out_stack.pop()\n\n def peek(self) -> int:\n if not self.out_stack:\n while self.in_stack:\n self.out_stack.append(self.in_stack.pop())\n return self.out_stack[-1]\n\n def empty(self) -> bool:\n return not self.in_stack and not self.out_stack","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3109185662","body":"### 解題思路\n- 先統計整個 linked list 長度。\n- 使用遞迴,每次選擇區間的中間當作 root。\n- 左子樹遞迴後才處理當前節點。\n\n時間 O(n) 每個節點遍歷一次\n\n```python\nclass Solution:\n def sortedListToBST(self, head: ListNode) -> TreeNode:\n def getLength(node: ListNode) -> int:\n length = 0\n while node:\n length += 1\n node = node.next\n return length\n\n def buildBST(start: int, end: int) -> TreeNode:\n nonlocal head\n if start > end:\n return None\n\n mid = (start + end) // 2\n # 先建左子樹\n left = buildBST(start, mid - 1)\n\n # 再建 root(中序)\n root = TreeNode(head.val)\n head = head.next\n\n # 最後建右子樹\n root.left = left\n root.right = buildBST(mid + 1, end)\n return root\n\n length = getLength(head)\n return buildBST(0, length - 1)","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124485354","body":"### 思路\n- 遞迴 DFS\n- 如果節點為空,深度為 0。\n- 遞迴左右子樹的最大深度,取最大值後 +1。\n\n---\n\n### 遞迴 DFS(Top-down)\n\n```python\nclass Solution:\n def maxDepth(self, root: Optional[TreeNode]) -> int:\n if not root:\n return 0\n return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3136873834","body":"### BFS(反向遍歷)\n\n- 一般 BFS 是左先入,改為右先入左後入\n- 最後訪問的節點就是最底層最左側的節點\n- 每次 `popleft()` 拿出的節點覆蓋 `leftmost`\n- 時間複雜度 : O(n)\n---\n\n```python\n\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n if not root:\n return None\n \n queue = deque([root])\n leftmost = None\n\n while queue:\n leftmost = queue.popleft()\n if leftmost.right:\n queue.append(leftmost.right)\n if leftmost.left:\n queue.append(leftmost.left)\n\n return leftmost.val\n","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146260024","body":"### 解題思路:哈希表(一次遍歷)\n\n1. 初始化一個空dict h\n2. 遍歷陣列 nums,對每個元素 nums[i]:\n - 計算 plus = target - nums[i]\n - 如果 plus 的值在字典中,回傳 [h[plus], i]\n - else 將 nums[i] 存入 dict 中\n\n- 時間、空間複雜度:O(n)\n\n---\n```python\nclass Solution:\n def twoSum(self, nums: List[int], target: int) -> List[int]:\n h = {}\n for i in range(len(nums)):\n plus = target - nums[i]\n if plus in h:\n return [h[plus], i]\n else:\n h[nums[i]] = i","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148509431","body":"### 解題思路:哈希表 + 排序\n\n1. 先用 dict 統計每個元素出現的次數\n2. 使用 sorted 對 dict 依據頻率降序排序\n3. 取出前 k 個 keys 回傳\n\n- 時間複雜度:O(n log n)\n\n---\n\n```python\nclass Solution:\n def topKFrequent(self, nums: List[int], k: int) -> List[int]:\n h_map = {}\n for i in nums:\n if i in h_map:\n h_map[i] += 1\n else:\n h_map[i] = 1\n\n h_map = dict(sorted(h_map.items(), key=lambda x: x[1], reverse=True))\n ans = list(h_map.keys())[:k]\n return ans\n","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3170662667","body":"## 解題思路\n陣列已排序,相同的元素一定會相鄰,因此可以使用雙指針: \n1. 設定指標 `init` 指向下個唯一值要放置的位置,初始為 1。 \n2. 從第二個元素開始遍歷,若與前一個元素不同,則將該元素放到 `init` 位置並將 `init` 加 1。 \n3. 最後 `init` 即為去重後的長度。\n\n---\n\n## 時間複雜度\n- **O(n)**:只需遍歷一次陣列。\n\n## 空間複雜度\n- **O(1)**:在原陣列上進行操作,未使用額外空間。\n\n---\n\n## 程式碼\n```python\nfrom typing import List\n\nclass Solution:\n def removeDuplicates(self, nums: List[int]) -> int:\n init = 1\n for i in range(1, len(nums)):\n if nums[i] != nums[i - 1]:\n nums[init] = nums[i]\n init += 1\n return init\n```\n","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3182007045","body":"### 解題思路\n1. 將 `dislikes` 轉換為 **圖的鄰接表** `dislike_table`。\n2. 使用顏色標記(`BLUE = 1`, `GREEN = -1`)來表示兩組人。\n3. 對每個尚未染色的人進行 DFS:\n - 將當前人染色為某一顏色。\n - 對於他不喜歡的人,必須染成相反顏色。\n - 如果發現相鄰節點顏色與自己相同,則表示無法二分。\n4. 如果所有人都能正確染色,則回傳 `True`。\n\n---\n\n```python\nfrom collections import defaultdict\nfrom typing import List\n\nclass Solution:\n def possibleBipartition(self, N: int, dislikes: List[List[int]]) -> bool:\n BLUE, GREEN = 1, -1\n \n def draw(person_id, color):\n color_of[person_id] = color\n for the_other in dislike_table[person_id]:\n if color_of[the_other] == color:\n return False\n if not color_of[the_other] and not draw(the_other, -color):\n return False\n return True\n \n if N == 1 or not dislikes:\n return True\n \n dislike_table = defaultdict(list)\n color_of = defaultdict(int)\n \n for p1, p2 in dislikes:\n dislike_table[p1].append(p2)\n dislike_table[p2].append(p1)\n \n for person_id in range(1, N + 1):\n if not color_of[person_id] and not draw(person_id, BLUE):\n return False\n \n return True","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"mr-kient":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3074503694","body":"### 【Day 1】989. 数组形式的整数加法\n\n#### Main Idea\n\n1. Since the length of `num` can reach 10000, a brute-force approach of adding each digit of `num` multiplied by 10^[n-i] to form a number and then adding it to K is not feasible, as it would cause an overflow.\n\n2. We can simulate manual vertical calculation by reversing the array and starting the addition from the last digit of both `num` and `k`.\n\n3. Set a global variable `ex` to determine if a carry is needed when adding each digit.\n\n > [!NOTE]\n > Remember to check if there is a carry after adding the first digit.\n\n4. If an array index exceeds the limit, treat it as 0; if `k` is shorter than `num`, treat the remaining digits of `k` as 0.\n\n\n#### Code\n\n```cpp\nclass Solution {\npublic:\n vector addToArrayForm(vector& num, int k) {\n int n = num.size();\n vector res;\n int ex = 0;\n int i = n - 1;\n\n while (i >= 0 || k > 0) {\n int x = (i >= 0) ? num[i] : 0; //k可能比num长\n int y = k % 10;\n int sum = x + y + ex;\n res.push_back(sum % 10);\n ex = sum / 10;\n k /= 10;\n i--;\n }\n\n if (ex)\n res.push_back(ex);\n\n reverse(res.begin(), res.end());\n\n return res;\n }\n};\n```\n\n#### Complexity\n\n$O(Max(num.size(), log(k)))$","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3076134448","body":"### **【Day 2】821. 字符的最短距离**\n\n#### Main idea\n\n1. Two linear traversals: The first one records the distance from each `s[i]` to the previous `c` from left to right; The second time, from right to left, update the minimum distance compared to the previous distance\n2. ⚠️ Note: During the two initializations, the first initialization should be very small because there will be no appearance of `c` after traversing to the right for a long time. If the setting is not small enough, it will result in an insufficiently large distance value, which will affect the update of the correct value from right to left in the second traversal\n\n```cpp\nclass Solution {\npublic:\n vector shortestToChar(string s, char c) {\n int n = s.size();\n vector res(n, n);\n int c_id = -n;\n\n for (int i = 0; i < n; i++) {\n\n if (s[i] == c) {\n c_id = i;\n }\n res[i] = i - c_id;\n }\n\n c_id = 2 * n;\n\n for (int j = n - 1; j >= 0; j--) {\n if (s[j] == c) {\n c_id = j;\n }\n\n res[j] = min(res[j], c_id - j);\n }\n\n return res;\n }\n};\n```\n\n#### Complexity\n\nLoop twice: $O(2*s.szie())$","onTime":true},null,null,null,null,null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124415547","body":"### 【Day 13】[104. 二叉树的最大深度](https://leetcode.cn/problems/maximum-depth-of-binary-tree/)\n\n#### Main Idea \n\n1. 首先考虑到递归即遍历二叉树的左右子树,计算每个节点的左右子树的最大深度\n\n - **递归终止条件**:如果当前节点为空,则返回0(表示当前路径长度为0)。\n - **递归逻辑**:对于当前节点,递归计算左子树的最大深度和右子树的最大深度,取较大值并加1(当前节点本身)\n - **时间复杂度**:O(n),其中n是二叉树的节点总数。每个节点被访问一次。\n\n2. DFS\n\n ```c++\n /**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\n \n class Solution {\n public:\n int maxDepth(TreeNode* root) {\n if (!root) return 0;\n \n std::stack> s;\n s.push({root, 1});\n int max_depth = 0;\n \n while (!s.empty()) {\n auto [node, depth] = s.top();\n s.pop();\n max_depth = std::max(max_depth, depth);\n \n if (node->left) {\n s.push({node->left, depth + 1});\n }\n if (node->right) {\n s.push({node->right, depth + 1});\n }\n }\n \n return max_depth;\n }\n };\n ```\n\n \n\n#### 时间复杂度\n\n要计算二叉树的最大深度,必须访问每一个节点一次,因为最长路径可能出现在任意位置。**没有比O(n)更优的时间复杂度**,因为无论如何都需要遍历所有节点以确认最长路径。","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146453148","body":"### 【Day 19】两数之和\n\n#### Main Idea\n\n1. **暴力枚举**\n - 遍历数组中的每一个元素 `nums[i]`,再对其后续所有元素 `nums[j]`(`j > i`)进行遍历,判断 `nums[i] + nums[j] == target` 时返回 `[i, j]`。\n - **时间复杂度**:O(n²),最坏情况下需要检查所有的元素对。\n2. **哈希表(一遍扫描)**\n - 利用一个哈希表 `mp` 存储 <数值 → 下标 >的映射。\n - 遍历数组,令 `complement = target - nums[i]`:\n - 如果哈希表中已存在 `complement`,说明之前遇到过这么一个数,二者之和等于 `target`,直接返回对应的下标。\n - 否则将当前元素 `nums[i]` 及其下标 `i` 存入哈希表,继续扫描。\n - **优点**:一次遍历搞定,时间和空间都最优。\n\n```c++\n#include \n#include \nusing namespace std;\n\nclass Solution {\npublic:\n vector twoSum(vector& nums, int target) {\n unordered_map mp; // 存储 已访问的数值 → 下标\n for (int i = 0; i < nums.size(); ++i) {\n int complement = target - nums[i];\n // 如果哈希表中已有 complement,则直接返回答案\n if (mp.find(complement) != mp.end()) {\n return { mp[complement], i };\n }\n // 否则将当前数及下标存入\n mp[nums[i]] = i;\n }\n return {}; // 根据题意不会走到这里\n }\n};\n```\n\n#### 时间复杂度\n\n- **哈希表解法**:O(n),只需一次遍历即可完成查找与存储操作。\n- **空间复杂度**:O(n),最坏情况下哈希表需存储 n 个元素。","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3168242525","body":"Main Idea\n\n1. 快慢指针法\n\n设置两个指针 slow 和 fast,初始都指向链表头结点。\n\nfast 每次向前移动 两步,slow 每次向前移动 一步。\n\n当 fast 到达链表末尾时,slow 恰好位于链表的中间位置。\n\n由于题目要求 当有两个中间结点时返回第二个,快慢指针法天然满足这一条件:当链表长度为偶数时,fast 会先到 NULL,此时 slow 指向的就是第二个中间结点。\n\n\n\n2. 时间复杂度\n\nO(n):每个结点最多被访问一次(快指针访问 n/2 次,慢指针访问 n 次)。\n\n\n\n3. 空间复杂度\n\nO(1):只使用了两个额外指针,不需要额外的数据结构。\n\n\n\n\n\n---\n\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * ListNode *next;\n * ListNode() : val(0), next(nullptr) {}\n * ListNode(int x) : val(x), next(nullptr) {}\n * ListNode(int x, ListNode *next) : val(x), next(next) {}\n * };\n */\nclass Solution {\npublic:\n ListNode* middleNode(ListNode* head) {\n ListNode* slow = head;\n ListNode* fast = head;\n while (fast != nullptr && fast->next != nullptr) {\n slow = slow->next; // 慢指针走一步\n fast = fast->next->next; // 快指针走两步\n }\n return slow; // slow 即为中间结点\n }\n};\n\n\n---\n\n时间复杂度分析\n\n访问链表的所有节点至少需要一次遍历,因此 没有比 O(n) 更优的时间复杂度。\n\n快慢指针法通过一次遍历同时得到中间节点,避免了额外的存储或两次遍历,比先统计长度再走一半更高效。\n","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3188424726","body":"#### Main Idea\n\n1. **把未分组项目“补组”**:对 `group[i] == -1` 的项目,给它们分配新的组号(从 `m` 开始递增),这样每个项目都有归属组,最终组的总数记为 `G`。\n2. **两层拓扑排序(Group 拓扑 + Item 拓扑)**:\n\n * **项目层图**:对每条依赖 `u ∈ beforeItems[v]`,连边 `u → v`,统计项目入度。\n * **组层图**:若 `group[u] != group[v]`,再在组图里连边 `group[u] → group[v]`,统计组入度。\n * **先对项目图做一次拓扑排序(得到全局项目顺序)**,再对组图做一次拓扑排序(得到组顺序)。\n3. **按组拼接**:将“项目拓扑序”按照其组别分桶(保持项目拓扑中的相对顺序),再按“组拓扑序”依次把每个桶拼接起来即为答案。\n4. **不可行判定**:任一拓扑排序失败(存在环)则返回空数组。\n\n* **关键点**:跨组依赖只影响组与组的先后关系(由组图保证),组内项目的详细先后由项目图保证。用“两层图”可同时满足“组块相邻”和“依赖有序”。\n\n---\n\n2. **实现**\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n vector sortItems(int n, int m, vector& group, vector>& beforeItems) {\n // 1) 给未分组的项目分配新组号\n int gid = m;\n for (int i = 0; i < n; ++i) {\n if (group[i] == -1) group[i] = gid++;\n }\n int G = gid; // 组总数\n\n // 2) 建立项目图 & 组图\n vector> itemAdj(n), groupAdj(G);\n vector itemIn(n, 0), groupIn(G, 0);\n\n for (int v = 0; v < n; ++v) {\n for (int u : beforeItems[v]) {\n itemAdj[u].push_back(v);\n itemIn[v]++;\n if (group[u] != group[v]) {\n groupAdj[group[u]].push_back(group[v]);\n groupIn[group[v]]++;\n }\n }\n }\n\n // 通用 Kahn 拓扑\n auto topo = [](const vector>& adj, vector indeg) -> vector {\n int N = (int)adj.size();\n queue q;\n for (int i = 0; i < N; ++i) if (indeg[i] == 0) q.push(i);\n vector order;\n order.reserve(N);\n while (!q.empty()) {\n int x = q.front(); q.pop();\n order.push_back(x);\n for (int y : adj[x]) {\n if (--indeg[y] == 0) q.push(y);\n }\n }\n if ((int)order.size() != N) return {}; // 有环\n return order;\n };\n\n // 3) 分别对 项目图、组图 做拓扑排序\n vector itemOrder = topo(itemAdj, itemIn);\n if (itemOrder.empty()) return {};\n vector groupOrder = topo(groupAdj, groupIn);\n if (groupOrder.empty()) return {};\n\n // 4) 按项目拓扑序分桶到各组里,保持项目相对次序\n vector> bucket(G);\n for (int x : itemOrder) bucket[group[x]].push_back(x);\n\n // 5) 按组拓扑序拼接\n vector ans;\n ans.reserve(n);\n for (int g : groupOrder) {\n for (int x : bucket[g]) ans.push_back(x);\n }\n return ans;\n }\n};\n```\n\n#### 时间复杂度\n\n* 建图与两次拓扑排序总计 **O(n + E)**,其中 `E = Σ |beforeItems[i]|`。\n* 额外空间用于邻接表、入度数组与分桶,均为 **O(n + E + G)**。\n","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3205439203","body":"#### Main Idea\n\n1. **线性扫描 (超时)**\n - 从 0 开始向上遍历整数 `i`。\n - 检查 `i * i` 的值。当第一次出现 `i * i > x` 时,那么 `i-1` 就是我们要求的平方根的整数部分。\n - **注意**:`i * i` 的计算可能会导致整数溢出。为避免此问题,应将判断条件改为 `i > x / i`。\n - **缺点**:当 `x` 非常大时,循环次数过多,会导致执行超时,无法通过所有测试用例。\n\n2. **二分查找**\n - `x` 的平方根一定在 `[0, x]` 这个区间内。\n - 我们可以将问题转化为:**在一个有序的范围内(`0` 到 `x`),寻找最大的整数 `k`,使得 `k² <= x`**。\n - 这正是二分查找的经典应用场景。设置搜索区间的左右边界 `left` 和 `right`,计算中间值 `mid`:\n - 如果 `mid² <= x`,说明 `mid` 是一个可能的解,但我们还想尝试更大的值,因此记录当前解,并在右半部分继续搜索:`ans = mid`, `left = mid + 1`。\n - 如果 `mid² > x`,说明 `mid` 太大了,解一定在左半部分,因此缩小搜索范围:`right = mid - 1`。\n - **优点**:每次都将搜索范围减半,时间复杂度低,效率极高。\n\n```c++\nclass Solution {\npublic:\n int mySqrt(int x) {\n if (x == 0) {\n return 0;\n }\n\n int left = 1, right = x;\n int ans = 0;\n\n while (left <= right) {\n int mid = left + (right - left) / 2;\n\n // 为防止 mid * mid 溢出,使用除法来判断\n // mid <= x / mid 等价于 mid * mid <= x\n if (mid <= x / mid) {\n ans = mid; // mid 是一个可能的解\n left = mid + 1; // 尝试在右侧寻找更大的解\n } else {\n right = mid - 1; // mid 太大,到左侧去寻找\n }\n }\n return ans;\n }\n};\n```\n\n#### 时间复杂度\n\n- **二分查找解法**:O(log n),其中 n 为输入值 `x`。二分查找每次都将搜索空间减半,因此时间复杂度是对数级别的。\n- **空间复杂度**:O(1),解法只使用了常数个额外变量,与输入 `x` 的大小无关。","onTime":true},null,null,null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3237241808","body":"#### Main Idea\n\n1. 滑动窗口 + 计数\n\n - 用两个计数器统计字符需求:`need[c]` 表示目标串 `t` 中每个字符需要的数量,`have[c]` 表示当前窗口中已有的数量。\n - 扩张右端:右指针 `r` 逐步右移,把字符加入窗口,并在 `have[c]` 达到 `need[c]` 时,更新已满足的种类数 `formed`。\n - 收缩左端:当窗口已满足 `t` 的全部字符需求(`formed == required`,其中 `required` 为 `t` 中不同字符的个数)时,尽量左移 `l` 缩小窗口并更新最优答案。\n - 唯一性:题目保证若存在答案则唯一,我们只需在收缩时维护最短长度即可。\n\n ```cpp\n #include \n using namespace std;\n \n class Solution {\n public:\n string minWindow(string s, string t) {\n if (t.empty() || s.size() < t.size()) return \"\";\n \n // 统计目标需求\n vector need(128, 0), have(128, 0);\n int required = 0; // 需要满足的不同字符的种类数\n for (char c : t) {\n if (need[c] == 0) required++;\n need[c]++;\n }\n \n int formed = 0; // 当前窗口中已满足 need 的种类数\n int bestLen = INT_MAX, bestL = 0;\n int l = 0;\n \n for (int r = 0; r < (int)s.size(); ++r) {\n char cr = s[r];\n have[cr]++;\n \n // 当某字符数量刚好达到需求,更新 formed\n if (need[cr] > 0 && have[cr] == need[cr]) {\n formed++;\n }\n \n // 若已满足所有字符需求,尽量收缩左端\n while (formed == required) {\n if (r - l + 1 < bestLen) {\n bestLen = r - l + 1;\n bestL = l;\n }\n char cl = s[l];\n have[cl]--;\n // 收缩导致某字符不足,formed 减一\n if (need[cl] > 0 && have[cl] < need[cl]) {\n formed--;\n }\n l++;\n }\n }\n \n return bestLen == INT_MAX ? \"\" : s.substr(bestL, bestLen);\n }\n };\n ```\n\n#### 时间复杂度\n\n双指针各自只右移且不回退,整体 **O(m + n)**;计数数组为常数空间。","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/52#issuecomment-3240735616","body":"#### Main Idea\n\n1. **逐行放置**\n - 每一行选择一个不与已放皇后冲突的列。冲突规则:同列、主对角线(r−c)、次对角线(r+c)。\n - **递归终止**:当行号 `row == n`,说明已成功放置 n 个皇后,计数 +1。\n - **选择与撤销**:在当前行尝试所有合法列,递归下一行,回退继续尝试。\n2. **位运算优化**\n - 用 n 位二进制位掩码表示列与对角线占用:\n - `cols`:哪些列被占。\n - `diag1`:主对角线占用(相当于下一行左移一位)。\n - `diag2`:次对角线占用(相当于下一行右移一位)。\n - 可放置位置:`bits = ~(cols | diag1 | diag2) & mask`,其中 `mask = (1<> 1`。\n\n#### 回溯 + 位运算\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n int totalNQueens(int n) {\n int mask = (1 << n) - 1;\n return dfs(0, 0, 0, 0, mask, n);\n }\n\nprivate:\n // row: 当前行号;cols/diag1/diag2:占用掩码;mask:仅保留 n 位\n int dfs(int row, int cols, int diag1, int diag2, int mask, int n) {\n if (row == n) return 1;\n\n int count = 0;\n int bits = (~(cols | diag1 | diag2)) & mask; // 当前行可放置的位置集合\n\n while (bits) {\n int p = bits & -bits; // 取最低位可行位置\n bits -= p; // 移除该位置\n\n count += dfs(row + 1,\n cols | p,\n ((diag1 | p) << 1) & mask, // 主对角线左移并截断\n (diag2 | p) >> 1, // 次对角线右移\n mask, n);\n }\n return count;\n }\n};\n```\n\n#### 时间复杂度\n\n- **时间**:回溯搜索的上界接近 **O(n!)**,但位运算将冲突判断降为 O(1) 常数,n ≤ 9 时非常快。\n- **空间**:**O(n)**(递归深度 n,掩码为常数额外空间)","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3247569627","body":"#### Main Idea\n\n1. BFS(从所有陆地同时出发)\n\n * 把所有值为 `1` 的格子(陆地)一起入队,距离视作 0;像海浪一样一圈圈向外扩散。\n * 第一次被扩散到的海洋格子的距离,就是它到最近陆地的最短曼哈顿距离。\n * 最后被访问到的海洋格子的距离即为答案。\n * **边界**:若全为陆地或全为海洋,返回 `-1`。\n\n2. 实现\n\n ```cpp\n #include \n using namespace std;\n\n class Solution {\n public:\n int maxDistance(vector>& grid) {\n int n = grid.size();\n queue> q;\n vector> dist(n, vector(n, -1));\n\n // 把所有陆地入队,距离置 0\n for (int i = 0; i < n; ++i) {\n for (int j = 0; j < n; ++j) {\n if (grid[i][j] == 1) {\n q.push({i, j});\n dist[i][j] = 0;\n }\n }\n }\n\n // 若全海或全陆,直接返回 -1\n if (q.empty() || (int)q.size() == n * n) return -1;\n\n int ans = -1;\n int dirs[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};\n\n // 多源 BFS\n while (!q.empty()) {\n auto [x, y] = q.front(); q.pop();\n for (auto& d : dirs) {\n int nx = x + d[0], ny = y + d[1];\n if (nx < 0 || ny < 0 || nx >= n || ny >= n) continue;\n if (dist[nx][ny] != -1) continue; // 访问过\n dist[nx][ny] = dist[x][y] + 1; // 最近陆地距离\n ans = max(ans, dist[nx][ny]);\n q.push({nx, ny});\n }\n }\n return ans;\n }\n };\n ```\n\n#### 时间复杂度\n\n* 时间:每个格子最多入队一次,四邻检查常数次,整体 **O(N²)**。\n\n","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/58#issuecomment-3263627488","body":"#### Main Idea\n\n1. **线性决策(相邻不能同抢)**\n\n * 到第 `i` 间房时只有两种选择:\n\n * **不抢它**:收益等于前一间的最佳收益 `dp[i-1]`\n * **抢它**:收益等于“到 i-2 的最佳收益 + 本屋金额” → `dp[i-2] + nums[i]`\n * 所以转移式:`dp[i] = max(dp[i-1], dp[i-2] + nums[i])`\n2. **初值与边界**\n\n * 空数组 → 答案 `0`\n * `dp[0] = nums[0]`\n * `dp[1] = max(nums[0], nums[1])`(如果存在)\n3. **滚动变量优化空间**\n\n * 只依赖 `i-1` 和 `i-2`,用两个变量就够了:\n\n * `prev2` 表示 `dp[i-2]`,`prev1` 表示 `dp[i-1]`\n * 新值 `cur = max(prev1, prev2 + nums[i])`,随后前移指针\n\n#### 动态规划(滚动变量,O(1) 空间)\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n int rob(vector& nums) {\n if (nums.empty()) return 0;\n int n = nums.size();\n if (n == 1) return nums[0];\n\n int prev2 = 0; // dp[i-2]\n int prev1 = 0; // dp[i-1]\n for (int x : nums) {\n int cur = max(prev1, prev2 + x);\n prev2 = prev1;\n prev1 = cur;\n }\n return prev1;\n }\n};\n```\n\n#### 时间复杂度\n\n* **时间**:`O(n)`(单次线性扫描)\n* **空间**:`O(1)`(滚动变量),如需恢复路径则 `O(n)` 用于记录选择","onTime":true},null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/63#issuecomment-3284142988","body":"#### Main idea\n\n**把局面想成“还差多少 + 已用过哪些数”**\n\n- 每次你从公共池里挑一个数,目标值就相应减少;被挑过的数以后都不能再用。\n- 于是每一步其实就是在“还差的分数”和“哪些数已被拿走”的组合之间转换。\n\n**当前能赢的充要条件**\n\n- 如果你现在能直接拿到一个数,使得**累计和立刻达到/超过目标**,你马上赢。\n- 否则,你希望找到一个数字,让对手接下来面对的局面是**必输局**。\n 换句话说:**存在**一个选择能把对手“送进死局”,那你这一步就是必赢;\n 如果**所有**选择都会把对手“送进稳赢局”,那你这一步就是必输。\n\n**两条简单但很有用的剪枝**\n\n- **总和不够就别想了**:如果 1 到 `maxChoosableInteger` 的总和都达不到目标,先手必输。\n- **目标非正直接赢**:如果目标本来就 ≤ 0(或被前人操作减到 ≤ 0),先手已满足条件,直接判赢。\n\n**记住算过的局面,别重复思考(记忆化)**\n\n- 同一组“已用过的数字 + 还差多少”的局面,赢或输的结论是固定的。\n- 把每个局面的输赢结果记下来,后面再遇到就直接用,避免在相同分支上反复推演。\n\n**直觉理解(以示例 1 为例)**\n\n- `max=10, 目标=11`:无论先手先拿哪个数 `x`,后手都能立刻拿到 `11-x`(且该数仍在 1..10 且未被用),直接结束游戏。\n- 所以先手无解——这就是“把对手送进稳赢局”在反方向上的体现。\n\n#### Implementation(cpp)\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n bool canIWin(int maxChoosableInteger, int desiredTotal) {\n if (desiredTotal <= 0) return true;\n\n int n = maxChoosableInteger;\n int sum = n * (n + 1) / 2;\n if (sum < desiredTotal) return false; // 全拿都不够,必输\n\n // 2^n 状态;-1=未知,0=必败,1=必胜\n vector memo(1 << n, -1);\n return dfs(0, desiredTotal, n, memo);\n }\n\nprivate:\n // mask: 已用集合(第 i 位表示数字 i+1 是否已用)\n // remain: 距离目标还差多少\n bool dfs(int mask, int remain, int n, vector& memo) {\n char &res = memo[mask];\n if (res != -1) return res;\n\n // 枚举当前可选的每个数 i\n for (int i = 1; i <= n; ++i) {\n int bit = 1 << (i - 1);\n if (mask & bit) continue; // 已用,跳过\n if (i >= remain) return res = 1; // 直接到达/超过目标,当前玩家赢\n // 若选 i 之后对手必败,则当前必胜\n if (!dfs(mask | bit, remain - i, n, memo)) return res = 1;\n }\n return res = 0; // 所有选择都会让对手必胜 => 当前必败\n }\n};\n\n```\n\n#### 复杂度\n\nO(n · 2^n)","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/69#issuecomment-3306753472","body":"#### Main Idea\n\n1. **把“最少删除”转化为“最多保留”**\n\n * 经典区间调度:**按右端点升序**排序,**尽可能先选结束早的区间**,就能在不重叠前提下**保留最多**的区间。\n * 需要移除的最小数量 = `总数 n - 能保留的最大不重叠数量 keep`。\n\n2. **为什么按右端点排是最优的**\n\n * 选更早结束的区间,给后面的区间留下**更多起始空间**,不比选结束晚的更差。\n * 可用“**交换论证**”:若最优解里某一步没有选最早结束者,换成结束更早的,不减少可选余地,解仍最优。\n\n3. **边界与定义(开闭性)**\n\n * 本题规定:端点相同只**接触不重叠**(`[1,2]` 与 `[2,3]` 可共存),因此判断不重叠条件是 `start >= lastEnd`。\n * 允许负数坐标;`1 <= n <= 1e5`,需 `O(n log n)` 排序 + `O(n)` 一次扫描。\n\n---\n\n#### 贪心(按右端点排序)\n\n```cpp\n#include \nusing namespace std;\n\nclass Solution {\npublic:\n int eraseOverlapIntervals(vector>& intervals) {\n if (intervals.empty()) return 0;\n\n // 1) 按 end 升序排\n sort(intervals.begin(), intervals.end(),\n [](const vector& a, const vector& b){\n if (a[1] != b[1]) return a[1] < b[1];\n return a[0] < b[0];\n });\n\n // 2) 贪心选择:尽量保留更多不重叠区间\n int keep = 0;\n int lastEnd = INT_MIN; // 当前已选集合的最后一个区间的 end\n for (auto &it : intervals) {\n int s = it[0], e = it[1];\n if (s >= lastEnd) { // 与上一个选择不重叠(端点相接也可)\n ++keep;\n lastEnd = e;\n }\n }\n return (int)intervals.size() - keep; // 最少删除 = 总数 - 最多保留\n }\n};\n```\n\n---\n\n#### 等价实现(按左端点排序的“原地计数删谁”)\n\n* 也可以**按起点升序**,一遍扫描:\n\n * 若当前 `s < prevEnd` 发生**重叠** ⇒ 必须删一个;\n * **删谁?** 删右端点更大的那个(保留 `end` 更小者),将 `prevEnd = min(prevEnd, e)`。\n * 计数 `remove++`。\n* 与前法等价,常用于不想单独计“keep”的写法。\n\n```cpp\nint eraseOverlapIntervals(vector>& intervals) {\n if (intervals.empty()) return 0;\n sort(intervals.begin(), intervals.end()); // 默认按 start,再按 end\n\n int remove = 0;\n int prevEnd = intervals[0][1];\n for (int i = 1; i < (int)intervals.size(); ++i) {\n int s = intervals[i][0], e = intervals[i][1];\n if (s < prevEnd) { // 重叠了,需要删一个\n ++remove;\n prevEnd = min(prevEnd, e); // 删 end 较大的那个,保留更早结束\n } else {\n prevEnd = e; // 不重叠,正常推进\n }\n }\n return remove;\n}\n```\n\n#### 复杂度\n\n* 排序 `O(n log n)`,单扫 `O(n)`;总 `O(n log n)`。\n* 额外空间 `O(1)`(除了排序)。\n\n","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/76#issuecomment-3332731592","body":"#### Main Idea\n\n1. **字母映射到孩子指针(26 叉树)**\n\n * 每个结点保存 `children[26]` 与 `isEnd`。\n * `insert(word)`:从根逐字符走,若孩子不存在就新建;末结点标记 `isEnd = true`。\n * `search(word)`:逐字符走,若中途缺结点则 `false`;走完返回末结点 `isEnd`。\n * `startsWith(prefix)`:逐字符走,若中途缺结点则 `false`;都能走到则 `true`(无需 `isEnd`)。\n\n2. **正确性与边界**\n\n * 仅小写字母 → 直接用 `idx = c - 'a'`。\n * `search` 必须要求完整单词结束处 `isEnd == true`,否则只是前缀命中。\n * 空间按需分配:只有路径上用到的结点才创建。\n\n\n---\n\n#### 实现(C++,指针版)\n\n```cpp\n#include \nusing namespace std;\n\nstruct TrieNode {\n bool isEnd = false;\n TrieNode* ch[26];\n TrieNode() : isEnd(false) {\n memset(ch, 0, sizeof(ch));\n }\n};\n\nclass Trie {\npublic:\n Trie() { root = new TrieNode(); }\n\n // 插入单词\n void insert(const string& word) {\n TrieNode* p = root;\n for (char c : word) {\n int idx = c - 'a';\n if (!p->ch[idx]) p->ch[idx] = new TrieNode();\n p = p->ch[idx];\n }\n p->isEnd = true;\n }\n\n // 完整匹配\n bool search(const string& word) {\n TrieNode* p = walk(word);\n return p && p->isEnd;\n }\n\n // 前缀匹配\n bool startsWith(const string& prefix) {\n return walk(prefix) != nullptr;\n }\n\nprivate:\n TrieNode* root;\n\n // 沿字符串行走,走不到返回空\n TrieNode* walk(const string& s) {\n TrieNode* p = root;\n for (char c : s) {\n int idx = c - 'a';\n if (!p->ch[idx]) return nullptr;\n p = p->ch[idx];\n }\n return p;\n }\n};\n```\n#### 复杂度\n\n * 设字符串长度为 `L`:\n\n * `insert / search / startsWith` 都是 **O(L)**。\n * 空间:创建的结点数 ≤ 所有插入字符串长度之和。\n\n","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/82#issuecomment-3357108848","body":"#### Main idea\n\n**后序递归 + 就地剪枝**\n\n* “要保留的节点”必须满足:自己是 1,或者**子树里至少有一个 1**。\n* 等价地说:当一个节点值为 0,且**左右子树都被剪成空**,这个节点也应被删除。\n* 因此用**后序遍历**:先递归处理左右子树,把不含 1 的子树返回成 `nullptr`;回来后再判断当前节点是否也应被删。\n\n**判定规则(在回溯处)**\n\n* `root->left = prune(left)`,`root->right = prune(right)`;\n* 若 `root->val==0 && root->left==nullptr && root->right==nullptr` → 返回 `nullptr`(整棵以 root 为根的子树都不含 1)。\n* 否则返回 `root`。\n\n这保证了每个节点只访问一次,且删除顺序从叶到根,不会误留“全 0 链”。\n\n#### Implementation(cpp)\n\n```cpp\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\n\nclass Solution {\npublic:\n TreeNode* pruneTree(TreeNode* root) {\n if (!root) return nullptr;\n\n root->left = pruneTree(root->left);\n root->right = pruneTree(root->right);\n\n // 若当前为0且左右都为空 => 该节点所在子树不含1,剪掉\n if (root->val == 0 && !root->left && !root->right) {\n return nullptr;\n }\n return root;\n }\n};\n```\n\n#### 复杂度\n\n* 时间:`O(n)`,每个节点访问一次。\n* 空间:`O(h)`,递归栈深度(`h` 为树高,最坏 `O(n)`,平均 `O(log n)`)。","onTime":false},null,null,null,null,null,null,null,null,null,null,null,null],"leohongyi":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3076771871","body":"【Day 1】989. 数组形式的整数加法\nmain idea 从最低位开始加,如果还有进位,将其添加到结果前面 使用逆序遍历 range(len(num) - 1, -1, -1) 从数组的最后一个元素(最低位)开始\ndivmod(num[i] + k, 10) 计算当前位置的数字与 k 相加后的结果,返回商和余数 如果处理完数组中所有位后仍有进位(k > 0)\n从 k 中提取最低位数字,并插入到数组最前面\n继续处理 k 的下一位,直到 k 变为 0\n余数 num[i] 保存在当前位置\n商 k 作为进位传递给下一个更高位\n整体时间复杂度为 O(max(n, log k))。\ncode\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n for i in range(len(num) - 1, -1, -1):\n k, num[i] = divmod(num[i] + k, 10)\n \n while k > 0:\n k, digit = divmod(k, 10)\n num.insert(0, digit)\n return num\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3077014132","body":"main idea:\n创建 ret 数组,长度为len(s)\n再次遍历s的过程中,我们需要判断当满足以下两点条件时,指针 p 右移一位\np小于arr最大下标\n前下标i 到 p + 1的绝对距离比到 p 的绝对距离小\n每次将 p - i 的绝对距离添加至 ret[i] 中\n\n def shortestToChar(self, s: str, c: str) -> List[int]:\n ret, p, arr = [], 0, [i for i in range(len(s)) if s[i] == c]\n for i, j in enumerate(s):\n if p < len(arr) - 1 and abs(arr[p] - i) > abs(arr[p + 1] - i):\n p += 1\n ret.append(abs(arr[p] - i))\n return ret\nTime Complexity: O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3082831029","body":"使用数组的栈结构,self.top作为栈顶指针\n进出栈分别通过简单的数组赋值与读取进行操作\nincrement函数通过一个循环进行赋值操作\nclass CustomStack:\n\n def __init__(self, maxSize: int):\n self.stack = [0]*maxSize\n self.top = -1\n\n def push(self, x: int) -> None:\n if self.top < len(self.stack) - 1:\n self.top += 1\n self.stack[self.top] = x\n\n def pop(self) -> int:\n if self.top is -1:\n return self.top\n else:\n self.top -= 1\n return self.stack[self.top+1]\n \n\n def increment(self, k: int, val: int) -> None:\n for i in range(min(k, self.top + 1)):\n self.stack[i] += val\n\n\n\nTime complexity: O(k)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3092615113","body":"算法步骤:\n利用current string, current number 记录所有不同的括号层级内的string和num;\n使用stk来记录之前的数字和前置str;推荐先push num, 后push str 至 stack;\nO(n)\n代码:\nclass Solution:\n def decodeString(self, s: str) -> str:\n cur_str, cur_num = \"\", \"\"\n stk = []\n for c in s:\n if c.isdigit():\n cur_num += c\n elif c == '[':\n stk.append(cur_str)\n stk.append(cur_num)\n cur_str, cur_num = \"\", \"\"\n elif c == ']':\n cur_str *= int(stk.pop())\n cur_str = stk.pop() + cur_str\n else:\n cur_str += c\n return cur_str\n\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092624509","body":"算法设计\n加入队尾 push() : 将数字 val 加入栈 A 即可。\n获取队首元素 peek() :\n当栈 B 不为空: B中仍有已完成倒序的元素,因此直接返回 B 的栈顶元素。\n否则,当 A 为空: 即两个栈都为空,无元素,因此返回 -1 。\n否则: 将栈 A 元素全部转移至栈 B 中,实现元素倒序,并返回栈 B 的栈顶元素。\n弹出队首元素 pop() :\n执行 peek() ,获取队首元素。\n弹出 B 的栈顶元素。\n队列判空 empty() : 当栈 A 和 B 都为空时,队列为空。\n\nclass MyQueue:\n\n def __init__(self):\n self.A, self.B = [], []\n\n def push(self, x: int) -> None:\n self.A.append(x)\n\n def pop(self) -> int:\n peek = self.peek()\n self.B.pop()\n return peek\n\n def peek(self) -> int:\n if self.B: return self.B[-1]\n if not self.A: return -1\n # 将栈 A 的元素依次移动至栈 B\n while self.A:\n self.B.append(self.A.pop())\n return self.B[-1]\n def empty(self) -> bool:\n return not self.A and not self.B\n\n\n# Your MyQueue object will be instantiated and called as such:\n# obj = MyQueue()\n# obj.push(x)\n# param_2 = obj.pop()\n# param_3 = obj.peek()\n# param_4 = obj.empty()\n时间复杂度: push(), empty() 函数的时间复杂度为 O(1) ;peek() , pop() 函数在 N 次队首元素删除操作中总共需完成 N 个元素的倒序,均摊时间复杂度为 O(1) 。\n\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3105379844","body":"main: 如果当前元素大于或者等于maxx,入栈, 更新最大值maxx\n如果当前元素小于栈顶元素,循环弹出栈顶元素,直到当前元素大于或等于栈顶元素,注意不用将当前元素入栈!!不过要再将maxx压入栈,因为刚刚pop时肯定把maxx弹出栈了\n\n。class Solution:\n def maxChunksToSorted(self, arr: List[int]) -> int:\n maxx, stk = arr[0], [arr[0]]\n for i in range(1, len(arr)):\n if arr[i] >= maxx:\n maxx = arr[i]\n stk.append(arr[i])\n else:\n while stk and stk[-1] > arr[i]:\n stk.pop()\n stk.append(maxx)\n return len(stk)\n 时间复杂度O(n)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3111913253","body":"找到尾结点 形成环形链表\n尾结点移动length - k 步 有移动k步 == 左移length - k 步\n找到头结点 断开头尾链接\n\n\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def rotateRight(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:\n if not head or not head.next:\n return head\n tail = head\n length = 1\n while tail.next:\n length += 1\n tail = tail.next\n tail.next = head\n\n k = k % length\n for _ in range(length - k):\n tail = tail.next\n \n head = tail.next\n tail.next = None\n return head\n ","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3111983736","body":"先交换以node3为头结点的链表 \nnode1指向地柜返回的链表头\n把node2指向node1\n返回node2 作为交换完成的链表头结点\n\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\nclass Solution:\n def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:\n if head is None or head.next is None:\n return head\n node1 = head\n node2 = head.next\n node3 = node2.next\n\n node1.next = self.swapPairs(node3)\n node2.next = node1\n\n return node2\n ","onTime":false},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"dmax1314":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3082278662","body":"1. 第一个想法是数组转换数字然后相加再转换回去\n时间和空间复杂度都应该是O(n)\n```python\nfrom typing import List\n\nclass Solution:\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n # 1. 数组 -> 字符串 -> 数字\n # 首先将列表中的每个数字转换为字符串,然后拼接成一个完整的字符串\n # [1, 2, 0, 0] -> [\"1\", \"2\", \"0\", \"0\"] -> \"1200\"\n s = \"\".join(map(str, num))\n \n num_val = int(s)\n \n # 2. 数字相加\n result_val = num_val + k\n \n # 3. 数字 -> 字符串 -> 数组\n # 将结果数字转换回字符串\n # 1234 -> \"1234\"\n result_s = str(result_val)\n \n # 将结果字符串中的每个字符转换回整数,并放入列表中\n # \"1234\" -> [\"1\", \"2\", \"3\", \"4\"] -> [1, 2, 3, 4]\n result_array = [int(digit) for digit in result_s]\n \n return result_array\n```\n但是似乎换其他的语言会溢出\n2. 第二个想法就是模拟加法操作,从个位数加起,关键问题在于处理进位\n```python\nclass Solution:\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n result = []\n carry = 0\n i = len(num) - 1 # 指向 num 的最后一位\n \n while i >= 0 or k > 0 or carry > 0:\n digit = carry # 初始化为进位\n \n if i >= 0: # 如果 num 中还有数字\n digit += num[i]\n i -= 1\n \n if k > 0: # 如果 k 中还有数字\n digit += k % 10\n k //= 10 # 整个 k 除以 10\n \n # 处理进位\n result.append(digit % 10)\n carry = digit // 10\n \n result.reverse() # 因为是从个位到十位添加的,最后需要反转\n return result # 返回结果\n```\n这里是要反转的 我一开始忘了这个事情,因为数组把个位的和放在了第一位和实际数字反过来了\n时间复杂度: O(max(N, M)),其中 N 是 num 的长度,M 是 k 的数字长度。我们需要遍历这两个数的每一位。\n空间复杂度: O(max(N, M)),用于存储结果数组。\n\n---\n在看lc题解的时候发现一个很有趣的模板可能以后会用到\n ```\nwhile ( A 没完 || B 没完)\n A 的当前位\n B 的当前位\n\n 和 = A 的当前位 + B 的当前位 + 进位carry\n\n 当前位 = 和 % 10;\n 进位 = 和 / 10;\n\n判断还有进位吗\n```\n>作者:lilyunoke\n>链接:https://leetcode.cn/problems/add-to-array-form-of-integer/solutions/570659/989-ji-zhu-zhe-ge-jia-fa-mo-ban-miao-sha-8y9r/\n>来源:力扣(LeetCode)\n>著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。\n\n稍微改了一下得到一个python加法模板,\n```python\nclass Solution:\n def addToArrayForm(self, num: List[int], k: int) -> List[int]:\n n = len(num)\n res = []\n i = n - 1\n s = 0\n carry = 0\n while i >= 0 or k != 0:\n x = num[i] if i >= 0 else 0\n y = k % 10 if k != 0 else 0\n\n s = x + y + carry\n carry = s // 10\n k //= 10\n\n i -= 1\n res.insert(0, s % 10)\n\n if carry != 0:\n res.insert(0, carry)\n return res\n```\n据说这个模板还可以用到[2](https://leetcode.com/problems/add-two-numbers/description/),[165](https://leetcode.com/problems/compare-version-numbers/)和[809](https://leetcode.com/problems/expressive-words/)这周末抽空可以做一下","onTime":false},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3086540520","body":"# 第四天\n构造栈结构,利用先入后出的特性来实现括号匹配\n大概做法就是\n1. 使用栈来存放数字、字符以及中间结果。\n2. 遇到数字时,解析出完整的k值(可能是多位数)。\n3. 遇到开括号 `[` 时,将当前构建的字符串入栈,重置字符串。\n4. 遇到闭括号 `]` 时,出栈,形成一个新的字符串并重复生成。\n5. 最终合并所有字符串返回结果。\n```python\nclass Solution:\n def decodeString(self, s: str) -> str:\n stack = [] # 初始化栈\n current_num = 0 # 当前数字\n current_str = '' # 当前构建的字符串\n\n for char in s:\n if char.isdigit(): # 如果是数字\n current_num = current_num * 10 + int(char) # 处理多位数\n elif char == '[': # 遇到左括号\n stack.append(current_str) # 存储当前字符串\n stack.append(current_num) # 存储当前数字\n current_str = '' # 重置字符串\n current_num = 0 # 重置数字\n elif char == ']': # 遇到右括号\n num = stack.pop() # 弹出数字\n prev_str = stack.pop() # 弹出前一个字符串\n current_str = prev_str + current_str * num # 生成新的字符串\n else:\n current_str += char # 累加字符\n\n return current_str # 返回解码后的字符串\n```\n时间复杂度是 O(n),其中 n 是字符串 s 的长度。每个字符都被处理一次。\n空间复杂度是 O(n),在最坏情况下,栈可能会存储所有字符和数字。\n\n---\n读了题解发现还存在递归法,也就是用[]来决定递归的开头和结束\n```python\nclass Solution:\n def decodeString(self, s: str) -> str:\n def dfs(s,i):\n res,multi='',0\n while i str:\n def dfs(s, i):\n res, multi = \"\", 0\n while i < len(s):\n if '0' <= s[i] <= '9':\n multi = multi * 10 + int(s[i])\n elif s[i] == '[':\n i, tmp = dfs(s, i + 1)\n res += multi * tmp\n multi = 0\n elif s[i] == ']':\n return i, res\n else:\n res += s[i]\n i += 1\n return res\n return dfs(s,0)\n```\n时间复杂度是 O(n),其中 n 是字符串 s 的长度。每个字符都被处理一次。\n空间复杂度是 O(n),在最坏情况下,递归调用栈可能会存储所有字符和数字。\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3091499578","body":"用两个模拟栈的队列来实现栈的基本操作。一个用于添加尾部元素,另一个用于弹出头部元素。即一个近栈stack in和一个出栈stack out。\n```python\nclass MyQueue:\n\n def __init__(self):\n \"\"\"\n in主要负责push,out主要负责pop\n \"\"\"\n self.stack_in = []\n self.stack_out = []\n\n\n def push(self, x: int) -> None:\n \"\"\"\n 有新元素进来,就往in里面push\n \"\"\"\n self.stack_in.append(x)\n\n\n def pop(self) -> int:\n \"\"\"\n Removes the element from in front of queue and returns that element.\n \"\"\"\n if self.empty():\n return None\n \n if self.stack_out:\n return self.stack_out.pop()\n else:\n for i in range(len(self.stack_in)):\n self.stack_out.append(self.stack_in.pop())\n return self.stack_out.pop()\n\n\n def peek(self) -> int:\n \"\"\"\n Get the front element.\n \"\"\"\n ans = self.pop()\n self.stack_out.append(ans)\n return ans\n\n\n def empty(self) -> bool:\n \"\"\"\n 只要in或者out有元素,说明队列不为空\n \"\"\"\n return not (self.stack_in or self.stack_out)\n```\n时间复杂度:\n- `push` 操作的时间复杂度是 O(1),因为我们只是将元素添加到 `stack_in` 的末尾。\n- `pop` 和 `peek` 操作的平均时间复杂度是 O(1),但在最坏情况下(当 `stack_out` 为空时),需要将 `stack_in` 中的所有元素转移到 `stack_out`,这需要 O(n) 的时间,其中 n 是 `stack_in` 中的元素数量。然而,这种情况不会频繁发生,因此平均时间复杂度仍然是 O(1)。\n- `empty` 操作的时间复杂度是 O(1),因为我们只是检查两个栈是否为空。\n\n空间复杂度是 O(n),其中 n 是队列中的元素数量,因为我们需要存储所有元素在两个栈中。\n\n但是我有个问题,不知道为什么用lc自己的time complexity分析出来是O(n)的时间和空间复杂度,可能是因为lc的分析是基于最坏情况的分析?","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094285074","body":"题目的核心是找到最多的分块数量,使得将每个块独立排序后,拼接起来的结果与整个数组排序后的结果相同。\n\n第一个想法是利用排序后的性质。一个块可以被成功分割的条件是:块内所有元素的原数组最大值,小于等于它右边所有元素的最小值。如果满足这个条件,那么这个块排序后,所有元素就都会在它们最终应该在的位置的左边。\n\n为了实现这个想法,我们可以预处理两个数组:\n\n- max_of_left[i]:表示原数组 arr[0...i] 中的最大值。\n- min_of_right[i]:表示原数组 arr[i...n-1] 中的最小值。\n\n然后遍历数组,如果在 i 位置,满足 max_of_left[i] <= min_of_right[i+1],就说明我们可以在 i 和 i+1 之间切一刀。\n```python\nfrom typing import List\n\nclass Solution:\n def maxChunksToSorted(self, arr: List[int]) -> int:\n n = len(arr)\n if n <= 1:\n return 1\n\n # 1. 计算从左到右每个位置的最大值\n max_of_left = [0] * n\n max_of_left[0] = arr[0]\n for i in range(1, n):\n max_of_left[i] = max(max_of_left[i-1], arr[i])\n\n # 2. 计算从右到左每个位置的最小值\n min_of_right = [0] * n\n min_of_right[n-1] = arr[n-1]\n for i in range(n-2, -1, -1):\n min_of_right[i] = min(min_of_right[i+1], arr[i])\n\n # 3. 遍历查找可以分割的点\n # 如果 max_of_left[i] <= min_of_right[i+1],说明 arr[0...i] 的所有元素\n # 都小于等于 arr[i+1...n-1] 的所有元素,可以切分\n chunks = 0\n for i in range(n - 1):\n if max_of_left[i] <= min_of_right[i+1]:\n chunks += 1\n\n # 总块数 = 分割点数量 + 1\n return chunks + 1\n```\n时间复杂度:O(N),其中 N 是数组的长度。我们需要三次独立的 O(N) 遍历。\n空间复杂度:O(N),用于存储 max_of_left 和 min_of_right 两个辅助数组。\n\n---\n在看题解的时候,发现了一个更巧妙的解法,虽然时间复杂度稍高,但是代码非常简洁。它的思路是比较原数组和排序后数组的元素和。\n\n如果 arr[0...i] 的元素和等于 sorted_arr[0...i] 的元素和,这意味着 arr[0...i] 中的元素集合和 sorted_arr[0...i] 中的元素集合是完全相同的(只是顺序不同)。因为 sorted_arr[0...i] 包含了整个数组中最小的 i+1 个元素,所以 arr[0...i] 也必然包含了这 i+1 个最小元素。这就保证了 arr[0...i] 中的任意元素都小于等于 arr[i+1...n-1] 中的任意元素,因此可以在 i 处进行分割。\n```python\nfrom typing import List\n\nclass Solution:\n def maxChunksToSorted(self, arr: List[int]) -> int:\n sorted_arr = sorted(arr)\n \n sum_arr = 0\n sum_sorted = 0\n chunks = 0\n \n for i in range(len(arr)):\n sum_arr += arr[i]\n sum_sorted += sorted_arr[i]\n \n if sum_arr == sum_sorted:\n chunks += 1\n \n return chunks\n```\n时间复杂度:O(N log N),瓶颈在于对数组的排序。\n\n空间复杂度:O(N),用于存储排序后的数组副本。\n\n还有一个基于单调栈的解法,时间复杂度可以做到 O(N)。\n\n思路是遍历数组,用一个栈来维护每个块的最大值。\n\n1. 如果当前元素 num 大于或等于栈顶元素,说明 num 可以自己形成一个新的块(或者加入前一个块且不影响排序性),直接将 num 入栈。\n2. 如果当前元素 num 小于栈顶元素,说明 num 必须和前面的块合并,直到栈顶元素小于或等于 num。在合并过程中,需要记录被弹出的那些块中的最大值 head,因为这个 head 将成为合并后新块的最大值,然后将 head 入栈。\n\n最终栈的大小就是块的数量。\n```python\nfrom typing import List\n\nclass Solution:\n def maxChunksToSorted(self, arr: List[int]) -> int:\n stack = []\n for num in arr:\n if not stack or num >= stack[-1]:\n stack.append(num)\n else:\n # 当前元素num比栈顶小,需要合并\n head = stack.pop()\n # 持续弹出所有大于num的元素\n while stack and stack[-1] > num:\n stack.pop()\n # 将原先这些块的最大值head作为新块的代表入栈\n stack.append(head)\n return len(stack)\n```\n\n时间复杂度:O(N),因为每个元素最多入栈和出栈一次。\n\n空间复杂度:O(N),在最坏的情况下(例如数组本身有序),栈的大小会等于数组长度。\n","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112533354","body":"双指针\n1. 创建两个指针 pA 和 pB,分别指向两个链表的头节点 headA 和 headB。\n2. 同时向前移动这两个指针,pA 每次走一步,pB 每次也走一步。\n3. 核心操作:如果 pA 指针走到了链表 A 的末尾(即 pA 变为 None),则将它重定向到链表 B 的头节点 headB。同样,如果 pB 指针走到了链表 B 的末尾,则将它重定向到链表 A 的头节点 headA。\n4. 两个指针最终会在相交点相遇。如果两个链表不相交,它们会同时在路径的最后变为 None,此时循环结束。\n\n```python\nclass Solution:\n def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:\n if not headA or not headB:\n return None\n\n pA = headA\n pB = headB\n\n # 当 pA 和 pB 相等时循环终止(可能是在交点,也可能同为 None)\n while pA is not pB:\n # 如果pA走到头,就让他从headB开始走;否则,pA正常往下走\n pA = headB if pA is None else pA.next\n # 如果pB走到头,就让他从headA开始走;否则,pB正常往下走\n pB = headA if pB is None else pB.next\n \n # 返回相遇点\n return pA\n```\n时间复杂度:O(m+n)。在最坏的情况下(例如,两个链表不相交),每个指针都需要遍历两个链表的总长度。\n空间复杂度:O(1)。只使用了两个额外的指针,没有使用其他数据结构。","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3121201700","body":"为了实现一个支持 O(1) 时间复杂度的查找插入和删除,可以用hash map去记录key和value之间的映射关系。但是hash map是无序的,没有办法记录各项的使用顺序,可以一个双向链表来记录使用顺序。这样就可以在插入和删除的时候,快速地调整链表的顺序。\n\n```python\nclass DLinkedNode:\n def __init__(self, key=0, value=0):\n self.key = key\n self.value = value\n self.prev = None\n self.next = None\n\nclass LRUCache:\n def __init__(self, capacity: int):\n self.cache = dict()\n self.capacity = capacity\n # 使用伪头部和伪尾部节点,简化边界条件处理\n self.head = DLinkedNode()\n self.tail = DLinkedNode()\n self.head.next = self.tail\n self.tail.prev = self.head\n\n def _add_to_head(self, node: DLinkedNode):\n # 将节点添加到头部\n node.prev = self.head\n node.next = self.head.next\n self.head.next.prev = node\n self.head.next = node\n\n def _remove_node(self, node: DLinkedNode):\n # 从链表中删除一个节点\n node.prev.next = node.next\n node.next.prev = node.prev\n\n def _move_to_head(self, node: DLinkedNode):\n # 将一个存在的节点移动到头部\n self._remove_node(node)\n self._add_to_head(node)\n\n def get(self, key: int) -> int:\n if key not in self.cache:\n return -1\n \n node = self.cache[key]\n # 访问过后,变为最近使用,移动到头部\n self._move_to_head(node)\n return node.value\n\n def put(self, key: int, value: int) -> None:\n if key in self.cache:\n # 如果 key 存在,更新值并移动到头部\n node = self.cache[key]\n node.value = value\n self._move_to_head(node)\n else:\n # 如果 key 不存在\n if len(self.cache) == self.capacity:\n # 缓存已满,淘汰最久未使用的节点(尾部节点)\n removed_node = self.tail.prev\n self._remove_node(removed_node)\n # 不要忘了从哈希表中也删除\n del self.cache[removed_node.key]\n\n # 创建新节点并添加到头部\n new_node = DLinkedNode(key, value)\n self._add_to_head(new_node)\n self.cache[key] = new_node\n```\n时间复杂度:get 和 put 操作都是 O(1)。所有操作都是哈希表查找和链表头尾操作的组合。\n空间复杂度:O(capacity),因为哈希表和双向链表最多存储 capacity 个元素。","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3132881592","body":"DFS - 递归\n这道题的结构天然适合使用递归来解决。我们可以定义一个函数,该函数接收一个节点和从根到该节点父节点所构成的数字。\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import Optional\n\nclass Solution:\n def sumNumbers(self, root: Optional[TreeNode]) -> int:\n \n def dfs(node: Optional[TreeNode], current_path_sum: int) -> int:\n if not node:\n return 0\n \n # 计算到达当前节点的路径代表的数字\n new_sum = current_path_sum * 10 + node.val\n \n # 如果是叶子节点,返回当前路径的数字\n if not node.left and not node.right:\n return new_sum\n \n # 如果不是叶子节点,返回左右子树的路径数字之和\n else:\n return dfs(node.left, new_sum) + dfs(node.right, new_sum)\n\n return dfs(root, 0)\n```\n时间复杂度:O(N),其中 N 是树中节点的数量。我们需要访问每个节点一次。\n空间复杂度:O(H),其中 H 是树的高度。这部分空间用于递归调用栈。在最坏的情况下(树退化成链表),空间复杂度为 O(N);在最好的情况下(完全二叉树),空间复杂度为 O(log N)。\n\n---\n\nDFS - 迭代\n> 递归可能导致的栈溢出问题(在树极深的情况下),我们可以将递归转换为迭代\n\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import Optional\n\nclass Solution:\n def sumNumbers(self, root: Optional[TreeNode]) -> int:\n if not root:\n return 0\n \n total_sum = 0\n stack = [(root, root.val)] # 栈中存储 (节点, 到达该节点的路径数值)\n\n while stack:\n node, current_number = stack.pop()\n\n # 如果是叶子节点,将路径数值加入总和\n if not node.left and not node.right:\n total_sum += current_number\n\n # 将右子节点压栈\n if node.right:\n stack.append((node.right, current_number * 10 + node.right.val))\n \n # 将左子节点压栈\n if node.left:\n stack.append((node.left, current_number * 10 + node.left.val))\n \n return total_sum\n```\n时间复杂度:O(N),每个节点入栈和出栈一次。\n空间复杂度:O(H),栈在最坏情况下存储 H 个节点,H 是树的高度。与递归版本类似,最好情况 O(log N),最坏情况 O(N)。\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3134942374","body":"因为题目中提到了**行**,我们可以用bfs一行一行地处理树的节点\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import Optional\nimport collections\n\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n if not root:\n return 0\n \n queue = collections.deque([root])\n bottom_left_val = 0\n \n while queue:\n # 当前层的节点数量\n level_size = len(queue)\n \n # 每一层的第一个节点就是该层的最左侧节点\n # 我们只需要记录它,然后继续遍历\n bottom_left_val = queue[0].val\n \n # 遍历当前层的所有节点\n for _ in range(level_size):\n node = queue.popleft()\n \n # 将下一层的节点加入队列\n if node.left:\n queue.append(node.left)\n if node.right:\n queue.append(node.right)\n \n return bottom_left_val\n```\n时间复杂度:O(N),其中 N 是树中节点的总数。因为每个节点都会入队和出队一次。\n空间复杂度:O(W),其中 W 是树的最大宽度。在最坏的情况下(一个完整的二叉树),队列的大小可以达到 N/2。\n\n---\n当然dfs也是可以做的,要记录目前为止发现的最深层级max_depth和最深层级最左边节点的值result_val,先左后右地进行递归\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import Optional\n\nclass Solution:\n def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:\n self.max_depth = -1 # 记录最大深度,初始化为-1\n self.result_val = 0 # 记录结果值\n \n def dfs(node: Optional[TreeNode], current_depth: int):\n if not node:\n return\n \n # 如果当前深度大于已记录的最大深度\n # 说明我们第一次到达这个新深度,且由于先序遍历的顺序,这一定是该层最左的节点\n if current_depth > self.max_depth:\n self.max_depth = current_depth\n self.result_val = node.val\n \n # 必须先遍历左子树,再遍历右子树\n dfs(node.left, current_depth + 1)\n dfs(node.right, current_depth + 1)\n \n dfs(root, 0)\n return self.result_val\n```\n时间复杂度:O(N),因为我们仍然需要访问树中的每一个节点。\n空间复杂度:O(H),其中 H 是树的高度。这部分空间是递归调用栈所占用的。最坏情况下,树呈链状,空间复杂度为 O(N)。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3146236433","body":"```python\n# Definition for a binary tree node.\n# class TreeNode(object):\n# def __init__(self, x):\n# self.val = x\n# self.left = None\n# self.right = None\n\nclass Codec:\n\n def serialize(self, root):\n \"\"\"Encodes a tree to a single string.\n \n :type root: TreeNode\n :rtype: str\n \"\"\"\n res = []\n def dfs(node):\n if not node:\n res.append(\"null\")\n return\n res.append(str(node.val))\n dfs(node.left)\n dfs(node.right)\n \n dfs(root)\n return \",\".join(res)\n\n def deserialize(self, data):\n \"\"\"Decodes your encoded data to tree.\n \n :type data: str\n :rtype: TreeNode\n \"\"\"\n if not data:\n return None\n \n # 使用列表模拟一个队列,方便 pop(0)\n node_list = data.split(',')\n \n def build_tree():\n val = node_list.pop(0)\n if val == \"null\":\n return None\n \n node = TreeNode(int(val))\n node.left = build_tree()\n node.right = build_tree()\n return node\n \n return build_tree()\n```\n复杂度 空间和时间都是 O(N)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3141867802","body":"坐标记录 + 排序\n为每一个节点确定其坐标 (row, col),并记录下 (row, col, val) 这个三元组。最后BFS即可(DFS应该也行)\n```python\n# Definition for a binary tree node.\n# class TreeNode:\n# def __init__(self, val=0, left=None, right=None):\n# self.val = val\n# self.left = left\n# self.right = right\n\nfrom typing import List, Optional\nimport collections\n\nclass Solution:\n def verticalTraversal(self, root: Optional[TreeNode]) -> List[List[int]]:\n if not root:\n return []\n \n # 1. 遍历与记录\n # 使用 BFS 遍历树,记录每个节点的 (col, row, val)\n nodes_info = []\n queue = collections.deque([(root, 0, 0)]) # (node, row, col)\n \n while queue:\n node, row, col = queue.popleft()\n nodes_info.append((col, row, node.val))\n \n if node.left:\n queue.append((node.left, row + 1, col - 1))\n if node.right:\n queue.append((node.right, row + 1, col + 1))\n \n # 2. 排序\n # 对记录下来的节点信息进行排序\n # Python 的元组排序默认按元素顺序比较,完美符合题目要求\n nodes_info.sort()\n \n # 3. 分组\n # 将排序后的结果按列分组\n result_map = collections.OrderedDict()\n for col, row, val in nodes_info:\n if col not in result_map:\n result_map[col] = []\n result_map[col].append(val)\n \n return list(result_map.values())\n```\n时间复杂度:O(N log N)。\nBFS 遍历需要 O(N) 的时间,其中 N 是节点数。nodes_info.sort() 是整个算法的瓶颈,对 N 个元素排序需要 O(N log N) 的时间。最后的分组步骤需要 O(N) 的时间。\n因此,总时间复杂度为 O(N log N)。\n\n空间复杂度:O(N)。\nBFS 的队列在最坏情况下需要存储 O(W) 个节点,W 是树的最大宽度。nodes_info 列表需要存储所有 N 个节点的信息,因此需要 O(N) 的空间。result_map 也需要 O(N) 的空间来存储所有节点的值。\n因此,总空间复杂度为 O(N)。\n\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146235205","body":"```python\nfrom typing import List, Set\n\nclass Solution:\n def generateParenthesis(self, n: int) -> List[str]:\n # 使用列表来模拟dp数组,每个元素是一个哈希集合\n dp: List[Set[str]] = [set() for _ in range(n + 1)]\n \n # 基础情况:0对括号只有一种组合,即空字符串\n dp[0].add(\"\")\n \n # 从1对括号开始,迭代到n对\n for i in range(1, n + 1):\n # 遍历所有可能的分割点 j\n for j in range(i):\n # A 部分有 j 对括号,B 部分有 i-1-j 对\n list_p = dp[j]\n list_q = dp[i - 1 - j]\n \n # 组合 p 和 q\n for p in list_p:\n for q in list_q:\n # 使用哈希集合 dp[i] 自动去重\n dp[i].add(f\"({p}){q}\")\n \n return list(dp[n])\n```\n复杂度好像有点难算 看看大家有没有什么想法 我再算一算","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3147359265","body":"首先想到的是26字母那道题一样开一个数组然后建一个数组索引转换hash map去做 但是我不清楚是不是升序 所以要用min和max 那这样的效果肯定很差 内存会超 结果没想到居然能过\n```python\nfrom typing import List\n\nclass Solution:\n def topKFrequent(self, nums: List[int], k: int) -> List[int]:\n if not nums:\n return []\n \n # -----------------------------------------------------------------\n # 步骤 1: 使用“数组哈希”(直接寻址法)统计频率\n # -----------------------------------------------------------------\n \n # a. 找到数值范围以确定数组大小\n min_val = min(nums)\n max_val = max(nums)\n \n # b. 定义偏移量,将所有数值映射到数组的非负索引\n offset = -min_val\n \n # c. 创建计数数组\n count_array_size = max_val - min_val + 1\n count_array = [0] * count_array_size\n \n # d. 遍历原数组,完成计数\n for num in nums:\n # 将 num 通过偏移量映射到数组索引\n index = num + offset\n count_array[index] += 1\n\n # -----------------------------------------------------------------\n # 步骤 2: 使用桶排序来找到前 K 个高频元素\n # -----------------------------------------------------------------\n\n # a. 创建桶,桶的索引代表频率\n # 桶的数量是 len(nums) + 1,因为一个元素的频率不可能超过总数\n buckets = [[] for _ in range(len(nums) + 1)]\n\n # b. 遍历计数数组,将元素放入对应频率的桶中\n for i in range(count_array_size):\n freq = count_array[i]\n if freq > 0:\n # 将索引 i 转换回原始数字\n num = i - offset\n buckets[freq].append(num)\n\n # -----------------------------------------------------------------\n # 步骤 3: 从后往前收集结果\n # -----------------------------------------------------------------\n \n result = []\n # 从最高频率的桶开始遍历\n for i in range(len(buckets) - 1, 0, -1):\n # 如果当前频率的桶中有元素\n if buckets[i]:\n # 将这个桶里的所有元素加入结果集\n result.extend(buckets[i])\n \n # 如果结果集大小已经足够,可以提前退出\n if len(result) >= k:\n break\n \n # 返回前 k 个元素,如果最后一个桶加入了多余元素,用切片保证只返回k个\n return result[:k]\n```\n---\n然后我想到遍历数组 建一个hash map(元素,频率) 然后按频率降序排序提出来前k个\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def topKFrequent(self, nums: List[int], k: int) -> List[int]:\n # 1. 使用 collections.Counter 快速统计频率,O(N)\n freq_map = collections.Counter(nums)\n \n # 2. 对哈希表按值(频率)进行排序\n # sorted 函数的时间复杂度是 O(M log M),其中 M 是不同元素的数量\n # M <= N,所以最坏是 O(N log N)\n sorted_items = sorted(freq_map.items(), key=lambda item: item[1], reverse=True)\n \n # 3. 提取前 k 个元素\n result = [item[0] for item in sorted_items[:k]]\n \n return result\n```\n空间复杂度:O(N)\n时间复杂度:O(NlogN)。其中 N 是数组 nums 的长度。瓶颈在于排序那一步,即使只有 M 个独立元素,在最坏情况下 M 可能等于 N。这个复杂度不满足题目进阶要求。\n\n---\n可以看到关键问题在于排序,想办法避免排序 我就可以用最小堆来做\n维护一个最小的heapq 按频率存入 如果堆的大小超过k了就把频率最低的pop out就行\n```python\nimport collections\nimport heapq\nfrom typing import List\n\nclass Solution:\n def topKFrequent(self, nums: List[int], k: int) -> List[int]:\n # 1. 统计频率,O(N)\n freq_map = collections.Counter(nums)\n \n # 2. 维护一个大小为 k 的最小堆,O(M log k),M是不同元素的数量\n min_heap = []\n for num, freq in freq_map.items():\n # Python的heapq是最小堆,所以我们存入(频率, 数字)\n # 这样堆会根据频率排序\n heapq.heappush(min_heap, (freq, num))\n if len(min_heap) > k:\n heapq.heappop(min_heap) # pop out频率最小的元素\n \n # 3. 提取结果\n # 此时堆中的k个元素就是频率最高的k个\n result = [item[1] for item in min_heap]\n return result\n```\n","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3156822202","body":"双指针滑动窗口\n```python\nclass Solution:\n def lengthOfLongestSubstring(self, s: str) -> int:\n # 哈希表存储 {字符: 最后出现的位置索引}\n char_map = {}\n max_len = 0\n left = 0 # 窗口的左边界\n \n # right 是窗口的右边界,不断向右移动\n for right in range(len(s)):\n char = s[right]\n \n # 如果当前字符已经存在于哈希表中,并且其位置在当前窗口内\n if char in char_map and char_map[char] >= left:\n # 遇到重复字符,收缩窗口\n # 将左边界移动到重复字符上一次出现位置的下一个位置\n left = char_map[char] + 1\n \n # 更新字符的最新位置\n char_map[char] = right\n \n # 更新最大长度\n current_len = right - left + 1\n max_len = max(max_len, current_len)\n \n return max_len\n```\n时间复杂度:O(N)。left 和 right 两个指针都只会从头到尾遍历字符串一次,每个字符最多被访问两次。\n\n空间复杂度:O(k),其中 k 是字符串中不同字符的数量。在最坏的情况下(所有字符都不同),空间复杂度为 O(N)。如果字符集有限(例如 ASCII 码共 128 个),则空间复杂度为常数 O(128)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3156831483","body":"这道题和上一题的区别一个是子字符串(3)一个是子序列(30)\n解法还是双指针滑动窗口 只不过需要改造一下,现在要独立扫描word_len 次\n即\n>第一次扫描:从索引 0 开始,窗口每次移动 word_len,检查的子串是 s[0...], s[word_len...], s[2*word_len...] ...\n第二次扫描:从索引 1 开始,窗口每次移动 word_len,检查的子串是 s[1...], s[1+word_len...], s[1+2*word_len...] ...\n\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def findSubstring(self, s: str, words: List[str]) -> List[int]:\n if not s or not words:\n return []\n\n word_len = len(words[0])\n num_words = len(words)\n total_len = word_len * num_words\n words_freq = collections.Counter(words)\n result = []\n\n # 我们需要进行 word_len 次扫描\n for i in range(word_len):\n left = i # 当前扫描的窗口左边界\n seen = collections.Counter() # 当前窗口内单词的频率\n count = 0 # 当前窗口内有效单词的数量\n\n # 窗口右边界以 word_len 为步长滑动\n for j in range(i, len(s) - word_len + 1, word_len):\n word = s[j : j + word_len]\n \n if word in words_freq:\n seen[word] += 1\n count += 1\n \n # 如果一个单词的数量超了,就从左边收缩窗口\n while seen[word] > words_freq[word]:\n left_word = s[left : left + word_len]\n seen[left_word] -= 1\n count -= 1\n left += word_len\n \n # 如果窗口内单词数量正好,说明找到了一个解\n if count == num_words:\n result.append(left)\n # 为了继续搜索,将窗口最左边的单词移出\n left_word = s[left : left + word_len]\n seen[left_word] -= 1\n count -= 1\n left += word_len\n\n else:\n # 如果遇到的单词不在 words 列表中,则当前窗口作废\n # 直接将左边界移动到这个坏单词的后面\n seen.clear()\n count = 0\n left = j + word_len\n \n return result\n```\n时间复杂度O(N),N是字符串s的长度\n空间复杂度O(ML),M是words列表里的单词数量 L是每个单词长度","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3161453831","body":"```python\nfrom typing import List\n\nclass Solution:\n def minSubarray(self, nums: List[int], p: int) -> int:\n n = len(nums)\n # 1. 同余定理:计算目标余数\n target_rem = sum(nums) % p\n \n # 如果总和已经能被 p 整除,无需移除\n if target_rem == 0:\n return 0\n \n # 2. 哈希表:存储 {余数: 最后一次出现的索引}\n # 初始化 {0: -1} 来处理从开头开始的子数组\n rem_map = {0: -1}\n min_len = n # 初始化为一个最大值\n \n # 3. 前缀和:用一个变量 current_sum 动态计算\n current_sum = 0\n \n for i, num in enumerate(nums):\n current_sum += num\n current_rem = current_sum % p\n \n # 计算需要寻找的配对余数\n needed_rem = (current_rem - target_rem + p) % p\n \n # 如果找到了配对\n if needed_rem in rem_map:\n prev_index = rem_map[needed_rem]\n # 更新最短长度\n min_len = min(min_len, i - prev_index)\n \n # 更新当前余数的最新索引\n rem_map[current_rem] = i\n \n # 如果 min_len 没有被更新过,或者更新后的值等于n(意味着要移除整个数组)\n # 则说明找不到合适的“真”子数组\n return min_len if min_len < n else -1\n```\n时间复杂度:O(N),因为我们只遍历了数组一次。\n空间复杂度:O(min(N,p)),因为哈希表中最多存储 p 个不同的余数。","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3169922808","body":"双指针\n```python\nfrom typing import Optional\n\n# Definition for singly-linked list.\n# class ListNode:\n# def __init__(self, val=0, next=None):\n# self.val = val\n# self.next = next\n\nclass Solution:\n def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:\n # 初始化快慢指针\n slow = head\n fast = head\n \n # 当快指针没有走到链表末尾时\n while fast and fast.next:\n # 慢指针走一步\n slow = slow.next\n # 快指针走两步\n fast = fast.next.next\n \n # 当循环结束时,慢指针正好在中间位置\n return slow\n```\n时间复杂度:O(N)。虽然有两个指针,但我们只对链表进行了一次单向遍历。\n空间复杂度:O(1)。只使用了两个额外的指针变量,没有使用额外的存储空间。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3169886502","body":"双指针/快慢指针\n快的去遍历 慢的维护只出现一次的元素\n```python\nfrom typing import List\n\nclass Solution:\n def removeDuplicates(self, nums: List[int]) -> int:\n # 如果数组为空,直接返回 0\n if not nums:\n return 0\n \n # slow 指针指向下一个将要被赋值的、新的不重复元素的位置。\n # nums[0] 默认是第一个不重复的元素,所以 slow 从 1 开始。\n slow = 1\n \n # fast 指针从第二个元素开始,遍历整个数组\n for fast in range(1, len(nums)):\n if nums[fast] != nums[fast - 1]:\n nums[slow] = nums[fast]\n slow += 1\n \n return slow","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173197055","body":"我们可以用单调队列(双端队列 (deque))来维护窗口内的“候选最大值”,使得获取当前最大值的操作是 O(1) 的\n>双端队列 (deque)\n队列中存储的是数组元素的索引,而不是元素本身。\n队列中的索引所对应的 nums 数组中的值,是从头到尾单调递减的。\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:\n n = len(nums)\n if n * k == 0:\n return []\n \n # 单调队列,存储的是元素的索引\n # 队列中的索引对应的 nums 值是单调递减的\n deque = collections.deque()\n result = []\n\n for i in range(n):\n # 1. 维护单调性:移除队尾所有小于当前值的元素\n while deque and nums[deque[-1]] <= nums[i]:\n deque.pop()\n \n # 2. 当前元素索引入队\n deque.append(i)\n \n # 3. 维护窗口大小:移除已经滑出窗口的队头元素\n if deque[0] <= i - k:\n deque.popleft()\n \n # 4. 记录结果:当窗口完全形成后开始记录\n if i >= k - 1:\n # 队头元素永远是当前窗口的最大值\n result.append(nums[deque[0]])\n \n return result\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3187054447","body":"```python\nfrom typing import List\n\nclass Solution:\n def findJudge(self, n: int, trust: List[List[int]]) -> int:\n # 使用一个数组记录每个人的信任差额\n trust_scores = [0] * (n + 1)\n \n for a, b in trust:\n trust_scores[a] -= 1 # 信任别人,分数-1\n trust_scores[b] += 1 # 被人信任,分数+1\n \n # 寻找分数为 n-1 的法官\n for i in range(1, n + 1):\n if trust_scores[i] == n - 1:\n return i\n \n return -1\n```\n时间复杂度: O(n + m), m为trust列表长度\n空间复杂度: O(n)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/33#issuecomment-3187045338","body":"这道题的本质是判断一个图是否为二分图 (Bipartite Graph)。\n n 个人看作是图的 n 个节点 (Vertex),每一对 dislike关系 [a, b] 看作是连接节点 a 和 b 的一条无向边 (Edge)。\n判断由人和他们之间的“不喜欢”关系构成的图,是否是一个二分图。\nDFS着色\n```python\nfrom typing import List\n\nclass Solution:\n def possibleBipartition(self, n: int, dislikes: List[List[int]]) -> bool:\n # 1. 构建图的邻接表\n graph = [[] for _ in range(n + 1)]\n for u, v in dislikes:\n graph[u].append(v)\n graph[v].append(u)\n \n # 2. 创建 colors 数组,0:未着色, 1:颜色A, -1:颜色B\n colors = [0] * (n + 1)\n \n # 3. 遍历所有节点\n for i in range(1, n + 1):\n # 如果节点未被着色,从它开始进行DFS\n if colors[i] == 0:\n if not self.dfs(i, 1, colors, graph):\n return False\n \n return True\n\n def dfs(self, node: int, color: int, colors: List[int], graph: List[List[int]]) -> bool:\n # 给当前节点染色\n colors[node] = color\n \n # 遍历所有邻居\n for neighbor in graph[node]:\n # 如果邻居颜色与当前节点相同,产生冲突\n if colors[neighbor] == color:\n return False\n # 如果邻居未被染色,对其进行DFS\n if colors[neighbor] == 0:\n # 给邻居染上相反的颜色\n if not self.dfs(neighbor, -color, colors, graph):\n return False\n \n return True\n```\nBFS着色\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def possibleBipartition(self, n: int, dislikes: List[List[int]]) -> bool:\n # 1. 构建图的邻接表\n graph = [[] for _ in range(n + 1)]\n for u, v in dislikes:\n graph[u].append(v)\n graph[v].append(u)\n \n # 2. 创建 colors 数组\n colors = [0] * (n + 1)\n \n # 3. 遍历所有节点\n for i in range(1, n + 1):\n if colors[i] == 0: # 未被染色,开始BFS\n queue = collections.deque([i])\n colors[i] = 1 # 染上颜色A\n \n while queue:\n node = queue.popleft()\n # 遍历邻居\n for neighbor in graph[node]:\n # 如果邻居颜色与当前节点相同,冲突\n if colors[neighbor] == colors[node]:\n return False\n # 如果邻居未染色,染上相反颜色并入队\n if colors[neighbor] == 0:\n colors[neighbor] = -colors[node]\n queue.append(neighbor)\n \n return True\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/34#issuecomment-3187051602","body":"双层拓扑排序 关键在于排序的规则\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def sortItems(self, n: int, m: int, group: List[int], beforeItems: List[List[int]]) -> List[int]:\n \n # 1. 数据预处理:为没有团队的项目分配新团队ID\n new_group_id = m\n for i in range(n):\n if group[i] == -1:\n group[i] = new_group_id\n new_group_id += 1\n \n num_groups = new_group_id\n\n # 2. 构建项目图和团队图及其入度数组\n item_graph = [[] for _ in range(n)]\n item_indegree = [0] * n\n group_graph = [[] for _ in range(num_groups)]\n group_indegree = [0] * num_groups\n\n for i in range(n):\n for prev_item in beforeItems[i]:\n # 项目图依赖\n item_graph[prev_item].append(i)\n item_indegree[i] += 1\n \n # 如果属于不同团队,则产生团队图依赖\n if group[prev_item] != group[i]:\n group_graph[group[prev_item]].append(group[i])\n group_indegree[group[i]] += 1\n\n # 3. 通用的拓扑排序函数\n def topological_sort(graph, indegree):\n num_nodes = len(graph)\n queue = collections.deque([i for i in range(num_nodes) if indegree[i] == 0])\n sorted_order = []\n while queue:\n u = queue.popleft()\n sorted_order.append(u)\n for v in graph[u]:\n indegree[v] -= 1\n if indegree[v] == 0:\n queue.append(v)\n \n return sorted_order if len(sorted_order) == num_nodes else []\n\n # 4. 执行两次拓扑排序\n item_order = topological_sort(item_graph, item_indegree)\n group_order = topological_sort(group_graph, group_indegree)\n\n if not item_order or not group_order:\n return []\n\n # 5. 合并结果\n # a. 将排好序的项目按团队分组\n items_by_group = collections.defaultdict(list)\n for item in item_order:\n items_by_group[group[item]].append(item)\n \n # b. 根据团队顺序,拼接项目\n final_result = []\n for group_id in group_order:\n final_result.extend(items_by_group[group_id])\n \n return final_result\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3193081347","body":"模拟\n```python\nclass Solution:\n def judgeCircle(self, moves: str) -> bool:\n # 初始化坐标\n x, y = 0, 0\n \n # 遍历每一步\n for move in moves:\n if move == 'U':\n y += 1\n elif move == 'D':\n y -= 1\n elif move == 'L':\n x -= 1\n elif move == 'R':\n x += 1\n \n # 检查最终位置是否为原点\n return x == 0 and y == 0\n```\n或者直接看字符串里面是否满足U==D, L==R\n```python\nclass Solution:\n def judgeCircle(self, moves: str) -> bool:\n # Python 的 count() 方法让这个思路的实现非常简洁\n # 检查向上和向下的步数是否相等\n vertical_balance = (moves.count('U') == moves.count('D'))\n \n # 检查向左和向右的步数是否相等\n horizontal_balance = (moves.count('L') == moves.count('R'))\n \n return vertical_balance and horizontal_balance\n```\n两个复杂度是一样的\n时间复杂度:O(N)\n空间复杂度:O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193084373","body":"排序 + 最小堆\nmin_heap存放已到达但未执行的任务(processingTime, original_index) 按照时间、索引排序\n```python\nimport heapq\nfrom typing import List\n\nclass Solution:\n def getOrder(self, tasks: List[List[int]]) -> List[int]:\n # 1. 数据预处理:附加原始索引并按入队时间排序\n # tasks_with_indices 的格式: [[enqueueTime, processingTime, original_index], ...]\n tasks_with_indices = sorted(\n [(tasks[i][0], tasks[i][1], i) for i in range(len(tasks))]\n )\n \n result_order = []\n min_heap = [] # 优先队列,存储 (processingTime, original_index)\n \n task_pointer = 0 # 指向下一个要检查的任务\n current_time = 0 # 当前时间\n \n # 当还有任务未处理或未入队时,循环继续\n while task_pointer < len(tasks) or min_heap:\n \n # 如果CPU空闲且没有任务在等待,快进到下一个任务的到达时间\n if not min_heap and current_time < tasks_with_indices[task_pointer][0]:\n current_time = tasks_with_indices[task_pointer][0]\n\n # 2. 将所有已到达的任务加入最小堆\n while task_pointer < len(tasks) and tasks_with_indices[task_pointer][0] <= current_time:\n enqueue_time, process_time, original_index = tasks_with_indices[task_pointer]\n heapq.heappush(min_heap, (process_time, original_index))\n task_pointer += 1\n \n # 3. 从堆中取出最优任务执行\n if min_heap:\n process_time, original_index = heapq.heappop(min_heap)\n current_time += process_time\n result_order.append(original_index)\n \n return result_order\n```\n复杂度:假设N个任务,那么时间复杂度是O(NlogN)有排序造成的,空间是O(N) tasks列表和min_heap都需要O(N)的空间","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3204406944","body":"a->c,需要len(a) - a中c的个数\nb->c需要len(b) - b中c的个数\n我们需要考虑len(a) + len(b) - (a中c的个数 + b中c的个数)\n此外还可以优化一下\n如果a= c 的字符。\nb 中需要改变的,是那些 < c 的字符。\na>=b同理\n```python\nimport collections\n\nclass Solution:\n def minCharacters(self, a: str, b: str) -> int:\n n, m = len(a), len(b)\n freq_a = collections.Counter(a)\n freq_b = collections.Counter(b)\n\n # --- 计算条件 3 的最小代价 ---\n # 代价 = 总长度 - 两个字符串中某个字符的最大总频次\n max_combined_freq = 0\n for i in range(26):\n char = chr(ord('a') + i)\n max_combined_freq = max(max_combined_freq, freq_a[char] + freq_b[char])\n \n cost3 = n + m - max_combined_freq\n\n # --- 计算条件 1 (a < b) 和 条件 2 (b < a) 的最小代价 ---\n cost1 = float('inf') # a < b\n cost2 = float('inf') # b < a\n \n # 使用前缀/后缀和的思想来优化计数\n a_lt_count = 0 # a 中 < 当前分界线的字符数\n b_lt_count = 0\n \n # 遍历所有 25 个可能的分界线 ('b' 到 'z')\n for i in range(25):\n char = chr(ord('a') + i)\n a_lt_count += freq_a[char]\n b_lt_count += freq_b[char]\n \n # 分界线是 char_next = chr(ord('a') + i + 1)\n # 条件 1 (a < char_next, b >= char_next):\n # - a 中要改的是 >= char_next 的, 即 (n - a_lt_count)\n # - b 中要改的是 < char_next 的, 即 b_lt_count\n current_cost1 = (n - a_lt_count) + b_lt_count\n cost1 = min(cost1, current_cost1)\n \n # 条件 2 (b < char_next, a >= char_next):\n # - b 中要改的是 >= char_next 的, 即 (m - b_lt_count)\n # - a 中要改的是 < char_next 的, 即 a_lt_count\n current_cost2 = (m - b_lt_count) + a_lt_count\n cost2 = min(cost2, current_cost2)\n\n return min(cost1, cost2, cost3)\n```\n时间复杂度:O(N+M),其中 N 和 M 分别是两个字符串的长度。\n空间复杂度:O(1),大小为 26 的频率表\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3208576782","body":"堆排序\n```python\nclass Solution:\n def sortArray(self, nums: List[int]) -> List[int]:\n def heapify(nums, n, i):\n largest = i\n left = 2 * i + 1\n right = 2 * i + 2\n\n if left < n and nums[left] > nums[largest]:\n largest = left\n if right < n and nums[right] > nums[largest]:\n largest = right\n if largest != i:\n nums[i], nums[largest] = nums[largest], nums[i]\n heapify(nums, n, largest)\n\n n = len(nums)\n for i in range(n // 2 - 1, -1, -1):\n heapify(nums, n, i)\n\n for i in range(n - 1, 0, -1):\n nums[i], nums[0] = nums[0], nums[i]\n heapify(nums, i, 0)\n```\n时间复杂度:O(NlogN)\n空间复杂度:O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3208555582","body":"二分\n```python\nclass Solution:\n def mySqrt(self, x: int) -> int:\n\n if x == 0:\n return 0\n \n # 定义二分查找的左右边界\n left, right = 0, x\n ans = 0\n \n while left <= right:\n # 计算中间值\n mid = left + (right - left) // 2\n \n # 避免 mid 为 0 的情况,或者直接判断 mid * mid\n if mid == 0:\n left = mid + 1\n continue\n \n # 比较 mid 的平方与 x\n # 为了防止 mid * mid 溢出(在某些语言中),可以写成 mid <= x / mid\n if mid * mid > x:\n # mid 太大,搜索左半部分\n right = mid - 1\n else:\n # mid 是一个可能的答案,尝试寻找更大的\n ans = mid\n left = mid + 1\n \n return ans\n```\n时间复杂度:O(logN)\n空间复杂度:O(1)","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3208553626","body":"二分查找\n```python\nclass Solution:\n def firstBadVersion(self, n: int) -> int:\n left, right = 1, n\n \n while left < right:\n mid = left + (right - left) // 2\n \n if isBadVersion(mid):\n # 如果 mid 是坏的,那第一个坏版本在 [left, mid] 区间内\n # 我们不能排除 mid,所以 right = mid\n right = mid\n else:\n # 如果 mid 是好的,那第一个坏版本在 [mid + 1, right] 区间内\n left = mid + 1\n \n return left\n```\n时间复杂度:O(logN)\n空间复杂度:O(1)","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3222475353","body":"排除法\n排除掉卡片的正面和背面是同一个数字 X的卡片\n```python\nfrom typing import List\n\nclass Solution:\n def flipgame(self, fronts: List[int], backs: List[int]) -> int:\n # 1. 找出所有“不可能的”数字\n impossible_nums = set()\n for i in range(len(fronts)):\n if fronts[i] == backs[i]:\n impossible_nums.add(fronts[i])\n \n # 2. 寻找最小的“好”数字\n min_good_num = float('inf')\n found_good_num = False\n \n # 遍历所有出现过的数字\n all_nums = fronts + backs\n \n for num in all_nums:\n # 如果这个数字不是“不可能的”\n if num not in impossible_nums:\n found_good_num = True\n min_good_num = min(min_good_num, num)\n \n # 3. 返回结果\n return min_good_num if found_good_num else 0\n```\n时间复杂度:O(N),其中 N 是卡片的数量。\n空间复杂度:O(N)。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3222461055","body":"二分 + DFS/BFS\n```python\nfrom typing import List\n\nclass Solution:\n def swimInWater(self, grid: List[List[int]]) -> int:\n n = len(grid)\n left, right = grid[0][0], n * n - 1\n ans = right\n\n def is_possible(t):\n # 检查在时间 t 是否能从 (0,0) 到达 (n-1, n-1)\n if grid[0][0] > t:\n return False\n \n stack = [(0, 0)]\n visited = {(0, 0)}\n \n while stack:\n r, c = stack.pop()\n if r == n - 1 and c == n - 1:\n return True\n \n for dr, dc in [(0, 1), (0, -1), (1, 0), (-1, 0)]:\n nr, nc = r + dr, c + dc\n if 0 <= nr < n and 0 <= nc < n and (nr, nc) not in visited and grid[nr][nc] <= t:\n visited.add((nr, nc))\n stack.append((nr, nc))\n return False\n\n while left <= right:\n mid = left + (right - left) // 2\n if is_possible(mid):\n ans = mid\n right = mid - 1\n else:\n left = mid + 1\n \n return ans\n```\n时间复杂度:O($n^2logn$)\n空间复杂度:O($n^2$)\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3222456504","body":"Sliding Window\n维护一个固定大小为 k 的窗口,在字符串上滑动。当窗口向右移动一格时,只需要考虑移出窗口的字符和移入窗口的字符对元音数量的影响即可。\n```python\nfrom typing import List\n\nclass Solution:\n def maxVowels(self, s: str, k: int) -> int:\n vowels = {'a', 'e', 'i', 'o', 'u'}\n \n # 1. 初始化:计算第一个窗口的元音数\n current_vowels = 0\n for i in range(k):\n if s[i] in vowels:\n current_vowels += 1\n \n max_vowels = current_vowels\n \n # 2. 滑动窗口\n # 从第 k 个字符开始,模拟窗口向右滑动\n for i in range(k, len(s)):\n # a. 处理新移入的字符 s[i]\n if s[i] in vowels:\n current_vowels += 1\n \n # b. 处理被移出的字符 s[i-k]\n if s[i-k] in vowels:\n current_vowels -= 1\n \n # c. 更新最大值\n max_vowels = max(max_vowels, current_vowels)\n \n return max_vowels\n```\n时间复杂度:O(N)\n空间复杂度:O(1)\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/47#issuecomment-3232274052","body":"动态规划 + 滑动窗口\n定义 dp[i] 为:爱丽丝最终得分恰好为 i 的概率,最后要计算$\\sum_i=k^n dp[i]$,dp[0] = 1\n```python\nclass Solution:\n def new21Game(self, n: int, k: int, maxPts: int) -> float:\n # 如果 k=0,开始就是 >=k,游戏直接结束,得分为0,概率为1\n if k == 0:\n return 1.0\n \n # dp[i] 表示得到分数 i 的概率\n dp = [0.0] * (n + 1)\n dp[0] = 1.0\n \n # window_sum 维护一个大小为 maxPts 的滑动窗口内 dp 值的和\n window_sum = 1.0\n result = 0.0\n \n for i in range(1, n + 1):\n # 计算 dp[i]\n dp[i] = window_sum / maxPts\n \n # 如果 i < k,dp[i] 会对后续的 dp 值产生贡献,加入窗口\n if i < k:\n window_sum += dp[i]\n \n # 如果 i >= k,这是一个最终得分,累加到结果中\n # 注意:题目求的是 <= n 的概率,而 dp 数组只到 n,所以循环内累加即可\n if i >= k:\n result += dp[i]\n \n # 如果 i >= maxPts,需要将滑出窗口的 dp 值减去\n if i >= maxPts:\n window_sum -= dp[i - maxPts]\n \n return result\n```\n时间复杂度:O(n)。我们只对 dp 数组进行了一次遍历。\n空间复杂度:O(n)。用于存储 dp 数组。","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/48#issuecomment-3232278119","body":"滑动窗口 + 字符频率统计\n```python\nfrom typing import List\n\nclass Solution:\n def findAnagrams(self, s: str, p: str) -> List[int]:\n s_len, p_len = len(s), len(p)\n \n # 边缘情况:如果 s 比 p 短,不可能找到异位词\n if s_len < p_len:\n return []\n \n result = []\n # 使用大小为 26 的数组作为频率统计表\n p_counts = [0] * 26\n s_window_counts = [0] * 26\n \n # 1. & 2. 初始化 p 的频率表和 s 的第一个窗口的频率表\n for i in range(p_len):\n p_counts[ord(p[i]) - ord('a')] += 1\n s_window_counts[ord(s[i]) - ord('a')] += 1\n \n # 3. 第一次比较\n if p_counts == s_window_counts:\n result.append(0)\n \n # 4. 滑动窗口\n for i in range(p_len, s_len):\n # a. 移入新字符\n s_window_counts[ord(s[i]) - ord('a')] += 1\n # b. 移出旧字符\n s_window_counts[ord(s[i - p_len]) - ord('a')] -= 1\n \n # c. 再次比较\n if p_counts == s_window_counts:\n # 当前窗口的起始索引是 i - p_len + 1\n result.append(i - p_len + 1)\n \n return result\n```\n时间复杂度:O(textlen(s)+textlen(p))\n空间复杂度:O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/49#issuecomment-3235951126","body":"用一个 right 指针不断地扩展窗口,直到窗口内的子串满足了“包含 t 中所有字符”的条件。一旦窗口满足条件,就记录下这个“可行解”,然后开始移动 left 指针,收缩窗口\n```python\nimport collections\n\nclass Solution:\n def minWindow(self, s: str, t: str) -> str:\n # need 存储 t 中字符的需求数量\n need = collections.Counter(t)\n # window 存储当前窗口中字符的数量\n window = collections.Counter()\n\n left, right = 0, 0\n valid = 0 # 记录 window 中有多少字符已经满足了 need 的要求\n \n # 记录最小覆盖子串的起始索引和长度\n start = 0\n min_len = float('inf')\n\n while right < len(s):\n # c 是将移入窗口的字符\n c = s[right]\n right += 1\n \n # 扩展窗口\n if c in need:\n window[c] += 1\n if window[c] == need[c]:\n valid += 1\n \n # 判断左侧窗口是否要收缩\n while valid == len(need):\n # 在这里更新最小覆盖子串\n if right - left < min_len:\n start = left\n min_len = right - left\n\n # d 是将移出窗口的字符\n d = s[left]\n left += 1\n \n # 收缩窗口\n if d in need:\n if window[d] == need[d]:\n valid -= 1\n window[d] -= 1\n\n # 返回最小覆盖子串,如果 min_len 还是初始值,说明没有找到\n return \"\" if min_len == float('inf') else s[start : start + min_len]\n```\n时间复杂度: O(len(s)+len(t))\n空间复杂度: O(N), N是字符集的大小","onTime":true},null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3244023262","body":"dfs\n```python\nfrom typing import List\n\nclass Solution:\n def maxAreaOfIsland(self, grid: List[List[int]]) -> int:\n if not grid:\n return 0\n \n rows, cols = len(grid), len(grid[0])\n max_area = 0\n \n def dfs(r, c):\n # 边界条件检查 & 终止条件 (遇到水或已访问过的陆地)\n if not (0 <= r < rows and 0 <= c < cols and grid[r][c] == 1):\n return 0\n \n # 将当前单元格标记为已访问 (沉岛)\n grid[r][c] = 0\n \n # 当前单元格面积为 1,并递归探索四个方向\n return (1 + dfs(r + 1, c) +\n dfs(r - 1, c) +\n dfs(r, c + 1) +\n dfs(r, c - 1))\n\n # 遍历整个网格\n for r in range(rows):\n for c in range(cols):\n if grid[r][c] == 1:\n current_area = dfs(r, c)\n max_area = max(max_area, current_area)\n \n return max_area\n```\n时间复杂度O(MN)\n空间复杂度最坏O(MN)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/54#issuecomment-3251910064","body":"Multi-Source BFS\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def maxDistance(self, grid: List[List[int]]) -> int:\n n = len(grid)\n queue = collections.deque()\n \n # 1. 初始化:将所有陆地加入队列\n for r in range(n):\n for c in range(n):\n if grid[r][c] == 1:\n queue.append((r, c))\n \n # 边缘情况:如果全是陆地或全是海洋\n if len(queue) == 0 or len(queue) == n * n:\n return -1\n \n distance = -1\n # 2. 多源 BFS\n while queue:\n distance += 1\n # 遍历当前层的所有节点\n for _ in range(len(queue)):\n r, c = queue.popleft()\n \n # 探索四个方向的邻居\n for dr, dc in [(0, 1), (0, -1), (1, 0), (-1, 0)]:\n nr, nc = r + dr, c + dc\n \n if 0 <= nr < n and 0 <= nc < n and grid[nr][nc] == 0:\n grid[nr][nc] = 1 # 标记为已访问\n queue.append((nr, nc))\n \n return distance\n```\n时间复杂度:O(N^2)\n空间复杂度:O(N^2)\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/55#issuecomment-3251914219","body":"模拟+bfs\n```python\nimport collections\nfrom typing import List\n\nclass Solution:\n def maxCandies(self, status: List[int], candies: List[int], keys: List[List[int]], containedBoxes: List[List[int]], initialBoxes: List[int]) -> int:\n \n total_candies = 0\n \n # 我们拥有的、但未打开的盒子\n my_closed_boxes = set()\n # 可以打开并处理的盒子队列\n queue = collections.deque()\n\n # 初始化\n for box_idx in initialBoxes:\n if status[box_idx] == 1:\n queue.append(box_idx)\n else:\n my_closed_boxes.add(box_idx)\n\n while queue:\n box_idx = queue.popleft()\n \n # 1. 拿糖果\n total_candies += candies[box_idx]\n \n # 2. 拿钥匙,并用新钥匙尝试打开已有的盒子\n for key in keys[box_idx]:\n status[key] = 1 \n if key in my_closed_boxes:\n queue.append(key)\n my_closed_boxes.remove(key)\n \n # 3. 拿新盒子\n for contained_box in containedBoxes[box_idx]:\n if status[contained_box] == 1:\n queue.append(contained_box)\n else:\n my_closed_boxes.add(contained_box)\n \n return total_candies\n```\n时间复杂度: O(盒子数+钥匙数+内涵盒子数)\n\n空间复杂度: O(盒子数)。最坏情况下要存储所有盒子的信息。\n\n","onTime":true},null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/57#issuecomment-3260205356","body":"dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])\n```python\nclass Solution:\n def minCostClimbingStairs(self, cost: List[int]) -> int:\n n = len(cost)\n dp = [0] * (n + 1)\n \n # dp[0] 和 dp[1] 默认为 0,因为可以从这两级开始\n \n # 从第 2 级台阶开始,应用转移方程\n for i in range(2, n + 1):\n dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])\n \n return dp[n]\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/58#issuecomment-3276673110","body":"dp[i] = max(nums[i-1] + dp[i-2], dp[i-1])\n\n```python\nclass Solution:\n def rob(self, nums: List[int]) -> int:\n n = len(nums)\n if n == 0: return 0\n if n == 1: return nums[0]\n \n dp = [0] * (n + 1)\n dp[0] = 0\n dp[1] = nums[0]\n \n for i in range(2, n + 1):\n dp[i] = max(nums[i-1] + dp[i-2], dp[i-1])\n \n return dp[n]\n```\n可以优化到只依赖前两个状态来节省内存空间\n```python\nfrom typing import List\n\nclass Solution:\n def rob(self, nums: List[int]) -> int:\n # rob_prev 代表 dp[i-2],rob_curr 代表 dp[i-1]\n rob_prev, rob_curr = 0, 0\n \n for num in nums:\n # 计算 dp[i] = max(num + dp[i-2], dp[i-1])\n temp = max(num + rob_prev, rob_curr)\n # 更新状态,为下一次循环做准备\n rob_prev = rob_curr\n rob_curr = temp\n \n return rob_curr\n```\n时间复杂度: O(N)\n空间复杂度: O(1)\n\n\n\n\n\n\n","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/59#issuecomment-3276687323","body":"dp[i] = 1 + max(dp[j]),其中 0 <= j < i 且 nums[j] < nums[i]。\n```python\nfrom typing import List\n\nclass Solution:\n def findNumberOfLIS(self, nums: List[int]) -> int:\n n = len(nums)\n if n <= 1:\n return n\n \n # lengths[i]: 以 nums[i] 结尾的 LIS 长度\n # counts[i]: 以 nums[i] 结尾的 LIS 个数\n lengths = [1] * n\n counts = [1] * n\n\n # 填充 DP 数组\n for i in range(n):\n for j in range(i):\n if nums[j] < nums[i]:\n # 情况一:发现更长的子序列\n if lengths[j] + 1 > lengths[i]:\n lengths[i] = lengths[j] + 1\n counts[i] = counts[j] # 路径数继承\n # 情况二:发现另一条同样长的子序列\n elif lengths[j] + 1 == lengths[i]:\n counts[i] += counts[j] # 路径数累加\n\n max_len = max(lengths)\n result = 0\n for i in range(n):\n if lengths[i] == max_len:\n result += counts[i]\n \n return result\n```\n时间复杂度: O(N^2)\n\n空间复杂度: O(N)\n\n","onTime":false},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/62#issuecomment-3276694316","body":"dp[r][c] =骑士当前位于棋盘上 (r, c) 位置的概率\n从 (r, c) 出发,能为下一个状态 dp_curr 中的 (nr, nc) 贡献 dp_prev[r][c] / 8 的概率\ndp_curr[nr][nc]=\\sum dp(nr, nc)\n```python\nfrom typing import List\n\nclass Solution:\n def knightProbability(self, n: int, k: int, row: int, column: int) -> float:\n # dp[r][c] 表示骑士在 (r, c) 位置的概率\n dp = [[0.0] * n for _ in range(n)]\n dp[row][column] = 1.0\n \n # 骑士的8个移动方向\n moves = [(-2, -1), (-2, 1), (-1, -2), (-1, 2),\n (1, -2), (1, 2), (2, -1), (2, 1)]\n \n # 迭代 k 步\n for _ in range(k):\n # dp_next 用于存储下一步的概率分布\n dp_next = [[0.0] * n for _ in range(n)]\n \n # 遍历棋盘上所有位置\n for r in range(n):\n for c in range(n):\n # 如果当前位置有概率 > 0\n if dp[r][c] > 0:\n # 尝试8种移动\n for dr, dc in moves:\n nr, nc = r + dr, c + dc\n \n # 如果移动后的位置在棋盘内\n if 0 <= nr < n and 0 <= nc < n:\n # 将概率贡献给下一个状态\n dp_next[nr][nc] += dp[r][c] / 8.0\n \n # 用新状态覆盖旧状态\n dp = dp_next\n \n # 计算最终仍在棋盘上的总概率\n total_probability = sum(sum(row) for row in dp)\n return total_probability\n```\n时间复杂度 O(kn^2)\n空间复杂度: O(n^2)","onTime":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"gjwang224":[{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/4#issuecomment-3086564307","body":"## Code\n```cpp\nclass Solution {\npublic:\n vector addToArrayForm(vector& num, int k) {\n int len = num.size()-1;\n vector returnNum;\n int tmp=0;\n \n while(k && len>=0){\n returnNum.push_back((num[len] + k%10 + tmp)%10);\n tmp = (num[len] + k%10 + tmp)/10;\n len--;\n k = k/10;\n }\n\n while(k){\n returnNum.push_back((k%10 + tmp)%10);\n tmp = (k%10 + tmp)/10;\n k = k/10;\n }\n \n while(len>=0){\n returnNum.push_back((num[len] + tmp)%10);\n tmp = (num[len] + tmp)/10;\n len--;\n }\n \n if(tmp) returnNum.push_back(tmp);\n reverse(returnNum.begin(), returnNum.end());\n return returnNum;\n }\n};","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/5#issuecomment-3093190969","body":"#### C++\n``` C++\nclass Solution {\npublic:\n vector shortestToChar(string s, char c) {\n vector dis, rearr;\n for(int i = 0; i < s.size(); i++) if(s.at(i) == c) dis.push_back(i);\n for(int i = 0; i < s.size(); i++){\n int minn = 1e5+5;\n for(int j = 0; j < dis.size(); j++){\n minn = min(minn, abs(i-dis.at(j)));\n }\n rearr.push_back(minn);\n }\n return rearr;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/6#issuecomment-3087031064","body":"### C++ 代码\n``` C++\nclass CustomStack {\npublic:\n int stack[1005];\n int size = -1, mS;\n CustomStack(int maxSize) {\n mS = maxSize;\n }\n \n void push(int x) {\n if(size < mS-1){\n stack[++size] = x;\n }\n }\n \n int pop() {\n if(size < 0) return -1;\n else return stack[size--];\n }\n \n void increment(int k, int val) {\n for(int i = 0; i < k; i++){\n stack[i] += val;\n }\n }\n};\n\n/**\n * Your CustomStack object will be instantiated and called as such:\n * CustomStack* obj = new CustomStack(maxSize);\n * obj->push(x);\n * int param_2 = obj->pop();\n * obj->increment(k,val);\n */\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/7#issuecomment-3086899860","body":"### 思路 \n遍历整个字符串,总共有四种可能,分别是 数字 字母 左括号 右括号\n1. 数字:定义`digit`存储读取到的数字\n2. 字母:可以直接读取累加至`res`\n3. 左括号:需要将前面的`res`和`digit`分别入栈,并将其赋为0和”“\n4. 右括号:读取栈顶元素,循环拼接后,累加至`res`\n### C++ 代码\n``` C++\nclass Solution {\npublic:\n string decodeString(string s) {\n stack numStack;\n stack strStack;\n int digit=0;\n string res=\"\";\n\n for(int i = 0; i < s.size(); i++){\n if(s.at(i) >= '0' && s.at(i) <= '9'){// 数字\n digit = digit*10+s.at(i)-'0';\n } else if(s.at(i) >= 'a' && s.at(i) <= 'z'){// 字符\n res += s.at(i);\n } else if(s.at(i) == '['){// 左括号\n numStack.push(digit);\n strStack.push(res);\n res = \"\";\n digit=0;\n } else {// 右括号\n int count = numStack.top();\n numStack.pop();\n string outString = strStack.top();\n strStack.pop();\n for(int i = 0; i < count; i++) outString += res;\n res = outString;\n }\n }\n return res;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/8#issuecomment-3092046146","body":"#### 思路\n\n1. `push`和`empty`可以直接进行操作。\n2. `pop`和 `peek`需要得到入栈的第一个元素,可以使用一个辅助栈,对第一个栈进行出栈同时第二个栈进行入栈操作,这样第二个栈`top`得到的元素就是第一个栈入栈的第一个元素。\n\n``` C++\nclass MyQueue {\npublic:\n stack tmp;\n stack stack;\n MyQueue() {\n }\n \n void push(int x) {\n tmp.push(x);\n }\n \n int pop() {\n while(!tmp.empty()){\n stack.push(tmp.top());\n tmp.pop();\n }\n int a = stack.top();\n stack.pop();\n while(!stack.empty()){\n tmp.push(stack.top());\n stack.pop();\n }\n return a;\n }\n \n int peek() {\n while(!tmp.empty()){\n stack.push(tmp.top());\n tmp.pop();\n }\n int a = stack.top();\n while(!stack.empty()){\n tmp.push(stack.top());\n stack.pop();\n }\n return a;\n }\n \n bool empty() {\n return tmp.empty();\n }\n};\n\n/**\n * Your MyQueue object will be instantiated and called as such:\n * MyQueue* obj = new MyQueue();\n * obj->push(x);\n * int param_2 = obj->pop();\n * int param_3 = obj->peek();\n * bool param_4 = obj->empty();\n */\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/9#issuecomment-3094511890","body":"#### 哈希\n\n```c++\nclass Solution {\npublic:\n int maxChunksToSorted(vector& arr) {\n unordered_map ans;\n vector tmp = arr;\n sort(tmp.begin(), tmp.end());\n int cnt=0;\n for(int i = 0; i < arr.size(); i++){\n ans[arr[i]]++;\n ans[tmp[i]]--;\n if(ans[arr[i]]==0) ans.erase(arr[i]);\n if(ans[tmp[i]]==0) ans.erase(tmp[i]);\n if(ans.empty()) cnt++;\n }\n return cnt;\n }\n};\n```\n时间复杂度 nlog(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/10#issuecomment-3095832085","body":"#### 思路\n\n先将链表变为首尾相连循环链表,然后通过`k`找到断开位置的前一个元素,断开,返回头节点即可。\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * struct ListNode *next;\n * };\n */\nstruct ListNode* rotateRight(struct ListNode* head, int k) {\n if(head==NULL || k==0) return head;\n int len=1;\n struct ListNode * p=head;\n if(p) len=1;\n while(p->next){\n len++;\n p = p->next;\n }\n //printf(\"%d\\n\", len);\n p->next = head;\n k = k%len;\n for(int i = 0; i < len-k-1; i++){\n head = head->next;\n }\n p = head->next;\n head->next = NULL;\n return p;\n}\n```\n\n时间复杂度O(n)\n\n空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/11#issuecomment-3102195778","body":"#### C代码\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * struct ListNode *next;\n * };\n */\nstruct ListNode* swapPairs(struct ListNode* head) {\n //struct ListNode Node;\n //Node.next = head;\n //struct ListNode* tmp = &Node;\n struct ListNode* Node=(struct ListNode*)malloc(sizeof(struct ListNode));\n Node->next = head;\n struct ListNode* tmp = Node;\n while(tmp->next && tmp->next->next){\n struct ListNode* first = tmp->next;\n struct ListNode* second = tmp->next->next;\n tmp->next = second;\n first->next = second->next;\n second->next = first;\n tmp = first;\n }\n return Node->next;\n}\n```\n\n时间复杂度O(n)\n\n空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/12#issuecomment-3106692662","body":"#### C++代码\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * ListNode *next;\n * ListNode() : val(0), next(nullptr) {}\n * ListNode(int x) : val(x), next(nullptr) {}\n * ListNode(int x, ListNode *next) : val(x), next(next) {}\n * };\n */\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n TreeNode* sortedListToBST(ListNode* head) {\n if(head==NULL) return NULL;\n int n = 0;\n for(auto p=head; p; p=p->next){\n n++;\n }\n if(n==1) return new TreeNode(head->val);\n auto cur = head;\n for(int i = 0; i < n/2-1; i++) cur = cur->next;\n auto root = new TreeNode(cur->next->val);\n root->right = sortedListToBST(cur->next->next);\n cur->next = NULL;\n root->left = sortedListToBST(head);\n return root;\n }\n};\n```\n\n时间复杂度O(nlog(n))","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/13#issuecomment-3112024319","body":"#### C++代码\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * ListNode *next;\n * ListNode(int x) : val(x), next(NULL) {}\n * };\n */\nclass Solution {\npublic:\n ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {\n if(headA==NULL || headB==NULL) return NULL;\n ListNode *a = headA, *b = headB;\n while(a!=b){\n if(a == NULL) a = headB;\n a = a->next;\n if(b == NULL) b = headA;\n b = b->next;\n }\n return a;\n }\n};\n```\n\n时间复杂度O(n+m)\n\n空间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/14#issuecomment-3116982615","body":"#### C++代码\n\n``` c\n/**\n * Definition for singly-linked list.\n * struct ListNode {\n * int val;\n * ListNode *next;\n * ListNode(int x) : val(x), next(NULL) {}\n * };\n */\nclass Solution {\npublic:\n ListNode *detectCycle(ListNode *head) {\n unordered_map visit;\n while(head){\n visit[head]++;\n if(visit[head]==2) return head;\n head=head->next;\n } \n return NULL;\n }\n};\n```\n\n时间复杂度O(n)\n\n空间复杂度O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/15#issuecomment-3121297965","body":"#### C++代码\n\n- hash表: `unordered_map hash;`\n- 双向链表用来 将`Node` 根据 使用时间 进行排序。靠近左端表示最近使用,靠近右端表示较长时间没有使用。\n\n``` c\nclass LRUCache {\npublic:\n struct Node {\n int key, val;\n Node *prev, *next;\n Node(int _key, int _val): key(_key), val(_val), prev(NULL), next(NULL){}\n }*L, *R; //L头节点 R尾节点\n\n unordered_map hash;\n int n;\n\n void delete_node(Node *p){\n p->next->prev = p->prev;\n p->prev->next = p->next;\n }\n\n void insert_node(Node *p){ //链表头插入\n p->next = L->next;\n L->next->prev = p;\n p->prev = L;\n L->next = p;\n }\n\n LRUCache(int capacity) {\n n = capacity;\n L = new Node(-1, -1);\n R = new Node(-1, -1);\n L->next = R;\n R->prev = L;\n }\n \n int get(int key) {\n if(!hash.count(key)) return -1;\n else{\n auto p = hash[key];\n delete_node(p);\n insert_node(p);\n return p->val;\n }\n }\n \n void put(int key, int value) {\n if(!hash.count(key)){\n if(hash.size()==n){\n auto p = R->prev;\n delete_node(p);\n hash.erase(p->key);\n }\n auto p = new Node(key, value);\n hash[key] = p;\n insert_node(p);\n }else {\n auto p = hash[key];\n p->val = value;\n delete_node(p);\n insert_node(p);\n }\n }\n};\n\n/**\n * Your LRUCache object will be instantiated and called as such:\n * LRUCache* obj = new LRUCache(capacity);\n * int param_1 = obj->get(key);\n * obj->put(key,value);\n */\n```\n\n时间复杂度O(1)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/16#issuecomment-3124142122","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n int maxDepth(TreeNode* root) {\n if(root == NULL) return 0;\n return max(maxDepth(root->left), maxDepth(root->right)) + 1;\n }\n};\n```\n\n时间复杂度O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/17#issuecomment-3125702334","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n bool isSameTree(TreeNode* p, TreeNode* q) {\n if(p==NULL && q==NULL) return true;\n else if(p==NULL && q!=NULL) return false;\n else if(p!=NULL && q==NULL) return false;\n else if(q->val != p->val) return false;\n else return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);\n }\n};\n```\n\n时间复杂度O(n)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/18#issuecomment-3130752830","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n int dfs(TreeNode *root, int sum) {\n if(root == nullptr) return 0;\n int tmp = sum*10+root->val;\n if(root->left==nullptr && root->right==nullptr) return tmp;\n return dfs(root->left, tmp) + dfs(root->right, tmp);\n }\n int sumNumbers(TreeNode* root) {\n return dfs(root, 0);\n }\n};\n```\n\n时间复杂度O(n)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/19#issuecomment-3135775890","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n void dfs(TreeNode* root, int height, int &curVal, int &curHeight){\n if(root==nullptr) return ;\n height++;\n dfs(root->left, height, curVal, curHeight);\n dfs(root->right, height, curVal, curHeight);\n if (height > curHeight) {\n curHeight = height;\n curVal = root->val;\n }\n }\n int findBottomLeftValue(TreeNode* root) {\n int curVal=0, curHeight=0;\n dfs(root, 0, curVal, curHeight);\n return curVal;\n }\n};\n```\n\n\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/20#issuecomment-3139476046","body":"#### C++代码\n\n``` c\nclass Codec {\npublic:\n\n // Encodes a tree to a single string.\n void rserialize(TreeNode* root, string& str) {\n // 前序遍历(中左右,遇到空节点输入None),用逗号隔开\n if (root == NULL) str += \"None,\";\n else {\n str += to_string(root->val) + \",\";\n rserialize(root->left, str);\n rserialize(root->right, str);\n } \n }\n string serialize(TreeNode* root) {\n string ret;\n rserialize(root, ret);\n return ret;\n }\n\n // Decodes your encoded data to tree.\n\n TreeNode* rdeserialize(list& dataArray) {\n if(dataArray.front() == \"None\") {\n dataArray.erase(dataArray.begin());\n return NULL;\n }\n // 前序遍历(中左右)恢复树结构\n TreeNode* root = new TreeNode(stoi(dataArray.front()));\n dataArray.erase(dataArray.begin());\n root->left = rdeserialize(dataArray);\n root->right = rdeserialize(dataArray);\n return root;\n }\n\n TreeNode* deserialize(string data) {\n list dataArray;\n string str;\n // 添加各节点val\n // 按引用传递,按值传递会增加耗时\n for (auto& c : data) {\n if (c == ',') {\n // 以逗号作为节点分割\n dataArray.push_back(str);\n str.clear();\n } else {\n str.push_back(c);\n }\n }\n // 添加尾部节点val\n if (!str.empty()) {\n dataArray.push_back(str);\n str.clear();\n }\n return rdeserialize(dataArray);\n }\n};\n\n\n//参考链接:https://leetcode.cn/problems/serialize-and-deserialize-binary-tree/solutions/1536508/by-peaceful-thompsonfsu-8143/\n```\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/21#issuecomment-3144061296","body":"#### C++代码\n\n``` c\n/**\n * Definition for a binary tree node.\n * struct TreeNode {\n * int val;\n * TreeNode *left;\n * TreeNode *right;\n * TreeNode() : val(0), left(nullptr), right(nullptr) {}\n * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}\n * };\n */\nclass Solution {\npublic:\n // 深度优先搜索函数 参数:当前节点、当前行号、当前列号、存储节点信息的map\n void dfs(TreeNode* node, int row, int col, map>>& colNodes) {\n // 若节点为空,直接返回\n if (node == nullptr) {\n return;\n }\n \n // 记录当前节点的信息:(行号, 值) 存入对应列的列表中\n colNodes[col].push_back({row, node->val});\n \n // 递归处理左子树:行号+1,列号-1\n dfs(node->left, row + 1, col - 1, colNodes);\n \n // 递归处理右子树:行号+1,列号+1\n dfs(node->right, row + 1, col + 1, colNodes);\n }\n\n // 自定义比较函数:用于对同一列的节点进行排序\n static bool compareNodes(const pair& a, const pair& b) {\n // 若行号相同,按节点值从小到大排序\n if (a.first == b.first) {\n return a.second < b.second;\n }\n // 否则按行号从小到大排序\n return a.first < b.first;\n }\n\n vector> verticalTraversal(TreeNode* root) {\n // 存储列号到节点信息的映射:key=列号,value=该列所有节点的(行号, 值)\n map>> colNodes;\n \n // 深度优先遍历树,记录每个节点的位置和值\n dfs(root, 0, 0, colNodes);\n \n // 最终结果容器\n vector> result;\n \n // 遍历每一列\n for (auto& entry : colNodes) {\n // 对当前列的节点按规则排序(使用自定义比较函数)\n sort(entry.second.begin(), entry.second.end(), compareNodes);\n \n // 提取排序后的节点值,组成当前列的结果\n vector colValues;\n for (auto& node : entry.second) {\n colValues.push_back(node.second); // node.second是节点值\n }\n result.push_back(colValues);\n }\n \n return result;\n }\n};\n\n//参考链接:https://leetcode.cn/problems/vertical-order-traversal-of-a-binary-tree/solutions/3739810/dui-wo-lai-shuo-huan-shi-fu-za-liao-xie-iar46/\n\n```\n\n\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/22#issuecomment-3146382948","body":"#### C++代码\n\n``` c\nclass Solution {\npublic:\n vector twoSum(vector& nums, int target) {\n unordered_map hash;\n for(int i = 0; i < nums.size(); i++){\n auto iter = hash.find(target-nums[i]);\n if(iter != hash.end()) return {iter->second, i};\n hash[nums[i]] = i;\n }\n return {};\n }\n};\n```\n\n时间复杂度:O(n)\n\n空间复杂度:O(n)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/23#issuecomment-3148379333","body":"#### C++\n\n``` c\nclass Solution {\npublic:\n vector topKFrequent(vector& nums, int k) {\n vector ans;\n unordered_map f;\n for(int i = 0;i < nums.size();i++) {\n f[nums[i]]++;\n }\n priority_queue, vector >, greater > > q;\n for(auto& [num, count] : f) {\n if(q.size() < k)\n q.push({count, num});\n else {\n if(q.top().first < count) {\n q.pop();\n q.push({count, num});\n }\n }\n }\n while(!q.empty()) {\n //cout<>& points) {\n int result=0;\n for(vector P : points){\n unordered_map map;\n for(vector Q : points){\n int dis = (P[0]-Q[0])*(P[0]-Q[0])+(P[1]-Q[1])*(P[1]-Q[1]);\n map[dis]++;\n }\n for(auto [a,b] : map){\n result+=b*(b-1);\n }\n }\n return result;\n }\n};\n```\n\n时间复杂度:O(n2)\n空间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/25#issuecomment-3154861022","body":"``` c\nclass Solution {\npublic:\n int lengthOfLongestSubstring(string s) {\n unordered_map dic;\n int i = -1, res = 0, len = s.size();\n for(int j = 0; j < len; j++) {\n if (dic.find(s[j]) != dic.end())\n i = max(i, dic.find(s[j])->second);\n dic[s[j]] = j;\n res = max(res, j - i);\n }\n return res;\n }\n};\n```\n\n时间复杂度:O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/26#issuecomment-3158408178","body":"\n\n``` c\nclass Solution {\npublic:\n vector findSubstring(string s, vector& words) {\n unordered_map hash;\n vector res;\n int n = s.length(), m = words.size();\n if (n == 0 || m == 0)\n return res;\n int len = words[0].length(), end = n - m * len;\n if (n < m * len)\n return res;\n for (auto word : words)\n hash[word]++;\n int size = hash.size();\n for (int k = 0; k < len; k++) {\n unordered_map cur_hash;\n int satisfy = 0;\n for (int i = k, j = k; j <= n - len;) {\n string cur = s.substr(j, len);\n if (hash.find(cur) == hash.end()) {\n j = j + len;\n i = j;\n cur_hash.clear();\n satisfy = 0;\n } else {\n cur_hash[cur]++;\n if (cur_hash[cur] == hash[cur])\n satisfy++;\n else if (cur_hash[cur] > hash[cur]) {\n while (i < j && cur_hash[cur] > hash[cur]) {\n string temp = s.substr(i, len);\n i += len;\n cur_hash[temp]--;\n if (cur_hash[temp] == hash[temp] - 1)\n satisfy--;\n }\n }\n if (satisfy == size) {\n string temp = s.substr(i, len);\n cur_hash[temp]--;\n satisfy--;\n res.push_back(i);\n i = i + len;\n }\n j = j + len;\n }\n }\n }\n return res;\n }\n};\n```\n\n时间复杂度O(n^2)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/27#issuecomment-3163210992","body":"\n\n``` c\nclass Solution {\npublic:\n int minSubarray(vector &nums, int p) {\n int n = nums.size(), s[n + 1];\n s[0] = 0;\n for (int i = 0; i < n; i++) s[i + 1] = (s[i] + nums[i]) % p;\n int x = s[n];\n\n int ans = n;\n unordered_map last;\n for (int i = 0; i <= n; ++i) {\n last[s[i]] = i;\n auto it = last.find((s[i] - x + p) % p);\n if (it != last.end()) {\n ans = min(ans, i - it->second);\n }\n }\n return ans < n ? ans : -1;\n }\n};\n```\n\n时间复杂度O(n)\n空间复杂度O(n)","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/28#issuecomment-3167368429","body":"\n\n``` c\nclass Solution {\npublic:\n ListNode* middleNode(ListNode* head) {\n int len = 0;\n ListNode* p = head;\n while (p != nullptr) {\n len++;\n p = p->next;\n }\n int k = 0;\n p = head;\n while (k < len / 2) {\n k++;\n p = p->next;\n }\n return p;\n }\n};\n```\n\n时间复杂度O(n)\n空间复杂度O(1)\n\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/29#issuecomment-3169793378","body":"```c\nclass Solution {\npublic:\n int removeDuplicates(vector& nums) {\n if (nums.empty()) {\n return 0;\n }\n int slow = 0;\n for (int fast = 1; fast < nums.size(); fast++) {\n if (nums[fast] != nums[slow]) {\n slow++;\n nums[slow] = nums[fast];\n }\n }\n return slow + 1;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/30#issuecomment-3172513759","body":"```c\n\nclass Solution {\npublic:\n int searchInsert(vector& nums, int target) {\n int n = nums.size();\n int left = 0, right = n - 1, ans = n;\n while (left <= right) {\n int mid = ((right - left) / 2) + left;\n if (target <= nums[mid]) {\n ans = mid;\n right = mid - 1;\n } else {\n left = mid + 1;\n }\n }\n return ans;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/31#issuecomment-3173606055","body":"```c\nclass Solution {\npublic:\n vector maxSlidingWindow(vector& nums, int k) {\n if(nums.size() == 0 || k == 0) return {};\n deque deque;\n vector res(nums.size() - k + 1);\n for(int j = 0, i = 1 - k; j < nums.size(); i++, j++) {\n if(i > 0 && deque.front() == nums[i - 1])\n deque.pop_front();\n while(!deque.empty() && deque.back() < nums[j])\n deque.pop_back();\n deque.push_back(nums[j]);\n if(i >= 0)\n res[i] = deque.front();\n }\n return res;\n }\n }\n};\n\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/32#issuecomment-3178242802","body":"```c\nclass Solution {\npublic:\n int findJudge(int n, vector>& trust) {\n vector inDegrees(n + 1);\n vector outDegrees(n + 1);\n for (auto& edge : trust) {\n int x = edge[0], y = edge[1];\n ++inDegrees[y];\n ++outDegrees[x];\n }\n for (int i = 1; i <= n; ++i) {\n if (inDegrees[i] == n - 1 && outDegrees[i] == 0) {\n return i;\n }\n }\n return -1;\n }\n};\n\n```","onTime":true},null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/35#issuecomment-3213208919","body":"```C++\nclass Solution {\npublic:\n bool judgeCircle(string moves) {\n int R=0,L=0,U=0,D=0;\n for(int i = 0; i < moves.size(); i++){\n if(moves[i]=='R') R++;\n if(moves[i]=='L') L++;\n if(moves[i]=='U') U++;\n if(moves[i]=='D') D++;\n }\n if(R==L&&U==D) return true;\n else return false;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/36#issuecomment-3193632408","body":"```c\n\nclass Solution {\npublic:\n vector getOrder(vector>& tasks) {\n long now = 0; \n priority_queue, vector>, greater> >entry, ready;\n int size = tasks.size();\n\n for (int i = 0; i < size; ++i){\n entry.push(make_pair(tasks[i][0], i));\n }\n\n vector res;\n while(!entry.empty() or !ready.empty()){\n if (ready.empty()){\n now = entry.top().first;\n while (!entry.empty() && now == entry.top().first){ \n ready.push(make_pair(tasks[entry.top().second][1], entry.top().second));\n entry.pop();\n }\n }\n res.emplace_back(ready.top().second);\n now += ready.top().first;\n ready.pop();\n\n while(!entry.empty() && entry.top().first <= now){ \n ready.push(make_pair(tasks[entry.top().second][1], entry.top().second));\n entry.pop();\n }\n }\n\n return res;\n }\n};\n\n```\n","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/37#issuecomment-3213243204","body":"```C++\nclass Solution {\npublic:\n int numberOfRounds(string startTime, string finishTime) {\n // 转化为分钟\n int t0 = 60 * stoi(startTime.substr(0, 2)) + stoi(startTime.substr(3, 2));\n int t1 = 60 * stoi(finishTime.substr(0, 2)) + stoi(finishTime.substr(3, 2));\n if (t1 < t0){\n t1 += 1440;\n }\n // 第一个小于等于 finishTime 的完整对局的结束时间\n t1 = t1 / 15 * 15;\n return max(0, (t1 - t0)) / 15;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/38#issuecomment-3213232703","body":"```C++\nclass Solution {\npublic:\n int minCharacters(string a, string b) {\n int n = a.size(), m = b.size();\n vector cntA(26, 0), cntB(26, 0);\n for (char c : a)\n ++cntA[c - 'a'];\n for (char c : b)\n ++cntB[c - 'a'];\n\n // 计算前缀和\n vector preA(27, 0), preB(27, 0);\n for (int i = 0; i < 26; ++i) {\n preA[i + 1] = preA[i] + cntA[i];\n preB[i + 1] = preB[i] + cntB[i];\n }\n\n int ans = INT_MAX;\n\n // 条件 1\n for (int k = 1; k < 26; ++k) {\n int costA = n - preA[k];\n int costB = preB[k];\n ans = min(ans, costA + costB);\n }\n\n // 条件 2\n for (int k = 0; k < 25; ++k) {\n int costA = preA[k + 1];\n int costB = m - preB[k + 1];\n ans = min(ans, costA + costB);\n }\n\n // 条件 3\n for (int ch = 0; ch < 26; ++ch) {\n int costA = n - cntA[ch];\n int costB = m - cntB[ch];\n ans = min(ans, costA + costB);\n }\n\n return ans;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/39#issuecomment-3213189716","body":"```c++\nclass Solution {\npublic:\n vector sortArray(vector& nums) {\n if (nums.empty()) return nums;\n quickSort(nums, 0, static_cast(nums.size()) - 1);\n return nums;\n }\n\nprivate:\n void quickSort(vector& nums, int l, int r) {\n if (l >= r) return;\n int p = partition(nums, l, r);\n quickSort(nums, l, p - 1);\n quickSort(nums, p + 1, r);\n }\n\n int partition(vector& nums, int l, int r) {\n int idx = l + rand() % (r - l + 1);\n swap(nums[idx], nums[r]);\n int pivot = nums[r];\n\n int i = l - 1;\n for (int j = l; j < r; ++j) {\n if (nums[j] < pivot) {\n ++i;\n swap(nums[i], nums[j]);\n }\n }\n swap(nums[i + 1], nums[r]);\n return i + 1;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/40#issuecomment-3213176894","body":"```c++\nclass Solution {\npublic:\n int mySqrt(int x) {\n int l = 0, r = x, ans=0;\n while(l<=r){\n int mid = l + (r-l)/2;\n if((long long)mid*mid<=x){\n ans = mid;\n l = mid+1;\n } else{\n //ans = mid;\n r = mid-1;\n }\n \n }\n return ans;\n }\n};\n```","onTime":false},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/41#issuecomment-3213126368","body":"```c++\nclass Solution {\npublic:\n int firstBadVersion(int n) {\n int l = 1, r = n;\n while(l w;\n\n int reversePairs(vector& nums) {\n return merge_sort(nums, 0, nums.size()-1);\n }\n\n int merge_sort(vector &nums, int l, int r) {\n if(l>=r) return 0;\n int mid = l+r>>1;\n int res = merge_sort(nums, l, mid) + merge_sort(nums, mid+1, r);\n for(int i = l, j = mid+1; i <= mid; i++){\n while(j<=r && nums[j]*2ll& houses, vector& heaters) {\n for (int i = 0, j = 0; i < houses.size(); i ++ ) {\n while (j < heaters.size() && abs(heaters[j] - houses[i]) > mid)\n j ++ ;\n if (j >= heaters.size()) return false;\n }\n return true;\n }\n\n int findRadius(vector& houses, vector& heaters) {\n sort(houses.begin(), houses.end());\n sort(heaters.begin(), heaters.end());\n int l = 0, r = INT_MAX;\n while (l < r) {\n int mid = (long long)l + r >> 1;\n if (check(mid, houses, heaters)) r = mid;\n else l = mid + 1;\n }\n return r;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/44#issuecomment-3217486441","body":"```C++\nclass Solution {\npublic:\n bool check(vector& nums,int n,int k,int mid)\n {\n int cnt = 0;\n for(int i = 0,j = 1; i < n - 1 ; i ++)\n {\n while(j < n && nums[j] - nums[i] <= mid)\n j ++;\n cnt += j - i - 1;\n j = max(j,i + 1);\n }\n return cnt >= k;\n }\n int smallestDistancePair(vector& nums, int k)\n {\n int n = nums.size();\n sort(nums.begin(),nums.end());\n int left = 0,right = nums[n - 1] - nums[0];\n while(left < right)\n {\n int mid = (left + right) >> 1;\n if(check(nums,n,k,mid)) right = mid;\n else left = mid + 1;\n }\n return left;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/45#issuecomment-3219872784","body":"```C++\nclass Solution {\npublic:\n int swimInWater(vector>& grid) {\n int m = grid.size(), n = grid[0].size();\n vector> dis(m, vector(n, INT_MAX));\n dis[0][0] = grid[0][0];\n vector> dirs = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};\n priority_queue, vector>, greater<>> pq;\n pq.emplace(grid[0][0], 0, 0);\n while (!pq.empty()) {\n auto [d, x, y] = pq.top();\n pq.pop();\n if (x == m - 1 && y == n - 1) {\n return d;\n }\n if (d > dis[x][y]) {\n continue;\n }\n for (auto& dir : dirs) {\n int nx = x + dir[0], ny = y + dir[1];\n if (nx >= 0 && nx < m && ny >= 0 && ny < n) {\n int nd = max(d, grid[nx][ny]);\n if (nd < dis[nx][ny] ) {\n dis[nx][ny] = nd;\n pq.emplace(nd, nx, ny);\n }\n }\n }\n }\n return -1;\n }\n};\n```","onTime":true},{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/46#issuecomment-3223228330","body":"```C++\nclass Solution {\npublic:\n bool pd(char a){\n if(a == 'a'||a == 'e'||a == 'i'||a == 'o'||a == 'u') return true;\n return false;\n }\n int maxVowels(string s, int k) {\n int count = 0, cnt=0;\n int l = 0, r = k-1;\n for(int i = 0; i <= r; i++) if(pd(s.at(i))) count++;\n cnt = count;\n if(s.size() == k) return count;\n while(++r != s.size()){\n if(pd(s.at(l))) count--;\n if(pd(s.at(r))) count++;\n l++;\n cnt = max(cnt, count);\n }\n return cnt;\n }\n};\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/53#issuecomment-3243929010","body":"```C++\nclass Solution {\npublic:\n int getArea(vector>& grid, int i, int j) {\n if (i == grid.size() || i < 0)\n return 0;\n else if (j == grid[0].size() || j < 0)\n return 0;\n if (grid[i][j] == 1) {\n grid[i][j] = 0;\n return 1 + getArea(grid, i + 1, j) + getArea(grid, i - 1, j) +\n getArea(grid, i, j + 1) + getArea(grid, i, j - 1);\n }\n return 0;\n }\n int maxAreaOfIsland(vector>& grid) {\n int maxArea = 0;\n int area = 0;\n for (int i = 0; i < grid.size(); i++) {\n for (int j = 0; j < grid[0].size(); j++) {\n if (grid[i][j] == 1) {\n area = getArea(grid, i, j);\n maxArea = maxArea > area ? maxArea : area;\n }\n }\n }\n return maxArea;\n }\n};\n```","onTime":true},null,null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/60#issuecomment-3268602696","body":"```C++\nclass Solution {\npublic:\n int longestCommonSubsequence(string text1, string text2) {\n int n = (int)text1.size(), m = (int)text2.size();\n vector dp(m + 1, 0);\n for (int i = 1; i <= n; ++i) {\n int prev = 0; // 相当于 dp[i-1][j-1]\n for (int j = 1; j <= m; ++j) {\n int tmp = dp[j];\n if (text1[i - 1] == text2[j - 1]) dp[j] = prev + 1;\n else dp[j] = max(dp[j], dp[j - 1]);\n prev = tmp;\n }\n }\n return dp[m];\n }\n};\n\n```\n时间复杂度O(n*m)\n空间复杂度O(min(n,m))","onTime":true},null,null,null,null,null,{"url":"https://github.com/leetcode-pp/91alg-16-daily-check/issues/66#issuecomment-3290572491","body":"```C++\nclass Solution {\npublic:\n int coinChange(vector& coins, int amount) {\n vector dp(amount+1,INT_MAX);\n dp[0]=0;\n for(int i=0;i 1,那么 A[0] != 0\n\n```","content":"0961e884611df7d4ac47a79a9e3b6f257d8e3d84c28815f2546a3c7d65595a035782802456dafc2c2809827bef3c5c1bd14d07d3813a048bf263f62bb5fefe2ef43b2766959ac2fc046cd2b7869f517a3af7328790a5418a3bf424dcf5a2b5c05f2ddd042cba9d63203f137aadd4daf214bc076a7bcf1605f7075b0c830f9d54a739a8fcf3c94e787ba7408641de15b5555d00b17a292354cdd22c78eca5f0154c772b2568cfe02b4566c12f06df1c5f22abe7fb7a3704619e1ce97a49f53d2a5aad76fd4769cb7def9d730d8e66087aa517c2675b22ac8c09619ac733347e81a3415b9a53673ea5826c39bee7c9ee9d175fdb410921ab88476e916b6c234dd0ce03d5a3ebea6aca3677334b31191d33feb3e4209867a62e65b9804597e90b8b0466f0ee0998a3a21ca93c690c966349e9911b59ede30085b21480f11ed748ff424ce0fb1e6d3b75d8d16f958cda02d2c0a089feca80a011af4a8ca6605d49fc84caf177a6b378c756526703556b829604bf8b341fdd92f78fee6feae7fcb76c1ca251196530baf51721f42f77d109389c320efe9abf4f9fa992d34fe591fbcc2951477a72dd0a6688f27a52b8bcab7fa7f4f7bbd861b57175a797720d71c2e19445fefc8c4f9f291da2552f69c2382d639c7ad8d2ffb98085658fe6714c6b64d710753759e7ed42fb9e8f3e1342728acfe68f75dbde8a64b90e04d398854c9a9f4e80b22b931043b28a40e5b0e8d71139bc665544feb164be994f1e29680156e01e536052390b2f33527dcc9ee0ec256490ee9b8147bb025cda907205ed003f48140ac92e491e6efea2bdcbff5df4e4e323ca4ca346b47e97ee21ec2ec9462c705b735abfb7c391bdb392c56463f9e27f1d6e611607741cc3b40bb49ce4a1fa4a1635e0ae2ede8f899bc4ef5d9a52173b063e69b966c839af301776c6187508d85186b065d6d9bb673d98a23c19770f5281789f4c7b45ac8e05b23388cb6bf92ca3489cf8e533833b72edf06b8d222512ca9de6b4985f069cff4f37d7f3c41a0aff5fddde8dd66f994a166b492fcf4290091bf866b3c88da94276807070b305f8fb74bb8c50a70b10b8d9aa636e9470dff4d58a17cc75500b0f563c82cd0db5bc33b0aac0932cce53da08fb678755e4fc225b67828d9a563a968b050b253f277a36d9df9f6b114db3e0af2b6352946090989fe59b7928e548a13a9f0db226cca3d4d95a3f5d6ca0459456451229d8134a29298fd82809b841ef30e6679cf45235e111a7fb3800a4a353ebabacb497c24533124ebbd0cb243b1c21374f6a294c78a3796bf3bf6fe3598db51c64eb22045b904aa7d20a58584b3adf4aa3a967fc67ca9311c49acf7f2166c9d8ea60392d0c690a93c761247d00d34d9f4434f733abd6d29bb61b2a2d4802e3f3290490464c961d3a76a8820798a5253edf78feac30e5d8a44e11df1ed041a0126aeb05a87b7ef2ef4a986b9dcf0692360a7ce89690b66b7fe44c39edc33d5cb2d0f0b5f9faa3afec9ec7f99d6e85074c0b65c1e7c075f9d1dad1a377d5414d35118008ed5a732b2ef3022754c86f0af2c5ee2bd395f4fd128e9119681620d78e5ff3246ff7414862a33f54ef71702465824043ea75a4df693600a9c5df185989ac8d726313eb6ed63a8cad8bb10541867b22a76a1973656525549bd47788b2bb0a15022e96e76efe4fb9da8f9ea713ca8719cdad147eb190008c0a2c4d688ebb0b23fa72a9789fd302c12f046c17be1f9b2b94fcb92e66adbdf715a8d3ceb98d5e6aa21ccd24fb85b19008610fd87a73339b01b486ee6d72ab87606284cd02a9a6c2275e8c294b3c416ca4d0ddcf1b31307b2839b8bbaafd4c06e627924139344182cfb03b142c362dc9cc952a72104113e73cbc3bf51949729d83c58f8b8bb807dfe5813ee165d961916b929bfe2c781258fbd37d079c5eeae2ac1aedff334aa7d794930a18975006d86b3dd353ff99c21449aa3561f8bcfea18a0ad754890143d04109d6aa7e036f5011dbdf7441db6dbd0bc6079bea4790a7e74b31bb50d61325b374b1cc4ed8906aef52dbb55cf84e47f8cd4974533d2ffb4c5b245a1df84087779c1a14708d071e8f853c7c5008dd868ef0c6850c0b99a2afe44d0b94802bbe7e211a77ceeac6c90cbb87524728dc32d8cc230325e181bd44a666e000e7fe9c09f8d07e9e6f7692e32a3c8a13819233fd537d784341d58f937ea176f82e50bea2ba5ed98ec7bbfbb7a8cfa520d80e0271b007876ce072d61c7536723d634faeaffa0e0bdab2c2048c99b72c568e380e91212b2550a12bdd2c78c21b26953470fa7573f39dfc5a4f5228330fe9a841f7d67518dbe21219ab56c22d4b236b475fe84bcaaa2be690a6d04efb0fba234416c2719131ae36ac220acc0f4814acc8a32d9563e3baea8e608b27ea9e4f3b16ed19ae0e2778269767788ad4282f87c4a1d458c624dc873e5f783e6bfd4b9d9c7208e14f5cccd457a7ae5e5a0313d5f6e563932f2985bd997e030082db407678a96f9c689cccf6aa7418865f8e590aadf5037b9059fde0d503741a98042ef5071d105ffc9d144016e1b2a8128edafba3869da15d45edf86f6fe834791dbd238651fe7315953c059c6bc0f46a1140512ba01127696dd482575040586a3346ff42027778eb52b3727ee9bc5b44379e7b4cb432ca77346c7b02452536ed21600d2aa6b531f5d19eafa8db35e8bbc0b58eae0927fea0d3d3a17ab9451803b5567893623d59f9e9be0fc5a1714054b4edcc6ca7dd3b2221d886724307ff6d178c6e365c61753c3efdc1f3ee75a97a34d88df8735e3703753209870383f94525d5d3b9eb1ede774bddf4fcd1c9cbc8056b75d2cf4a6223fcf7579b4a9e6f64de0b344121b7a986cefd36dfb637d77b845e9721ab08f32f3a7e7e48dafee8e2ca3fc54fd28c31dafb327e4354b239998415ef630602cf7ec94a2f9ac79cd96c2145d0e30c3850e61fb9a7f1bd86c1207609000a228eb9acc2e1276dd655d84a2be2b1f1a35e2081b791d69fa7b98dcb8c659e2cea54a94ae1b1592011d5ed92d791e7c47a9de9627d3e28c2e95c8403009125e76fa02fe9d326c7e54f8e2d5dd7dbfa3484c28dc1332e1cd719af1581ab29de64df7de7aa6de5dd62db9cb684b6c9dba8b1cd709ffb5adae2c3cbf750ce08f1f5c91fdea6c87b01e74c720c3dde3a049f1c5f88b9b4be00f601ebf143d13acbfee79227adee3ad893f75d7485e428de08bafb154925266805ed203a104c35ed62ddc01059795147ca10bb8b8accaeae3a478ded13d8da8746728d17d694ab35c1df0f5b490556ae2f871e9bdf3341c4449292d1f359decfced08e0e315bd0347eec8fff898b92cd51d26b589b665efdc7d136edb07d9a3b0659ceda818cfaba1e18a35f5b9971bac1cbec1f871816ec9db9cb66f19e2f44552bbdad642988c725e62b503ecce8e08d810a05d52c4ac2ea239d9f4c3e9715d415543e659bc0344d3e14b447b2dc30eb92b3e9c6766fa267bf611382fd6a457f220e3862cf0c60254360535f646e14c597274c98af0290bfce3e70e0550603513d89ff0c35cbb44afc9e3cdafb0b398ab460979640452f7359d2a9885b0dfc6d8af88d4f6ac23abf3837f3dc676e133551594f65262048f77c3739072d442f17003e418f7d75bb10bacdbc0ff5b2d4e11a53d53cf6df3dcd81d8998f2cc7bfe3264b2562e58fa0457edf39ae5d58ccc89b25b0c5a010d64ef46e1298501fb4e1186f25b86c46d755134ffd866b56bb096c2746ac72e9287481314b65896010988efcf0b9f5e589fa13dc29d6495066768c72f37cca6e1166661db583af634499aa053f607f20f0493817b267295d81ac17f36d4b34376879107c893081de99208bcb2d72e2e106627b154a324a3be157605443891f20a5fc95f5ee8cebbac3757f583d97135152710b8fbb2c02a48a93df02a24def2c5c852bed2c1f9b6856bdd5286ffb8187e90aea6cc4de07dddf205c2d305dbbc3951f97133d5324dfed21d206f1476e826bfcd6b78f7e26e82877e03800fa8a9e2baa972f74885d8d96c6a566f5cf83da2590e165061024a75ba1239773d4eead3b25340c869411d71ad53db3d98384b1c5ad9f1b527f171f48235432ecc278a9b5334af86fcda5c243658a575af0528f159be129f81341979ef0ec95bbd2106f752fc46170b400cd03ba177b9e2d50efb3021970d8bbc6dce5fb93e6682a0e0f7495337943980c6683ffc6ee506ad75874eb23e43b25c61c7c50cf7c77d0889de677952b848e714f1c1b02e57e4aeff6ecff9c4cb8ce1616f56e5c24eea1d72cec21a43b8113f102fffd5623c2006dc888b209a2269dab7659492a1b029bf01fc0f6a8c1e1301d2229a0ce4a0e8039ec5d4e6aa550a78a1fb0e01abe2cdbd0a106d78af8a1bde2a2c79fd6501421401ece870dec2afd01378def0eccc9377bc1fbbfc58584f07474bfcae439093c66f1f1a56a680870927fd2c49e7ce84f75f505bff43a236877ff2c88adb23bf5f74ba0eb99e8fcaa59e13c8c35c8069941831584aa8feeb5bbc4217755ba4b361003f43e2e53c6e98aa605c15c9413642b509bc7774f311202969cf7758cf6bf7cae008ea8a541697d763af4ac5a1486455c77aa17dcdb452aa5a6deb0ef1b4ec6395cc41f69aad32553a8d2cb359786f231d2f5ed96374babd493f8503d9a0f03c3f71b448d46dea5674211e0c07a4616dbbd59585ef98c7dc80c2223653fe4dd12da62c645b639dbe6159a2529b6b43be4138d86b26ad5018829a52c6fdb822b5070b40a2519eb410d90e384a319f9b8d32137b903a563a54ab70f3075575c8927dcbba8a1771676c1ed6c0f176608b54b8b697b3e28064fe2dd6e226fb08c7390f4b8bb3331c4212325953512405c4368f23b46b058b0fc1e4dde9fade2b28697ffac46f790f0f06e3189814583db66e031616e4e53a0cf739a00bdd09d8a8623407bbcc1cc0fc9bfc08de1c936f2e4d2d9ea908ccea2ba4d33ba5b3fe28851c182295833431e49ad054aa293a1af44d4c38f07f223660969955bdb37b5cf5b987f78db20761fd01d2f5deb9190815cb0ce909ce28680bd53f5917cb04bb8aaf7a62e131b53d480efe1bc128eb38d0576c8403bff4042a3b032e7f9ce80b08de891acc52441148c2b9f70a899789e0b41fd475441191046cb8770093a4ed4d9f954372175fc8a1779e0877ed186e22257956cfb5ed2a3395008927acef79514ab34478f0d7097d4febe3c6977333018509589e163d24840067f5a534ea3a45079816aea8894ad8ce19fbcd3b2","title":"989. 数组形式的整数加法","link":"https://leetcode-cn.com/problems/add-to-array-form-of-integer/","question_id":1031,"issue_number":4},"2":{"day":2,"pres":["数组的遍历(正向遍历和反向遍历)"],"tags":["字符串"],"whys":null,"difficulty":"- 简单","description":"```\n给定一个字符串 S 和一个字符 C。返回一个代表字符串 S 中每个字符到字符串 S 中的字符 C 的最短距离的数组。\n\n示例 1:\n\n输入: S = \"loveleetcode\", C = 'e'\n输出: [3, 2, 1, 0, 1, 0, 0, 1, 2, 2, 1, 0]\n说明:\n\n- 字符串 S 的长度范围为 [1, 10000]。\n- C 是一个单字符,且保证是字符串 S 里的字符。\n- S 和 C 中的所有字母均为小写字母。\n\n```","content":"0961e884611df7d4ac47a79a9e3b6f2477863d84c1b032f243483e5a435a7a0c5787a92a74f3fd1f23c502d161fbbd42a87d4088992f12c5be23fe2bfde9f36ff331672a8bc6cef10526cfb6c68e557025f0789580ec089727ad24c0e4a6e199566fce4462bd9a3c2832137ab8bba2fe3d96c1ccfec31329f917540c873870ca271d822966644e524da455bc4cc40dbb4f6008a376252e43c1e03c72f48ef103777b2c2868e9ff2e5d4c2eb98118626240ecf6910413761da95ab67234b13576379716a36801af53404be5ad8f5d2d729d2dc26c6a2db3ac0b768ecb351d7287acacfd1f94ff65e0800f4bb299a1fadb47535dafd4c72e0714248611330033aafc4d8584bf9a4ca04552410cd25f5b69dfd99001fe14b64a89d3c515a38865b55b3dc78253bce4db08ce744347c94522b5817206e7b56ab8c07abc9c40ea259a77e00f508da85d64a7ac70d2cbef6880f0f53e564c6850fcd275f3d67e2016c0e7aecb39fd950a86781b3f37020fa0235883ac06cb1917575a64f63ea5d7dc2938c315e30e55bdab4e20a15352b15405da6f1895c5a41dfca12c4ff430116e04a0be665aa315a0658bc67953adb18e4baaedffbae173b66c756262c50d47e0e3b947dbe75b68826f40b33d774d667a0608d8638e9727e5c6f74bed955d0e2ca351b3000a59dbd243f4aa8e10274074acc9da829c51bb24d49f1085f94e1bfc74c97b3366418ab069eb42c35677011d88e04a42100dbd8531f7894f0e4678615ae73054579ab4acc05c56d40942692fb9cce7ff869f4bb80248b6b6ba9262c988eedb877f3f49027eeca5bdc9e75df999d8f956cc4f399efe795a87ecf98b6d51d6f77f5c9e90e66790afef1ec0b74c06a88bffa5aed9bda73c708e2e6f7ccbc18e88973519a4016ef04072c94596248891080165b459c232ab00c0cc67ddf3bf0ec5117fe47a0936c6d3c09b6e524862ea1d728e4196e3e2d42ee5748d7715c38404f95b3953fa1f80a01c7aa84680121fd2fe121e957319bbd8b61acb8d2786c155f7097b3c6df9f8081815280aad1b97bcce75fc7d583a7cf2cf58fdd665984412139d3cbe79e050863c35da447838e6809db1b829e4eaaf82fcfb7552c534220096b0cf8ae96dc1069e6441b454fd46a0fbc92f25b06d135d1573672f6275684b1d4b5bf4bb7795fda3fddad25feb384f29515ec889309b2dfade03f844d6dd81c2eee3ead37cee218af3a6ec63a29288994a679e10827bfc23f6bf0b67be44d43b9cf20b0aa7bf44e1a8b558145a80beba88496bad4b7658767f89d68984fe3c43512b0ac625fd1f73c1bf65d382823de279438e90c3fffd0eee7914da25e0554c9d429ac6442157dafef28bf2ecfee0c1414ac99cb8b99719ac365ef55bf7f892df4fcbffd4ecc44e55f6b2002c26db37d4ee05475391fe49099dca7f67b08593a31179c58535de0fd704cd67c77d256874820f2bebff60cc3db392731154eb48149548729acd7d3aa6b355043253fbddc7d79addfd11ac792a2a266f01891f3972783d0ecad87948da87cd4ad73c090f60a8347803f91b6de19e8c1985efcb9145b8e577477365d4d505f1653fd4050964d15f719039496a22a0fdc47af8697f0eb68d6d99e7dc528d8a8266791ffa6cd61ba9ad9aa00876af7539b06b14766d432d56bac276bc80b83b37052587e545f688687e542216d69d9278aa984e189d10ef10f394d98f194ff95acab53991583be141eeb2fde44ad669831f2a64f1d068edba164662637e13f06bbb1cce31c989a0ae095404d64a42de3fbb7bdcf53d2894d50149e19404cffef56423bc5bd1ca8eb77607506f131d3ad6885f2a2baa49d7679429f93d056c1eb888e80c5373324991c9fc775875c5b6e00484d562bf4975a78fdead8ba79107d4ca8b38cb6ced6a50943c8ab469e9e0a31e65d6cc00e5eae48212f1f733877f089b9b01db01c1e43386af08867b503480850a93aa183e642d05d63bdb77b84c990a7184f97e7e3f5202c8c02d1a83398468a243c5eaf11f3424ffdf2cb31d7842be2f3700ab4d618f7388322cc1364e6df1ce29e28deabd29a37155dcc738ca4a8521d3c69c21acde39690d770413da87cf6b1f7a3b0fa6cde7cf5e5dc8aa479b69360671cfb7c6a230f3c22b6402c758989c750c7e3317188e09cb2ba465642deeb4c3689e4505ddf93e3ac30e8adb19e0531c2a5545ca87a134a947f90856a4eaed7edf90c6bbb8fbffa38320b9524d4ff95c9f52fd3ccb616436093c634fe0e7f37d0888f7e00a8b85d76551d14e1dbb7a012550a12bd2233b46cfd60a8ad13ff8ea3634519cf7ddef88c7607ae67b5b8b9157369ccb40d65af0caf6c3e2cf408f6926e37e307068c633bf09136e16c271d877ae3edf5943b10f3472f8b5cc24d661fea6e7c733de6ab2f537694fed12a1605cf4d52da8e14810b5ab524c2212f161fc7e233e1b377f6bafd73531b7c111c3917d1ac04a6dfbfbd7ac4f3272e857a6b3690b00bbb3b14754dbb0d137a84ce655434c6fe8bf6bd30859696269afbe5def265c0eb9e1975093933281863a5cfc5892ae950b0e21b71b13112769372198cb4130a2d7338899d9089842cc53bc896abdf66ef70306f9b8c497cc4492ea83e3307d8fdac858acbcf26d8ce93b5ceb47ff097289b04b2637d85155ad2ae07734253d024d564de21d32426ebba852bf9097d7f1db3ee8d0eab58efd4168acf496d7bd33e8007501a04c2487315951aaa1f15d91e4221458b4a4ae61ba9149314899d4201a0eff6817df2c0e1d216e7414fdc1f3ee75f45034d88df8731d3a5c2a7023880c9ef9091fd5d3b9eb1e893f0291e3b98dce999a057a7b958a650f37f4be7dea03ee1f64bd44704d7d9d8bb5f5ef088ffb2a916cea468476901efe3e2d23540b96ecf3fe9818cf50d3d86595d87371210aaa329bc505bd0654568a2dcb036c9c88c3c56c660ae4e34d7c149250d8f5e1ae9ae6243f6e085c67cdede3cdd76e23824bde4a37bcf7e689176ed5b787f5b5fc938dcbde20cd57a329ff12a2b65e3d5fc8e6959d8a9f8129dbe9627d6c6d96bc0eca4a1c8076b245e0348dc62b899c2cb7635edea39f70c1e8a781736e5fc106d75e84a42e8d2dac2fabb139a1923dc0c7d5d4fd9697f1e9d75792b253819e8688a31f9c14b8bb9d01def5c97a07b34a740a3ac4144cc34e198ea09dbe33b10a98b64397729bbcfcdb2eadb510d893f75d7485e428c34df6b25a0a29740c51f32068551f3d9e6c91855e576b110c964bd3f4edccb0b33a569de448b495d5467ac4598294e235dcdf1f40494c1db924ef3ad79a7d06900c9a9bcaf310d5c4c7d0d5676409a36133ec82e2989b89e718946b50e81d1780c7cc2bed8e5e9a7849179a93cfd9bfa13432f11a089721ef9283935dc65b14aa8aecd550e28726427f62a687642988c725bb01503ecce8e0c4cf5e52cf2c41cfb66880810535b44efe15543e659bc0344d3e14fd09b49927ac91b2ba93093df80ede695882f86a546f2b151262cf5b286c0f255357282b52da97364c98ae12d7c9ce6c39a71d52034d7da38c02798efa0da8d66696ad436bc8f8689ef9134b6d361e9be7805201fc3fcfab830a6dc032be42579599213a6e354c444f546a74468f32376b427e5f0517003e41d25728a03afa8dfc259b91c6e35b4eb63ab29727abeede8dd44c86e9a22610326ff49fac5468d228b900728f84da34b18092148131a0275dd650449ee1186f25e839049b1c0d6591cf3802a760227303eb37bb3674c0754657c60931b19decd1bef3d581ae408831a24945193b8072ba329e6e5a6f66469f83af634499aa053f2b39b410c1495eae652b51b9e549a7e0c8b3f1def4d4e727f5054a5cb02d0fb0df245496a7c9fbdddd8bb55ff8291a07cc4720b5d695f5ee8cebbac3754e3b44c30f381c254ec8fe7e1ca4d8d68c02bf04e76903c902e23654c02c2afd863036a3dd83ff3bc06cc4de07dddf201563645df5c3881fd90f365d60c8ea21ce1aea716ef165b093f9c82a28af7377e5715fa78a8562f0df357f8e46b68dc6ec66ebd283ca3e90a86856330efc71a1239773d4eead3b25345ec3c8655afc7be60f160f477b1b193fdefbd2d1b6c3ec95b40368f86c079f8f57d95b7d2fd18d6092a8292b943f9be129f84e6bca85daac87beab342d326b04f6ff729b3656e5a3ae59ead27531bc8db3752810626818247242000d0c7795f5d9fe5094e66f6e95a17c332b093ffe69bd37779206abd725a1e9663e5a6edc51b3094befe7d983d12de4eb20021d767fa50249b016ea351d6fabbd88718021acfe2ebe399d5866c18c0d9cc10e3f24c015bd5406a4d193e4dfe54067d5367e5754e8363924c43aadba4ad90cb02f6521e757c4d53c4972dbff963f7542a3d790e5645418265ff089677752475296826c5ba43bb9b84977a3096980bc0f163d1c295f59bbb868006599f3f1f457340ae5ac93f554d035497e9d68dfdbbe45c2b42aedd2881385286b0e92316fe0666b3e20207fcf72c80dcd48d20de10c8d0b6c2b6e7b3b4a213716d305725940b16d6e5349710878a57266a5fec0bd952b69beee9c8a861a597ac24b7a39b836c0cbbc835327b9bcf2600dd4d209ea98b20a8f7b2cc2e609434816ef377300c4bd68cbab2638c6c6566205a7306a9f34935d135e646ef694bdad0a15fb6f1b98af2c05d368ba33ed878e97b0562b65d7d31b753f8bb2149a046c78518c4342c116a91cde1e8bfdcc7d9448200d229f266d8fe16ea342a9eb71915beb7e48913202a66e54308c003ad09abefc8331b8d337649e42872cce862d4a6b77b69bf53b963f76670d0e1792de375217e0c346efad28e58eb7cfc23e178cad11e2e6375fada8fb6905b55e2066ea2d441c5e0b11dd67348e0fece27f22ffd8ddcee4de909602ad32294e3794b58d9b436c52cbe10559626341a1d3445cb9701dc1b9d97861db1a7c38c357f65525496950a2debb91d3e9c9f1073eb6d97c3629bcd47394cb3f3950475a2097511ebbfbf4af3aa6f3c97ce27b221c1aed53a549948dc676d9bc76236c27d229395ad39893ae71b3ec999ce38483bf6bf7bf60b24dafa9c8a3200b235ce0b6e0efa51d8cb7893e7025d09c33dfeea29031e6f4eb4528765d0c4e0893e1fa3bde199261299b6e87952e82b99898fae3255cb58ccc953b5b759a84a1ba72468e8b2c0eb2591801d8c141bd7bb75a19a0ceca13925a2a7f904a82df6ce71bc8957a63e3f29da796b6fd593423f40d9adac88b5e6708bba84a34c21d97bebea08680bce396ca6c1e2773078721d8983b9801118dd1024644a5429386fce4e840c3d7bb613d64d24cbe0335a4095dab6130fd5664472bb761a6525c6c860a10a0d193f11c2c08db8986352f5eb7e4bdb7e1f14764da8a58a4e160e58c310213ed758f03d5497a1583ab934230fff803f5eff167f73f41101bc02dc48a90e80bf4434679b6381211a038302a38a3e069c0783517bde8bcc687e8f46316766018e819a8b0606c3917f67309751583886588219c972c051a999c47ef84e553e23b945b30744b7101dbaa6491bbe2819316450608642eecae1c94d62f13ff385cf17c7e9b393bc8b9b0d292299c9828ebdc436fe794188c24b030da1f949494621c0d7f437c1eed3febe16928fe125c39967f26377b894cb69fd38fe5af738ce71d992aa5db542e66868fee8b635f0c7c47c01df181c1444025092a4255abc45ebb3c10ca282666d597b651d4c5e34a74a3623155d5ddf27c6cc637d015fdfe5a28dbff93e4051587db97a1817f1ee5c4dcdf728a735a56f1aa0cffd78ede0afc072763ff864055732a5cdabed4d47bee4f868227ef3c7c495de8b5c69f250c1c2095c2828a6570fc12b6b61ca19419e8aaa64ec8f3a89862f0965b59753cbe8a91e6cab1ddeaf4de5837dd797446f5e1ac4670874782e02a2f939aadb6c64f8042d5f28c07d96d5e14de12311d28e1029958ae1c4aca476dcf4ec781253d7b5791c064d73f843f73f57b64f3789318c4ee51c03a5357676a34381428b11cfe38e45a8b676316568f39389f1844cb5bd71f3496ee855c1e6e2b095cea3fbb45497befb073d769ec76216f3ead3b4a0050e81db4745e975b9906bac678d04287a9ab3fe38ab87ff7d1993c8f8d70a56665a977b6ff63fc1c50f5fce63f670c1041bccb7245d45d638dd3c5706733170cb383d671277124cb6f776ce39447fc80d1e48010a8f35166dd47b34ee51f6ae815e07a08e94d398ef0e8f1afd0a001e8cc0a93aa5b867ea2411bf3834ad55d03078118d54ee15c5735840244c7345b1a630f11597d8b267037b0c981cc8c24894a51ed43cf27293470e53a7f13599e4fb9eb0d57494b680fcc96377441e3027b3096a663f46cbd72195d42d911380430b493413b687de4d1accc27b0ea7235931e875da5a922390ef44383568b525d04efa6401efbdd66d5bf48d41b65220339c189521601e2f9c672813677495fc24d90c1ae761f791dcf289475ae6dddb2b49567bc87ac2c7be906a540b41c20b48ded2d6e0538dfc55750c3e8dbf272fa95bd9d1dcd8d963ad56df2f7029fe4d4b8cbefd40070b80c4f73deafff3b0581e2f13bbc6f2a3313d2c72183089ea22765ff0ea5bd90d649f6590b62c3d3bbb515cb0c78b26a712ca89b859f88872244364bd1898f357552ea2ef8d366cbe18b129a8c489b6ec17aba5925f548b721daaa3da107a6c22ece63f340eac5e8b1a0bb528c3b68c0f1e0705fdd18ede570aec15eb835dce3585746ed28eb63118d9cb32a9d831af3e91e84cbc0d9caf3769a20cf23f741488b5300f2e63c343bf2d8819da7ed7fb9aeb2e3aa0982a26742424591bc308aafb005becbdcf8af553a43b79ffaf712b7799968167c5b22460e283e105c4befe8856217b5ed512adc67e3fc628f935e9cb3ebbe41dc9311049f073aa39bf5056dd9610e9e5235c3125dae2b33a71576d885d58ea8d209024ab494f4dee8f824a3cfa957eaa070c670472617a7d111feb63cafc263ddec477101517cea954df2f5a2fef85afae6132cee91021a9c1f05be2ec234f6c42b066ab1cef0463c9ee69db09aad0305991505dbc877a18d11a401fa9a0eb27ed369a517183891cb9b1caacb8caedd889a3093c6a2a2739086fb801e9ab03a322af3d5db514463fab98c7c70201eb882726c4e28b2048ba88ced6a266f2f30c69a659c394e8920c36ab79268a5c7d92483908387a7aa7953cbe601a01e6f725b59bc3178cb1140b6c2c4c40d81839c7a28ee3406a7cbfb8927fe86b05d3d203758471250d7727e66111a1a442a231a948da3f1ec4ef54913ea63656ecc91b09a7d544dd4bf699158b9b534b4c60a3b5cf5155f24d736c547ce103e23956ad35b02bf2c4bbbc9c8e4f53614d06bf9a56af0a18709cf0156605575aaf74c2ec3ba2c9331052e1b02031763f3cfc06fa3c87ce495b680ec07678dff0a74274a297160b6c1cdd106d5098ba40a1ba3084bd31d729c12d62dbe6b5a4efd1cb247ba221963051d1d4c2ba9e28da4d5f40eaeaf2729bab7a3321fb08fc944a2c7b96a2198478208fd7969aec80bf052ede7538032dffdef197dd2a338f077fce3027cd8421214257769ac361bcf4d032df7add25ef35d8c9d94342cd95f8e5ff94d5fada58d305a4fcedcc19bb48f0f6439d5e6b02fd9dfaa88ea42db5f46110563c420779cedae9f3d967bc9c6b2b28269bff8502c6e52a182d783da55a2d98295f9d00c8330738b3bc5154c15277ac086f63b3e8900044f0749709b84a9111f3cd61da33fc483fa56656aaf67ca76bdd3c98854384100f9c26cfe2a50a6af4ed33debd563a9cedddb4846bc930123797b53a4fd54156da35857681dfcff31c6e1f74f8c286aec2d155b8639640a0105ff489355cdd76da057788b3a536ea024fb5139b193242f0cb0328d121108bcb41bb8c0bfe9ea1298425d75d8968787680fe487c1152a5e26e9f0bddfbb310bd165c61b226dfdcbb2126d59b514f733e00a6650a75f1a636d6ac5113dfa452813e0449ff9ec41866f81d6f105567357ca16acc8c69b5f2649a724be4b0e279db88b73401d03057f8b562b68652410b6eb4dd8624bc8f603a2cdf07e99637efbca400204dc734ef6af41ff281fb4ea00dcdeb4a40683a36933e87518a97104d67334195d7569cd46c49165ff1e5de2790c224e8e53e6e0d4b2fccf0ad86a34e236ee62a79502c9caf0b9b74d15427d617d7777e8199af38f9217a7a0c48c451e0c681f1b29d0a59d3b41c986bac7aa7cf92a9f6ebf903b471ebd151f0bae24829b75aec90ef66d34b63052e213ec189c076d6e749d1e0b9372a1db272ea696a67dde7f6df0be06091f4bc603bffe110e4ecfef7da0f550ac115ce62d9ab096b98fecf4642d342e67601980eb9cc05ab6b6c6cb11cd30931ce657718452c95af949ea2328338c4b22d3f7224286993f2466762bd097e84768b3e0ea7c2a0a75ff097a88515c838838036e5c71aaf00931f9e4058e15e38bbe704706580c3bacd9460a8df9caa2de6fb343490c215e2142b8610b6a2b6c47b4aef91faa870be6705feb697da714617cb6b5941c4491d23bbe3c3fb36589440b1c4a128c29bf8ff36eda41b1ebf19d1745132174597d2c39814c33af8df0b4305bc63db47177cc60abe2677f41232016b53d6ae05654a6fc69c75340835452d60a911232e55f6800e1206a87a97e4cfddcb0debe814e85d66027efc83bc7d3fdb437cc969cf9dd38baee39c1cb537adf52589c0713bc1b54f7ec13f83a1d2bed04c31dcba17f17e21ee63f2a75f3d8f6cfba361ee638a4007b92ab0deb42f9a77463161921a7ed7ad31677f7dbc4aaf9f620e413056ece16737696acc57cf8a7b55480fa66e6fd74ef311a6c80fd12ae1cb70d4ca749c0ed4a8116d347dd2992b6490b90dc7b5bc9184f9591e951230b0423740930535d0d0050d7cb06d8f80ade7a4c8e6c5c4d83e6498211eb4e6ad7a2ffdf510e39c7965d0f869fe90eb0d102c9c01feb16e1d76caa2f29286de43d9d3833d1d1a92a9678b6d7c460fa5204c8042f01a7aebc612f4d41ed7076ee2aaff22604e4eb5cc3399adbb999f5bc8cbefbb2c1691d809e1a237ba937a5679e36e6a6d09e95e339f533fe0e3a61e9ea507cb9fb9e077eb567b1aa5175b78ef6bcbd414ccec2e411aa82a6d5c35236d793f778487c3d68445c2f271b5815b4979d1f31ef37e333409b66090f43509edc79fe96fc2b178764bfd051fea51fef76fea05be893775ef9da0ada079c9f454d4a54e39d18053a4b541a993feb27199e6bed809e2b87486d41c33f73d101ca6971971490ccbf9fc3f7b0388b17cdbb37904593996ffa0904a2eb1de95231b234849272fec13c644e5b7884fc1ce6094a0d806a573c1c016e7f91a7b3e96be9b05d815719bea8a5b09160863b9c3f2e67623680dc367fde5f6283704772bfbc2ccc264fe3cc662e0c42132f37741ca7396527882927310889051a362203067d67aef8a30c82d223394ee215b707b48f7ab7351bfe2b7f22dccb5fcf593011cd87b1a90bb352ae0cd6515277cbc3a3b20b1293e580bc1d7591b37fbe10de29c16ede3dcadbb474f327bc734d2a4fa5c4db00330ad0f50593d4e81c7a85f65ecbe308e3e6d6bcc73538688dcf589dffb8d696895ca4e36bba98580495038812fc4280b4492e2e2c4516b01fd284aef71fe1fef755d560b654cbf5a94a28b86cc71ff28087cb56b4bedb6226ee279cc42ae2d9844d7c4ff9b5c60fd8a2580a6a3c68a4b223a916af325a6ef792e64c59f50b2616c38c99b5c812a0fc187effa4116d08c4825fced12e744bd504365ef6752bd09582d205629a4b7134038e6cb7caecec9693e1948e9787c1c568dd86e6d6d1a04df7c6d46a574b3c9e6f69e7df020fa4492b3a8afa84d55f35d2a34ea5e4f192fe681af63ed8e31b40afa0ee629d1d294bd131ba0bd346c9b9ea89e34fca9089ae383645b36ba57f800567a9b1bbaf956325669d650156f04a6f2a1201ac63b3213f4005ff99ea68afc0525ae3a402d879ff2a4ae37d0d5d248013a1a42d7240bc3017fcac232b9f2107adbda82cc83fb5126c2b27567fcf53f153cca9310567cb79dc2c0dd275e65ab6c3247b0a47abe5b063ffd3720192be96c9129c5b406b58b8a530d3686804a0bd6df4517ee605233bfb059d6473e7822a71adb254617bdbae32d02a58e5d170b14403d9a91f7180ecebffdf4aeff60e4db223a0bc801af1c33bf1a263e7b452e4c7a5f5e3945b0b4eac16d723e036e840c3be66755e3e797867f3d7b87a3ced7671180146438159695ed0912f8fc597d0aa505a72fe1dfbe05c473293cea15e3caf9a53704658a48871e03142cbbcb7a234f2f00d6354e799aaaba6125f44b0d97cd5f39ed2dbe879c2f61adaef55501e332fab34d47a28d2f6a7d3c919cb16f85d81b892955550bb0e7d8ea360941b4f253391c17a6920c7966ca88c6997e07b665f5b7ee6fb35b95a0e634acab74df82fbd6ee4327bfc696cb135eb54afa8f8fd30994eb6c31a1d180bc76befe075ed5c47242b2dba7d18a095d38af90b34243ebaf4ab96a354f0f6a1721b9b7eaa417e75a9d1b5fd069dc37cd19dba3c7cfd7139447cfbd938d1aa8f80d695bcc7a11f6db3c4b33482f2fb3a4e2b63ee6326b6f98471292a8ec7e63c373beff750b5547eae8581bfcbfbbe6579037308089ab73db53b52848f674f6b997365a8b8b937c814fe4ca035d6683bb2ee02174cbc988fbc7481b0da06e069e0715a34f7d2adb02cb2aafceb0fafdf14b1441ef2247dfa16c990b759f3f71cce041a83a22db97d7a4226037077078ed623515c4a51e6c4e3bfbee4b59c90001c914e5dd642039677fbd24e38121b64f710256be8de7116e1585976be3ede9aad2bc2d09a80453c9c03ef12300d5cc87e087c529fffc29b7853d49d1e0377b00d92355c866bdc6bdc8f23df290c5f79eb6e408360e32193beab4a871a0b0b391e002216d1fe79ea6cf26d2d841339a350cf242a8807fb1262e56ad75cc8e4d62b92beb864f442e1b42af54dcfa9e4d1bea57c25a4c70d735a64a5b4460299d509acab7407014a3a652c549f5d2684f1a4c25942ab9203608c097844710730341a53317fe099d584ba2c1f7b81b111313cf3ed19905e8d64f55e683c23677b398d249f80eeafaf7edf10749d669a3faac5df28931efd9c730d7e4c34c7079fa5e695ac90563a8b0a2de68eb6cfa42778955ff94a02cdb9f003f2ab5026c2c7a8f21ec72e5f11636c82d41533d7ece04fb83e8eba927a5bc769a4795aafbf58dc4fc13596ae4e8891225344e3f3411bb7100c6a1e8eb6635027a497bebe57d1d471894b17e550a01bcfa716e4634509ec02c07f74c43619187cfe40124cb253de7d7dd0756ed3b8cb66af3e9846440056612eb6d1f408a679590e8047a14876aa2a2b8b22fa19f684eadd39e523a5145f620128492d8fef08cf6f0b2f0b907a0a8c34972ba6fd4a1f649dcea89636dff8d79f160447c6ae24983bf0c20b1a182dc281665cfdb364f6a3d706ef5854c457a68dbb41915198fd7073f2dda5c3c389972e3f413b74ef3958d98ca4642e85362fecb1b745a01e5abe9b52b76cec1bc743e6d412b421e28cb6e3645d6ba545c9c1e077d3c8a41a156583291de0637a74360bb920250f8d2c36458ba558391f92b803abfce990f51297367682515187df61367b92cf981d23d625d10c02b561c8e9dae7a83839089ac1ee74f3e186f8e0815ca7eb69ef580775226165203321239eb9f5833967ae8f146dcfaea25243954c39051235f22bb12e9c1ea2da435e959f197b1b3d76be0518c9a87575e2b3fef3d13d264103976bee7b5c3a7f698c99ef57503dc368163ef470ca113ebb8349fdfbf99fc2929ee4567e9925be9ee85a059b615451c40733f5002c9a790ffee7962c93433028f78e5fa3ac53219033d64a7ddfde6352ed580b8fe13ffe6e5c09e849fa58a15a86d6b5116b691f0bf65b007ecbd4e2a8c4f393177097019593599b25f08a06199ed03c6c8fec9f3619d7b992d92636c0ab205c010ccf19a4d99196ffbe5548b6447ef1e808c785f1ea4492a41dafb919faccea74d8547a0900436272d5785c29cca7f2774ed948c173bef3132074e80330f21c05af200778c796c1a51598ac919c29ff132da613b731595191f9f5ba51afe10a858635dbc773aa7b94b6d87782962b9c220db9610e87414d71f5659b1a5134f2d671f330cd3ea6bf990158be119b7e4ff648cede803bdcd66af3a32190f50f3485b4536c1f8170b2d70e50d87ed6c61da619b622be15d8b6841825c358c638c2376d8b5a07f0dfbb1a3f585b5eca26d989a47824d31869689ae6524ccabdbf9440d53dcf22a8e1a862545de3d75f0a1c9c83fd7ea4bef0faccbfb9a97aaeaed04898776ba8c4073b172d0597f199b11ffd497c63bfcbc6a92493d185a9bc32b21b224e06c35e8a4c7474836835c0de18c4ef5b6fb5937eb02e7a567f7bc3d6cf177ed1780fd7a68a21f7b20f80f669cb929f25bb2d280b76d97ecd97926459072acacd5cf38d630d7c17e2548052ae08bc9433cb896f457bfdd266b5b0e9e9d4c7a9693fe6ef771a70a428983230125891b926810aed134341478924f9a5950f9638dfc3dafab5eca2eba1f78a770fc680af9754314b28d57a867e1e9388bb944350cb42d2fe473976401f7ddf9ffbe1895c9dab32879ac776cb110138b32e0d5aba79ba35e3da58160602820be78be36ac5f668dfdf055a582224908b14b32a0e5864317956326079941ceea198fb5b923461097af770867b852335a52550d6f3ea47ff98cb6d0e365e0339800589d0ae9eb524c137307a9c1b11031f6b86a344ba4f3280a40a14dc4f84dede39ebadb3e31da2707f70ac0f7d1d6822bc156bab8ac39366118be8189032cb829e378eed13717a776f2959fcace4cda81547d34850380e3749b94e940cdade07394f4440df9e6eba09201836bb90aa1165d026ab0605e8958247da1eecc69b1ed52b678e08285e6f357416d885f6fe19e3553ff1ba3684ce8bdd40d9607712f1d690e076587bbe145b34a1e600e5c4566061ae438a18fc40e5f161d36e8a27fe9aff4cc37ad21597535330f1ea41af502fe78a9c8e34b699affc46986901fd63616468adcdc920776b520d255694b876e7ec5cba4274b4d8abda40e5a1ced5c8465e38521d8d11a71e1c2b04d8f7a84f9a8486de7f4069c02e27e47033466a60c8e51f5bc66b758370a77197c8730f1b44a772972b45b7556d00a1aa10d97b2de8818c402d8e1f7e0946975fa1ce791c61a6f7a7f26e7eb076cabe64996cdf65496cac89d0cb45c8590da41708c29362b05e60bc860cdfc9d5455d073d5cb41228bfdb87032cf26b3fdfce970d667a4409ba7e1f3721e954234820929eb488abd1ea8b8e8e8b62762d8d26268546cb75f009ba5167cfaabf3abe48023ffa0bd306915aed1f06a802b699bab1dc53df480ea414061f8361366a5972c1bb945d685dbe981971f5004cae10fb6774f6f9d237192096ea965c8f83a134c6367387266502d33dc1373387166c5f6d462915f367e22b1bd2103fe9f0b9bc18b56c7ab343dc20f47ec5f46069eb11566408d44ad733a19d250e0dc2626438c4c34125728602acf92163634400ff6d6d210ba9537362a2e04b51930bd1f019f02e33ce0b51bec28c799e10d17b8d7253dd4f4ce6b684e21dd541485af6d23221ff951469e04fc923067652ac370c239aaf7195a9e40ac060576aa025ecfaa5d10fbe77dee8a2ea2bd3de4425672b2e578f06a0ce140252425940151f1d1f5c32969e3afa09b72f0fd4fe8a2f62b5e2bb5efe8c251720a0a8b8d75e978d12dbca4031e2ac867273230d974ef25e215c35d84160ac7eb9864d2112922edfd7fb806f37aa2ec5a88cda8eebc108de4b5579bddace8461a6576d62dac01a1d7621cec5aebd4825241df98c916f6104fee888ac62bd3c906015a9449a1f0f70565014a9bf494efbae8be595f0fe519a1b0ba84cc5e6525762c244c3c1b61397d73fd42bb110b235e07b7daf8a1bf24cb0dceab2d2aaaa14368b58fa30789956e4c05e30f9f2edc3a4066d59c12c58b1c401534579a5017bf5233cd6eb144520f81f0f0bc0d8186f0e782f6683950a09ab2107ea897a1727fef333444251baa1910605543e0d8aa09e84c4ca804381b23acc825ead5b1c64fa9a3c8519f8b6178d3275e3624c1b4383c98f1db1d42973fa4df90acdd39925d231333b41badcec736c158d6c5a5400fc12a25eb987840232049046c9c766fa247a1b45598425abd221877d032d5d5aa39ee746aa40cc94b2d0c661b55ebdf7c8e21122c04899cf7717f5d06e16f94513982fc4ab95c9c0c03288ef958ad02884a779c4398d9b9107ee60ee86d7dbe79405586658571452245ada82fcbe58dac861e30adcd80ebc123a6c6d1a30e44e0eb12dd805f30d42375de8fe12095ae3f4ab3211cdc9a0cf38ede22f9489880da0f9dd5178f383d122c97133025b73506a7f05fb03f58075be0471d8305ee5bad191b626aac981d612754d17500fd2c7ed6bddd881319852c84946be7b7fb4fc63c428660545e78046275076a71ac3559a83a7e8f975a1b2b349b7d2cea44d672c35b4d0dfa1769d2b550c8431ceae11767c5716c523022c4d861709d662fd360b6a0078d34c359963e3c028d11b31feb221b5e64d202ba55cc7de4e421b1ee123e244e21eed3f1b5b0b55dbcee63d5cd4de6991f9b7d2f620118c6810be8a45c8ed658d0bc352eea7a144d39a7f47d30fc60bbbf806013951ba2255082eee4c4f40b0b1da57fbd63827abb28e1246e29500b90bdabd685abbaeb370326d501b8cf977723cd43c976276d83ba5c78a6e754ad7dfd0d9126ec3b489e1d25506fa488d30b7cafd50108208d96df3d7e34591742d9d5de60f17d1b38d6a007efca7c19d754001c45f7145a4026f49cc78e9742f7854951300971ec6b25542db5e6b19dfd28195a148a6ee32a98bb48756b55f1b0f22a824cd7f45f867dfeb0b6f7c86f0888cff1c8e4bf1bc73f9b4c47eea7d642eb2cd9141e6e25d46cd6f31c56be320772212f4ac1373bace7eec41eb5fca3535a8701a119fe4d73bb68d03a1e0b64a47df81b1f4601f025c2516f534df2b4daf0836896d3f1702371a653c7b9caaf6dfc3a89a50beca53b054174ec127eb3cdde77f04e8fd3462845f4437e74ea4affe75768c8d63fac4299dd18ec5930c14efe924d3a4f50dd8bc1581032f7032eb336820394940bdd2b24bfc169214f5dcc87ddb145b4f6f2c927ca086f1b4353d654fc55e18f809910dba342b2f911971b6bb25fcd88edf7fcca50d75e2594378948c53641c317a792d59b3591a12fa7b502538362d01e98836bac2de18f605d91c29738154a72de4229ab8fa4a7d48435914961197014f72e7d78ced9824c1daa1e440233d64074ab6296d23de0b3b577375ec9fb67802e392ae87fdae6c0f10f05895a4837bb908561d4c83e638ab216821c302629bdc11d3592d3cd48ffe47394ef60f76e0334d50055d6383d68c7512cb73b597a6af5095","title":"821. 字符的最短距离","link":"https://leetcode-cn.com/problems/shortest-distance-to-a-character","question_id":841,"issue_number":5},"3":{"day":3,"pres":["栈","前缀和"],"tags":["栈"],"whys":null,"difficulty":"- 简单","description":"```\n请你设计一个支持下述操作的栈。\n\n实现自定义栈类 CustomStack :\n\nCustomStack(int maxSize):用 maxSize 初始化对象,maxSize 是栈中最多能容纳的元素数量,栈在增长到 maxSize 之后则不支持 push 操作。\nvoid push(int x):如果栈还未增长到 maxSize ,就将 x 添加到栈顶。\nint pop():弹出栈顶元素,并返回栈顶的值,或栈为空时返回 -1 。\nvoid inc(int k, int val):栈底的 k 个元素的值都增加 val 。如果栈中元素总数小于 k ,则栈中的所有元素都增加 val 。\n\n\n示例:\n\n输入:\n[\"CustomStack\",\"push\",\"push\",\"pop\",\"push\",\"push\",\"push\",\"increment\",\"increment\",\"pop\",\"pop\",\"pop\",\"pop\"]\n[[3],[1],[2],[],[2],[3],[4],[5,100],[2,100],[],[],[],[]]\n输出:\n[null,null,null,2,null,null,null,null,null,103,202,201,-1]\n解释:\nCustomStack customStack = new CustomStack(3); // 栈是空的 []\ncustomStack.push(1); // 栈变为 [1]\ncustomStack.push(2); // 栈变为 [1, 2]\ncustomStack.pop(); // 返回 2 --> 返回栈顶值 2,栈变为 [1]\ncustomStack.push(2); // 栈变为 [1, 2]\ncustomStack.push(3); // 栈变为 [1, 2, 3]\ncustomStack.push(4); // 栈仍然是 [1, 2, 3],不能添加其他元素使栈大小变为 4\ncustomStack.increment(5, 100); // 栈变为 [101, 102, 103]\ncustomStack.increment(2, 100); // 栈变为 [201, 202, 103]\ncustomStack.pop(); // 返回 103 --> 返回栈顶值 103,栈变为 [201, 202]\ncustomStack.pop(); // 返回 202 --> 返回栈顶值 202,栈变为 [201]\ncustomStack.pop(); // 返回 201 --> 返回栈顶值 201,栈变为 []\ncustomStack.pop(); // 返回 -1 --> 栈为空,返回 -1\n\n\n提示:\n\n1 <= maxSize <= 1000\n1 <= x <= 1000\n1 <= k <= 1000\n0 <= val <= 100\n每种方法 increment,push 以及 pop 分别最多调用 1000 次\n```","content":"0961e884611df7d4ac47a79a9e3b6f2d768f228a04f50bab074078247f3c02341afe906d25e29b5c3a72e15c86695abf3ffaf3406fce911155659044b8fee931e364252a97d1c4e70a2cc6a0c49e533134eb70c984b3039c38bc28dda8a7a99e5025c14460f8883a28320c32bdd8dcb533df4a2a294ffec570f3ff8463ec08a1625acda3f2e3a3f5d86228960d950ddb296369ea6271a9dc196c8478c18ff1035e76370668dec42e50542ca6ac10446a4df5e4930f337b3f9e5aa87d38901675259814bb6005ad686a9f6b05805e147c8325cf69552f938e0b7380c0313b72aa87aeef2e95e370e2b43d44a3a9a0e5fa4b6f53a2f1de2e0a3526b20b331730aac44387b49c9b658045534f0ee16b584bf0d6912a38ea7cd11d9eb22e2d884d985d02e38f64a3e4c01acf7869a942e2e6e4b6285ac2f501908815a1f119ec44ff7a45e1c80b6d264adac2669895c402cce6a2aed8c5aaa811ae608f8e725c7ae88ed0cd76a29e7bc37b586129534d827a90006ab4ae5f37302572ba5487a88435940bd5c08ddfd7ec4650f96824fb526d907656c9fee34df7ef5d4d855b3c2c5893e41b4a16448d658ef77866a6b39669acc0ea574730fd7a22097fba6d41a3a99b11a0ceee0aaa6c49a5faaebcf0a3fe8227b12d540f0789ac4b637982fbb8489336e4e3df1e028c07401ca5fac6b77b432065bfb4e01a89ef062eb41e59a5175ba080664cb26fee338772e0b0c2cb163487c8c9f5b38b2dc1c2194b25bec4d526f5fbb9caa7d9b95b094ab3f1d9be7c5072380d008c12aa8d02197d16ee0f2d721231dcf0c7a2b87e01786463986b5a3b84469d211130a91228f9a56643da52c3da7e74a2b7ceadb6b78562d0f13f35cc112938513278da1b19d229313f1072a8dec96c4db4414660a8d8aa06c2473218012550b547c0308d36c3e17ad0e1b00ff51d75fa68041bedd2f7b6a690a8fc21dbed46f69ef3c8d526e6539da2f71b4d65c207465dbf579ff7567cc32fa3aed1722fdad71e95b5091785f0428623b1c373ca0a75066dc5f90414342b20a319be9bc571ca7d510371cbc258cbdf6597411832a9d12e9d65b030d9aa7582160e87c7b8eb0a992e63f0c9fcaa314bb5690b94bcbedd8ae377fde952ad22da59b4cf6d5345ccc49a0c1c5e5cf89a82f3a9aa856d5229bd9df57a6a16fcd5e6983b9c4c0b7f52cc8732a10b35a22abe21faa5ebfe86a4fab013dc8d191d472910b3f9ecb22d0f86a56ed157e46efa4941db10f5bb4b9d0c76d6b70cb498d20413d30e2fc0d2761b2fd8b3dbddbbd7fbf3f6cd75c0db2529d626e03372e99f6bfc99820ff47b529a58121776b4891f164dc75d1d079b2ac1e2127b625f10a29f84a4eca2825b354b417f72498267c2db07a3733d7b19db626a051b4bfcff3b7eef5544d43b1225e4d2cc2e39b0f10a1ad6ad32720357c3be6636aa17f05aae67a026b8a38a800adde37c5dcd0bdb6e15b9d0dd368c8621ddb57a33e89631748ad0a4f869182c160c5f56d67181bda4dd453a914c87dea1067ec666c4bf13403882348eb09b917dffedbd5dd7a7331545a005380c39f62554a9cbcfdf633abe539b8a56ffb3e61de7810d365b5f2f90dacc60d980a4e2c9cc2151310dda590c0a85ac9646cf13f661277f32838b73fe8f5af6d787ae91d4df5978fc714830afacdda13630d37f43c0ca8392bb027017758d87441f95f559aba28a84941954e47a84fb758a5631e45bf9f3e6de4e9878dd5c7636a69b75bd9e4a3f1c2f3063a4ef7cfa009f62573a27c3fc64905c344c9a71f280851145233ab9e70f07ea39742291b861a29eabd68c5b5d517ad59a96b7879b743102ff7818ea15aa88e1b8f9140421f3c3a4fbff542a7aa2dce23e6a6bac34f674bf81f33d80e9918b8c8405f1f24ed95caf71c229d177ceee39650d72600e96840db5612f09dc6a563c8015b30b4ccf6bb6ebdc59caf457f5f09dc9156ab43665f4b2cf918036e791365ddf3fc6db2c36d1a6ab8bca89f63c3cfa2e8372b84bd599d6747765f1ef29a107311db76f7447e51fe64c8f08cfc905cdfe6d80df45b0dac3c238b8225adddf06dc4e9411a0cbe372eed9003657250b4f920e1d979f86d7bf7134aff51d51d5b80dce3408787bd5aa92e50e8c96092e499222cdcf320b6afd97ab47b8772b915d672de77335bb0bd78addd46e64c34ec3880a809ce1d4c39c3e4771a723952c8aa86c2646ae52473c760d51231d29e4248bc49d519157906cac2da4d68eddbff906f4d1b05b5590fde33e8b8c8f2e16930b57e96466601ef523c8203b925964c52f6df56a59351d549fe0eaecabd3a68150aec73056caa0415bec02da727347207305bc0987c873a7defcd207b85de17c23538c259923a236bd321ac5142960eab569ad7ee71e507716e78b54bbcf0c654fff02bc635c204b841152a2817e7bd999db801c857ec2db7107337622af1d9297baf62ec39a72df46dcbd5b571f1ddc3e75d8568587693d31b78296477bdc7669b97c38f43f056b02a0a7149b16c30ad6e7136afe59f2f0bc037459cd577aba4a6e441dbf139cb29f0f0664ac061c572b8ba8955d70ff30e2c73c88ddd83c988a53e77932873339946ac7c368184597b71ac66c5106a2a43c354de06824683abfb267089665f05c3fc0ff165c63c2381ea37aaf273c6560024a2a3666ff869ac818a823a681ccf0fcc53e204f5e703510cfa7566952122c9369000a50e5cbb666be97f13c4606cb5d3b713b299eaefb3fee920d5936d8976b145eb0381f94654b536575968b4904485075a46b34d580e673dbf6f9e3f3934f850436c899374c0d2ea5607746cc8c93af5a3636c28def1653916249adb761ac29a35e3cce0d2a413b819ec69fad659fcc268c70944fdc2da603fe2f3d33442187bfa7acca078a1f9ad86985a5220f7904fb66d59b17b9491a1fcf6f8f1f4608076102a2c2d7787a8befa1921996b6f1b992e221708b94f03798beab9039f5a647e4744a35f8acfd66bfc8101f5119235c56097144f53deb5edcff1eb2f50672cb1022ec89d1f5ab0385c062b484b60773daae6043c5e227cf788212ac41cab50612e8f2194d4e1eaecf8d07b38636bb55fe1d0d4cd019b051a75861a5677b59ea91ff42287cf1b5aa08d43f75cf210d7167dd7acd0bf1bc875c8ce3cc701bb30fe1e9d842c0904798bc1b496d32e770ce732043d055d2a5f5bc276a549e1e256e9be730ce02960bb6e6d3f888f5d58ac70af396faf048ca1b68a1d4a4d5c222c70f626c082813fdd1302df54c1f1fdeb50191132403f27a4bc7dce0c2a701e22aad5d4c868e58e85536473bf97207516949cac9cf15f8f57f3727010d4d7ffc17eec554faf2b4899264a8a012d46f069f7d7745114673a2b8399ca9509b4b5434059471cf9860732a24b76149a09be7b1bda90b21c3ce2178a1f214e6a8b0d8d2421258d7aa87a238d2d10c2e5bde6fd3ecb1a3224efded84d30ee32619cb23714b7e13b5ee4386f4acec0d3cf2f4a7adb4d4f147cac48a84daf799dce1dc100eefe43478af0a5155a8bf7cf9ce9ce8a43b75c9a25973d1535bd21764ccd31e4ae6014b9e8dc191d8234944c8a733a3636e269de01b81708ca91153f3ab83a497e1c0f8ffce378f3f373b172d1705d0ba9a8765c1ed0083320b5de0775c5301d6950efc772aa12130191d55c0ace4a2765f626f33250892df44ed19b9ba09251fde670365d25ca32fe2ed5097cd042582c90fc2f1a437d9f1f55467a8c63fcaebce812faf3ff1d659ba93bd03aec80373055e70066c19139910d8ab0a50673b45dd02fb39c192e1f683023669e3ec5e10a1faf2c322ed6c9deb63e9f69f2279e86331735d6954f487ae7db0058ff308e4a81f17aac4533a7c7f33380f7ac317a783ce6be8ef297a506c78495732c3255c416e06bd941c751b9bb67edb1e7c103b947aed18afb0118112f2549d626ef443d1e020260131804846eedd04dedfe48ee0a3dd54e9a2db42c5b7ddc95c17e940e24ba2f2381ba582ffc030af3bd61d9bbed202e0967df658fdd8e62deca7ec9c3fbf9acc843ef3e72c4ed6b8465b8b63d73384b7877869755fd59b7d46d22fb4422112556c4b2915f4fbd2d1b687a98e9e5617b1224ecbf028d15a7d37c2d32ec1b3363d9515d2af7df1096b979ef0ecc7fe811e7d74278a7f2fe0089e568c1118e32d5beff80b19758bef9a93f092ddb268370e1f5e9533794398036945171764a0f4cfd4a316eb6680b212eb7a3bb72e2efa88d9a331957bd1dd39474f5e05a36f4abfa2b9fba951ccce1008be091365abaaed37c621a43b8113f14bb9a02f4c8e46638bc6e609be29c1ee6a50142d5f0891b96689b8efdbe1f59986ee1068019958d86ce68dfb2f963340f4b0f15f219f551602a3122c6d64146b665f3442affcaeedd5457babcd37fd101da7c50eccc6383ff0f4f2d0cac9f84839bfc3aa314f2b6f92bff170420870927f858cd730e4097ded40edb224692678d53195ada221f5a50ef4becba6aee21bc57dc871c0169541c846c4e6d8f0ffeeba217a48ba5a1c1003f43e2e538de9d7fe51851ec139376e1cddc9241b3f1f67ec94fe5fa6dcbf7cae528fb9b6136e33672de2fa355ad24d0f6fcc0cfa9b4e708fc59aee269fb541c8e401cca13b7283980862af70f3e92c8056f58396f3d331126027c5a677c6ff1232d38300a139875d43116b3ea287f20a349bfbdb0a7ab452c1e4b6c5118bd57cd12f871dbe29d7e67ec40e6c8ea861b4ab6459f42e9a011bf663c1eb1405d1de9f5ad4e3c706c0d20c0d367959f73d1ca76ffb40c326af8f49d5b68999d633d8576a48258fe6ee5b26e9cffe2f569f69c6222c1c6e4b1d89b3557845edc8040b295738ac9502dff9ae6de19f978886dc37bcab53d6711dd2e428731b7b20594569088b736d532afafc0f63920f058e3da6c3ab809d2d04e7c950939b103f0be4a0a26e5e0ed17913c68328439430441e4c257c043a07259bcc31b1cb744edd5c26859796ab89a376948369576766cc290f1b9e6ce1e8abcc7d8d46c155789277f9b778b699f241c8fdc71b765b7e83271e3d497d67135ba16543bf3bd60337570bb381949b1354276e6b9c727044cd864eb9d43e90ab284ce66974564574546750234ed9b0d911ef72c4205ad868868c298c89839dfc82014ca09fcece495d64baaea1ed587bc5e05440f5536952869368a179be0f38c4ce9b5da7472968835aa88425a070f9816a63e9edb3f3b4dfb65d6411e91c81dbc3951b3216a1b5086c9020bfadd7f4c5c0d8b5df916c16453c558525d9cc1d923159d18356130db0198e91e9eeec0093909865341cf14ce57b70f05300e5a9ec28c0f9ef36d42f3693a7ab158cd80d5989824eacd6776457a8c1ec2a2a2f10245cddc3245bcd5f08a61762a2f3f86cbf79c51ec4501f839d825162fddc4deae8e76fe67a0e4d60eb77a2a090a444c6110b61a63e5c58fb737f7367fe8369d6776c7aa4fea6ce9ed3bb221c366541ba0dd6ff3435691bbe3a4f453c8fb820db68818a4f4a4f94b65de282e816b97ec80e357d0f31089baa6491a087f9931e1c485aa3fc5f75a2380b9aca38bff8a566729b1d689caeb2cb9c379c856fa294393dfcde4a8d57e5569f51d3c0952d12437f0f2c16cf78adf30d61aa4b5522bc016e7e6ec84de2d6dc81cae6478cf1008967e4de4f1866f581a29307185869769d4fd0ca88043125636b1414a4a81138c2842682c1e3186a308b13202fb3fe7896b5d30d570ba03fd67e8546a9b15e1d8fb6a3d44c33adc68abc815559b1e48bdf21de32191db8c55f849ef39759a8176806af9d6a55732a1fc5a5c2d17cf80afefd74bb7331672383f68d976c4d4720113e643e97a47f9b1128bb1653956e653ae20d086c1db91050c6fefdcc794d430c5a521d6d0533d7d138ccf0dd325b0882e82c8102134f7f9387a0e19237804a96bd9f7e8d6d1d7dc003360961ed44cf548e160ef3517bd44f8e945b3d235e919b4e9470ca6c27f53f2de96a9b518bd31189210957667232173828b20dee35f853e86e783c7c8f39389f436ec454d7daa4392b15f3dbc7a19bad07f028fea7e3449a73d769ec76216031adae8dc9dc3fdc25808e2ede5b1dd3af36940bc4ecf83f7a3835b84d75008e244bf002f08864f25f0ea637ecc34f2866f3c3c0a0b45f76f0826ef963c99adf626fa3c1e36a0261a8b8f1e276eabffa4951c320654d4845bf2737cae31be901870ede14bd47ae7a05f81f558ef8acb8fc84a01fa8e658d6f920cf03ab4154ac9244ce5d032d8118d54ee15c0522922d58e87a4649730701461df5692037bb94bab19753a34a51bf5bb1727b7a70e72a6e443a8054c5e404536308454795d3197e4bf220183e82e66ba83cde7f011c47cb5d424b27cbc70874267dbffbfcd02ba8a37d66f457d35db8ff0a3b0ef31ff2568b0e0808bcba401caf933590c21c9d5324700b6a95db1b1e09b08ac23b8c2a36525fbc448081843f1f651d8361d93cb33889b9f1dc7396f4a2603ea741f108e73f3b9e8ded2d6e0538dfc50115d3e8d5e325c89294831693f28935dd3f9bb25184ced4b8cbef892a70b803402e9dbc9c2f0c80849202891f6b500ad3c16fe670dead2126fc17d5bbdcd91af2103c7f90c3b1be27ca016ff93c6b4afdde85d1cbec7a377f119493c1606e55ec28acab7a82afdf4fd48a178633c234ff4537c4629d21daf969e044edd868e063a109fa97f2e4a4f90ade3568eab8e06c5fda4daefe3ee88d10b77692a517045ced49b93150d480b439d0c92cdabe78aefcddd9a9fa359611d539e15d489a4f5caafe2e2437f9c387ccafea23efc6f7b1a309d98867421f6fbbbc64c2e6e30bf38ac2c4b40f770ae4cbb7ff4ad930d3360d1f5b3e4640333e0d1f09b5e69d0643b5f05127cd7cc9fc628f9317dae7ab84699ba75f5ad04214efd5fa46239f2e5d9e4f358d570aae4a61f5542f828dc7ad92e6535a43aac99792a4f034aad48357eaa070c670136e5eb7900cfebe31b18765f7973a6a2b517cea9510d8dfa2a3d270aab34064e6c9181ad24a48fc2ddf6feccc340777f584ab713c8efd9dfa9af84546ee0803d6d23aa7904bf754a08b4ef236dd6eef44627190a49b11bbc28cf5f7889a3093c6a2a273c487fc87109db73d6d21f5ff9a13176bb9c6c532602114aedf5a72726bf40a92f4c48f627e66341ac69a659c394ed40ac36ab7db738fe59d6dd0c4d3d6f7f0351ab0e129e45c68721e43dd2a52cb1140b68b82c405d5cbd52926ad7a52f593b5ef6e8e97a45d2b2c30590e7650da63654c111a1a442a235986e9f0a5ec07bb0a13f73e1b0c85c2bed333171f91a0698b5982b572a9d022743ebc465167c448e547ce7a7e63bf40d0584b31abc034143eede6a2a26aa36d2faf6f02ad77844b066eda9b546d9eecacdebd5fe986eff6bcd8c6ee3a6f45ae5871e473502b2c018be14b428fbca8deb2a5852041275aea0d89637281d069818b078b876b9c23de78b7a5dd47b56a9839ed9ce94c133d17016c6f3a6359729c1803e28c2c7338d090437802894f5a17fafe2aea45867cbac95e4bf605c43862cf57c245541085a3292d992ffc376eccc85b8acfd0a3f3e06b8cbf09b094cf60221dc20039e5dedf79ac32a3865427d6bf3d7f49b096e30b251397ae46e09cb1390527ab74187041679e49042c6245ac588cb064203e07d452fe434b1c0845f21bf81c696140a1420d5b569b195c436e3d54860fb4c405b75e155898f9af0a5b3f2f3e47a78f9383d9b721206fadf6bf66bb2ea77a4772dc6c2a986f83e03e2d404780bab6e1730eae76ecb83a48bcf922e5c4db0f68c09bda9c5e4d84b0bce5f33c408f7f2d2ab9d087b950ff38dce0c66b8d2a7e29c5c0ddf715c2c79fa736d0f526c3941c81023bbd58ee9e2cf935caa5c34de1b9d90531b011d5c0792196c9b49eab77ee9a576a77f1870e30396dfaeda9384f2118a98885800b9ba041d40b8767f115607c806c4dab15c71ce11f72519764137f636ac506df49e7289d0a91080c0fc1789747a7d46133432ea30ac091c8c90e1519fa2ad5382342c386c22b744f8d80d70dacaab1d0a89a2d6ebf2caed26319ae3ec9d9467afee0348a717c7cd200d4616ad76f06b51a56cc5c4e58049647fe6058a26c77f06f6d59cf343e4e7579e147ec9164db1c53d97b0f2043826ddcedf19df3dc1ad54405e909eb6880b903d5d7f0b8b84d16537d59747460f41abedc8f943ba6b2d14bbfd98ade7d51159729603045c5869ef7a857cb2b886bbf961c45278e15320416895c0bb973528344a5fe78b5a0309e21a709f887a8945295d43ca42943f8bd1a4900cf0deba9635fc59ed18c0f86141db3a088618f1aa7990194adb38326f3db81d7ddd4b11f3c564b62187782acddf706c99c9caa24a6788775b66812da70be2bf202b820484e9c0645c6a2774f387583a8a00430aee7f0061780a0987b685048bd6f64e8335cdefb1e573e6312323aa3f344e40c8f15d5a952d7d9c183e13be897491d8ee0cfec942ebf42008dd48fe9c128edd6dfe5aae8b6bae2da7e7a8d1d98d72390ee6adea522aeded02637ceded5d150ae1636d5437d567362c63ccfddf308805edc98cdefa2ded99b15f1808afe2a4d07b28fe8b33b5fe0aa79b1fa08cfabe267ba81d5bfe97aa28073557085fc60f75c449693a13c4983343fa0d5a4ea6bf302122f544ce2e8b3c58a8d4a97d44f3ceef61b035b7d7daf1804481c1b5dac865bc9b80b4eb70766e16700d4456393b7309a720c61af3aa460fdf9c9b624eb08b9c89e7b3b15521b5c61ec58d70e1ef49e43b15bafc85e03451b65f0c50aaf090f98cd5f201717588b544ae406effadae43356b053025c31a49102db852bef48414ec8a320e5448d5f2b860ab0ec1edf2ba2de35854e1a490890dc5562ca0c6795addc593332053161093857532c3758fffc0ae2f20ade774eae6951788d09fe366ad62562833115288f999d5118b39053702fc74144a204409c36820a78e054c1e6bee7e40b913910efdebe0f977089dbc94ef77423c932170f98a2bf7c384347e9706fe82b8ede2d25ea04f47eff335bbaaef5beaca0f1b4eb6a1d97903b2a9824966215b264b5b780c3b18a67c25797157a13ea95fcb5743c05cc2d850e51145e749d4a1d16b26451c3eff1129c85a3c8febca37a91f35a4477216e605320383a59169a9d8707f11d8a3ab4d49d5b1eecf2f75576ebf3aef7293f80a30d1ee66e47d245f64b488d6f4086917b41a403cf19748cdb9daf7210cb8cc38bb6bf4d5581abc500a161287bb73762271c82a5a23fc625b2e15ffbdec2acdce298fd77c52395e969d11a9a0db01e8dc6726ee3060025fc14fcd735bbef3a5a09732a0f7ef96df6874fd7fb8ce36b266eb2050a2233b42173b609b1c5fbb2bf878c46833f806b3b752863db96adaa3dd4f21ac5e1d8dcfc62d45e0aaedf692877022b7cf2eba203c1b766c4e2f49d6ee64a261f624249031dfde2a30cd21be6e5c339bb27c265499f54b6e54cabedd24817f820e47e74ffe2e9b55e31e36a985551c4910506cc986a73beb4eb8c610685ccc212d9406ba95eb3810913f758817096330a3822e2eebe60206380eda45f91e5b6be1d1a11d0ad43fde6cff9c0615e2bd38058d9ffb5abef8d102400bf2b7fcccb40a483de598f6e2cc42e6d2b57167cf4330b535fc76150329f71a75eb55d0a67f2b80aaf2ea6f28d870ef93d745f116fd04de4d05eb1c4cc1a4729a3b2a176e1c1ffd9e3d1aae19c6622cf63b698bc30254295ab4802012ec28e817009cce6fc1874f9b85ce0d92b319d2c43aede8349e9d3c25ab0b2031c41310579915b583833cb3fe3e3eaf1b9daec999ffbfa087fd8071b3e5d007e4df7056bc8142f7bac5c28fbd25645f7016166a1bdcd881667a1ee2df5ebe9ea8e7952b83f9274d0c5411041a7129c2471ff33940c36f0b7e6f2e0a6419fe198c851000c05d1d529db4dee4ee0e2a465e5ddb772f3f9ca0b91e4fa95a55983f68da33fa2621e26ae3823f6c74e1ccb68c52cefcb66b1eb2477807ffbf7bcbbaf09daea7a70bfc52ba6c13f3c2ad527fa6df7e2cbfeca9f175bc11645628ac2b804ec059acb338d7af3092c8be8ced92c2017f96b38ae802649c2aa0f59ad8a86d43e6da76eafee9f3543b57ac08c67cd8fe36b8471dfe72134ba71fff7545f7ee08a61993652b7cc78ae480d9cca1f6c809fe5b39a04fbe70a0bb16affe4d216bc9868a5f334b4fd42e9b5b5d3c99e5b5807bf15fd01b273bb3bce86206813762a5921e6dbba7564b42e3744485a52db222d40dbff71bc8080fae3504672b71df6e0474461bbc2901132be91540b1325f7d03df47a42f9aff2b31ee38d164954e7c48081a6125018f55db45a67446b522f94403ec5f8b75c3c51612fa378912e289bf6bad38a478719f602cfbed7cd461cef6a10f0eb7b9452006b7c91ca1f392894d372abd612d3837b3211622598b33bf8185d6b188fad70b101f82fa27531a9176cac75c144b5faefec319e52f891525f29219a70c5a035ad76246821b944a5980053555078d2a793e437636c10389b6c4cab7831b114eb447a4aac8db5e311cfe57ed096c45770ee4a20521ab2dd71b5fe858db6d78095eb4f6dbbd2ab20c5f5f2241c1d04ab277297e596583b22c2daab37383daeb904e17b09aee6abbfc1fbde377d19755a5b9abf36ac301e9289126279e37b66a799ef25df58eb0aa629c17f2dabdf032045b199f4f2318ba39a06fa74af325a2df9f4add325b2f1d6eb0faadb0af71812ef6732bf3ade8ca241b7d769d1041882f826fe32506526124b38488ece4514084a18e6d9e3aff6a1b0da824321cb0215850546f46cfb9b45331b1b3f8f55713ebad93757a7780815e93ec387b06fe49f9a9b4e2cb50fdf576359448011443a5e9fbbd79bf993105483e0fe6baa55fa891dfe663487dc36d967444542966e4b8371c92193beab0fcb00080b381e1f1f51efb030f014b73e56cd1334a341b22437951afb442dff6b9b0ac6b298018ebdbc6ff342f9f8638e52c3b497cbfbe43a3a9a89527f4b3486b44b5fa28209a7f03b03400e5c603814fc7751c5d4eb8e7f43a883514aab49291f3b0f666b2d106d25b383d8eae67f101eccc2457070b7ed8401e04bd265968cd5a5a2abea78d09980fa91b460d44331a125da2491efdf289357fa8e08782c4029ff1ca7e8bec6e5d17327d66963afdaef86b62f788a5bf2420297f7f00f8fa64a3df9edb4f24c822d711a522cc1863335fff1d202d66a9dbc8a095b8936a42566f7c7119711e235cdd964a291220101b7a6471dfe11477444fc98312022e4ca94d97582ac38b041488a7a8a5b8fe755b4333c1ee100d82c69b737101a28c45b1d0fa26590203687162dc992cb66af3ece4a49174b767fbad1f457ea79115cd25da14c22972b1cb82ee949d699e2d10ab909d6185f211443312dece608c410496342d37a5cc37d9a65a2a8575771d4f3f2da2b98bfd8fd1e0d5cecae24983bb9840b121d3cc0966200b2b370e7b5de42ba0b4d8d41d9c4af0d837be9d77073f2dda5c3c3cfd87c3f49216efa7a5ad7c1f1277d8d2726eb9bf95ea05751b59252b16cec1bc743bbfe38b421e28ce6ff60112a953ec9f2b46a9e87971b1c219150499b2a07742b0ba972415b8d6536588bf60c785cd9b615aef5e998b5549a3e2e99655197d6617232c19baa125ede71d1544bf63cb3f29fbefd7b0a089cd0e445d9e186f8e0815ca7a272c57a4e753c617529337a4fd1ebf58b7029fa8f5d6dd2aea51c0dc7186f401561ad7ae245ce1ee6d75f2a95cf2e7b527335ec40558ce62134aea9c3baa462451257ec22937b4127220da699ef57503dc3685f70a07098546dbb9e15f2afb0958980cee5067b9034b598a7140280774d6fc35379b9422ad30f14c5e78a2cd70a637c8c8e6ce9f73c6cd57d820b318ca52a2fed450b9ffa15fe6e5c09ac00a90c8856af83fa5f2f72090c96380075cbc5c282e5f3820c5ac754d7df10d825a69865779e99722fdda9d27305c6e58ec53c36cfee73415472cf4fe595c5bcf98f7f08f60454db9851da83eaa40df1f65987d267f282e76dcf76724941436533e57c1e2fd1b4f8314f9f0a8636ecbc303a5ee80330f25840a0665438c1c48bfd46dcd1dea44bbe4125f556fb775551c2f5f5b016f6994fc8c37b8f863ff902dfc9f27c9f967ddd6e16937b5ade110871a67fc6630566d8d62cd96de714e6ffc37f2be45e5eb9f830a6384930bd197ecc351d919ae5774ad1e4d0c189248e7546f1b4509709298720d62a987bb0507d2592c660c500804d3769e41c16e4dbdd52719781cd29914d4c20d5e26ebafeb74f29d3f677050e199d59a92fff134b31bbceb8270ab39dc1162836b7242e19710625f0e472b8ddcb539330e91a2ec8f3adc09e333e051dda46c9fca1690e163aa86076124062b378bcf5ce874aed34a1fdee4adfa1055ab50252f9aa6653ba7af12929590e8e968a64278b7c419ca6b66da006da2c3ecc4c2b07e1e8436680ba43d6317413e3cfc19f5a0efc51a7490e7f1726c8389702ec3e7dec475dc29fe70f528762d3c3e7d7d5d4af945b36cabf5a8eec0098f9afda104cd047e350929aced37fea766e078410971b4c6335245168431d2218e1ec651d662bf4f9cd8912e112b8fd514c7171d4b308fa5630d1a9b7cbc9a2dfd4c6e9965896a332ddd4ce63b6d6b09c649b819d7398e907e4e410794b47cc5fa6c7e3a96554a07f73c2eec9b4fb6d36dd66efbcd2fed7b7e8c7e8b414a55a200533d503fce0a5bc44dd42e66ba9fd5cb2a5566722901d4732e8aaa294b99c8c1aa0d392a471ab8b6c0210d3325a6800f9690cf17dd754e7bb5b4ccfc96bb5e7547079160999a15474729c357d314920991668a98fc9927911b2e3de50e94237c45aa6ae7c6d18df96a3820e2d310222d98c589128610d7c2ab528cb058aa338978ea4d15450990dd8f09ab50855c6320f65b7a50806e7b8ae44f410230a6288358d659c27266778375a18d196f573cf2ac2f70b38f4564a6f1e87974e0dbd224b5d31b1294fd96a6776364b04c3fd56536ead5fa41bdc7426018ca9444ce62754008e528a38c004f00377f6f95aa9133ce08ed28d7fa41b2400488276163bd5e7aff4170b8c331f3d7e6a4f43d6e65b85b044c9c8fc93f2736d1eb3af93b7e02c2221f09159d43ac7eb6a2584d8ed1855ddb326bb1e7c8996db202f29263b5f91a02d1299671f09d1610e919622184b19a919e8182ed2752d7aadd78f12bca04d40f4604929b1b8a5ca5300bf840433061a65050ffed40cf3066e9fe70e932843464278125a841a3075ad071c92a92daf0a5b9bd75e93919662401c3b76a60e75f5c88a103eec6b07d9c9910b654e4d488a1f05170b8904621a259ad8efb49cd9f68399a5b1387868a24a2a8f15e27df047ef4a679bf8eb45f30a476d81768e2cc215ae735eba04b6d7f285f32d9a1b5ad05b6557c260733b1f3ad7bb83093c12e0b21102f9002fa710a01e31bab0d36497f0642f24df195d7db972afb4328aaa9e7ff814d0b97fa4e383afd2d0f173b927afff3cd5a5424e6820f62df67ada49df2fba67c4fee7fd1491b29fc153b9089f5e17e99d0dbc722813c5ca507758429b133c8eeca7dfcc936d3e2802bb5d7c2cebe0242ad0339dab0abe670a8b0e7baec29679f75e9732c33b07841023aaf08ab146d400df800459d9aa6233ada17ed60e96aa5c52ac370c71c9f73da0a9e40ac7774a48a363dbb7e99308e40da4adeced6c8d843a25356e7d579206c19c46430b196f021f5410165c7a949810c1239d434086fe822762a7e2a211b38466496cafa1a4da33998819c1973e79f9accf79782a0d8522f20d64107cd902e676ff6315faf48525bb16056b7ab1f23a8c2a01211d045c04a75ddd87b33e7b1e02ab3f9dc5ce0c50bedbca810b55017596dee3c827ead761224af8adc5ca2bd126a76078e810d2114239185879e8b8440cfce291a39fa2b61c935c53e96dd7c9174b5e801cd693e55bdbd838947ed868f778a53526e1c68128ec640f66775c066e8e904ec51bb08561c32077c8da3673593435858ad11da2940161ce9cacf073a9f40ef4aa0b2c9681c37cfcdfc03f048fe09c78054c8395434fef6c08eadd294975e9b776513c59e9e4dd400918750a8abbcbfac8cad602cda86885d10ad7555834beb12ba41aeaff1b8d7e75e8625d1211efc9dc58fdcf0d3ab453816580968534c728326f6be899bf68464896461a1440d66b8419f489ae033513ff21ccc972f838794a4b5c8b7eab971e8e3f15374019edd5b56cf7159fa5fb98c14be31ff1dddee7125ca5108f43bdee2d6d9f9b2c918275da56616aa082ab4a8dbc076f0faf7433cf4c94086e72907485281a3634421cccfbee91f489ddd281dac893ab49a0c207ab445c05dc7dacb583c3b7f659eccb2bab17d0079feaca996e72a6e9de585e32eb8b080d276fec7572ea5e15679d0f3d45cb78b0cdcc6c5acbc5c4f3e3e4ff9d8329eb3858f97898fc0683e7200776541eb66c467855dda0c5ffe88115093adc0d5456c856a16397f612bfe72efc67ab20250d5eb58f4e00172668cf6f8d3f0578703d75d3b239ca2d5d760280facbd90140103ddade65010c40a9542ceb88ecb1e370bcb8eb88649d991ae7149a84eaa5bf25e1ff25826417a74aaea33b61ae7361cfe5bb0a985d7089cfb2da7b8dab4fa34ed7765c03c49b7b0d1db576fe1bc61e3d2c57319cba49cf8a7a16b10d5cd318aa4d9a692467d7665fc3cfd3428753c8b15c16398507ef9ed6ff658cc0e406154ee066138997762001d7d84a53bc10cd7e12acc34f4309d4f1cdf231a6fa2958d16fa452c7e511b91d5274b40a3294dfef81542fd69e4f5d7290cb7fd316b28a82f52e6ea202972ab3d5a6638a7327f332ab0c198fa9e864436ffdbb83a27f41079f5b7745a11e7942ca70b22e7a1e01c15a4f9d54c3fa47439956771581c0b4d7d315f2b160af87f59913f4431a5529e070ea3d1cf5219ae6473a3dcdb4e7def015a4613707e7266427e72dc5ffb3315b6a9c0879d88e43f0f872e53fdc9fb5ed50ef6536acce4f8905ae5f03b78d60f78387500e42e41f42f352fbb6655ec2cfc3d1275656147054fb77926440c4527a9a74280e1a224c7037749caafd83d3eef415be09f31254d0f51da71191057096d373147b23934b442dfd0fa4ee7587b54763c8adc4c619564b4b05c88d50608b41607e88545f8614ebb7cb9a47e9d2c7fca9802a0b05c0798151b45f1962c61defd897c5ff5990690b1517be9ff29b63c2f4439d548900f290bb11e0b37f6099722c2a8d52c7a71c1ee3141c525d0eebac9bb250532c22ce510003fd504a4237247d42e99677b88edb59ef0a91097168d74ce825e76dc192","title":"1381. 设计一个支持增量操作的栈","link":"https://leetcode-cn.com/problems/design-a-stack-with-increment-operation/","question_id":1497,"issue_number":6},"4":{"day":4,"pres":["栈","括号匹配"],"tags":["栈","DFS"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个经过编码的字符串,返回它解码后的字符串。\n\n编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。\n\n你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。\n\n此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。\n\n \n\n示例 1:\n\n输入:s = \"3[a]2[bc]\"\n输出:\"aaabcbc\"\n示例 2:\n\n输入:s = \"3[a2[c]]\"\n输出:\"accaccacc\"\n示例 3:\n\n输入:s = \"2[abc]3[cd]ef\"\n输出:\"abcabccdcdcdef\"\n示例 4:\n\n输入:s = \"abc3[cd]xyz\"\n输出:\"abccdcdcdxyz\"\n\n```","content":"096221cf5b628be1e73e8bcfe626c734768e278a04f8088208427f247f0e0e2b13ffa443ea6410d1ec9878a833a0e65ebe221bc49a2e129cbe22b42dbfe7b231e23168699ed9d2bc0d26c1aa8d98106c23f6748893ee66f477fa654b0266256db0a53fefe6414a444360493f2f3825348314cce6efce2926f8275a0c890d935aa8d6186b3b463d3e45c128b70f9331de2b684feb5b6445588da61c16ae9fb05e7d33760b27afe875237c64fb8877175a25aad5fc7a19366fa826e86c7bf61b225baf5df8686427d864592f36ed21343cfe01ae3a6975ceb9492995976b1803cca3e3b41dd9ae4db9ff3104f5a3d884ff080c51c949a44e314b5586684c2942d5ff03dea5e4fe4dc5015f1671ed331a78988c996da600fc3eb49cb40ae2d161fb0a09aece76c08bdc46af791639f4256495c515029fc74dc09a6bebdf778a46871d5daa9c12045352a5a36ccfcbf84848272446380ce1926ed255c4dc6c3617e7ddacef3ffeb8008963123f362f2b98df7e9bc972e74a484d3a3fdc59edeea56c07845118673a83cf190bdd216ecd09358f312ade9abf75b9b16304e87b584757fd801d13755ae801bf8e284ecde9ba04c3f981d8c032c960230c63b7655ca3a8b811a4dbec12986f409e3f5c4b6057130ad062a999d2c2e9bf35d2d6243e56d453ce532a019afd0c87aefa602a352abaa6b2bf3bbfe7238ac30ae97ef2c760c7c4792f6b638c6fcf0b8d42fab3f0d7191e92cfd2fb386eca7724f4cabdd8b8c24bb6f3df78001c06fb054cb1fec1ad7f714437080361824e08e7907d19d70c16581f0ed3fbc384b9650675474c9a755235b1789f3325f569e4b7066af89e4859c6dd735bb8b7ddaab7a18b6ce3fd3e19ccd4c9c3c5c0dcd92503d1380b3828424128240f23738da5f460712bcf3282c2a80a21706ac1298d76c4462e965d3a779a1dc5f93691b061eebb97a72e1a6d3e973721c76edca9d28970dc1ac8ab6086eb069c3f0b3085363722debf24a2677c6d81d9a2d71e86b59fd5563dced476acab2ad762d2d7ab83dd4c56024c439356ecbfa5ed2db80c0a049cf93cb4f939d16452758a82528c30d30cb41cf380233884e89feb09862164eecbd3a6314ab26915af793e7b4dac519b5b9624cb059f450ee8e7a544253280aafada2a754a3b5b2329270b1eccdad139343ba9abda15b60e0955493ea0a648f00f44df34df46eff68ee3dfe9d8d97dc43987c2b8ec76969c9390497fa1df03dd3a8f61b12c7fbe6feefc01bb5200cbe149b8f28a317555e4e99eec1d6423a2d5f95f5589fbb089ed05a6e74f51e263803f3ab98427978ac349d2243db4e781d19172ff2f72ca63b3422ec442fa8c6d6c1ec0aaaf8c80aed58b8b6e2fa786d4d6a675f53806b17a85bb9f911fe1b297cc99375494eb3eabcb6c93d6f92a447bb23baba496ce7865ae8993822978f2993ede19d70bf165c166257b6aa518be69bd41cf3a96b46b87eb67bf30a3160d8eb42627f8d35f5c54584f309ed976779d50bb0a730da07e8e76e5d0f81289b00fb8530d8381168e529ccf84912ffff3bd0be9d64a2a812fa6edd6af42abe2ba9a9ee32d02811ce2dd9d00542ef831fc35315956c01d889d4fa60f5a63003a3e5d625894067b05c29b9937a01d92fcf580fb6a44f02e3916e2d888e39cc2d25637b00ec3f8397953193a310cf1f5f8f05a0005d6a8b87296bedeb8223ac703f3a893843008d24a94c77387545879961e790c37d54581941d2975a99c61feb95c280b243856f284f8359248f5e73a3c0360183ade3a6aa673de9f8d375b7041d9cd4e13fb2e2814a1a85db98cff84f3c08beaae7b1b59243299f3f3e97993e36ace74d0c3f386146d34e0d7c19c8f036bf0534c77f1bf098e2bffab27033bb0ef43134d203c07e9cf892fd3895bdd543db43397602a24674765ffcc00e5ebd6ac12ecd8f43090b31b5e20fa05eb08d96fd344f5fea9f1157e9d3549c5b2ebaa6fbc78922454f50ac6c83137e6bea08fea4f0d856bfa6ed522ecc238574aa2bb04d576fe4a88828176f2d58e7bbde55c8109f8d105cdeeaa6061812f6f7974cd2af1af5528d14d82609d221d7ea62516939e89bc92880d7c5884e4e1e8f82e2e0e4bbcf31210a50baac295b4063d5e38805f6081efba5bc9165be1babb7a366cf213b150903138208c0c1ee862e5c36106bad3789b4825dc52dcb5db9ac13415159475c50debc7615424b410f6a0a2a6f221041ee636b9280ff75415a239f90fd653251727182cf4f5f3732cee7737db1b5578ad866980b13ee691819617b21b87b746e6e30a94f63cddd635067d92d9c1e0b5e8606be3796c9899471895ff5cd645f8cbcaf9e1f878895612e87a317169de339304fcc19c0af019f62aac6585a7098b84a96934699846e1114a99a4b429ac6d46b5afcf74d403e198aade53f4d22769aceb0d426748f1039a434fa5d2fcc3926ab50752d7ff5cadad0970c00b22dd9fa2ab1a7642a93696f130065cceadc5254187ccdc6ec66eae33442f31e0cd03f547f9b86868b1bc48fd274937b6ca92579882328fb0d5ec529e3a5314c482a92a99d4eca38a97935d56f3f64d52e60f5316823a68e69a1e0afd6c11fb0dd69011301e2b0ece4c030932cfec0b7d26c32f7b489e0c27f4df78fa70a9cebe9a9d878647e0d968856fb3afe9beaacce2822660610b32e5e331702d49387f65f94640222a376a91ad38137e40748f3a9cb48955a9ef64dedfc6402d2685002cc687d8322936feba8e8fb6ce5c7ca4dcb872ae9832bad3fcaeedd4d170763462f36ec0901f1c63b6a3dd9ebbd123a2019e3cd297396d052da651b2c66a6036289c948b1b09b34e54eee2e3791fedb17aba5e27f644b59988591b4ba4b0754a60954ad235893ca27cab6efba09454069ba1bb746fe44e9b2a1fc5357392a0af937cbe7f4d935dd906519b3fdc446c0a1043c528620fce26f6fcd00aca1e490a397028a787d9cee0ce0869595460c3098f4b1bccc771424165afe1d5ccdad292e293454418a3268223f352ca2648d3ffba5b2f400d092744b52606e5d63e25cff75c41dae8039039aa30986223ee0f36aed46558c0c015ad12061575f6beba57e36dd84552bb468816db71ce60e818f5625a41386e6c54b8d7cd709fac534947570d4ffe07af5c304db21b2b36f2d961cbbfcc8910c4c23fa311d0f9d1f7b866ac221dee11be772b710fe02168fe40013efad940608550a118228df8f3b0c7c04fa8ff9df4f257c61b7580d5b2eecd3eefe2f401672f7ab8ee5a5fc635413e81c829d3483f6eb8719f5c5b54051fb65fdd26e09c4e3cc60492546c7691515b014c34674e08d81c3ba4d6b6c8c893e85e826511cb2f1df3919866e2f4118d7c5c03c090d1cbf39034dd4d92c136862a3a13931dc698fd559eec5d8c0f168ff2b0b7116bcc984c5ca97f99fdf87a65262406c2d331a0a82c24e83547ff835ad342dac8844fb1c14f30365ce013b0ca79eacdb6b4c75964a02aa220088dee2b1c3f7c0d1c289f4b690f69a5ceecadcfb34b3fb851d87db23ad50984d426e290c6f1d96c63a0fd44208c4430a8371c8af05534f2711b9ccea891845d6728969b5af0530747928940843bf48b431ae7c6d48ec59ce7a7a5dd83609aa7aecde79a9fa3c784e5929488107a351150ed4061512fd69a01e775208322262f1e43e0437933e0a8bd6fa6dafc1129865bed52b12f26f05ce2beae57d24ff4770ecc5f4bceef513f6cab3752d24c5f1fc088295af66e682344e21d91f2e966b3b79e0e87e303680853720a6d26339b04d36ef89cfca73f727c9a2faac1e3affa3f4b29c283022dc2a4e2b540de07d4f633b0c0de5671810f391a244f18414422aa42c1d2c676a08d7f43889c091e0d21055e7f6e815f9edcaf7d83bb391e1b652b115e7e5bef13432b934a794846019db02adf047afca603c430a9215fd117f7785bd17c34bdd63530ebdfc7a22fa62193c95d91d16a45246d77df0b28b31ffad09af33264dc228b67daa90eed384e254aeef161c2f8e8230bfecf967fd4d8343ad15d58154cec34ae82c68b6ae3fc3a0bdf8f60b70fa650c9702b30b9e0a8a3453bbc138b713e96c4838489c596a9194779171e7328503eedf072a98a2849d874cc96d0417aab547ac4bc179891ebea58b16bbd9f8b91cfb6d54a7e6271c37e2cba41d31fb46264aa7d54a7ac534131cca49c85b9d8b9ccafb189c8ef18fce5ef5db3c78cf9d0ef5c5e553d629b75ca4659d475a7b15baeb93d323929eb2f01ae8f0a3214531db13319fdb7b6e2e94c95875e18e82e0c24a2f3d3768a71aa71d154f828d56fe0a104bccd0f131acc19b75d378f3c307d1551d467d70a7f6f7acbdf5d1d6dd7e8a00ca91bec447f60bd6d1349e5b6fa1953bc0f4f56eb5d62a2f8ae414c1f7451bae9e8b88f072fbad527ec156aa7ac428d956b7bc6fdbed5d1d0bf5566d985a33142712a9df1e12f2b4734d70cd1de9e7eea472efb49e7f82a79722c8678daa4b236ebf718f4b983c2aeef0aef7dc871c045c1008b5e81b79e85c18aee217755ba4b361045bb6c2e108da0cbbb56ca668f39642b509bc7774f314f28f5daf7368ceba27ca92fcce6da13277d247fa7b7701486455c2a804af6c9403acacd80c97ecde31d84f906afef6f7b83951662c13fbdac36aa56f583c4b6837453720bd8f37092b6413286c564e67c8f4d4f112677ec8fa14f78ddf5981366f11ecfedec8b7ac89e7c9061c31ded7d96a535ec4631b5a633fdd02a5ff33fad014db72febc1544591f4b530a7e3a449849716274e7c49f2361bfe34a34af426f6db68c6bcd588d4638b103f0e6798f1e31e2afce4d93426da43c6282336380a4f89d0002b11a285745f385b23ac4eac30ace255b7fcd8c686d47afdf3209f2b58dbe473591b2820504f7108967d655b3ed0b14e3be1465fcb268cc3abd4d56457e9cd4c9b941e3f45b09a9c3e74128417399add632adf41496f616a671639523390cb35b0862f09f7040c859d96cbdbe622c1d127573c3083604b46b43eaeb7c4ee7cbd5ddb565fc62bbaaf22a788f61bd7e6ce433a5525d626136d113c75255ab77f5eda75d60b6f5e0be8ab949b5a1227663fd468770bdd9901bbcf6099a02203e064240f04746f7a512d0998a19e45bc0a81701f9968ad8a2fcc8eded595c90f1cf5cc86c611547f90aee4fc2163c4e07e4fff5943528c9308f33cea5a6a8ace9347b34920239057d2c161eb52d9dd1337a6a0c0a7f59cfd017117f31a808f98c7507609a7ab0022c427a9a89d8acccfd69ffd926688eb91936ec64e56c912caff0a3db2514ec93dd0c56e1a31c7744b0de990c166ee20b3b36b9ae8afc6b6039afd3db778a4c6492f33878cbb1c9d0b18d46e06abceab765b68e29a813a77561a19d0d32a81803ccaef571c9024ede34ccf27e78146797fd68d1e54d737692e98a050547e69b9f97226550bd262dbc3359d6cd6c03aedb7b9e42308ac6cd681a355ada181141a4baaeae2ae8b6e8122124a463a5db0b5b79fa85940a10f904e0bf5c5ba68309419e78c15b236c4c8c3818baf87eaaaad31540d3621d1f0adc0243699fb17ec892545802c3f60b5ff548ff8684d363403bf4365e1566ee7a00712fb209f39ff59c2660545fdd6d39bc9bfa24cee206cbce26ed2d3e71aece1b99d03b3035803667534bf4955b740911757c980a05d306655a1ddc892997cdc3d06448083a6c180e09d2a5996e3175dac0aab899cb8ea14f291b7780df0445b14ea8d8f41c01e825dd1667dd7f67b3160088fc825c64f130bd88f48576978b405dc9cda2228dd145b5b4ed26b91fae27343efc2b6ba8e5d6f3b58903ec33d1ae2728eb388db0537565a8d93d68fcfb997c11b51ad5781e25981c050c9fff342bf9ea5ee32c4e41e450d4c83decfed81eaf08e776a5b3ff2757357fbe7a84a6e8d4791cfc68b3c5d17544fa50f850a1104fc3ca582c459f1d881b531832d9303c8a883577cdd1593dac991dc9e2368ac03cf02f4ad30a29e65853ecc652ed53ad498beb5fe86dfb9fb589e3bb626c66e6ebd87fc49b4bc5a9ee602ea6b1e39a6eca17b1267130a7fe5329f454565e55fcf5fa04cc4e4fd8365626d4d24ca62c16118e857c5b069699a33c276443b9f85381f7eedee9a3f978f68a264458d718af78c54af9786f98e666359665ae5b37d35a165cf0f3227e0fc7b470fd7d7ea18744b44b34f293dddde06d1cf88e0d5bf64789fad4fe9c51fd158e04ada7cd2cd5284bb16626a0d6c412da83063d71e5abd09bf0284dd1b02963389b584ab15d58740fbc0d847bfb434fde6a0e2cbf5caea27e9ec9b75040d0929ef64f1c579a81eb4ece1b51dffe9a0e305d43b814017aac0acc16f0654397ea4e7cddc137a80618c18f5cdbcd9179f8dfdec267dacbd86cf7a664e5ac55e6485be7d842994195faffcfb7c8a18d85e8b879c162883cd6638874456b570c897b6b6d55261bf9dfa724c7ceb05e5b1dcc42c81143e43c6b9b68163ed2ff521ae0d7b5a27bf214665da9a6fde45cd07abfe3e112491cecdbe7e00adb0450c1f67fa311e7536d2125e17eb25e10a0c94216d13236f2a7b8fb4238685d20d241eff845f177cf959a8c9aa6f9a84bc6dfd5b45f165ae3afd370c348e3aa399977c5e5e419103f2e32e90f8ff491b3e6f4139a081aafe143b23f3a3bf6de21d46c0266a52bb5d528b0bc62d5c90dfb357a425ae1e329d659f2c07cd19f44de3643118b18ddd3c8c2073063848abe537ca6f14bc1e46917fb31943c492d85aed6fe4d4030a3cc2314dc60963c326fcf7daaaf9761dc405aa33a921e4404ee2e3367c1fa188ced6beb22b88c7fea2f95a82d1280e4a3bf2f37e90859a05becb9af3b813324ebc88b5fa57d92ddb3a5872536d030c753259045ae6bb8a1a1eb5e04f2a8f33b1e6488f9317dab3e3cd3ad1ab5719c6410aa2c8fa6e3f8d6814b45235c3125dae2b33a715768a92c3a5a4ee5d6019f0dddec3e8aa61f38ae80395e33f933e13260ae4995880ff72fa8778f7ec477101517cbddd04beb0a2f08631a8b21330eedd4754944c0ca4428d66f6cc62483eb184f05b3c8efd9dfad3f703159d0f1fded36099d056a406f59243e92c902ba7063b38cae19b1caacb8caedd889a3093c6a2a27390cfe7914e9bb83d1969a180d4471760a4c69649673d1caf85740c3328bf04c2a197c76a266f2f30c69a65d97507cf209011e48f6ff79be06dcdd9839edcff262ab0af7ca91e2d201e18f72a52cb1140b6c2c4c40d82835ac1bc28829633220f3bdc2bacad5d7969640c5c3850d7727e66111a1a442a231a9af3e2a3b842f51d6cb96a1d44d191f4dc2e5c1e80ac7e910de0fb25efa9592076f5155f248a1c985ce4507e63bf40d0580274ab9a380a38a5b286cb25f6237bafab9908e751be92d41b118d91dbf596c3bd64685c0c6d67204a3fc4a59b5ccbb86caaca95f2b63824e2ef48060cdeb4a89c360e3a6bfa0b9e0437cf8400cfcd48d8fc3fd46a8d76f4eb8947b87bb77cb6c4a851222d58796c723a311c228473579ddf7821388fd85e545f9e530e10f7ac4ebe4dd439ea8c4d5add13d9232ccf16a1165a43d1e26a66977fb36766c5c8508a869ee0e8982edcfa48b9c1a62f775396496aa68b9d1ee97cf78e1f3dd6f168320bf5c4ef0b731797fd00ae9a87281434f03a65261333da4e2201786fac588cb028656a079d52e34300072245f21bf81c3b6d52f41817134c9c564d59363d1ac316f88518c810415efab0fc0418717b3e4ca79e88a9d9b721202ae1ecbc7c9967a7644762dc652acc27cab330640e04d2fffba46f1f977deba31660a1ab2feec8a65c188ecfcd8f462b84b0bce5f3616ad2556d6af9faadb35a3aef2567299d48bbe5ec7c4c1b49a5c8cdb58d3bd03391550fee4192ed5e9e0179b926f251462a49e6c09105f402bdd5903623d35b526121ea161bbec6a14f3b87c7ed82544a654069494492eed8808d5a67ef03bc33a2679782ff126e63941acc21e2346f52825619794c6ac51013864346dd401dc6e58721a007dfec67a2f71a0afe78e3d4b8df66673d9169c25a9eb306dbfe4b25601241228322435df2ee96eaa46bb1104fa2b70ef8b3f21929cfbb6db4d8d5c91ecc4a2839e710a74cd6df48580a72c30dddf34e76a27076f06d6fb45f5597b0b222fb2697883ea20e1d94496993c057cb7d294c1c36736dab745084058525a4d27ddf7a1f3b2ef24a610f3177341ce34fc4dec2c901d56768c451291c3bc09991556055b58f3c1357373ca43de0459e3730e1d0f46c9cc5e5388e670bbf6a4fde46cfea7db7a725923ce752bd0c157ad6452afa178a986a0acec8af1b92652caf924c4d12289c23fb983a6533ee8f10b051ed1bfa998039ddd9b1cdd0f395d88ef284e8a8bf6e501aae1c85c89efb7d961362d036a3e14c8b15e066cc38c9aedb71ddc70e6afdb0a2f0616769e3f428122884e077695defc894b72c8a9572ddb45742f3c5e78f83ebe4233eb72888fd4acfcb14f58ebcbc81a63e1ebec70d2d226a5df435ac9e83ee89e4e92beff1cee4bee8b593fb13b58c09f4539a6bd3a401b8635f89b69001428fc6bf7cf9ae1c2ed5454b59734ac918f4dedd1b837cd3573d10cda0b7d4941c3d86fb39402c878feba03a5dd9a0618c77cc343f29e7b5c3d3aece7bad877dd1856c35943dd7cc2b84f16a1fc96464ead7b5ee73e382cac6544adbdc76a7b9ca2cb6bc0b20b99425ac4b4467c448024f15499bda9e1997a46dfc30074dde6d12ee444880b607bf7f2a66ae079760eee625139565fc5e5f7ebabac7b1de344c8b3eca5d71efe125ae32c3e02a6d5e5400cbab638c4465869be4fd9cd0b008a29b6ce43e7f489c6b6dd2f2e1dad4523bef1c04b28e02663f8bb8800bda77e48241985c33895e846917930382ffce9d6850b6e75ca7f545051d98e5dd8490fa","title":"394. 字符串解码","link":"https://leetcode-cn.com/problems/decode-string/","question_id":394,"issue_number":7},"5":{"day":5,"pres":["栈","队列"],"tags":["栈"],"whys":null,"difficulty":"- 简单","description":"```\n使用栈实现队列的下列操作:\n\npush(x) -- 将一个元素放入队列的尾部。\npop() -- 从队列首部移除元素。\npeek() -- 返回队列首部的元素。\nempty() -- 返回队列是否为空。\n示例:\n\nMyQueue queue = new MyQueue();\n\nqueue.push(1);\nqueue.push(2);\nqueue.peek(); // 返回 1\nqueue.pop(); // 返回 1\nqueue.empty(); // 返回 false\n说明:\n\n你只能使用标准的栈操作 -- 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。\n你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。\n假设所有操作都是有效的、 (例如,一个空的队列不会调用 pop 或者 peek 操作)。\n```","content":"096221cf5b628be1e73e8bcfe626c7347784218a04fa31bd094e51256922010200f19c5d26e68d9092e660af7dffba08f46803c2903e14deb929b72dbea4fe2efd717a7794d6cdf604308dac848d517a3ae17392d9b0199b21bc68dbf4aaa28a1431db0862be8861435b443cea542d78f736adaecbac7434af8dd8da3da9927f8fda0055355d153140cd2896109331de26736ce8595f457a89a4312dadbc9d5e5e09702f0c4c61ebe6c422bfb01863484fc1e19e200d958d77df6cde35ae1474299f14bb60038374adf77b64ff5b751d8e7cb0571773a0e66759e8bc00532ab6d4f7cbb37a37a27472a3da39216b4c554d5f57afd1c12f3a0824ad0c311904abc45584b9a89646b3464f660cf35f586bc0d68f20fb0898a84d14508a244dc0339465f0e405bd9ea228b1335735994f6eea8b2d56e1f700ada615b8d819ec4410858f601886a194eb126b03c3b9857cf6a6ddabb9a49fd950a327e99b3720769de2c99427b8db1de3ded8b6ffc4b42859ba0e64b4af423b322542b54397a5b31278991a457d73dbfb4b53ed722fd56e8fd9730895c08ccf5703849b32a2d8bd85387dd19f85b220bc1305fa8b02184fb03a251d3865fc68eecff6ba379f8e68777486716f39831981896bbf98acada7e49c1ced7e1e5f2d1765b41c16effeae5997739eac9e5246848691fc600c39ef19202b75f32e39ae1e14de26f04401d951012d1f1721b4146989688f03301817d0e04b570100f6c36eb2844c0eede7c89f5bcb533b13664c40d104419dffc28da3f4c13b0a138e07848004277e1ff10e2c6a1d16d4fafca8b9440d7b58439b5a4936ac6558848c3020cacf4f7cadc062199fde3102b0db6644277c60a43031f9cd2241756d523f3d57a7e459e48dbae29fcf88d26a59b811407aba95ef4853f5c61187eaea358c32a26a8ac3d27fdce3b40ff11875c87e0b3dc7d0e582657d4b8e960f37c55ff1abf98f71c31ecabe538bc22e9d142333a62dffe90838f34be48c9d14215158d06976f9fa1165cb8c1084c274d60b4f036cf1d9cdd9ebbdd1001882adc24dc3b88cd0e8013352ecc966b8451638b0df2c8665b81bd9aa7082033d87cf91e939bc2d72cacbd3b63f54a9632c86791c4642a676997b8b24eb399c5a27e9e1a844103281a3f3d12b7247087b23232d0d33d937981e576bb5f18431d05a343a3324c4e0688942518548c30ea0d0e1a5f68e83cf1d9f2dee5cc4b57bd7c582f1096bf7850495678032ef0623f14da68129f42f0fa68f7ee0afbb5a21698dbfac896e5687313a0b75b9e7c0fcecccb3393ea6de7f25f63d71e0a36dc3ad842de894b85a186e7c39b74a760ef928ed5ca92be35f8e53471dd88f402b346249e1cd6048eca4573b11d1f50d3e5edd317d30de7ecdfdcdc6c44176f1a11c2c26db37d6f503a8c322f2581b9cfa638b1a2155044d1cd7fc6dcd893865e91aa84d6e1043e65e3c8a98758154a0fe2c2f34b66c6de46508eccf1550a0ca1c22713feba4bbf7cc94e26be4665a693cc38573e03f424bd1bb45d55956d687e546c93d0a2362ab2a71c619e5fb48c5fb1d15782466c5379c257d191ae0876bee246cd643716faf3b4f27ae8abcc0f2f2affc33ff8ce49c49cec0b9e019d0bccc166072835c897f8ecff58d601aa20e4c880f536b0e16392cd0dc05e3bed8a3f883e36f67c3a8fd7edad6dbe746483d78a2bd4b00b0ff799941516e02e5ac6eb3747eae4591f93ecf17186d1eb71da62a93f79a20419b7964b7a8d0c057d74c05fb29a848f3c63a7b98bde15bf437718873d8b586334ce6c54e05efcf7ce397a94a5ce341778fac1fa0a49df050472b3d4d331477148a13388e49a823523623f9cfdf6337499ca6c5ca9e2c5410ae899262a657ab27033995e0ac91c5236c943a204e67f618b548de3d810b78e09d40412543d5dd0fe53d7301c13199af23dcd9173c9378ce664a9f706f8f7590c5c77417a95520faee8b9df15ef414e22acc5c9ce1aed97f65121b18ddd97d12ca62d971e24dc8a3c13b6267afb06ae4567358f67a3e18ad160ae6e24bc2b77fe9a2e07f08fe260e1241bc48f6c7102ab233811fdc0f5d2783a6815c6f4ce3acf65a68383f0a6c2a30e969152ac4d268659d6227b0c88c4876436cfb700ad7d9c727cc988d7ac5d7594924d178eb41d9550fb65bb4549145a985756ae5dd05f47e4c827195caf8c19726a5158171c419cac45f4e27a52a1f2a116d74464f179c7fb791d57ff51b881df939df7927d6bbcfc0484a37958a0d3418887a6504e3b91fd5b2bb33e4b9fcb2e441802f838cdc6af1c571a0fe695b7cf289fb85fbc80a39e11cfc1657a0cd5b1fb8479a3214626c7658a11683f829b0d4e7d307bd54f6782a188821d638841c6b869c04af85a079196aab74e40f547526cc4fb4251782d08b74ba6bcee6fec73b7d78296db0e832426e6cd200b84f4ea6cff3e08d6aa92353e8cf559a8d0842f10a16d45a00cc405af9a30f922daf7901d3c690131dd0eeb036d331fe3b066f3ba1920a9b17f1c5314a03bf6af9276703b9d0bab2c3a341c1ab899a6fed57724199b6e2789abf9dbbe537335757ed233f4b829cd0df285dcf7459b689f1602efa1ec3960d1a113709c3561b0a11eae13b582ad73878689c0b3cdbdc44c57baaf1502dc4e8830bbdd505e27fcef3ebd6c4f0b5f003eef5c4c0601695790c60345358fa71782c1d3f84cdbc72687327218a44c485df33b0a20ee0b79d6163778d7864f5f6930e4968ec121bfdafa7146ce6ae903af48e58d9d19bd0d15e06325d5ffdba35d6201b2d5a5937772a5a6341dc58ceaa4e3af083b7a24e9734458befe98ad7d697415e3dd7857b0f6abc78e11979a14f6478e3ea2efd2006021610b32652f122c546d328e51ab23886a2e6d9b35e2a2c7777c9459f2ef2525300a6e1f18e2fe4720ade5e8e97990be203c7f3774e4e52eaf3abe4c94c07699a188ca1f3afc5a860744a410c2e8ee3b5d9ad6169d518980d2ab9b6ade41e44ff71556b5a7a31425720ad01952ecc75c91573d3d2b4533f6a0f390445b20a05c1ee3e7897ba14848ed665e131e5bd3a681ac700148510f1fd1b4457f202604851a2e8a41e9e62a40e65ea19977baf7b5e47c2dc08bd94b7d0fc8488a2a5c22d9cfb03c88bcd9dbe00c141bfbfd04e84a8cb6512ee250d99ea1dbfa42ed48e64305757b569ad2c32e81ba676285409e33662fe412c32f2fb417fad50a70421a1e7f081ca05bd7569584cfc55f41b4e85d39ffb2eb584684503551b7ca6fa5874d934620880da3cd34d186289611789fa8cb995a574c967d3dff5e9728c3237d1a3168ecf096a2a8bd39f66c18a231e4e5d0b2f21e442acc33fa3e2750349b22975dd5cbbae9d5771483b6e7fbeaa39bf9653b94f540f129e66f977ceddef99d00140efebf1ec1f344e0385c7e00789506e99bba88d46b0f65bd2904242d15829c5e92ac6368bf1fbcf1206b4e536d11beb2619cbece8ccb98d09e978a733e9f9a8d2a3f7e7eebdb4a6548fa7a5e2a5fcfdacceb74630a29e0404694e3f75f8d9639088bb99e72082047d9fe01aaf846190e10b2e8db22781961e0823385dd4aa8f0253b37d83eece592bcf7fe67d699499293a1e64041c1a726e214eec7c7066112a1e465c5331129d1b7df473b5c3f37c9096d2ba011bf73dbfc96faea6c0908e288badf76f1d7e26b192ee0d659e6dfc5431c0c09f7bb0c88b11d80daf2e77fc95e1082580e225a17777cf5d1304910ba09862c69bb58343f8279a3b95217c45874209ca0b3d0c3e28334733f54bf20963343e3b48fd37fa16ce9cdbe980332260fffef3d9093f1f29b30c8e1a52fc462d4fac2ad80bcaa3e9dbf49e95b166a6461815e0790fd39060118c8de3f9cfd880ad6e84684807a11e51e093c0b0ee91ebfc963b5045278c4138142c4e93d47e1cf0909fdf0cf603d23d4ac60ca47f54a55121de867c27adc0ddfc6fbf38b78a469e942008631f20eee9d504f36c1d0419cfe633c340ba3f21d624a88fe7ca7030f2293fe86c4ee8df9968e3de2e3a8555c484c6b74cebd2d78277c3a621456a70bd32ea2dc72687a6a5632c2f26db803439ec228a5a171351215061708ab48688e686e298d17968e56c41cac1148d40773584d72792a146788f5cdde121f94709decdfea392aaf24a6f7220c23d39fa4fd71efe6c69c92d5beff85f513c8ba49f9bec9ec6b26023152574956e534398512c11110066e6aed4d4aa5da42ed4920ff07c5a937e61aa8094fd5dc830aea41c166d4e0cb02644b7eaf6e6a8519c9e5818ee221960eeadc771936fe76fc85cbf02f7a97c52e8006d81ceb201a37ddae27518552b422180e20fc2b6a39eafb2cdcee710332bca1d942abc96e672d92a5ea3b1e003719f643c02a34f066d64462e320a665feae4a0aac50560fe9259a94074c6945a848f6b75fae7a6f3d1d8b35072bfc0ed76167d6fd6f1b41773222d8955afe18e41f80a28fb0bf1a6657e27788c7ccda3f776a5a312a0f699aefba149bb34873fc01e9c41933f81aaccbbe8f5bc6f7701f202651e4ca16a5d07ccaaceb5499502c86d2c2b4d86da775f31492ebcc8bf3cdff8f632dd068abfbb1d6b386a38f3ff70099b585c3a9b60ab802f40e2d5a5ef6fcaa60ed4ac4ed1a03b22d3d0182b8f2df2f962aa4bf5c5c3bd90655b692697ae37c6ed7632819506af30ca4d47456e3ebf81e8010b89b4db0f20f417c4aaeb97328b8e56d12f871dea619eb570d81e74bbf273a39b2374a176cf0919ff66b8cf1d0be2a0f473ecedf406d49f1f2e071319b72a65d07bdb0aa9668fa559dca39397d533e0567b407de09ef31b2bf8ced92e439469856462656b0a22d0a1556e44e79f5d75681437e9ce02e6d3a960fc82a7b98e873fb1b529850158dbe473591b797613263a06c63235535eb4f81a72a00a1691638c9ae481876413a8ce45d28b0f6d43a78f8a27315382166b8c870869943a447e1c662c475d077ed5997cf3dd635f9b0a45cbeec28a98ad22dcd15c2a163083604b46b43faeabc7a1678b46fd4c4a857dbae1769db6971587eddb0d331c60c43b03695c2e640a53eb2b20f075d60b381642a4ee94c81f5e6168769a48770bdd9915d09f30dcee660bb221270f09661261567970cca9935aba1994701f9678c6963fce9cd995f1ba5b5db68788965e047799a78b9a72269a8f384faf0c101a84c04dbf7ae65a3290ce895da6036b20cf07eccb61ea40b0d43937a6a0c0a5f79ed7533443a648ceffcf96163c03a2a04534de32eabb94f4c38fc2fd92982e0c2c77559c228b9d1a92371cc2a9025b44e317ddc7aaaf8d0ec3dfc86d3d549e00a3277cea7506eaeaf563d2a9a26e9a256b87e281208cd5581cd5824ca6d5641d4fffadcf252d3b3a6d1889b95e1a9f1e45a64c2ef5bc9029ed24c555ee2250ceb2845563bcc505f4a6f76ee172195e34bd70bcc5ddae0de8430867bc224658ef63306b76e6fc2cdc39085df1ffb7d586f2a1305f292350bc42c7fc25217c10e47d2b066ecaf565953e8395650c1adaf509ab84e016ff7a900e30790f7e068fd530e2b289e8d80c600908a3b55f68a228109ad470eab4b42e688d5f7dc6a6bff3c63a9a8032dcdc223db5d5418457be7c9f51d3c08f2e5e0d38406542f725eceb6c6feb1b0567f2112e64788a58b8ded1b9e5ee79c7f44dc661ad9b5d184cf581a2ce2d180a71089506b48a9b01574907651701d79f1f3fcc905ce7d1ab510a5bf7780a7fa2f972dfa6960b5042a0299a5bd915f0e0132795a3fab54c6887c68abc831e15cf9ff6df728a733d13f7ef0bccdbf39845b3596849baca051836644b9bda809d35bb0a9daa25ed167c1477c2b5c6d663035d6f087f6f0892b834dd4427e24212d6257f10e20d5b385cfa5b5088bbffcf20044450417c0424546a9e8b7db1ebf7601e5cd7ba628151024c699dd5f8a4fa49c109ddc6cf45f047377d9012310328eb09c94f9e5a5dc6486e9547cac40f7f3418ddda4e9470ca6c27f53d2fa2069305c4831094001842706b72287d31bd1cf270ac08c23a30797cde6c7dca5d448d07d79fe9697f4cfdf1c7a1cfe257fb21e78fc9449a73d769ec3f67607fe2a9d9dbda38e17f869020974245b2af77da4fc4a2b76b274170f40b7b12f17038a443e3963c94164da67ea2974f5829a3998cf4ba2738f0f63cac26e39a962467f78ef63b4c29a39bdbe276eabffa4951c37b1d081c10ed6937aca257ba44ad1cdb00c23f8a3b5ea8041cc1bce992d6c4e05fbf8d0e97d3638342f81259cc9f7acb037c688143ff4ee15c0514922858ff282f547303054834bf263979c3c0ea8fc762894a51bf06ff372a2f35ab16625c368411c1b54d583635785086d51f202f8c285170d6b675e670de72557148fb440e1e39e9ce082f0c7dbffbfc9965fca37861ca4ac61eeeff7a7a14fe469f7e9754025dd8ab5e19ea845ccf9f42f016766e03638ef11b5846e28aca72c231634f2cf505d3d1846b1f37589828f527b562d0d6bfc42ff9e8cb2e6ae206b45aa21d3285a7ed2d6e0565f5ef011580bcc4f52cff92aa834bc1bb9b74c171e2fa59cd8080b893e6d45b5ab8034073b7e1b66f058eddec20ba24656310c4cc7d945385c76165ac47a2d2ba9849a1100f7f81dbb7b054d70e78b26c7f30f5d7858aacad2244364bd1898f7c6517a135e2d509d6ee9c4794975ead2bdf22e31f25e762c60bdaaa3da107a6c2688131f348eac5aefebcef47853059c0b8e06c5f9303edf151a5c85ee31fdce3580503b97db92d11c2c9ae1fc9ca2ac3ae33cb86d5d0b2d076d95f863099220bce000ef2e62d300df3998b98fba426e7c1f9eba309d98867421f6fbbbc308ae6f605b684cfe38e017349b2c5b3ed77e729dd2a1e3c523e1d6a333e595740e6e8de4817b5ed1864ce28b6a86a86883ddab3e3cd3a95ee1144a80759aa9bae2f6dd9334bca07678d1212fb7f40f35435c1ced6b0a4e40116518e8fdedee8a50e89cfa957eaf025843c0e6517a6d110e6ba33b4873dbabc132809587cb1bf4df2f5a2a3d270fab45678bbc34c1ad55176ea29ce2df885312d73e1d0a953358efb9bfad5e45735b21d08d48f7db7bb52a71cf9d70fa04fd323ae1c4c12e0e19b1caa9bdee78bc9ce759390edeb379086fbc6518bad616f2ab5ff9a13176bb9c6c532632114b194092e3261f17796e0d48c646f3c4a7d96ce3c943047897be96ab7db2ea5cf9d6dd0c48399e8ad6873e4ee3fe2107d754d50ff631cb84501f589ca9442d18b957333c43406f58ea8f26e83db875d7969645176657afd323e263b3079345a237986e3e6ebc664b50953a96e1f6e8fddf1c92e54208d9c798058aefb6fccd30b6920b4411a3ea01c985ce4032a22fc0bcc114c23b5c834140eb0a7bac366a3227afb1c56ec6087197f4a93d5173f8deea0d4e97fe9d2eff0938487a7324b06e00c0ce46e503b6063c2ad0e4287bde19095b98d30046051e40f98773fc68d0094e748d8fc3fd46a8d76f4eb8947f72eb14ab2c0aa4e532e59782467732d2a26807148ecd86323308dd111010cca010e1af7e500ea45867cf3877f5ae313dd7832d44f831f4169d1e26a66977fb3673befc8508a86c3cac29a3ecef340aea4cf60221dc2242ed7d9df61ac74fe8e4460fcdb68320bf592a04237528be115e6c1b5351475fa67187d242eda495f066245ac11c2c37c24294c9302b610480f7a4ce931f81c69285b8b6059131fc85e51593a6d07d64eb4c4179d43150cd0b0fc0418383d3e44e8cbdcda8df6626b61e8f2a932ea6fae6d4739f6652acc27cab330640e04d2ffb2ea2f15926ca2fe7219f5f92fe5d5a60f6380b18cdd1256aeb0bce5ba2f3ed20d6d77f9b5f8e7296efd326d759d07e0f0e5764c1b49a5c8cdb58d3b9f66c52609ea568cb140d10334e078990539791db4ea9105a647e980c27871ce142d336fea5200c7e4b14611c7cee3fc7e102ac0a6ec8b2f17371a0b9fcf49c50283e12bbda0bd47fca7569238fe29f58fc46badd4eac3a5028017e94b28d444d25a494284368a09732899a3d69b7f9a64577f5fc7a28d3ff352fe9ee0061c44efec87c8d0ed57afe3b08db7e5796cb233a98f2863ab37157adcb34974ac24f6bac170c50ca8ea07d5479742139c506d725cbf473bc9f565f0d7358f8427b0a3d9e3fbab32d61f7eea69d1d607bd92b1e34bcc7624034a6100fe51afde2fd301f7484cce584b1f362e898fb192abe098f23b9d425d61069aa59ecd4ab8df89f25c5336b1efa544d76f6a387b6e21c278cf66eefa352f7d93724532ed4e88e5f1604edd0eb4dd2598e06ad430e61ff8d7684ab21f36a572a1dce8dc0a9497471a22689ff612404042a348aab7743b01a7fc2ad5cd3ade3c19820cc5d996d2d2e5b21e2e4349592976b6bed2e03cc8a0b2ad1d9478877854f7b5da548e2cc92c5b8aef4ea1144bf8ac7b7c01759388a32920a8ccdeddee6b226bfcc2c48977d3c962dbbf5c51590f0a06733c74f2fcf94f88fd4af50d52e2e1c280c8fe047acddb4b69122806da63de9ce7ac8e9b8b25b78cdeabe1ddd6f2fb7af3ac4487433fa37433ed120d2b81dfdc2432277e773fe2e17b3fb41b64183b55a868c0bcb02ec303e7f894e724317a2416d99588c3254d2f838ee0bc3b5fcaa97da1fc38c24550feb9cc524e13f6697059b8c721fd44fc5f43ae5452d6c353c9b55e1536178e6779064aec36bed6c1a58cfa2eb1810837839c22af8df7cd67dfdeddec945e91875af18c0b4eba0449ce6f26dc4f4d93b62cb77e3f75ad1ead63d8fa2b2da767e9755e40b3b6d4b3df037b8c06cb5b7bf60d812d31e9c82950495134d7a754a44772bf98ffd69cfe830bb6896fd618724280684ffc340d3757bbdd65d6ed74ef30194da8f4368d1f9737429675cfc1438236e38021e11d2a2157a69d2e48a9775ef9dbe50e6b115f5d496a626a3e483b3d614dcd7b540bdd414eaa7b5d7bb6eb5bac3b81e8a469acfcde510e38c6b86a05948de50985d034f9c238c715c0e96db00e2b0c49e515b93a2bd9d1982e9a57a5d5c456fb643aca222f0e8ab7bd44114f5ddc7775e52485da213dee05ee5afe027bb884f0bc99adfab3cb6433879f101b951bbe6139a3a07c4505185a4e39f514fe1a0269dbc07ed72935539b3b299a8aefc288f7123a96503e4d91b2f56af499fab2d5f0ff4fd0ba7a0b0d2905064c6c5c02024ba9dbc53d9544a778f3fce7030392aee9391af784cad17c519eeb7322b8355cb221c5063c8b1a14a6ec1478cb5fc95029aeb9c6981758f4d3bbbed2f441df6ff5c07ddc584f1c9c48c794d90df6f73ab857898801c06248423d744510184fef173ce579ce2b4deb06c0905e2d81239bab08f3610ed43b0ee8e582aeee52768110d3c0fb4dfe91c4848dd7b2242926089b2c7ea60a9df93f60540143b006f555f9b3cfe2f84f59d5a057b9d443a3eeb77a0cea17a48b7b00e0f596d6e1eaf8f5b00ee4aca37798928ce908d6e1a4c3a7d9cbf76b571d2945a110702ce872fb2af6e67930da70c557263792964da30a2e7497bffec102069526a81cde0d18d5aec3bd757d888ee6a3430cbfcf2e8b798433ba13c0996f6ce73ce459ff6926564bf8bec76c473cb4a936df92cf9ebc3d3fd61079c71507411c2cf099e05850e213653b116d2cd57b19eb5a58879c51c71fb7399f0872f792e8cdb2d223e083087c7dc4404a33ae7ca47c9b51365ff28012a312a81c181d0fcc1d76413867c44ae7f646b0fac81c6725ad9cb177eaeb3a2c255a773f178bda53b850134e89e1fa3b13e0737d00a0fea62364fc5f7cf5aa6241b16d11de836ac3d3337c45ee00d8c67cbc932a1c7920c6907dd0aad1bb32f973002d7b7550cb5f0e2e3d7b7cb04e3877370820d56a0957c6fbaaf01fa7817620bbd0019ea8e959771c759bbc357fed3f2b30141dca993da87064c79938720262a2312477c033ae09d56ed2b8e1b6e278f4918bb4383c525cd808b52795e150602e48cc0429dc72c5889e52d9a6b4ee945381f6107acbcb0d236ea63c2ea6cf450bc824927ee6a26ab9ef7967cf51a1f4babba036cbe66a34eca251ea84727920c46cab47cdfec0bacbb3211dd55e5a70c781a01eb904c99839967da91c109ffad6cd234458f46132b7cb6354d9fd1f0e9eb2e2d96928aa3de7a1ca2a42f4699d8a24cdd8b166c70f9ea46a67b725b0fa4e5762eac17f952243ba9075ac54128ca5166c8d92fb99b0c2133683c905ea331f48d47218897e76e36235d1760712200f3ceaccf44150bb6ef727d874ce8666a1c19bb196aa710545f6f207b9b1fe49405282713a51d4d677a68dcf92ed13093fb85cacac1d1b76f19fc94f29ebd04c4e4a71e7da35f75ed21057b76e8f6d48bfe4917056471a0912435bdb11a100754265d6ca42c6d023dac59092d6a4a135bc0891ed34797e485cc76ecc3ed2092c7f779ca65a859f562fe72397ebb9f9313095c39b013fbd2875921b37fbb8ff9df71c24fe57ae9bd08c4a608c77e929a552ebbb75ffab0bccc138eabfe9ca2a8f45b658ddf6cba6195aefa14ed07e257a75ba52f3d10140154d2885f99da06419630521d03c55f9767be153e23d1505e9833a04db5831865c6035deb3261b591a568f9567a9fecdc5e4c5afd0a11624a6d09a6e83e8e8371d4246e13a7297ea8e6c3e22dcdae93b2167edfb49ff5776ebb5fff68eb58d382e47334a5788fc7cb73e49cc884f773be72420aac1bb37d95ffe09bb288f6029addf403509ac9fcaf431c8f78450a434bf2d592e94cbbdc735a0f8fcc125d3","title":"232. 用栈实现队列","link":"https://leetcode-cn.com/problems/implement-queue-using-stacks/","question_id":232,"issue_number":8},"6":{"day":6,"pres":["栈","单调栈","队列"],"tags":["栈","哈希表"],"whys":null,"difficulty":"- 困难","description":"```\n这个问题和“最多能完成排序的块”相似,但给定数组中的元素可以重复,输入数组最大长度为2000,其中的元素最大为10**8。\n\narr是一个可能包含重复元素的整数数组,我们将这个数组分割成几个“块”,并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。\n\n我们最多能将数组分成多少块?\n\n示例 1:\n\n输入: arr = [5,4,3,2,1]\n输出: 1\n解释:\n将数组分成2块或者更多块,都无法得到所需的结果。\n例如,分成 [5, 4], [3, 2, 1] 的结果是 [4, 5, 1, 2, 3],这不是有序的数组。\n示例 2:\n\n输入: arr = [2,1,3,4,4]\n输出: 4\n解释:\n我们可以把它分成两块,例如 [2, 1], [3, 4, 4]。\n然而,分成 [2, 1], [3], [4], [4] 可以得到最多的块数。\n注意:\n\narr的长度在[1, 2000]之间。\narr[i]的大小在[0, 10**8]之间。\n\n```","content":"096221cf5b628be1e73e8bcfe626c73472812b8a04fb39950a4a4328440103223cfe8c5225e0885c2263ef418d6a54a5fb0e268eff401fc5a93ce974ffa5f124f52a696a9fd18cf0076dc1aa84d24d6d38e6718399b2439335a168cdefb6a2864a6fdb062cb89a252c7c1470b8c5cdb933df4d665120b0833e62574efa09f32786b545596ce3a3e7d5622abf049835d22a4b452d9ea1d1b208ab060542303b9b122c0a4916e98f70450073b7cd6c700311c286d7375a0503fe1d94334abd442f31d34b840d69820ef7c62c19cf22301dff068f374f53ce8f792d8ead87bdb4091ba2f32197dc79e195044aafb14c6b15c88fdba3d6d82f3a0828bf213f0f3ca8c26783bc919942ac46636b03ea665875f2d98418fe06884787f4c738898870895601d68d779de5fb1cc9667d47cd4a21b6b57311e2b57098c249889c42c12180710f80f0493c1423b0e40fc7888960e5aae1b9b39084d848a62bef96362f429fdcce950f98dd39c63d28646a0a6be4c8201179a47712135b5b59ea3fb0eddc1f1ae430230a619fa56d34a16c6bb1543f0fe7985b46e475df03c38311a55b504ffcb4241e487de50e9c831c41c7d9b304dfeb81dac030f76920024cb55e4ba19d85138cf3ee3f926d6dae3d564d6c6b1d09fc54a88cc8c2d69639d6ea253661da69eb502c3a98e1228ba7da631f372aaf8abeb83cb9dc1c8be639ec59e2ce4af2c47c166674a962f6218644edb0f0e51b0da0c2fdd23655ce7a0aefc88bcab9c04fb6f3df96b3b4c04b620baf94b2bc0718457a5f06dc6eb3cd68261646f3565d7c6c5eec819da0fb3913191f70ee2f5a4ef46bf44f2d9921fed74f7693c074249feb1401bcdca1aed6ea861ba2cb695ef6b5bed69abfc8b06b14b49ea73a186146130ae3b514d4978928737e8d06e1aca45e7e71d404ca50f522b5a456a2bb98788c2a07b74a728458d0dbbc62434246d283ad29dc99f1d7d513f28c0d45a5114dbe55e796fb2b9e246b82f07a9b08f08c614857044ac1a47390527b82ee15112c2ac36914293b82ca69500a4843a86e38deb75aa0107e5d19f1b026e4a427ad2c6c04f08a38f0038d6aa1b61fd70b7ddff0d58702c5404aa3b3ebfb4370c63703ec020f0f2a82fd9b5daf27ed3c96612debf3aa44382a476b4b19b6daffa9e89d9faece81771d4cc2f06481cb8503c35a362f332fe6248e2187f20d827b906a6c5a6f433539ba25f045d0e5cfb17ed5e3a6f23360fd830796458430c21c23e373a29b2f175034f9e3578f37048497f98db1bc8b7f5b9d613409277f52764f5e65a26568ef8173f738ba7de3ac67f89e5d8d5e94309ddb8df190ae60791cd629ec5646ae619bd2582172dfffe4a2f2c9efe1e5774bf9beb8acab1eaf2152ea5cf7f8921bac723650597ef2f3423db60618da37040868226c08fc443291f2786eac8e93ac2d7ac284fa39b11eac7adf63f69bcbb84b98d63c22cd09e9342beb503ffc0649a614299db91004fbca7a5a7040a2a0d89ce1ea9c61b10d4d048aa9d262995e7dc03d298b4f8405a59f8c3bd05957112fd20a9ad745aab9581059ccd1b1dafc3aa39b1879f5e33d13b8169d30e0200b6ee15f6c883b796491274c03ed73a0d5b4e144f4f6b6ef02d6a0e6faca9a0a9d3592376833f77740fa28053e8996cb6764115aafea980e077fa37b4d15fdaf5d4765dfda541e1e39003d78b9ac482093f24499a2c3d2c44dde00a41727b806e9f779870b9681a01a1fbb3e7666362d7397756dbcaac8c8571df067870ecd24dc66102bcffc6a9e753441859c511941a8e1e5e17905dbdd9347f3f05b25874d100a091d93909df6434622304f0a297536a61f2eaf4b85185c0736fbdddb672d4f7026a0aeae6e140feefcad08e057df7c2e5ef9ddecf0cc9bfb7ae7afd51b8a19d5d02fe9388ab17e26540d2032d509be60e6f0951aedec19a51400e9f042845cbb9d43c8f619fb71523493df5cb9b553325c1257c5639f6ec2049a2a71415cf1daf496952c25e5cf51ab63b12398342c0d81f1a85d78c87a8ba1af7aecfe8e5f8fe757830bddf409dbe5ab4e5e862c647b4ded29e9835427e54f94739d143f71b524148f8a84a48c871652589fc6e6f3d72f1b3f4997f91210a50b87e99ab9083e4230865a548de29b59e82c5bc0a7bb53166ce627b16190331626891433eb42dbc05b0dbbf06995720ad661ffb4c183c00929d22ee5c710d5c5427327a2301812376e7e6546358c7cb194d962e216aa0ef925fbbe9889e3fba6267772c19a687715cd194048655b95105aef21eeb5c16793522c40934565c02561eb694b8e5e5cf86578294834aeb215ea866f4cd4bf0359a5438322003b2a7659b10e8ead6bf293fd8c09ff3499fccb8006e91c31ed79f96c5e9f743d12e5703fbc109a3ee8a141e127e72857daedd52aa80aaacca09d2fe378f5d4e5b02f10305e9866a9092ca49095effd35b4590ff6af1687e26c7d7de6b05b9f9cbd154f4fa80b9439ecf2cc3057004467e0b3e409aa70c354794faa75086ae7019f982c33bfd237c6452828df99a03ccbb259c385bd9463ff5a7d69998efa71b08a9cb5dcf0913e03c6b3374aac4c4a73e138e0e679790f9b33078065eee46923555338951317456cd1b4536b469e11393ab44566c28924d31fc0ce1774c287f00ae19c1abe25f399aac6a080bfb06bf0a399cb29a835e3c09cb8a3db33e89ca5e2cbfc0de8620c16217ff76d8d1815a4546f9878d1e176e9ff5d97a1b6faf072510ea93e5a858afe56488c1a42b03f52cf7e8de4e5751f46afc13454d16fc6941d1d57b6bdea9287c923a2c4107892806f163747d851c28f440d7c3532561aa909b3717eefd3ef7431dc748854d8de1982c88bfd12370e101eb01255f225c14ef5202dfb4cac3ee891f8cd2a1f7c2a628b30a787992ac77aae8dac9375bc4e629049e0c39860b925ab6c8fda9c0ab9c6110959e9b49a13966d6565494f60f48083b2f8a2687e240366ab8e118e71c5a6175ed789dff16c7e7d7359403a49532ca106a62ff16cc6166bd1d094533f7cc99bbf44af2405dcc1fab0462dc40e8cfb55e232cb7a95034ee54870b344acca5f0671bb427a0205ab8ed436c23aa76c2ae172e47de3237dc52c45f7040475421d441c230e0bd32077c92e0d736530ea6acf6a460fa16262188a935f80e3c6ee43d09045a6b51e546dfd77f6cf6d18856a861e737c7f970b26bd5b5b79dcb23074ee3bba707cba97a991879f59e8b5958a8d43a5645dd6b88e9ebe3b846c71016c0d709af4597ce534622981cb10d34f2b6da74019b3f28ca08e62b707fb077333876cf5551a7c36c75007495347eacecd3bc1f7742926051b4c77c014ccfa5ffcf83e67731cc728d138fdb8e50872304a5010da8051de901de75a024408f900f2ee20477d5689081482c9ba9b136bca9b4d5d8a749dfcfb525f252511cde839a3b31725f33945d48e5bc044d3ecb1a21a4ef1c384d30ee32f05cf206f757e16a4ea6da530f4d84458c490f683d3bbd10b95f1e3edd296daf9ab8e215e8bcc5e069d4f0d6efae86a92878d94ee1938b6910d08e33904c15a37e1ae7146ab6571dbd4d4f286112f0ec8c65ea6081127cca905f537bfea795ba1d69cf3def28aadfbb3802bf581da85c4fbc6b7a2f6e17e92a61ef3432838bd7517091b9fcb16b72a10e1523b5f426ba031696aa88af4cf5a5b35fcae7b9b7d99e3401876b346531bd11bdd15b79a4de382205ddcf69a2e818b5c9dde8a1f75ffb803afbedfcb748e7fafcb06cd80d749aa875057620b78601e3074e72c910bebdb9c9644eb11fd02c29fe9c480213f69dbcb5d3281fbf7fa23dc6c91ee50ebd6bd2b50d4603277566d72327d54e36c948cf202e8951f1a94fa511d6d7e142b0c40f816b1bac242fde60d59516d43495b1604cfb7def26fc7b69de3fb583ae7a362605949b2138a11cfc825e58e4855a55132bcd22823b69381fd70e425949744d38969456c364ab9d49855d70c201a619a6cfa2e8675d4aa1aef384e3d49cbf060e1d32edffc6b1078ee0739a6ce219a073e0052da2f49060f913a60e68adf916cb53ea251d25b2815b4e1acac4e3c8ad43bdf3493fb6c3eeabbb3f9537f1479070777445993cc3fe2b0591ce21fb591bf1e79e10e40465282155e44813ebdf352045fec86acd312eaa9c609f7f47c86139059def779829e5f56cca3d1d8eb8487fe150b7c6879415d20d0770602ca5143484496b3483f0b1b3cfb7bbe2f72921092d433882ebbdacf29eb39ed0b3ab4c9bed2e848a6e4417d1122239f630989947bfbe9ef762ac77ec6e61e9f44b652c56b20b3956ec5c85e4c2a84a23992b73b16537e0a5298e60281f9bd89e8df94862b96cac774a1946bba8cd43b9e6801ccfe72eddd5ef197c41682e8f2e5d2cae99a86bdeae3a7b1c24e6bd48778af7a2dc4e41fb1c6ffc1117a7c01432c60dfe3724302be86adcf135631a5f4a4b930fc41157ff822dbbb06ab645ba5eef3a910842e6b33ad3a6be7655b1f2d0656ce77d00dde4fd20ec40bb52380b4e0bce1bc730c4ff340276d0332928994374d43038ad00ddd6b64ecea3f02dfe8f6e68f73005bb1175878e82c975749f00327b88cefa770e49643d9e92ac94a3121a1ae172c1022a05a4ba74357a6464fcd51a9961561c1fa183fff1ed832210fd9f93c12eee616608b569c763182c14e22e70c8acfb00c5d24002c87f07d332ccbe814f3457105af62df9d339f05ad5dfe6987bf7ecc5c2dd9b66fca936165a776877202fb7abf881b0b99bbf77ae2a0f0409ebd16271c395df2314fc021a929a173ebc47af1b8a897c967c65d37562286f2bf5b2afac5847c26da43c6282336380a0cc6854e7f6ee3856a5f2b5b3fe0cd41cde5af60e6d89c83c0952fb1a764d6680cd3ad3d0d125174110c3a06c632351078afff1a44a34642cb65c38fe79196301ea6d457dc9c1e7957b1978b313d109e5b7087dd2b43943a447e1c642e4536492dd5847ce3a40c13dd040c859d96cb9da970c1902b577e30ca2e4b1cfd3ce3a6d3fd24de41c14a5f8372b2bd24b4c2b40fada99e4b33552ed674563d547d620940ac6575b10e97766f5516e8babe9b5a1227663fd43b234a9ed24cb5ca7e88912470f05c744158200d04032d0398e8d011b458c4205a917ace8635d79483a3fec91201f58fc9935f0000d2b4a1f13c75dec1634fee7369528c9308f33cea5a38cf9a9541bc0a2a63822da8c46fef70b0de33f2220d061a575967d5f1eb008e703f90cf74164bee23bfe759d17e26100d4a3234704d1ea3d1d5f9f376ad28444f942d0c82d77d1a4426a571c5ebe2f24097a08a6dfabd7f8a6a9dfd3aa5941c3f77da073c768612dcc11a712dce156adae11c8218868d02470e7c776ae09ba5fca9d21b03efdd25ba8311dae5402a7fad40e278f72bca934765481034d39923cfb4bb266ba3f0d5c52bf2760790c04462dbd4f346fcd5c304ec85a5e6392faa7cda6c14f16a7b1b1a177ba6dbd0adac4a871836aff0839a2decc6b2e60e6fc351a40553d7861a99ba5ce599e3447ea968cbc6aa86bc8f0510cb5845556d2b994a67c73f199ad322ee9d1e44b1393146bafe4cbefd754d341a14bf415128f2b32a53bcd18e18fb7bd909954b4ddc05128fae95f6a314b6360ceed4358ecfa47ff5841d17c51db653037274038c4b40b941bf2454e1a24cdf82a1cd2ddef8899457dbd0a00dcaa5c6b08f86cd0e04c2d04136bd6c1a2f9cb8dc14eeaab7601df0477217d6914ab02383538450affedcf2773f40338ad00802172346a89f2107561bea00731919f6a10bc1ccf318aa79dfb2d93a1bf55532784d9535323135e845cffc62ab433d4625c2727c3b25475a661a7ff9e04d3b951dd2d333d2ce33a8ddb52a92e2fcc5459fcb7e3a282ce8f5858587b3999bc9840621ba0b4f33aafbcc1a62e9199a81b5bf5706153525ab48ea3a7855c64ecdbf57ba90dcf4ec35c851847f97a10cc0b319827b52c98aed9e2654a00cda02f39c31a78d66a116c1583bd538c4928a8939f9d5e6af4cdd639e4c9361e6787f33da776ce0594401e67bdae7767e5ba7a485a10858f33dac51457de755ef7ba173cfe7e0a66a736e4e0cc160cb6b19e055ca84516aa605cd7c633e9195d7af1789effb6784e938a20c188825dff422b918338afdba6a7f47674decb36013a841ec0f3227e0fc7b4a2bddd6d13b777452b3422f3df3f5c97187c3d8802292378eaa5daf0b8d9307ec2db077be955ac1d02c300c1b381c0bd943559c4d7ae74fa268e1fb8bec089d4529e8248b1cfa6f9ba7e9fd5300bafcc89be1f3d2276ba1653f62fec0ab0b36dd6bd4c878b337b4c6fbb42ce9062270c057936fd694a4e1aa2eed5edbb6cd2e8897c459208c05f30b8b254545c25e0584e04dad4922675795bbbcd935a5a36a37b40f93008fbc2b3b09e811ec508953174df3a01566af9835818f42f15369315309dd8e55131596c5b93d902a735f57f201dcdc88765e2b4fc632be75e72389b2fa957affbbf72e6aa75cf14bf35977dbceb964214b6bd1814453c1e9d8f42afa98bd8b54c0a6d65e9124b1b25184ced4f684a1ab5a35ea4c3f30f9b5b6724cd084b861f96f6b334597c53b9f5a83ed714f8647fff8909849a11019659197bfff54dc4065fc3c6a29add6c483d4a12217791985cccb3d6245fb73be9b5082afdf0c9ade0dc8668f76ba5e6aee21d27494fe46e07aa6df75813ce252a3c5f3ff96e10ade640c83f6b46c528e03fcac78a58c17a559dc27c3f946e039eba6be355a52dc9d9b69473ccfca9993a6f3bf249620c523e708ce69afca3a13457c44b099c2d6afa476a284b2aaec09c1ed320c4b14fac13097b2b015a4cbd4f8b32a684fab8485fd5cfe79826e16245b3d46047a781f57847d46de58177042e9ec74d7e3ed62400fbb94fcadb260d0bc5e66c1490daa5e04afa941c1249e5235c3125dae2b33a71576c98fd3bbb5d448624aaf92decfc2f824a3cfa957eaa070c670476f51e4dd10ffb12681c505f7f15a71104b7ca4da038dafe7f19d0fb9a8472ce38c020b9c1c05fa21cb20f608f9e63ea08435f48448552dfa8ab1ccda4a1204d1fe6ea18c50880bee8b067ec27ce736bc3b38cae19b1caacb8caedd889a79d5c6e1ed26de9bce9663dee474663af4d5d45c5914e383977d4b2a13a9d1023b3339bf07c2e5de812c26abb49ec68a655996f64f88736abaca2e6a5331239f8afcc3e2aa737ff3e128a9db87a0da80570052cb1140b6c2c4c40d81839c3967bb7a528eccd5f2639e86bc777969640c5c3850d7727e6611535c44646c54b6fde6a3a331b60747ea235244dc8bb0db33074ddff02cd40de8fbfb7a2f176f388a4f1a76c563db12b050b9ee16844af60267ab00fcd2ba607cf9cc23e52b2f6aca8a648044c5eef85458be15f1a1e990e936a7c0a0f782d8dbf5276147ae5f26ce2e107b1d01e1a01d038fdfe79aa3f7e6590f2e54e31e9a6f1d9fd14283840bd8bf739539de7687a4c512ec32aa77e6dac32f5d7e0c2b6c3f6f21153b82324aacd82c3e79dcbb427e4281527a5584aa52be00c274f3875875df50d72430921fd03c5a43d1e26a66977fde2636d9a11edec3d9a5bac66be5f15da8f9a0323c1d810622e8d89a29e932b2d91f5597a2205f4aa5cce6105952dbb446aec9fc7b093bf66e59685d2ec7494f1d4845ac588cb028656a4ed306e30d4f497800a054f80169381d8b6059131fc8171f0d3a7406d23dc0c409ef13504f84b0e104592329300febd1c6ecd1be3a0a6fadbff966b367a70515309d3c79c27485e1646c4b5c82bab8f03441ed12aaf76933f5f92fe593e95d63d5d2c289121faeadbcf5e86123d2496d2baba8a3ff1f74fb256e60c943bbb1e56d3d3149a5c8cdb58d3bd03391555de25b93bf489e4e3ca831e17e7004069eea9105f402bdd5903671960f4e7d3bea0b5df0cef41e4182c4f9d3373d74afc7e4822f4c1d1a0b9fcf49c502c0e738f3fcfc42fd800a8b77b564ff97da6bfa9ba69eca0bce52af0a7d9810da024542943fc34c6176c5ecf49264b064577f5fc7a28d3fae31b89ee8455311a1b8dbcac1ec0db9eaffc5fe963d24f1238ddb6733a33e0e50dcb34974f10edcbac13e8a00bde0199a0fd7096dc55864720795473bc9f565f08a1fddc173e5f197e3b2e541825e74e7679cd818bc85ede40c8f242c1416356eb710fd9c21cd66a71c15c6515035362e898fecb8f6fbb2963493583219439b6b014a8c057d4c68da969e17291bf4804f6a12766ee775ee06d17a3fb182f86185cefc65d1410be57a0d9908e5e763a2e7319e27c609d98ce1974b96c73bef3551f8bb0a5d0fcc13ffc237328acd85e7008f3e37b0a3c22749b2591ec355d39701d10b17407414742ed88be384c2fe9515231a669d0d000065b80abc1fd87ef7fb539655aa3bc17a8cf4a3288e824f38bef8acb32e2a66ee8c675064c1ad24662ee2adcce73789c629d7b44c01c29de18682a2e96371e43c8829db6f56be62490618453ba1d90a4fcbad8aa2c06fbd5e4e112c586e42b533616a232547703663da3734ce4f80b04cdeba2b92a5e41d7314bb8b0d3731fb7225fcef4b9b9cdefdc81daf6a1175f16ec67757515588f4d49bd0593d4f798188ea4a187b18e4ed6a6ffd363f98606f7afdbaccc9cd9a33f8c57392ca2167ff4d9bdf3293e8720ad12337b1cea2e527e183dd987e897b7e763d2819c35f518e9d0159b4c6cffab612ea9481d2de33b9ed21e40ec5fc30cfc99f1f0ab13745faf705f6061326f124cb3ac7a9502ded20ee3f2653f2e4f5c0b5291ed231af0477919c0ceb7aeda65851172034a5e760dd3c68f5c7d9adc1ce0aca7607c41ee1f1b429a818ea5e483a07c2c02d582fb283184431b9ab6dba7fc52c15cc568ea07ae6a16b475ac3487f3a07fb9d4b2eb11327ca9a910a15495e0617752f2a002d5f07eba356f2548d0982c462a6c60c8f8f1192876ea9ad12f5eabd2d19926fd9666cdf88a15785906acf9e4dd94598f207c23b4d5157a749ab66ab75782dc556ddd48ec603974a41970798a730d7e37d723f6b8e234d8058b89c7f228561d4ea109ad87cd8f5cff98c9deec7049f0c5ba79051459a1869be2f053b8dfbab8660ef58b92c7b15fb97cfaa762f33c729800f47205353934b080cb56744c2edcf1cbf81a0daeebca05291d1534665396958512d00025a04bd9da12ff6209dd8104958032d87afed21df38685f7f2a2fa9ad0a04eb5174d166c74943ab6f40959e7173a402f91a61b2d982ac7305e14a6fcdde92f372aba8cc16a25936b46adf1a0dd73ae2fb21bf589a9700fa714c583b7f411cfb29f45963cd16852704ad1a8eee6ca808fe526c75ed0a5bcd6164f4a7d9ae88e0d68231cac3d771ff98d085b1c07f94484a22ff554ad066a38a415f347969c668df079cbba28bec0a04e7f03fa3a711ac417813298052b1f8270289b9b1a792e59ca0ab52ac8dc2169accfacb558fc0cfad979391f5213c34ae4ab6327025c272cb2ff6e679df4b359e69679212974a9e06317697bfde0c925ffa1fc742dd5364f1c08bba0b2aaae78bba1d47a7b041a611e83ec24fd4f83e5db451d4259f664f0c4ba6ffd0011b09d1ca0190c4fef9e62d75932726aa2f652a0a469580ac05799d7b476b4a4c40aa4568907e16f59d199115de54bf6f09feed8ec7293c7ee31d085555c7737a33ac72609f04949aec2424b7609f79d8463a4e9e3425143b1a66cb2f78fa7598fa773f11c0f09813b5ff7556151df8b01ebfc05d9741d6fd30edd22b19d4687f0184fe9c3164da4473e88b6e55b7602ac88542cede0c5047c23cdace6ebdb4291d493acd9342dda5c5b826c1cc89a5ade1c9ed8d8293870278d7ea8bb05c28488a576004f692117a109b84771ea9d13cbbaaf17b753c575f376024c8636b18b8c068df699e17b83b09d0ba842995596648ba4aa868b47cb6c0c6e8ba4c90f794ca64090509f36def33c139ade7dd95ca0b3330f069f28253cba7a799d21ad2ce819f27a2455ea54ecab9563e9ca46542fdfd1a50e16626b0bf07db35292d5c44bc301bfda3052b992c06b791ab0eef3f96256d38155a78c89430cace9e220d77e173ed1302f87be9419dc11051096388206ceb346ceed5240e9abe6f9a765586fe336db56e68543ba29e52f8566fed010538d31b5bce28bd987cfe4bf7151af7362bfd4cc0d32f7cb05e9c927146dad1375c4511b009a8b3468a0587753f2b97697de26938be5f725ffa0139020f1bef0b5fe59553ac7def17fe254ca2f3c6e6d1b7ec08293593ca9e7b2d5701d3bc76e6b8f51f099e365d10165bdf466678815a2681b661fb8719d3bb3243accea0aa600ef477dcb77548006a9441a71b4940e7033a25628afb8f28b136ccbed6dd9c7fd0caec2d3477f5d0d1f6ea27ff5eb2845e59351742870ef75e843c5d1466f936d485815a2df61095c99afc103295f9b1012eb1edcbdd4231bed3f9f39739758377d7c1d132a5e936ca40b17299517fe7387fcc42cc54d4e9c08368cb7ba2ec7564c4850cb8650cf135dca493a32dbb4d1980a7dd97cd0a37163fa7cdaaa8b75ff4e16df5b2769565d085a2251f5068fc226588151d2c9ef8279fb6b8dc3c73913313344527653436689df1445175e70d0015afeefb8157d8e0633d01bedba8123063fbc2ac281604fa0c58baeab9b3d3f7cf3b2d2a2c50465273ca26f6870667b8f4a318bbe012555bfe5e8a06cb73cb47a3d62f23e8b09c570f202bb15d515cca31e8308b9f873adebc1cb91e347854ca421e8009999e118aa947f55c4066c56533d72ad1905e5065a1a9ccc4e29ea9fdcb391bc6b9c1f79a22414e6a3f50341309c5c739c7a52fc6f77c46d15efeb3df83a51bba8fad5d07f08d4dee8a990596734105bb65411017bdd828d63ed785ab897bdfced2e05a6a625d3f7280c00973029075e51d08d55ba1a23d19e83eefa8ffae2ac78c39d50c9c247b3b9e03def1cddecf97c1d56a4bf42da513f8f87fd6ae0c860880f00ea93dfa9168b6778a486c19de70306e9378862972945ada3b6958251e6dcc9a107a84b6f6c84b2ccb98095bcf104dfec5ae87d6bcbccc7698b53e472e09d8964203e2cd48b4eb9accf9f790a3959dc425545f4c13b048991e08d7b1a43a4472e369d616fa2b370e45244850d4237a03017d29e27cd5c873a3009f724c57e133ac717ddccab0a5a109da263848411122faf6738cff06194f6d3dc0f801972ef6f0597a77b04b33f1e94f6b725afd46e6a89db1cd461aeaa82b0c58d112f864700599bf01da2baa871271f7479c6d945343ca6b2ca0c7bd1e6e8df672d2e6fca53824e4d6ae4654500d9c1f76dc23b9d165fe0d9f1549903a90a8f0048a30b1b12dcd9dc2ad72b3d48871d94ab0b559819a003567af12bc0ca3bb9b859ff7712169af03ee89eb15a940dca350a0ce61a5259566701abe5d649f7fdecda08fd5b2eb7f6ece30eace879b56d2bb48af52a16a5dc3a4ed58012e1cda0f7b1b7cda95fc2836ae5eb4440796a98bc12c10b9a126408e67187485328bcf50a662124c8d1aea7445ffb76a7d615b490b47fdfae6e5f52795d5440e63c0bd40d29a38215a9700e594372c946cee29b65486495bd62fa425052c6395c9a57bbc460b76a3795c00a9b1e77ce38c0785cff3a8ce0fa8ccaf2fe9b9dc4e08edf18f317ec64f6b343d7bf228f89d2b88eb3313f1ddf65d2227c8ca13975e8cd063f20f0b1e7203efecb9567b5b141c4c333070229a2743f05dc1cef79a1c6d6867753582f1fa843c7cb9c61b2880a0be17009a1f6e4a1c3afe26a32e880ffad85e449a897c35546939f040159afc3436a9f5b1d9f3bdf7bf9f73855be4f8efe09f62014292d4820cf4baf85cc10e8ab27305b467515b106233563dd9ba399276056295dd73182a2bf67a30bd4505ca2115e0e8da229e5a2a3f82916bfaaa3732c320911b73958e245bc772158f29a047a8e4866fa003c57ab5334b24d9ac8189f709d1a0decb01072508682dc9ff0fc62f379c34b5385881fc027c3ca8177757b1f957514f4dffa74166d7cf819b0a9b071e76186412e9cd56bd9b4734950f77792ee5364fcf2f35817f2b30ec1ec7fceac4d8becf69abbcb803407599ea5faa2dfe602bdc9ae32f98a43dc4ec2cafcff61966526ae70b584a3ace3d8285577cd1bfcae80b52593ee21103853849a97701db1bbd0d3837e724508b21ea9a36b2fa78d995fd69e3378d9dcb1e6efe36986bfb0f2d46f99b2be92cf2c95ad33a206c8353dc603b1d8c555ff5a5707ed3cba8e7332223d733bcec2458d820bbb659ac19c9b895161bcf4cbbf75e9ba42ab9c2437932f7e1501957279c7d4f13eee173a1ffb17323e0fd76032fdd17d5a83bdfd5f3b5bac4b12c0ebf9ce21c2b3fb4e1ac792932bfe1a9fa5c0e4a8f77f592284e96e6f8bab2586d3577b74c8da1a02864006df65814474ef267f7d681ee069c5758d8d9b133c0fa5c72dd5d7951653572d324ddb9e898ad066c6cd1ee79334b50067aad064a821953a164425adc40ebcef422c8104a466fb8cb882ad8cd99420fac91c3d06fe046d3069c414848903bf3f4be1417f15663e9f6d4106ce6f3556894b2d86bb434faafab9e7846b305d92bf2bc858e44af116f59da13f26b59126218393661654631a8a778462f3f928cceed5bd640d6e716284bfb3aee39bf143a90ffa48399ac5714314bd1130850d3421c7fa21499cd8206e89ef52ca4498a322d8799a5c5168b221b72ae5e75a05e57c1c2f8b4f94935e079e58ff4fed486ebfbc8bb33a15a1c113cf01cf2eea6be6fd042e35da3c453b08a566615b0107817e8b48d9bb8b68d3fbdd1878f738cae6e0e3ad30c48a696820c026d938b6fa519b9915f74a20b7887e7f9ada3dbd8491c3990702419ceb65df8ef7a15cbb56e11b4f6dd7cf7431dfc58b4837e533b19594f07e4e7b3dbd6a7e719c29cefdc9e8719fd5360ce907f29270e69b1d55bd85e36737893e8c33e0c4fe671faa9e5ac8247db00095737a06f81b15ba9edd095e0f6b2121e24108c69eba04a6eb616073730ad79103c1db7b3bbbf0c681ff63a30609a9e57f2992853cb6116b57b984486955b73812cf3460818dd3f9d44a1339b9fb77d0aa029c7ef68722307900417323a8d4896835cfe8cddcf6871ac615e2a28154409b2e1d44be942a8689b0258abe052eaaafad7d743501a441dac2968d1f26e289b9966f1f1d19f2fba1c578abec521180626385093ba231ea569fd83b80221dacf097f0136e54ce45348d0074b6cf98b9771f39d2429d52f1308f3ee828c3031ffd316544f20385627a2bd1957efcd3ece2454b0c3810642bbb7cc34979765e79a767feb58ba850a7c3cc6d7ce201cc2abdad7685810176a3b2ce92aab1036af37021759498904461762c545314961acd1a39eb7d9f784d7f0ce302b2daa49608f0bea7fd615ba4d629c85be1cbc581328c57edd69dd16ee3531f350cd83bcaaf30e9a1644d0122b03d8193677593494f5d7097246b1db5a02e40054da3aa04d74f6f6dd37deec6e7d399e4a5d69fc39b59e328aaa9e7ff84795f539aaaaceec49341bf35fe32a2bcf1120c8f39abe1aad5eb35b9b5ff915f02b096a50e4136a5902cf4dda3fbb9c1439c40ceeefc72e41a8dab6da36d6a63a24285a4369c4abe2fafd123fa72f4fff90275cd1ed04ed2e50ce1451aec2967af796379e05bbaf40dbeb20392b268a7a85175a84b23e65aeba4e02e310b6196ec4f268af86b42705be7a0b68dd12e197b120ad27311f64c328e53352066fdc1248ad92f2d4d9912ea60418c186abd6e5d2f59fe8d8cef71b439078cd2fe486094a82222724725d995928f0acbc200b391e913909d1348d4436a9ac0adee2ecb0494ef25e215c3ad741a822ff7e08b3a29f76bd12127528bebc739d5355605e4f2709b6208edcff396f774cff3f90d8ce1d7abedbca810b550175dc982533d3620ae3a8b80c655d76ee509a45ded52da07ad4f297dfe2dd2d479b85075b1f5778364ff11396806d81187bbdf4e536870d2728db2c20f05d98b13ab235e07b72a08ad253e175724c775c056e4630e2c51aa19077da6eb12310b395e5a2e3351d24e96501adaf754f2f31b1a7ee14f6bb051adedeea3d763441a9f77f2d11d5e8dc27bf434fab294eea94670a27acfa331f6851f9f4c30618186d44cbb1ced5c9dbfd6981b268cc9f5ede55552abedf64ea5ff0d61b4ae5e12ecefcd4d8010e35b97424b6bb6ab31a807f1649deac64617541e899bf68464896461a1440d66f891cfec2e71e2200f92789c668fd74796547568e0df5c32fc82f56380e15becafd2fb11bde97ab9bd561b55ebdf79ea752768f1a85863943ebd06e0af7540cd33dc08f9fe4cc8923d5eec8f29966c3a70ac839ced3d055ee46abd5c9ebcd940558665857141b6a0edaccfca358a99579e707d08207e44b6408031271ed640eb12dd84cbd5942785d337ec9b7c726330c8bd716467a729f2967ae1c332dc23c5518eaf8350e1caa1dd9a6b8e2b6a7e3fcdc1a826d72bf069abd7eadb35f1e172426ef0d66fd93512102454c469cc1b63fccc39c65dc598f5a3fc03a3cfff549ee0226034a9faa2d1e6e388d798308dad0ecb8b02ea5beec41ba8ad0f26e243b5ee783dfd239d17e0145cb7fceb172757d6e13f160050600cf5901de6efa3e0f2b551bd71077d271d5dc53cc4968bbbf20eab8247464f7408e901a5c1d1ea071f90be24d8e3f06460b07d2cebd4408959d228db0f986e82042d82953f59123c8f065df10e952eee1ee16dbd33113d346c616abe34f4f781ee85f08073de5004e38f5ba835eabfc292eb0988e1246e29500b90bd5b26893472376d8a2a9c8bb4861a09e9960fa17cabf59ad600560fd9abc5c7a3757d5ba1702252972f99e79b85fa7754d07deff4fe649bd115c799216bfed71cb0f89d835eae62989af00337b4a100c5490163e0bac4d2d03893bb272359af439d5807b9f183fc0853bc8a7fc481e7f1f67a32028ba336d6507e23ac88fafa539b422c2f237fb732e92f9ba1c46640c57db34ef3431cb245a39e817f2f28905597fb70a5efd8349e8f465f736e882b7ec742984f72f1a8402d96699458135e970c5d3647a3dda692df321107ff8b2311d4a7f604f4d0c25d352ae1b94caaf0836896d3f1702375465217b99a9b0d6c3f5f113f5c416fd0443179b6bbe3a93b34557a3b52f7fd4284d60e81ca495f94f3adfe96a87ee039dd18ec5930c14efa524cea4ea02913cbd63bca481fb4a8ea0e598c99c485f0ca813a63ad145720fc77f83f7c8aac22bfd536c7300d6f4e1d909d4ae31ae3ccb0ca4ed9b4993980834a51dbc8e8d3e82e2487dac505952948c53641c3e7579e5f91f591b03e8435258fe93a2850074fb793e4aaa1bca48b0a0c10d926bebb7799cf9b4014f4c5b0e1450a918c7f3d222530b2a22c9addae8e45d3e3d361d60b6296d23de0b3b1e3d21ecdce32a02fedefdcebcbf0d0144bf089dad9851b908561d4c83e638f9217521900c24d29d5adbddbaa85e235481a8ef1bb5d2259ef89895fef866301ca5e2e121f0c48cef10d56bb4471854698eddfb6b3e5a2458b0a57b849ee4d1c0f0cb6fedce7e5c0d9f9188da5b5ec75e853811edea1bfb84be88f64dcc70141463cad24ca0457dc082b27b224a67569c623ed8f00fdd00d39f4b2517cf929c08597af417549d719663c92784c54adaf303a4a45dbb86abc6ee4741572c8d0e0551acf68d4d9dc02fcd340509c74df039dd8284a96844b86e038af6560953dc0d3f9dcc925cefca54f84059e9c48c7a5ebe7d73f56286c0bd3d4428c3a447829c880f94c8a2213151f9f1e84959bba486decce4b238566266f3293797c4b959694de22e193524958f79907b24bb953bb1d7fd031b0f4650aa92a909fb5d64e859080e3be56d1eaefb46c9869a952048cc593fb6dec743cd13a5358a12a4c485d879442b815f0f37a885c7d6c58f3381ab9f38e92c353bec4963fd7b29cc0e1623791d3385ba760f709f0aa88f1d156bbfb9c449a5d77f7555b95cd6e93f472679f231da94ef3c2f73a2e28a7b33ca293fe72a47e9ddb9aa34469a4a23f6af488fe91533ca2c730f32ebaa653e564227c001ed796088ffe0048efdb3fc296e37cba371d03276a2a035c9ab535157dccd15388b9a301e98679a2e0fae2506acc5799505910234b6fcfdf923733517320d1f4106aeeea6da918fcfee020c6a2f2ee07309d250f72161e9842eb2966720512d313d5b32af5901227c27e63826f072f3e2dc396c0bea22a3d87e988fe4da7a4ea8c248b2641a85f2af863254a47fbd6cd55f97cefb15fbde772e9948f81bf6216519e8c52d893ddbfae8972830a282953879fdef1677e09a96094b3f6403dc6a505d4139b66bb1fc3808b62a38e7df64db694c09c5ef998db8df98980ab32bc5f3400a6c215aa5ffb4f8ab2c574ec2b90fc3429f0d9b37debf14916c1c8ba7b207c366e0aaf399eeffdd8280c5485945f2d84fadc13493265dc608d5c4f4d5dc085e6787568949eb547aaac38a4bf2152fe79bddc846158e67d40206c3b42988abf03702dfed56c57c8c42d8d09a708a5d98634f1ad0746dc6157ce6008a1e7867799b4d1059d937c226c72e01da8c1070062c0c281220d08cb5032f2e829e4a8719b9c06242aa90d0514479031162b084477df22184f3b6dd75be9f52494af416ee6646ec02fb55246a3099ed414753ee88ba1a92c60adf8289287d81e712ab93947b2bd5f43c6e535af74eb22d388922fb577617c397d51cab0ad3bea57ee8a06d65c7f82946cc65e66f8aec5cdd610697ee54b5d2549c3f057b9c44c28f9019e9a8eeadaab96a0fd2e5d18f7557a69cc667bad7575d62d125f33daa6b6a1a04530ab2402b29255427149b682f7fe81a9115342296b692f5bb9970a1e725d8d714acd66667469b3e1a9937cb05e558577a20783a996a74ee7b5eace9a103b355a002b58dd86cbb250d020df6443f007cc43ff692cfa6a68fee63b412ea077017440cdd8cdce074bdee4ba371e6658b446689acaeb45ec6230e8de7b56540cabb5c672276077171482a6386070dc6ba9407dfe320c2bd2fa9134c9ed6bb3508efebfec191ab3d8d52a2d343372824acc5a4e641266ff9f2c3226f7d01bd51c43ac95c21986bc75ac54cea34310b98beedfbbefdf63a43792e422d817dff56368a68d4b93caebc4a6fe2e6293b269bfb47f9ee1113d2ce27f3e4f7612b18ef2854d2bc3929392a8c9dacd13e6310a6830fea2828a55e1ffb41bbc94ff7b12ffbbf3d5a282dd4bec01bcbc5035045edc24bdffd8fb2ed6999f0e8993d051418f363d86401ef7d1faf5cf586712384552c69ef21417dd46e6b2f66beeee00bd47362b5793ccc17e189363172eac83dfa0ff13b8b3d2760b7ecca87eeb3becfed7e8586333b7300fc2ba75fec32c1cf39514f0d76525f60de2d657b8a0098368b273604034b6297a030a5747ff543069231278048ab1585e48cb5d3453ec89a0927bbda0bfa163d3f469ec45a4a0e1d75da09495d3a8431080d294b4ee640a55fb9ecb575d5bd8bc4d90581f42708841f715b87dbf410c72d9dfefbf8753a15fe4374bf1716c87e7d92af8e273a6b43c4072224b4b0fdeee78523d41578f9edb521c4d4b4ee9d24388ce055966fbc1ba428d635f60cb148b084e1836730754271e0b41c450d5cd543388e4a99d6563037964ebf8e692080734886dde6e0e0fb8fdcbfe2970e817b20ef13196d0f8cab07f0d8b1982ba9be9cb24519b36e4a8fb993dff75b0e0e7460eff819d4e9a5ff0b3ee80877433503876a9e4acc5fd2df632845a69aeb4d176952e2a802408cc11ba4d76a733830119a4c99645fa698e2fdf710cc8373c0289937ee9e711d57f8a33c5e683ac6538f71f2a93a8707668f95a88a3f9a8cd33da0da86c4ef62d5d60f719374a0e4beb33917b685c3979dc8fcc267694ba70e932108ef44fcc246d5418f14a78f5f62868c037f924f5c7c2f3d9e40ad92dcb02bc45a9cb31ca25a275b65679e0558187c930120fa56fadfdea2fa90c510e40f353d4c8eaa079139edc57e836b621533b573e41940fafb1818860526fe659b02be891309d691f7468d29ff6eca668ee664012089bd65eafbe698ed9f828cf9a48293b75b6a82bb439cffb589b22c14e174a3481e13bc821f45644d663ed06038ebb267c52903599e9b6b92490f1caf38a20f13acecb3c33e82abb0eca0c3925a443342126a52240551c3cac57911116b4b8c5e60eb0b43f24c454425327bc95f2e22ba431a1e058e581efd32573c25c6fb6c5d86821714339d798e2fd39440d6f7473495aac3e9a06957f1b4740d6e190d77185875081c05ed967cf2408408f3056db582d75f2a4228bf3b36c3627eb22ebac9000c7247ea809e05626f4eb3ef58b9dc29c31d6f0abf13a496edd6af8c305c950e6468de3127d82f8105e0fdfe40fb128d59caecd06ed11c4d871f7bc354294939adf76a65f4239e2385be827d202689d1d60e8ec29c756ef9b5def1b1316b374f349af9bb815a49729ce65acc3210433489d814c29ae6a338bac6140ab5da09bcd2955f2cf120422959ab2ba996c8fa54ab63210203d3c33f4d3cc8d078913bb71bf4c8469088fffcd90ef863f173cf40a5efc93d20512acecebc525559b059c1092dc92c792427fc4dd92a13b52864ea70325820b87d76950094b9bdee623ad7c33d2b52abd966d016cb7640e9b204991aee403d8c69f8c7dca555e8dc98fbf07f0787c3f544c250639c1bbef331692c4870fa49d5a89ac983efdd4b001827781b7165831eb56be34c6c6b9193574cfdadb40898726405f282ab95088a90fd8aab9d79ceed45bb6deabe6f1576174563ab64af6786be0f115ff27d3155a0a4f44ebbfa6fae54e4451585e6c66c44ab1f0285d6f82f876b58a95942dd95291fca580287932efdbd2b432f4a8f183a1fc13122ee3bcbe2a33d40c5dedf2471ab94fce276a4550eeb62acfeed8a63be9aa1def0ba29d763895659cd8e9212f70660c31266b815cc51078017bcf5bed509c7ed2abe3064eda013d06dffd1a8931aebc1d881b2fa6f8b1e11828b84aee3d4920089abe016d52c08e854c745851895948b7abb805b4f229d27310d6bb06df6c623da1e0e945423ee633578003394b032c58585d673b631e21cd7e3378b866e50904019e5a5daa939c2f0abcdd4a7f17b733100728024a9331ac5c617b52bd7a3823e48c8da6cf780173fa458e5a5c6daacb44a82640ab812fd30aeac72e4ab4de0a6689b9253b28e26692a563864699deaccd52808dffb759957344f7c463fcc62c2a51a4a8486a19c6b485a54c751af180a5f15c8a552deae50598634979b4b2313a27ca5316baa94d18039870e64120d2b01d9a68d8a268ddfc60a676a8aaf59bde1f915105dd441252ab932a9eb2db17cb71125c4c381505b9f1140ddd3c9c665816097aa2974524c2348b5c0dfff807e2214819e31c6514ea71060e8baddeb523bdc5e4e1c1a1604ec117efb5bc1bc106d26245380406efb9f2eabcb35ad1edbc6eecb14e82dc06221b386f685a8ccc4e7c15c56ccc055e545bcaa25218dfe48c38e29959ac35dce161fc01ea14ed9badc7ec2d8b72fbb4def696324e8124e57f700f82fc82c3f586a4a89bb2d9bf235721b41fe5e02e40dc8bcbd68c3ca28a3954529c004ac3756e0f62443d444159de1ab39d5e5bd12ec00d6a9cb247fade098f48408e538169285f1244f0a2bb8dcb272217c53eedf70872ccf20adf8523fbd6721c246a6d4a664728544a39c8e87196d8c9688edacdf95d3b1091a1f22e5ff0e43920d6ee68d96a932c97a19e7aa46f59ab0a199d3ec426af1654150c3cb11cd64d0946c0f88deb53e7011867f19ffa15bddaaaf1de06e1ba8bddd03390215b8d7a04f623fd0b3599a17d117ef2a8f21b4367f40b2a5c8d93dc3901935d036159acdf724ded286946f8ac5adb03821b6c370e0ed818d897ae472af9568ce4ce6190c2aaee26016aeeb3b6eac103a706b042f8caa31cb0251c034f33dfe8034102e0fed4db51a035dd241de6c47f69ef9bdbbdf96a2ccac74a52e725063d30d0445c5b02eb929cbc8832644788081698c39f98e3e053715c1acc334cdcb06bdbc2dfb31f585d5976d421e8652f3eff99cd105c2873d84b328980799f1b07b6ea7293e9dde58cde84fc8612098f949d917edb10e2cc5ecd1bca049725a4d77efc67380d08ed43d9180e2ea8987301d259fc101c465936080fe71bf1425b19937e63af09d5d7c21c8795b04b35f8a28c2bfc12f073236fe1b2e62e70246a9fe6ecd952310f75d8bdc648379147a1b6994c199c84b10985a00e9d3f3b7d57ceb7fafdbcf3a37d1dc3222141c7c9f1da3db03fc83c75cb9296af37be2997dcdfdce8d80b3fcf4391fc077768310c6bf3051304fcb1ee34a563b08001800bb5228a7d353446489fc8dc2a864a2dfdaad2fb6e87fdf40d14a86f9b66fe5d8c2d4e0d327633a9ad10264f7532f4afe6b73d870c2e1373e41fb8d8252424b12dffc2645739e1551711f952b106aa9fc12908a4a30e2b067e704f98318286e7c429b6c0705b738820c1212905e4247cc13256bcda7683fcde62417dbb2e54bfe6cba3e0aa1b235d1e564932738b0f9e0261d17c840986ee4a83b3681678a57baf0ba3e9a84333b0ca935f200d43f28b8f1a976b538538703b6ac09457a7342d38dbdcc481180a09399f11237bb71b0b7cff068349e21bd2cc9b0bc14da2787f7fa521c208ea8f099d16f794438c34d41e5ef68c9e052e35c68565399d5120b63f26f43fe5708ba223b672bd32754e82ee5cccd00e2a778796be87bdf6e06a8c8a790d40b0b2381eb1d5f756441975468a224c9b51413147e4f46a2a4b47dcfc265871115d9066bf5bafe2c7f8bb834284e27c465f7","title":"768. 最多能完成排序的块 II","link":"https://leetcode-cn.com/problems/max-chunks-to-make-sorted-ii/","question_id":779,"issue_number":9},"7":{"day":7,"pres":["求单链表的倒数第 N 个节点"],"tags":["链表"],"whys":null,"difficulty":"- 简单","description":"```\n给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。\n\n示例 1:\n\n输入: 1->2->3->4->5->NULL, k = 2\n输出: 4->5->1->2->3->NULL\n解释:\n向右旋转 1 步: 5->1->2->3->4->NULL\n向右旋转 2 步: 4->5->1->2->3->NULL\n示例 2:\n\n输入: 0->1->2->NULL, k = 4\n输出: 2->0->1->NULL\n解释:\n向右旋转 1 步: 2->0->1->NULL\n向右旋转 2 步: 1->2->0->NULL\n向右旋转 3 步: 0->1->2->NULL\n向右旋转 4 步: 2->0->1->NULL\n```","content":"0961e884611df7d4ac47a79a9e3b6f2a74993342b3964da843074a7e2f1d4ea5ba126cb6b71e6983b7c364be6cfbaa5dbf2242c49b6414deb063ea3cbfe8f124fd2d257794c0c0e70c6eceac9a8912155da73ec61144c917d450a23e0124585c33489e47213c61f0acebc1fb773f4761925fa4cbbeba1b498d393a4abb6cc640f19c25c7efc7893e7bc128bc37952fc3297d68e45d584c6aa4a61c10af9c875d783b7b003aa9d744236c5af8b457117b0ba6c1e37b053262a70ee4767afa3c3d58bf42f3576127e0695aeb6bc7437738a79120fed322b8bd076fa6258794b40ad2d1ef5ccae1dd0d37ab45be81a3ece0a2e5f26849a4420f457c866849084ce2d6e16b11ebce5cc92e521878d7331c7399a5886d981afc378d9c8c0e2d23cdfa0c2ba3e06ec283feaa2cf9d283996e5eeab73859f7dc0d9795f806189a0cccfd4e73e0dd346c0c46dbf34195bede0fc9e7aa88d0ca9fbb1e886283a06e5253d088f6ff76a8be74f26a557a2756628f942289a11ec51a2d6e5b4ccd3e87f3dc2225e43f082f7554815150fc6228e8616283795dcdf2e270ebed714fa177d60a40fe940b136d49e835ac8d0a4cc1d5b4eb45a7cce7a96bd82665b6f558e003f894e470bc7d289b0fb5ca33e4dee4bde3bcd141e87279316b2a3cf10253fcaef93614e5247239c753845a0356b0ba99fe0514682da86871be202ee242d397865597a64f9a8921bf1bac37d118e1de85cf52a5170793d47bd075a7865d1f28666e57fe665e634627016b8ea0a223fcca927c717839203883358248b5ba7c0febd398f6d6886632451f73e0bbb0c6f850f78a875db5724e05aa20cddb686c2e1cf0bc92ef0801a9f77c14622236b56960eb94737f0c016e767857a8a916a0a7342e63472f1c3f09a61c0d23edcef24588291f7da29322f742ab5199902fa462a9bba75a8f201bb04b41ae631799ab23c7e9b65f8ca70ee840627a7ec31bfa27c147f2880cc65a345cf70fbb6782fcad6ba72212c380ee8c5ddfa55446bb8d272595ceb65e9660415a1cee995019a2fd85c653af01e86d76b5d684b44a64906e0fd67b85fb768fa7519633d61bbdfe44c8beac41819daa88e169f867115b31e7c50cb2de5fd0dfe6ca609775e907e16b58f94049b9d426a8591cf1d5fbbd70663361736a4b1e6557e3b698395267a6da8a07c459332d3c24f7ec74bd4e52aa48ce11a1e0c463082680ed339427ed9ba9b010b3f9031e9ec738d00ff638947eb2136fbe72e3fd219a5e02cb0ddb2a37d3013615e988c6fc721a1fcfb3fef7b9e3d1fdfec17acae6270efa25ca3f73f09a66c7a48315c07652b89fe6cffd0eee7614d828ed5c46b15f9af9732e79d8ffc4a71d724727885804a796dad8ae79f50222b252b0b89cbc1ed29295edab3666a92ef106ca5bb23a61a5820bbf88253bd2947806f990fec1232ca2aa648538ba6bc93ba941761759eb5e08aa996dae5b92fe2d1813b6474fe56938efdc0a5288e61d1378fa2e1ab8c1d695f076e66c748c8aabdd609b61511d97a205816ce8357b05ce05cfe75275e5444d61801803481d49f95069352ea7f1fd3a1d7305a6f36b5ffdf712c18fae7db0ab6fb789a9ea3f859c77a50678652e2863133a00c21c001ffae0da039b1fb07f663e3ed1c33fa28a14f8b1cba2df8155b0f67488a3b51115cdaf3ae466ef897e7d5b2c1e1d4378e55e1fa7b83f67ef11882c4e4c8bb70ec0621236dc56b72e836b100c64a87135d8193362f3f47f97bd5f2c624abbb8416aa43dcd1ccd88a282054120d74e56308e35bc9ae36d55ba855c578bee06a8b5d12677a32655044579aa3f7301af81f5f7ccdea89b807a97e064de1ac4dffd846d0b3bf797f6b684462a6abdd2af6b7166e562f67495d9b4740a2c3946657d923d6600e715f778d00fd1349bf42b2a484a3942d5d31ee53e76018e5b56338f1528d8b75dd015eb9d1588ae47bb7d5a29cbfb0af0b8767b4e4104c52f91399205d2530f8abd3b463b087ad4a76d019047fce750ad5c7024f1ac843602fe35f59dc801f1bcc74cd0bc60e165d1b55ad9a2d07e09f51b0c2643be48e6ca0f21b00ead13c71b5331a2637780f7d39ccde121011f879989cd51c3692139cace606cae61efeac2f71c43ec8052f1c280c39559dd2e59d7b6b7471263c93fb057b53003048c0101ea41e305ccafb0f46b995f16d157f1bada9ecb0f2616a24bc717fdc4597324b41adc98b36c6a6e4103827eb69b37eb5ad3d2399a47c1cbf0acb7a48a6cfbe10ec25c3866e77d0a6efcdf60e114f56473715067877ae98b32493a997821d07657f3586cfc8ac2b6fbe3043de3271186f2dbfe160fb8130ccda9a8d39756a0038bffe87a357177d23e8b24ffd3930ded381bba38acea9578ca92d120151deb63b276643f8e6c8beb3155d5c3ed2ab0374576f6c038a4e7461cb29650543f13e762f0482ff9e79db0a503d43526b6f2160c2b0a68fc0433d79e88a5186e4aa80e9333a57205d2cba02e12c2cebf12e131d01c0b6d0ba3bf079713d50ae6f5c7e65f967c4c6bf0e0d321a1ea6daddbb8ed38c31e277fd5c7d117ce95f9eed391e50061888d7210942c175b955ed179962207f1651af90ed59002371a3707cf4405cdbb64e2206924f01cbcb93a0b3cdb19f94f75bdf55218eb2f7c837055bce940d51e46bc8cf2e3a51ba69df0bb3938fe2a2ae6d7e0d53e207e7d702118cc8a4b69601a21b27dc7a2e431a4980ccd879e7565be44c565e9ee91145f68d92a1acca662d2d42b1a1fffac8f17b6e1feadd7c73eefcff32be50fbf946a4b4de3dafadd272009830c8ff990ad751b1349d97cee8c6702b9cbd9c1d205cfd97e0a9bf963f2e231fd03fd116478d4d6c1ab034b6c2c7ad716e679c934dd4f42811ddb4e8f2d6b114ad27027190ce716cb124fbe2830fdb9c02ef375d505c9418cbdbc0ade2dc9d95e4f42492524110a7bc7b4be30977a6c89d61b39c4e1c2aa95d453256218fd0f238f55de2865bae2fdc01763cbb7bedf92e293e8cb49ca0deb6dcfff1da2218bdfc2000f02572c7224ae425bc8b5a1b80464d94dc0ca01bd33a021958dac7ac7b6ce7aff907176189e26052f58334d1c55ce531daccf6fd02dbe60eafa6d8add7ede9c9c84a5cadbf6ff81319eb23781c5ddcb927add06f191c912c0a6e43558f90f465e4395776682110fdd97cffa63f644bef669c034da26630ce21650f2723130ffed858002bfce266ed3fc9af2debf28819dd5ca9724d143089198f7f3a658e0511772537529bc92057e48be9fc989ee2117133c12f06e4cc8dcd20576a5e001995f479d846bd755154a36f356cf85d08b4d284ced61f45626242d334f59ed14d3d75ffefe3b4746f15749575fab979c6d7547347573ab8734808e53b9759292834dd65b9a754d2b23b1637da99ae2a9753ad5e02974ea27ad50fa5168281a300a438c75168725f90e45d48056d94f15452e759b07a5defbbc248f7e07a45f66200201cc9d4fe06cc99c1a72afe8ffecb78b48e5cacdab85edd79bfcc3dd3409edf7217bb51150489cb478fec29fdba4387ccbb56a7bd646b444dfed0e218adb68c51bbddca899a852541e9a8074f8750f4abfbb43a8301b2cd9976773137e515c4ffed0ead524baf0d1e6b7ea9ad29ab86bd257e00ead3f224ae07f6a5302cb943afff99a2ce7ba941c6fd4405c32e19cbe043007269cc270ef1b99b6172a13c57d0d52d75f8b3eeff77497e607cb186fe0488bc22e8c97c31d843809a771e6eb89239d19f1d6597b41549e5542d7cfebc3baeb8281b3943bcc63c896f6ab1eba109059ccc3612803c7d7af7e44d1ef447b4570e71684000bae626cdc4d5782123914157d95304c6def5fa78dfe29074ff09f0e7e95a4c97d141b0d7ee5f803de9c4f80a01410217a28204a755fcf7962a15fa3525d730fc4fe0e45f09099c2cd23e1c2197baf6de42214947f10a2c72e73b7c6dab374af1e8d994f89df3d15253113b697c150974678152ddbe76a8605e36d35a86bfc9ff18f7661ef3f36ac7112f28ad663f2d6257acb18c4d9cfec34ae86d6987090e02d4a5d3fd671a16fd227d4ade26e6b600c9b9b0e1fab7bfb0f52085b78002e3f96be9395ade9ecc8c96121b4290797c1188e003820aedf2e92fa2237d81586e167b7444fd9dba8b8dcd4811e2e3128832432e003884ddd6c32be075befb30b047593aad3d5bd9ec6a83c31240f74d9762d43cb4f2612444f28eebcddcead53f67bc8a41af5360ab72e2eadc0d4aa329523c2cf221b12550cbd3743e7e393b2e705c5875b16b62c5126eeacda37d628a460ab13f102ffa07c5a8e4f3ac895b25aee66c5a56853422a0d78d4a34c89e5c5dbe1f599c0af433c01d71dd26bbb8aa16f923b44aad4b55724bc7f1644e24178632a5133325f2911a2f5a9a78d212fab8a6fa90165c8bc0ed1c66b37fae5fccec0c1a40056f385f07d0d626195b4fd3e681570dc2ac9c0cc1aad4f2ffb51f4a6642a3a698637a2f0a911b5b70b8ac1f3a9f8ae0a8c328c34da3cbf018855cbebc8bf96e3a2602406ba38795c56a077611d8db2afbb05d04cdf6c266719d8c71b06621b46f3d8b275deb9eb3dfa17b9b5b75b73754836f4e31e5bc2005c62c50bb2970523c1d8d4f1239fb82a84fe0185ef6f7b83dc506a897afce836b74bf5cdc3bf9f314e7a68dfe37f82b81277d9964efb618f031a5d6a7eecdde41b2d8fbb980c6bf91691c7bfdf3b8bd57cd12fce53ea2994a92bd91f20d5a622fbfa2d24f42587014db743a292002bdeb0f030e9acf34999975e625d7d029d774f8d60f14ae926f2c760c9b2d396d46483182205299ff8ff523082978d660cda43c6282336380a01c687003611ecca205126512bf8932899ace02eb5d6d8c686d47afdb06fca650cd0ef68731b7b74110c3a06c66f1f5337fab14e3be14614cb3b8c88abd1d52718bcd450c9f25b3f16e4dbdf75743f83006da7c6662c946908314b6433453f423f91957cb5cf7547dd190ccdd8d78fc0cc22c1d127573c308337030ff829e3a1c0fc7cd05ccb405fc637a7fc38b387f11cdc839e4b33552ed674563d547d210f53ea7a07fd75ca166f4e02b381949b5a1227663fd43b234a9ed20ffa9f6390a1310baf2127060a77126046755783c2d011b458c4205ad83ccec57adff0d7dcbfc90f1cf5cc86c6115439d1fdf5b06f26988b2d1bf117060ad88822f33cea5a6a8acec04ed80a6b2dd10782842fe91bc9803779e3f894a7e89cb5167507bd62ce8f9ac55e3c46ee894122c408a5a7d1a0decac5b5ca983f01206b5b9d21d39854fd6259cc83025b44e344918affa3e94b9b8bc8703d498e00a9321fa40652aba9be6d93abb77f81332ddfb9ee5997ff1c59938241c3d8460e4af3c1ec557971726b18ddc03b5eda046f8c0c6cb7eee303ae688406bd5066ccb1874479f3df579ba6b222a47b195660ef79bacbc4eb36ef040661fb3f5714e629307266e2ed73dc140f4aa5c3bdc596acef28457d225fbc4b82bd7e6c5517e3276f492a8fef4f953c81974f0c1adaf6096e620ad01d920dbccb16433808c0806491e681ed935e0f484cb99f5f68a228109a8338a3f8f12e6bd91326c8a7b4c1d651d9cb28f6dc223db5d5418457ee6e9f4cd388992a5661360f30168471ada82761aa4b166de91b723720c60f9c979fcab1af3a8cfa1d8931a5db542f66e5aba2ce2d1858345cc054fa8ac8135346456f421ca4d75e379db40ca881a3582071dd520a7fe6bc34dff69a081b1ae16298588841e7d4136edbf7e09f4c6887c68abc811c17e59ff6df72c93c0f18f7ef54999ee2f417fc173c49ff864055732a1f95f0809d35bb0a9df835ef217c4465ccfb83c7712913205c7f3c4ddefe3a921173911653952b2969a71771385cfa5b50dbfeb3892e4d0a420e29502c5d409ec07dacebbc325e08c1a779cf566d002f939aadf0891d804a96bdc2548d6d1d7d90563d4535ae498831c7520e8304289c47c7da0f3d7b5791c0649470ca3c35f5222de869d241ee831094725d1625393c7b7d66f559a638a05ac973782d56a539389f1844c454d7daa4392b42bb928be4cfb245f56da0d5b75eb073d769ec76216031adfdd9889f74a7719fcf53de0356e8a178d15390c6f83f271235b84d755da4244bf002a0dd76ac1650a62eb099011d71f7e1e3a0ef7576f0826ef963c99a966d21f7dea2795129e1e5c1c876eabffa4951c37b4f4d4845bf2737cab756b9019a5ccb51e65ba5225cc3047f8ef8acb8fc84a01ff5cc1d9aaa65d529ab4159a1c60b9e46292d8118d54ee15c5735832c5ff4340e5f6602680d66a1267037b094abcc8c79f35b5ff143c3267b6770d930624d59c35493ab4d1763610b04c79604290be86d0924d6fb20ec79d6757f1c118a114b4b7ce1c70874262ffaafa9cb2bfcf77c7f935ec71d8fd5047151bb72d05b802c6944fcae4c1cffb259c89853d91c6035016ac7944f1912a7f883358a2a3e7716f210fed5c0331579558a69d079e76ac7e6fade73bcaf88603ea741b84ebc1d73dbcca92d73183891904d59d0e8c68a6eb3dbe9831d8ef28328916cf4f31589d09afd93bbd41d6db84d153ffbb1e23d66c0aeb861f96f6b3319cb843ecc4783ed716c8647fff8909849a1100d6f97c2acbd54d6056df6271a4afdde85d1cfe376447a0e9f899235320c837ab7817aeee68c58f491498d6c8f35ef452cf362d5649bee268b07a6c268d679ba04e68bb4f2bce94292653698ece06d42934db8e037f59c0cea1f87c9585746ed28eb6311cec9a86c808b2addf26e9a989881fde15cd95f866db3080bce4c4becb864676eb099c2d6f28e5ca284b2e3e10987bf670e5a21a0961a8aafb005d282c9e3931a764ff3cbbcff41fe7994735e701a7a5d6a333e59572cafbb8a2658f1a85b2a8f2bacab6292935f9ff2a7d610bfee1119825011e3d7eb2f659f205dca5f2b8d5705fa2b32ba1538df8ccaa5b5fd001f118e8fdedee8f824a3cfe011eaa83bcb7d473a0ae48e56aaa458fa8778f7ec477101517cea951ebebaf5a3cf70a9aa5c7be38f4c5fc44b1e94688d66f6cc62483eecaef05b3c8efd9dfa9af74215b25c569fc775b78a12e906e58752a04fd323ae1c4c12e0e19b1caa8dcdfd8985847ed69ef6a26e9087f0955ac5d369662aeeb9d3404305f6828038342718aaae4163726cbf19c2f2db883d2b7161759ece7eb6394e89209026f88c23bb81d83584c49e99e9ad704ce0fb2eb2342d201e18a56f069e430eb68c819372c9c6dd3e33c4692cb5cee8d844898c68d9d4afd9ae99a2d612dad8a0afaa104e000917c961146725f9618c9747f8f2e6090b3655e1ee857e4feb67942d47942307e3e5d97fdcfe894fb23e987cd4b7c2128f4cf4c4c03d01caceb8604b3f35c866f7a96bf798a94cc44c5c64b9d817f8523b20277df3236d661865491421a6fdbc26b08620f3cffc83a381eb82c032792c68ece70bc9eba99d33967bbaf85328c74657816f68fa50c74bcb562e13c1bc14ed28ef85c3","title":"61. 旋转链表","link":"https://leetcode-cn.com/problems/rotate-list/","question_id":61,"issue_number":10},"8":{"day":8,"pres":["链表的基本知识"],"tags":["链表"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。\n\n你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。\n\n \n\n示例 1:\n```\n\n![image](https://p.ipic.vip/r1afvu.jpg)\n\n```\n输入:head = [1,2,3,4]\n输出:[2,1,4,3]\n示例 2:\n\n输入:head = []\n输出:[]\n示例 3:\n\n输入:head = [1]\n输出:[1]\n \n\n提示:\n\n链表中节点的数目在范围 [0, 100] 内\n0 <= Node.val <= 100\n```","content":"0961e884611df7d4ac47a79a9e3b6f2e719933409cb941ad4b0a63642131446523a6ec636b8aa2147f768c33830d2eb0626e65ad9d3e03c1ae76b561bceff835f3316e60d6d7cfbd0a2ccfea998f527d3be17095dbb21b9f24f42bc1e3a6bfc0502c821960bc893d665b6d3ce9914d58bb5fa4c0bcba15478a36d8e122a75a29858d4a6c750c116e13e549f53bf169ef52165fbc10580c30bcfb4112d0e4993c13011b4032ca83775c0267bccd7a4e0307d08bc62e5b0728f307a83069b74e1c30df4fb70d60a00cc1c52d03c22b2c19fc008a355e6fcdac7b28968768133ecda1cfb81be8a2739dfe3124f692cb85c834006dc780c368661b49cc3276451bd5b457fbd8b4f731903ccdc3c5493c06589a86ac608112fc29a293aa20eaef54f92e05afd753c295ef4f9a56191ce9287ea7ca1c3f9de442cdb95ae9dc4e8b7d891268bc9621275c4582af57e6c8ef768fdbdad1d3b4edbc60d254eed5470c17f8fea3f02efdb732856f183c1b182e80f290296ab7671b0f505971e2d1026d1b6c0dbf5d0145df3560d294a14141b2512bd9481799d181ff5724e90bf069556948ff96201f6f6de61d9f8c0059cafab0eb45634b7da44fed017f21c558c7cba2bfac12b4ce02a001a8d8f778752e18797760fb2df3876e2d0670b163947a172e9266bf0f175ac5c34dfd9080243f4873a4cee2a472e3f864d4df48837b9aa4409a996847187cc608f25ff87a9edfef957c3cc99bf99c675cbd2d3f86b59bbce6de26d8d1b8e284d8bf5f057d97f1fbab7a7e49d5bd57d628cad00a72191fab6612246319b692eec9e4716e077c2de970215d8911f22b46927d96d62f259f8e1d2cfeb41b58c3eecadcd283ee1cebb74539a597d8a88cc4b1a50d73ac1045630b1803244e8fab73b38af77a5425e51484cab3e49308f0eb4831b710c1ff79186fc755f3bdf03896e784736c166be79aacd95adae357a602756b1fe679df5d4db44d1bea0593d1e67ed461329eb63ba12b123892cdb0b4985f069cfd5037d7f3f74e47ab53d2d2e7ba4943c186aefaf82a16b4a8cf4afc77542fc2467a8c7c75af0494fb74bb8c50a70b10bed9aa636e9470dff4d58a17cc7550224a0a78f9c901d7cd00742d7f4f874d905fbe9916b49e791beac5a7828355dbaa743f7e5031604d63433e74db3e5c19bfeda3407e3fb2b8023b56520da6b84f4e9a8f326cfbab4caae7d384a2deba25e6a76595b8b71b92d3edac020192bb6ff366e74cd34a51e810dab548811f78cf840c9fa316e5addf453e1f5ea7de42c7d071657f536b342226f72c75b5d433e3598db56c0fb2754407cd6094fb19588cc9b770d13c9e4dee74d983c74ee2814a68f25ff2f5b8fec0faeecf7f4ac4acb89fa219932e53fb48f5c494de71c5ffded1c66e62ff9635cfbf48ff91fd63286ce5997963e3f6120d97ebe4ac4c06cef256e566a21da802cddcca1f71d65c37869968a9549cff2c2f34b75a56e74933eee63c5290f4133f6f32fbabb5fac19be25be5564d6020f88650fb354e76d2b84adb5b46d993f44ad410083860a6044003ec396ddb888f0ea5ece99549afd27c435b66f7c507c56431f7060b6cc45e61923b4b522d99d0c66cf26f7023581be899e5fe55b5a26efa2561ca198722fced92fa5250f9061ad3193f0d1a504509b9b02aaec0e4037a5616fd9867a4fc4c1213167eb9affa1f93cb1114f99365d5136c187bedd32fa816099b05cbceb11cad783327d2739951fef2f5487ce62356daeaeaafe1aa353e9978bb12a3cdb228adfcaf0ef490f4dd29c0d2c3072883e70c50c09d25c1fdc75328bb6d1c1926118eb49cf56b443e2888fabed3aafe4c25eb229a88fba94384e3b1093a2c2b02c8c19b2e702b6b6971e147f3ab240b3992ec695b4ee48665acd8e065d02db97af63c9602bd236f18555665ff0aad5aebf8aa1cc2c8fb0e9dbf0c620a805aaeaf59cae74994380f63d0b30afdfb5c350b5f11f4b40d8854eb22c4c0083ac2bea795f14f39b48548f7d671be41f9ea8f2b344cffb262f22e3902a0743a0db24b4203bb61a6df4491fcc63d73cc777c362dcb41b78e0555cf2cc677c1660507e53c55d592ce254a05ca9cff3f9eb2eabe4604afc0490581c801099dd196a02b3d5e0a8767488dc8a15be6185fdaa154de4509cb73ee45d56a2d70fe2d57816aa6b77568c5cc0add554d835297e5e2c89829a5f82beb02d64fca4641249a0f1b3017a8bca1d1fd207fb8a5d849e5d359ec64d603631c33396356b2be920e0bdab2cf4dd2d3cc2b5d821176bb21013b50c32bd0323bcd0c2c985647d07757f3fffc92e5f0ef91d06140e5be98790e8fb095fb4bd67ad00e0c490c48e81698fe46e690a9dc2ff613ad3920539a25f331ae1cb22268cc02376f849f853ed822e1baf6ef7d43850b18bff08857b6ae2119690f97aad446119d9e96b682fe43c6659ece5f57366139cd12908972089a0b3fcc911294fa397038c7407c2ef710f9b90e7205c4292ac29b003c2b830ef926d69bbfaa7808e21ad60d04cfee2919fc17a5b8fa7e431af91f04a555587152b21dcab6d0420e0fac2c53186b691de7307a85ab7c128107144ea75dea77962713fd6d19f83bcc922422113d07cd763acdfa3661fcb5a31c63205ef24a29b2bc7d4ffd4c34c0b09d83904ac9fd6b8647b284dd7b634de0930ba5afec73f6fa74d7900b475513b95a1843278761958b363f6a4269a433b897865cb5ee51f4d3c14a2f2d87013bdf87da032b3dd9737ddbe2fc281bbcb6c75ef7d238d38ef4eeb3e899355f6a29c005bc89594963e5ded6f32d61c117b5586ffdf050797c438e17c4d515273143303e4fb7a1b14641edfcfa7b0dd9779e78dac40481f490f33721012c24b02069ff2ff14ce035ea0ea13b9195e6f8bd51051f777dda4fa33e11c52b70aabdac9c7fbc61459555eb0c08e5545b91c70b0e6c00b8dcd4674e84cf8a5ad150313b66103bd52425085179cd8fe39de36e408246c04a01786051678af112035217264655267444cf3ceb48cd3abf0c218ee80dccf183a1d4f4c5298bdd621c3e25dce93e844750c546a962a32fc3ac410f1aaf13cdd21a587afc0b6b4b4cb6e796159262930e51e4188178a9554caa527973d39c39092d116b166551d15b01cd49494b0f6fcae422eff5994d9bcec47411e702395e2c8b7a1a827d11d0eacf947dfb14ebde69fef245573a0fb16560b3d8c3a5181cc0a56c95ce1941d0e8843d23ca718cfd8bcbf276ef1958bad8a0c9c212c7015443051015f2cb11e42bf2d799461681d2481e6c9b4e1982df8f88986cae18f3204bf6e954822706156bd3177c50180fc5ac8b28a8934a4a7f14b1a323cd58afc318a1de5c084d8cc7c717da7b4c0ae4da81c5bcbada806bdd810de96e1a453beb0efbf82171665fa90d17beffbbb33765ce8b4f65bce02b503ecce8b2c8d55f00d3654ec2a32cb7814c73b44efe59116a655e69998aa39a72eb4750d14dc2fbbac04c7ae3ed47f7900370a2fecdecb78b48cf0ca58ceea7ced1a2c2b34725805fd6fb4adf95d33e38a51442295160647380f153148e6414a6350f89c940f175c59b560a291c1e9b2f1fe6c44781081127cdbf35f4088d2cc4dca0e29ff1c9f98bafe9bcb707f595f2687e5f525f497204da90a42cfe622d38bd55103f159cf12fb63f22e25b2398dfc96641652ee28892ab6c1564feca158a200e3ccadc8eb27b6817c700dc29bd548d7a449ee118a8a964fd9e37d8c8c559659ac505f9226e032cbb37f2ec60b1979b0eabe00d6d3c98b8e2f0d5995d8852ab8cae9dfc1dfc7c9e39a7e8c7665b9f4423ef800306c1a7e5b84de606f6c7f2622941b9cf6ea7a9d399fed1f41168be3cb6d49431a5c72f64ecd53a6e691f470546d444d2291ac040cbe42d76516d6444411804d78a1f2086576c1c384e0d4ed0db39561020a576ff09430b8547a4a5d852e8a05842e4f92d232c358273628a9b5f89df3d15a4e8d1315b28db41ccb8f7ca5d01ffac4eea6d6e47c251112a01b8cc00b3c5407f00ebd2832baa97a6f8099906210274ec2378210d9c0982420b1924fc7eae2353ec5a2819a2e398ab4f29b6d71cd63c92dc898883c8ac84167a7e152e6828503ee1f576a5a73947ca5523387b84dfeb3b57abe501d33746e04abb418a9e37604b3a19beeaa9e104dbde73aa1a7cf76c32e3ead7633c93b9b140201e7f5c16317f68370ecac43bf4e4cd5eafce8cf6fa02e6fac1b7f953b93ed4b409ff3fd9029aeb41365a5cd352b03748cff3365b09a54960e4bbbab2239e46099db7944d98b06d77479600952bfd2db23e9e45a0167a0d9cc1a2c9e4486db53edb7f4252315841d8a32f82b3c5f18b8699e5a1542dce56a7be00a89eef6b844946f0acb5042ed72f6643ea407f6d79142d33117745a3ffa6e39e436aea8223fd5a1d8def478ac6307afdf7b3c485c5ac1b7dbbc0e2754c7b2a83a5ac6a3a4d24c72dcb8c9f75ec0b669405a1b86f7e687e907f88b0b273b0b60faea5dcb0faf420ef7d84349416db0e9f159caad6bbfde4f50b7755f60e621053a67b401cc9ac85a6059e09d839086203cfa9380b744721a7b6f775dca4fa12e1168ef2be567f292462a7ff3555c25e762a801dbed2492f8f849af57d9fe50684b04ed2e1213edbc11f629a15bdac36aa1ab0d796bd9669464827d3e33edbb6127dd6cc00a324db5665112677ecc3e41b7893bbf60b6afd5297edf19a63dfbb33956a8953fb7183fd54974b20c8e87db7de6361ac71871c4df961858e10008adeb530a7e3ea0cdcc37868587c17f93217d960ec4aa769f2940385f7dbd8cb61c677704122c4faf6033fa88a8d28498217a867677323204f89d0007b43e7eb381b2d146eacc64dceb7ca2eb5d6d888c9837ae0f36ed145179fa168731b7b293b0c3a548366600179fae30b68fa6c02d00ccc83ebfeff0e16bfdb04b1971f7ad97861f55f34138a19789fc8082ad87b172d1c1761092253379ad77ca8a42613dd045cd0dfda8298e64e888273397374c6601811f53c9ba6c8fd7bd67ec74b5fa879feb976ae8efc518ea9c56133552ed674563d5434674e5da7704ef068cb0b210b47a4abc8c75a5a62277bda756612cad212e79f7e89a22a02b273311e1072522e4b6842dcf3fa11b458c4205ad83ca28c29d6b49898fac95f4eb0a2c98254546290e0e4e7724a97992a21b01d065a818204f374af1b2e83c2c041b7597007d10782842faf5a9a846b72c8ef84e2fbd2b80b6043bb4886cadb81451646eee508719066eab1d1f38c9296fd92d9284321790d877fa1cc4fd76259cc8302370db043b38aece8a7488a8d9b3953489f09e53435ec4313efa5be3ed6babd65900f2c9baea70ac290440dfdcd58ac9e464e0ab3ebc62520256d6c1f91e67c5cd64c16f22263b3fbba28f0248b00a21c1585fbd25679eec219dfe9f667aa71194834bd37f38adefb08ea4a151ff36c1258a025303a23a3a9698f3d0556bfe99cce97e5ef7e5f3b2243bb16ecff24293710f52b551d44caf565953c81974f0c1adaf547ee95f278fe71810e7e3c107d4b8fce20ffa98cee9d580f515cb89f7568a228109a8338a3f8f12e3b8e5a699bbb9fcfd63ed7856dae882220b59b04dc03d033db14c8eadc6b124b360f30168471ada87424e9041b66d21a627233885beec39fd7b1e973dea949e77ee1d74f1866f581a2ce2d1858345cc054aad88d2a544b4c240c10fc9f5e6187cd49ebceed1c4e3e99171155ccbc34dff6d34e1b4af36cd61d8047b8905c2a9ef7fd9f0a21d595ded2ce5852feb5f6df728a735a56a3ef5f849eb59745af435206bbc3404873645acda4eed271fe11b7a827ef3c7c1477c2e8ec9f250313205c7f3c1f9baa6fc05f73c353008e44653ae20d061201d01b109bd499f97719420d403a504f1204db91579babb7720b51a8a16a814c08542fdbdfecb48952d24ad8f29654c5285c399e18311d7cb444cb5e93075ccd0460d90683f00f3d7b57d08e37946dca006ea66b43ef68d60dcda91094725d576b6a3235383ea159bb38a11f832a767239d76d129f1844c404859fa4242b54bd88eda1cfe257ac6bacc1a644d236962dec376f2431e5b898cc913ae2299bc479c30306f9af36940b8aa9a06b270f35f0083419aa6a0ea8568add26be164da67ea2d930166cfb9fc9bdef3b33a8d660b72691cebc0e67f78eb3771f6cb9ff9eba22e4f1bf1105c3664f050d04fb0d37cae31be901875ccb12ad1bae3f50bd04628eb6e9e0a8aea01ff5cc58d6f9208746ea0557ef8353ca46342dcf679b0bb9082f70d7790dba34461a244684b6f26790e0f11c33627e2453a34a51bf069b727b2a22f27f31083b8615d7814d1763610b04c7961c7e44e2284c7098996ee164c31b551c118a430e1f29b3890835682eb1b5b9c131d6e3716f9334e456aeff04351efe0bb53585460347ecbe2520e6cb61ef8443f25924235c2bc5ab5a1114b182a63b912a58541be44e90d2c1375b701d94029475e723c0f4fa9d32f9b5e66023ba41bf5df0596bcadfed713205709a8445189ef2d1f83ab3c6f48353dbbe9324c576b8b203c19a81ea85ef9c4531fc186a59b7e1b66f2089fdec0fb62b2e3945d3d13881039ef0612be910ff94d9cb1dcf5f1b6fcb9aefff54d6056df6352b4afdde85d1eae47110580495cc85357345ec2cb79c7ac6fa9241c3c527c8668f76d65e7fba0cd2659fa03de252f4c2758161a10df586a2fface31b970159c0b8e06c08db4aa1e97bad8b0bb11fddfe581913a164bb37438d9afc6cdede3b85be2dc18e89d9a8e776970aca21e35c59c7005588b36f7c44b099c2d6c3ed25f6eafda7ef0382ec221a4b6fa6bc73dffdbd1bf08ec2e3e67f320af9cbfabe12aa3adc211b2b157b1e143323591905bebcd35659f0b50531f667e3fc628f9317dafda6956e98f05f5cda5359b79bed7a3fc24b0e9e5235c3125dae7b61e2437b948ec3adb5af141f04e1d78ac5c2d224a3cfa957eaa0709622027017f99e1cffad69d08778f7ec477101513fbfc74deff5e1f6807de4a85674ba8a281a9c1f05e3428d66f6cc300d6ae4d6be5b78dbb0d0a397af4d03be0850b5dc1ea49e5fdd62aad5c33fc8159e0cd98bbe0f493dda147b86a4f7a297305571346bc4040a3179d8635bacfcac214920d5becb7f7a6cfa9ecb9a5f48cc89b9e11ea9070f3103f286a68e9d0906c95a8ed8409757af3376e8186d58f756001b03a397346eb9ab56a41eeaa984d140be974fbc860b60015e8b4e1f26bc9464f09b6a491c7aa7013b68d9cfaedea89bb1ca1ec5eaa98db6ddcdb0eaad5d62275c2af3578c896c3a204cdd98b4b057574ed4248c77c876491ecc805a237633b5e2ec1d93b276f55e7ea61ad316cb8ab11768b8cad2216b494ff110ab910ba09e01e6619190f035118fbb1f39635843946062396d58374626c5a8a646c49168adf0991d3985e18ed2297508782e7040b6ffc0d313fb09bea9072ea2086fd1d6b27a8c3e8db0584c4cf709bf7d92221949c3d1ffc58bdeaaa7d19ec865fa9c564997cdfd2444203802cac991ae325ebe23e520b42745c9be0c972cd2ab28814397d2865576a2cc35b811fea9596000d99c57404e02f6007aa040795fc4e5914e8ded0a4802be21d65549bda4196dc1182130424dcdcdee1c08ed6a5151bde7d76df2b4e395b412c7d1c1deee68c0277680d4afa1249559e77bce91db3a9a70d8f19bcf23f2241b579c434f5e203247ca03f8900ff807500183ffb0514c38347042e4d087fa96fb747426e2f19d23e726ee2858378e293784739ee363611d65d7ed9da12f3c8668e3f92e7aa1b17aa7dbe5402ed889ea8f5706e1e3b9f79520309e46747de0e2b8ab4f2cb96340378c0de4bba329231e5bc38b82fbd97e9e67c2504fcd418ff65ed51a72ae30b6175f3554faa1d441f94ef486c4383cd209536a3faf4f4ce4012dead8602b6415fc88e0032a7f24e7c28fd2940f0bd363ca1c11a9252234b808119554b815859ae850a37e18784962d90bd875f102fe04921a0311ae709609223385b8909236e52a5f371a86e68415ae78b7d8e0c284de28654f450530c349553778465382a737c40e1fff9367a6849876118ed66855f6bac170970bb3f0199b029257068172642f2d95828b6731fd5013ad5709d94736357ab2f841ca1b7ce569dade0fbde1b9a20e8b342a025a6d27aa0decc774d84462acbb02c9f0f1aea441254e7f5462bc963e85567e610c55d0b4a414a5b9d4e2123c3cd08b82fa932018467673e73dab4795503fe3c7ef7b82cea8ae31ba9b7583c501c162188f314beff12e831bfd898dfc1dd9903372a2d22f32ab7a251981672fb7934c790a21ac2ef1ab0ac9f8aed5167010c05a4805eae4064b51325aa6af74e5f986e88fd566237929d9481a2a4ff84afc558b54a1f44ed85cb828de01c6a6db7b8e9f4f7eebb6efe7676528b3ae2f152585a4243d04e2ad85a17ec7c769d1ba5d4fcacfa6c29eeff12e7fb764d06ddb6f5fd1361c54564573e4984e54e1ad8aee853bf35f45133d646e0bfd28566a6b600634382d9f6f60d565dd9a2e9bfb6f9ceba1452714a68b5e2936ab0a2afaf342d680d4a5816ee03e5d7be4019e235e4a7f88f49ade880d53003dc486e541132413e2c7222abc7224b2606f28b8ee99c6a99a7dbd9d27fc85657fce4dc6c418d3a83220fb1b33b3daf0c868e48894a97ec93b3e3c215405c35c5d8fe47853cd4c070224e6071f1b0f319b1f2bcf0146839f59c2a510fbc816cf957a73fb67fae1932aeb56f57502aae870cc09bedfdb7e3b1a42129b80629e6098db54278c64b16128aa869a97bd7d63834ecd863001036911114b8a1741ef0afab6c73dac9923bec19691541df40d13fc47c89bb648208021db0c998a09cc642a8910e52903d84a9cf3d5c75056a2ad0cace218591fd2a1c386c184da8dee9a8b9b9f4b67863d158a4899cf6eb794de1370837641db6c6385364d35d0cec66f59be85147d64c95c1db66c04846ed15d76aa4ac3b7c0a36ec976f2e5344f71ab42d953572b8229f6850f8a98c9301329a2e0dfa907b8a70cb57337aae003da5cc03a99865640723a715c140237f5e16e17ea8051e075e1e4338a0551041b4117d50bdd7ac7efae061f1846e5dcd84dab03cbdfaad3887e8ed6eb3bab98463e29873857203927743b9f113fa69bcbc5e493a587d5fdd88632551fa559c96ca6540b1c83b10f69539ddf793a0d36aa97682be3ba6ab48750e436dcf941ef88391f96b124951f98b452050356f2c92e18300e3675983b81474ab464e78ab42bc30d5545827032d444d07e2b8b1886dfc89fb0ddb0328b77d5bf249506dd8774e6484be3fb0ce04662e100efc208bfe83c7212406f92a849e6195f1bcc122c41412b6e759ec3a0f06de7ad5096514de6fbb9819f47e450ce3f33672463cecd2762c4432c8b4d0e2a889f6cd74c65c9f92c770c731938727336862b772581717e530d9f1f332d2e4f17571ef9b9fc73c35cfde68216fc22df5b099f5ffab510a1a2dc1150aa20ceb6d4536e320690d117ef47d94c89de1b53476e9ee15b227270d8815c37ac35ca0eeb5e807a20b4db3fac08ac60a1d899eb313d2f90d1ea1425eb1410541c5085b011998f49fcf7ecf3ca702f68db9d0a87aba4cbe5cf55a0e937c4d04304dc64ca48a877e5f00c242e364655f722edcdcef744b5b1a462d17eaa54c0dafb1d02a56c8e04b4c9d49f38f4f59eada004a4633c903a193f9dbed13f4b47e13e32af90b092abf390731cda51a785e0636d01cb980cc9a4f4416045bcba76ccb55637abbb58f7c42b47c02c52f687834694541bb73154da9faed940688b674d2f31db21acb2a9bfeddab2dccdc9b485d56b8ec3e8cd98f94da18f99396a1e50fd2120b3865050f04e3c27f1e0c19b106aeba34ef8ceecf8944230f33b1da03a0ad698873e9759484cba4aa4a716f0597071e1917690e283cb790c0524c960ea09ca3dbae9d7a8c918223ef27b4e31c61c043e5c67bb021de4fb1d2881ffcb21f4d6302bc9cd70fc12bf1f27985f6feda2448434a087fc8c738a81343b62669b6f76abf9ea3da747b04d310378025aaeef189794bb4176638434fd454fcc04945ed48f1121794d24e9b74bfde0500f889a5002a29e6c536973a3ab12fe696e37afbf7df94a7920561352ac1dc11650b5f13edc394aa5dfa820805dd87d1eb3fb","title":"24. 两两交换链表中的节点","link":"https://leetcode-cn.com/problems/swap-nodes-in-pairs/","question_id":24,"issue_number":11},"9":{"day":9,"pres":["递归","二叉搜索树的任意一个节点,当前节点的值必然大于所有左子树节点的值。同理,当前节点的值必然小于所有右子树节点的值"],"tags":["链表","二叉搜索树"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。\n\n本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。\n\n示例:\n\n给定的有序链表: [-10, -3, 0, 5, 9],\n\n一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树:\n\n 0\n / \\\n -3 9\n / /\n -10 5\n```","content":"0961e884611df7d4ac47a79a9e3b6f2d758e3d84c2812cf0556130537954472458a5a8244eccfe0314098752ef1f55d56fe5890764637dbbb538ee3ea3b0b26efc3b6f7198dbc5f64420cceb8a92503027f6728498a4018d7bba2ac0f1a6be991431c01b75b09f632538146be7c5c7f07cdf4a282953bed37be6a0887ba40eb273568dc7d7ca8af61ec768fa28f56ac248147bbcfcca92f808a73611acb8995e751a753f12a1df6a23445af5a96b1d6c01a1d2fa7a193862b909e95b7ef710365bb862fe616bc448ce9d722d837c1071a110c95371c1192dcf279d9165163fcda1cfb81be8a04ca9f5372ef689d785ce040971f38cfe4864225cc038794814fcb673ced59ec1368d0b206b6f8c44073de293ea1b956ca73ed2c7ac4785c60b9d0764c3c10bbf85a420a43c5e37956a44e4bf2857d9fb0190af1596fc1fd36dfc7b78eacf226d1244d9d5779890c003d0c2a188c6c9b79b10bb5c858f5c5370db83f3fb7b9a9778cf4e585a1554758d951d99af09e212135b5a61da3fb0cdd32436e6111a09689fa74939a07456bc7f3bd6761a9ec28b10c6a92f4fc732196f05b6ba41575633b921d4f11b1ab5e3d361d6a4d0dda87bc90c63062ada6c0dfe82e94a80a3b231c10b7a14d0ceeaa33e0b51917fea3d6e0a46f469c4946c07c136df7897711efa8e09d02462a8b74e5c96c2fba89c767c64d4f74b815099b16a99956746235525806a9b4217d4cd8ae95063a9a89dc66ee05ff2cb0324e2e3c59f6ecf97e5f2ee878f3e617bc08ae4eb385624633b56ee3ecad02a7d0026ab6c3b254f16b593f2cbd3596c27772df35b21689e16c42544a04296d51c24a18a1c3bd8b5235ec5f9ded1e8a9ed3df7b67818aaabdda998d6bdb30172a6084a68321602394585ab9e3bd58f6c1961f052dfe7de52152ee861a66eb9438ed91782f8cd50da5f31f9125702b7b8f6e0266c2f1cdd541ba432c9cfa0883cb30ca1c158ea8b23e45a0c58fb0abdaf3a5eac44bbda921537545bc74770f6cb1160cf8d2781c362e309522d6cfff5041e1a2b1f861bbd95cd57c27f53287cdbef58d0fd678f4419259ade0b9ea0016fb694f36e793cdb838e848829c32df1b68eb24313bb08769615765625e964c10b856aa402e3fdfa234a1c8e9097541c5e05bace97a9e8fff1aee4b9bf85fd7b6829fec0cd50d3014f295150e49033b42334a001b41ddc17586f432b5779b945814f511a39df13157c78c3c5380cd55dffe578d4494bf713fabe45bc1f77e7bd0dbc9cdf233f1bda96cbd650170cd9b0c1f3bad6e5fccde877f3d7263ad625f52c72e99d64dfb58811f094d21a5844563ab45a95b467ed77da8c01927549dde7d5663a6a012e4b49274dc88f613a723b1cdc229d9674e2183e705bfd4a395348c6575efeb334c1b353ff9fd381a8c322f240169ccf668b3d22929e2779c59d3cf21fd538e964ef47276261830336eefb6ecd0a8092731f58d96015814878b6d07d098eb373323c50c7dddec09be7fe118152283905a8e57c9a7e551e8dad0cb47604a3928019c95940272cee33296ceb6d09d1c7f315d088edf62d959d08771812c94d06c25332f3290640c45d5ebe397f482f97dcc663c66d7b3a5910c299e5f650bca0826c491fe54eda3584adb38f05749d75218d64216f677f1db93f77b124c1d30f7b6115f3906babdc67f0b89db5100dfb1db7cc1a371510018c172e654f888422cf7538f36efab41daf640e0368b556fe18e6afab451aba3034a8f88dc5ded7642ef02da449cedbfeb57f390d9f315d56dd16d8dfed07278fe60d7fe49503c9f3e17028b9481605241197ac90cc70473e094f151274078f110f8145af185e3124fadfdf67195c701fb5adac48153ac0f6bf1e0cd57eb18e3493d1ac96f8e6a172acc1e36bfe3db951dc3c8e3f79f5a787a3ad65c7c10321b5fac866ef9eb207d1e3193fa849cc73549f476063e63602b9485ccd527c99ecc8cfdb0fbc2b8057e30fc9f81936eeb1ab89fe4c038e4d15c259e577815e5426fc94ae3a28fa37c289c93ec55e5ce41fe57c8b0ad0d707ebc0a45b4e8c1f5b7b65cb2bf1bfb8877b88ca49d0693539e62a5dd7a7ece389c5b8e2589acdedf2c82e2018489fe81a36bbe40d645c3845777c6eda5606d0cdc604f85d03f1c5d2534519e071f842d7782673e31959b276ab9d596be7e20bf66d4fbb649ce1d4c39c334b4ab023a73589ae4b2a5190505325752577212004e826afc68559904b9d619620a6dbaf33356d06256640cb994f7402ea167f64a0b04a8d8a25e4bbbb9902a31a969f45fee20994d435f9f535107f9fcacfee96cb6056e677649490721096ff7cd470c5c9cffae2ce72825236e044049df64df51db3fdf59505f1301b84f237a1cd4caeefdb6a73038c19be0b82c08217ca79e8d36d301ba55de0633f3a50bd461292d44e60d29182fe1d867586d814017a2d39fc5dcfc3372df64f7298ab18aedd2f5a0f039aa3a42fc77776e1bd91364641c6d2402d52a96fbe2e93cbeae22049e8568e0b4ff9a05135f217b5ace265741a98566ba1524f5e5cb81ec1ea981a4f29bb065d0d670f3e3ab2965a1ada917bc693816bd70ccc17fada31bdfc7de74a55f9f990dbac0a8f89cdaa2d6294f8aa1dedf8f227d9a02358a203ba093ed1e40e7d79833500e166fb5d346c3747112570ef33665f6ea6e074f7d4d7d7f1db72ad84eae6c2e15e27e3a09bc1a877ee2a1840a34c63863d1751bfa8ed5bc5a06c4000f5a4e26cbcdb406c23ca802e544ba73c179c634b082b3c121dfd9ad9ee75a97a7299deac7300761766385d8642dba1003bb196e1bf05f4774bdda6eac9d3ce8618092695807c462df9ef29aa03ee1f39974470487ec98394c1f2218ffb37c229de4ff07fff5b907169665c58daf0ecbf9c0dc60a9cf27895e77d6a3d0aab3e939956e84942449c76d74a2d8a84ce96692046c7f8677c14c01f97a1adae96e0277044155c238bbeebc3b121748c059b1231bbfca9e25e22dcacf0df9faed6d99ede2b9e7ea51bab1488b83c324ddc89eca3d0e3c029e58c26382402e8a91cc4000f9364832cf16ef4d56bbaf94a813c1c918ed06faec28d91666c50d815fd699aa038b0629b25e7b722ba893684f0b6d7fca094dad9b975fefb00d5a68c8fb250864db0b1c01f858c813555e70f271708833f41c35811c0e9cfb928ba46e2ba11916e8fbcb2b869f8a276c3b9f75d7485e428c74de1b3471635790456e5687f510839a337918c190b155904c268c8de979ef9e57b02d8e43ca09fc2283dc952d6d0ed66c9b346081d6b52e1619c7cde9e774dc428dbc1859d169a8ace84cf042800f84b33ec82e2989bc0a1599a2e19df6643e0c78577a4a15e9a69430d9b88cf8cb4ef5254ea30089721ef9283ff14950f33ab9aa99953e580725f622bf5e8256d84c776f74e073ed1e8a8c8c04e49b7650687e2689dd60467d20bf653156d319bc1294d6a55fd0be09f65e584a7e9da0763a67ca069599ff83e1526671c4948cf0c60254360535f646e52cfc47c5185be54cac69a303ea50d520d1f25fbab171fcbb44afc9e6e9fad4e6b8abd2792d30e4b3e7a51cce9ce1759a824e5ab830a248632eb1b2cd9dc676e1341031c0a592c3058a5607824167e420559456941a6056de554b5c9b92d8c94dae05505f73fbb810de7ab98d9cf66d4a6ed721e7e2ab2cbac4968966eea083acac59e7ae3969f10cd12bb0d5dd650449ee14a206abc3756d25b181b91d23846e1332a204fa460b578319821031192400b86c6bebcf6a7a881b35dda17ff1c4c7d3bd23df56685445a6f3b6cc2a9ef2304b38075663b38a80ac13711b8697633c7a504e7f98ab3b292b587b427864a0609e46440fec50e5496a7c9fdcadecaad0b807d5f43a00e73e1a2da979df8e3e98639551d6e8b4a79583f4ea4b72d48ca9792c90bbf40bf697fd702e10c1b9a6920de867c73e5898ef220a32ac4904889df6850222047dfc3881fd946705d689aa366861caf393bd025fc9ef2ce3a4aa77a77e8714eae8a8779f29b6127c912cb81c6aa27b88683d73efee7264e1524b434e0679b739cabec7f0f1e0c869b1e13817bfb581a0f586a00757e8dafd290f887ec8edf7a3cf62242c7db4df309387b84df2e92fa6c788f15dda07aac135c97d8b1bf93f0cf5b766565823424e0228356f76c32e32d5beff80b19258aefd6c8fe82dfa93f000e0f749533794398036945440164a9ad9c80f900a734d7ef15f46745b72e2efa889de6779562c28e211d590163e5634ae7b8b9b2e705c5ce1d46ec225265abe89337db21ca74cf56db02ffa07c09c2006d86c7f64ca23492df74535f10591691ab1fc5f7b8d5b7b4d58fc4106801ca1d942ae897e921842f5fe6fea84a79d03e4556b9382c6d64146b665f3411eab0e8b1d35f7af9882ab34e73c8c50eccc6387bb5b2f2cecaddb51530b6c3f7315f353c9ebde3643b4722c63ac1e09e63f93b32dc76d5fc626f2968dc0688adb23bf5f74ba0a5d6acebe158a63a8025c00b95128d59c7a4cdb1eef4ab651b1ce91f425f61874a2600c1a6d2b54b9514db304e2b509bc7774f314f7af9c8a227c2f6f133ea17e1bcb0530d574774acb7135bc2004600aa0ab6db463adfa697f66bccb000f7b14dd0bb2634cd954d48916affe07fe94cdf8396f3d34540632df9e97a83bc5c61ce901aa338e3041c4552388efcd5471494a6cc2a61fc1780edf79a7acfdc7c8a05871dbe29d7e67e970266c8ae7aa5916924e938874f18fb63bb95064c91a6f064f2b1ea49cac25a6b4c6d4bac5d4f8d60f14ae926a5dd6cd1a289969b60cc4b6b4023a6fde00f1fe7f5fe12049206876c2f36765f03c580547918b9af775f68142e86880299ac947cf093b689c29170fda06fcd7f1d9f883a0a4f0f3b737f4e0eaa7b660759b5f50b31e10e1a8a6280c3c79d863039a6de41d8d80f7e5fa8d2df2e5e53ca5339c9892269dd7c447654216f01771a63d5cd3dbac22f138f4158d0cfd8cb95b36e8d817305271aa9604b46b46cebe781c3618d46e0574f833cbaaf3aa99cbd0887e1db0a774e04d674563d547d214679ab625e9e3a924e655e4da9f8c09b47126f237e902009609ed20ffa9f30dcee3143fb6d314a4d665d7d572d0285e88450fd14c4265cd87a8f962e8fc49999e79d0f1de8ccd28758187690f58bb07226deca7e4fff5943528cc044bc6bea476ad9828f44ff142568895399ae2faf5a9ad43937a6a0c0a7f5dabc006043bb4888cec991532208abbd5c7c8e28afbbc0bba68f96b5d7986c4d6f617ff9648bcc4fd76259ccf7501e018d589980a2adf5418c8bc8703d499e1be55d67e1433ce4edfb65c0b5bd7cd97f359ea7a211a6d51c5993821ce9853e0145e7e6d86965636e244bddf03b48cb5b01ca057fa3caf54b9e50cd1dab11518ffd815c7feb98569ba6b222a43f5c1060ef79a1de9db016ef040661f371120bef77647f67cfe03a880c097b82d9fad29fefb86e41332e49bc4e82e421257557ab5901066ecaf565953cd3d21b594894f55be482f20d9b35c40e6361696513eac024d1cce2a199d3cea4ce1e179af224edb83c458613f2fb04110c88bfc8a1f1440ae11078b63e5daaf4004a841ed17ddc3d7bf9cddcada5ddffb8a4d300dc6b1585a430cd9abe069c8685f85bac70172e0d0b0bfc1b6bd813b7610ace3262b9cee58029d7c4989a4ffb3e1268818aadce90e6901b5198c00b58bf05453ee4e6c44d9692e5e6b87adb394fe2def173aa5b9916b56639a9ca1d407656fbfc4242277a3cbed27f193247e88e1c5218efa018ca97f7f41afcd0b5d33631d490f787d928524507b37496276fae75f5cb80b24618002287c689a698e7a649b1f676dd563d981279bfa8d99325b7fffdec569edd5d3a2b24ebc9808692939584fb86203bb4115932afe9cf384cea36948eb7bb561e003634bf45d0107870f84ae487b427c2b1c18568f93bde5dd4c11fa8ee34f6034183f8c7df595fdd5dd766abbc4cfaa927e91d930125bd52fedcd2be92fbe0d0a26df962a0429962cc52167df44430d74c109407cdd5ab69255ca39284af99ab07f473f2d4a902c37d9d39ab7f0b4af82b4b1c2d37b20fc00b45df0693bb31208353bf5f295fa5e294977cd5df9a1e808250b06540947896fc65de0050fbc9ed396500005db0eb4244ee48a4733e50b3f6321435b387f6b9b597ad31a4bbfa8cea43bdc2c98fcc25ee805e269f44c73afe5eda6ed070ebce518b7f8ab4e3ffb280a063ffcc91764be552b16ee6c467739b5be08ce4229012f4459b8cea1ece997fb0ebdc9ae48797e06ebadcf004056f5622b003f89422b45ed5e6bcc527ba8aadb44ace5a1cd9d2e7cccdb96553cebdc13eb25174b9ee31ad3858adf9d9aa0ad7c6cfba415ccfce82ba3661352ef139279ce904bc42c7233bffe05abf7e97538a410d0db82dafee85b2f3365dce00c7e1f4a6ac2879dec2c0250267b75cf0f3a0cf68fe0e5e1cd6d8db84088a0db647814d2b5150d3113c27fff834f434b434d09e364862b1a98a9f185eb8d0043b512ef87b547d4b82293d43ce9b2e7434f34270687e77461da0c27d9ef2ba156273ffdd061637ae65d5a293f75219c70ada2f2adbc164ed5d3f32018f14805f56c9973753e65bdd9e779bada6484e4077236481ccf1f1754c30afe49609bc042cbe1f1319b90ad4070bc62dbe1abbe471db588e5f62b21cc01c66ad289c35e7134d043e2f12ef4a97da091852a9c221c64a31bd10589b45ba1540d090fc49ed54f9d731103cdf304ff43466d6141065566d62d61fdf11aa09acc452acc63d0aa9fcd376306f1e0c39b11910744d2fcd1b1aa4e2bda71b10f8151679a212023a0538c880cf5e563c0b826dc32db6a9af9d82ca8680939dcafc205d4e8c8f1829c98a1ae7743fc22db93d1e2b4e05a53228b9a8469cd56f341fe8c349a8ae2c97a871d4dd1fee9502dcd50206095a2537a9dadb0648647a2d47be65732591590db45bcc8193872d3dc26c47fd3f3ce23262fdb6bbf5b376394d366d386667f53f5d89e9602bc78d0ed89e11ad31ee3377fc8ca61b436be2f90a7a58740c768df123fbd1593cb12044b934e8021abd3ba35ea768bc8aff70455c9530023b3a180c37f62e646738f5556a231190603cc6e9ee755053b3ada32661cf38fdc9ef384cbbe0a4b97a9e44a1ebcd6ae0e080f45e3aa00d9b8b36ba04eb171d9d080b00d116711393ad30b2817721cb6c809ae5b98238b6fe0f88ff73525502b50e83983464a17348f14d08506e44173699e5f5a3b6f8fefa77b7e9e1d4b59580b1a6dd7d2f676b428b68fbd673a889ea7e542a35baeee911698103b0493eae6046f186b04ba59bbc07df38fece7abbcc398554eec7f32c0df3ccb97d593e33fe65c3aa6ac08d69b849cbf5da5b4ab0fa7e2d2c0c46f00948652a5b491010acc69c23acae21e1c9ffad85437ef28b2e0f615c5e2b71f687e18066c360e6b95141bf550bf4543a8c79ae10ca325e1947cc73ab30291d45ccfffdc8b2c4aaaaf29fce683277eac225732584ac026503d8080e66fde512ea4e8632b5dbc3920e9638fea714834eb1c0856c676a129f31ba67a3414f960c24585867ca25c0f04ea37d45c2ea827b8ced124415b120f74f4a87b0114bccf5b4700c60adb0f2799e830b5e38e6f3b30ce6dda992e645ee988ec9802afa482883aaf6bdb778e7472a2d564dbc12f801695c0eef454b1a1fc2170d0d313d068954bdd966cb05474d93ebb2594363263e47a78c88a3d9bf5d663decfca228ee3cb5394e62a26538cc2ccaa1301a0e16d280fbac411c9579e9ac276eaeeb72ecd5d80f70dd908cd31c5884adbca9bc2624d25f6d16bfa8ecf00174e12a3426e3629afce8474cdcd83e0c5129488740fc0df9982db70101ac57f38e2fcd3bc09cf5d82845559d6e02c9ddde3f718b0f733b21e54054edb2bb4603c78cadb97e8ff329244601ebd5b51a7f978140c5c7072fab3b0a37823912ba5c7bf968f78c579f56f6c9c9a6596d8b5a8ea56c8241ef63688735c047a7c7713f491d4e9aa1ecff9b5f3845b131b1491029b5828c6e641115097fa77824457c2521bbe446ec625fcaf51e9ccbca5a77d1eef561d4f4c874c9884e058f4e871fbdc801c3e1b69a0a808f4133d06010ae7904e34338247d7a64c945e49964c7085eda510e1b62470eeba18b96afba1d842a38a350fb31d5a25292f0971c048a8cefb83260311ffb7c285d8f9713a79ac14ab1f28ac47b5902ad4368f8dd064b195c448d06ee659e3e7aaba8916e90c0e238ab421ebf2352d619fef7699aa0258f07e639cebda7cb1e9cc67df56d18a7fc0a5847985ba0e13769a0cd85ab45db3e65f5f08b7c49c1674abc1b87ce0edd135a19755c2c729c8ff2d6e8a5bf15234823ce03505536f002f45a993af9e35d9406f4438e7187efc16dcfc64f25beb0e9f26a2428f6fe334b4ec1ad794c2ee2ff89b32b9d8821d0bd4a47c4d6f5cfd6babc6a23bc72867597214ac02a490b185432baf35754e187ccf78e2ca7584f05694e671cb07a0e392f250b7c3631d3376fe44fddd320deb26792bbe44f7a14e9ce592b25b57a25e6ed5dc5e491fd9945fb7a553cee44db77071007dbb1bdd584513503798c88f90d4b7f13edc7616faf3f24b2606f36b8eeccc6a8d567f8d873dc8f763aa135de9a5cdcac37028334219ed6b9ef5aa9d6a48354db3431226e4e01af4b11d3b76f15ed0b191223a3481d175456d25b2b925415c6cd30c2c90be7d32c8e837634e064bbace32fe457ae2f2bb0b724ef0fbe9ad0366f57064992c0629e60ca9e0072de63f73b2fa093c5bdfd4a238d5babe0535654693a1b4e8b03258012eef69970fcfd35beccccc2062bef1414e60ecf90f75711fa749940d0c913e60863da44ff3402d8249df2c8993e4aa9ba58f4a63c550dc2dbc2a1eaa4c9cba7c9dff5d00f22c4781c8b07938336b8bec31323d43711ab2d7c92261134c78adb4f42e4c0547c65d45b0f874604846ed15d76aa53cea6d88821857bb9ea351724b65f974e5e2696668e8c0fd1b2c930137be7b48afb49b8e949a3681da0f74891239372e6993d5e137279597f6c4ab2e36714ad887b833aa5a129a02f11445b114eb70dd07f94a1ae3d151557bc8bd946e97dd0f5aa97cd388e85bc7aa6c207777bd430046575333d6f820630e2d284fbf985b585d3eac9fb7d3a72d13dce70b67f1754c6bb29691dd29b3c69032ca5cd636cbeb339dbc614e479d3d30fa0dc392381b525f51e99a90c1f504be5c93e0e12472d64ad30c91e3ebc32a2c9e064df54445fd673349c4fde7e609651dec2accbb08ee473d92391fa2c9f5c938762f64156b88249ac006cb257ae9231b8a166724e4f789efc59b55c420181312c13047f3b27d08dabfd75a5b3419c1e67d1fbf1c4de03ce7ace767d33242e87db622b911927c5474b7fdce678d65e1bea9a287c1e105d7c643d5d943f2c4cd121543f44cc4b5d16384f583902eabda603d05ae0e18a67b53fce6246af48b5f036aba7dd101ebe4e8be5af1e6e307b918278ae03d95194de5506596d81e1043c62699e9d196be86b9b12fa43901674fa8f05b6269344fdc4dfaf262b77c5d0f0553ffa5954027f3e8cab3b99e300afa382bc8e676a27c9d94686b6e39eb1870de1fe63bc840640b041d04f8856c8c73d26602a4753eb60a9809ab302f7e3e63adc25aa559195ca3728a56c8e04d880d58e02eee395a7f203ae7663c5755f40d3a6a3362f2af33127d5baa7983d207ce5d139dd6f502d988e843a6642ce9090c0a395b5ef5c222dccfe1863d9241fb6ff41a78d281023f9be3653f6b39c03106603c0b472deb7dfbb14f7780413764d6824043c407a701efa6f422813504eef206452ad84a1bc60b7e90412c79109ddd3cb3429021cc7beafbc0badf5a5bc1bf4b63fbe77e21b4daebee663a13a2472dc308c27d470d1bad3bee97cf590ac8e3b2c475fcb3eb735a169aa8db9aa96623e669d491855e756abb0dbc2d95b1f42fb1c378dcef728d0f53e13cbc267f310811627926b63c0b045980362555627e0086fa1a1a18009e8c83bffce324bf7124f221f7e2974add73f95b48643586d822afa4456e5049a72d79c2d2e7b49ebbbb33cb7e42b75b6d21722d5e372320c48f6f21ca62e4258fab53cb17600b5354877f15dec4b22a5997ccc5d329d9cf63e1e36bf6459bed552","title":"109. 有序链表转换二叉搜索树","link":"https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/","question_id":109,"issue_number":12},"10":{"day":10,"pres":["链表","双指针"],"tags":["双指针","链表"],"whys":null,"difficulty":"- 简单","description":"```\n给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。\n\n图示两个链表在节点 c1 开始相交:\n\n```\n\n![](https://p.ipic.vip/bkdl1z.jpg)\n\n```\n题目数据 保证 整个链式结构中不存在环。\n\n注意,函数返回结果后,链表必须 保持其原始结构 。\n\n \n\n示例 1:\n```\n\n![](https://p.ipic.vip/bzw15z.jpg)\n\n```\n\n\n输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3\n输出:Intersected at '8'\n解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。\n从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。\n在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。\n示例 2:\n```\n\n![](https://p.ipic.vip/26cojo.jpg)\n\n```\n\n输入:intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1\n输出:Intersected at '2'\n解释:相交节点的值为 2 (注意,如果两个链表相交则不能为 0)。\n从各自的表头开始算起,链表 A 为 [0,9,1,2,4],链表 B 为 [3,2,4]。\n在 A 中,相交节点前有 3 个节点;在 B 中,相交节点前有 1 个节点。\n示例 3:\n\n```\n\n![](https://p.ipic.vip/2tpyar.jpg)\n\n```\n\n输入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2\n输出:null\n解释:从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。\n由于这两个链表不相交,所以 intersectVal 必须为 0,而 skipA 和 skipB 可以是任意值。\n这两个链表不相交,因此返回 null 。\n \n\n提示:\n\nlistA 中节点数目为 m\nlistB 中节点数目为 n\n0 <= m, n <= 3 * 104\n1 <= Node.val <= 105\n0 <= skipA <= m\n0 <= skipB <= n\n如果 listA 和 listB 没有交点,intersectVal 为 0\n如果 listA 和 listB 有交点,intersectVal == listA[skipA + 1] == listB[skipB + 1]\n \n\n进阶:你能否设计一个时间复杂度 O(n) 、仅用 O(1) 内存的解决方案?\n\n```","content":"096221cf5b628be1e73e8bcfe626c7347481238a04fa3ead0b547d2954020e2d18310ec8ab1a6ec9ebd627f465eaac46b8280bc2d829199fbe23f761a0f8f223fc3b6776d4ddcfe70c31d1a08a89547039a97280d9b51b9179b52cc0eca6a8c0552bdc1d72faf1446a7247fa4f14415d9751b4cfbcbe22aa14b6fccbfb27c824afba4b4a510034741cd849fa0ae46ac9601c538112782e3392d64c32ede6ad361e2f09a5bc684b2045672eb2b7165a774ec0e99104057a3a8458965038b83399b714d13b0e46aa0de7c7c1874ae4751a957da6541a59a309c2eee7bc335f36823141729a50ae4db9ff31041a0b6b4192066f34c6fc4bc1a181e1c12d4e4a3fe3b664eed4b2cfd426c3a791e18e60243fc39fe830bc6ca208d8f6b54b9ed305bf1c66d1ee0981b5af2aa43d731ab26cae684df2fe58b677a4059a69199e2ee6f54966eddc196c0966d9c25599aada02d1f9ad8bc8c993ae128d6a8e8b7a5f7fed8ed9cd7bb9907afa6c59612b575784982f94ac33cc152555595ee53888c2de231ce72b3c096d9ba7491ead5b72bd4d2dd8651397e28e11e7ad2e60da38014408a79841616ef76ef45f07bf1fa2d73cebaadbd6bae96fb75c616377f80378f8efa05dfcdba042a8091f9c63cdaab2f77453f420ebbc83bcdef46bcd9c7d14c1369c3bd79db45c32f946461cf1e7d4f507052a2eff2b35e3400dc77ef61d4a921210bf8ee9b448a343b2029e165f84d06662bd8993ec6e0cd83c8b879198b0f3fbe0b3e6e996b295cc48520b9596bdb80a18555b530bc66c96e562370247d2415f4c5455d39d7124b86d217b7c449275483796449e3c11f87be7b53152fb9d6950e4cd7e74a2bdfab8bb9cb66ce5f63c06c8d8f8f602bee7a16e18b771286a757e3d4d018ece2fa2d58d44d020e8346d40f34e93c0b745f832ad2105701d84c4228909d79a52d7b6d37a5f0b72f68ef3ab5dc2b94aa6182c6a46ff27994f5ea05258f95bd6d3b036b81d27d0bc41cc08f08c6148551b9f5d0f101681bd191afa4852991283d281ab5d5dcdd9ebbdd161de371b71f96aa9c48db5407a880d6da35ba082e75d168939db05a0063ac848a6b4554b05529e03baa1235f2a3ce4d413a0b079f7fa9ce820ca5fd02e2af52d9c5a1be1c7b6ebdece02420d50f59ac7e1e8a7d8a2c98b7c379538736a9cc58d04ca5b330b310dedec5f974c508149c125a3ccd4a7dbbc446db99311e79a98a115b7f4e6a8230cbebb6eef43e46ef3487cf21ed2a545bc1f77d8bf0dbeb3d3360417dd82c7ed471a1ffb754bbae3e6b594ee4377f2d52625db2be21a72c7bb6ade8c8209de7b64ba9dc3fdfd3afd7721f022eb764ab27097c855e7b975fef29b371a5d2b5ccb976d2e7104611eaf215fc769faffb81bb560fec8d20385e6353eb61700ce3b0479beff0d8299ca61e5dad4c030e6ce894420c6f341da678828a308cd31424100ee356b94f6c11b92e4ce615d3ad10570ba1e2b91b9041c3d14da5b6c77aa86d09ee7c59e4ea506470467cdd82ff6571466be03d91d125a95f3ef2c883e54544acca82642d36e35e3e2c9a3dab4cb1fcd771892f1ded912498b0bb4a7099ec1e53694b577b786e2bc7e100cee75e990e6d38e270d3851bc3f400490caf08243ac7d91eefca2779771e6c646f0de88f6a9c0dff7f4af241670a3f184e16e43c3704fa9ca9e87ba02012fb11e7981b873739645eae9ccc73608a51bdcae4bcd5621fa41fdddabb01aca37960f207fb8bc22a0fd0e4680feced55734f02db2e525187f7a9fb9e144b1b6f454e27b1d50accbebc64704ebf876f181a85974e47b516d2c7bcfb7c0ac66255318145f2a2baa28d76fb225f61b126f209188e80c526d144abed7fd715676f3b3ea17b837ee374947a582f3bd8b8b8505f1c58601d067e94a54ebfb0714ae8ae22bf0d47b0ab341e6d88b12cbf2fb0e9dbe106ccf4ca82e49f20077fe3dad95b24c7dc3437b94fac6072496bf09be9238830c4288e2720c63072d4611818863f31ea06404faea46adae2e84ac70e0432d727dd4d6622fa3a8cc46cda4e94c9af8c13c75d174523a20d14fb6ac0b57dc25c96bf3ae88b6e53e5bdb95eee2a6d95d5426fae6a16f19e96a3703c3c1796dba56e3efd6f02a5b0108da3a6be5abbe3572899cbe9bf43c26098f15ee2eb1578971ce2e55b3668d85ce60e3d2e9768fc859d7797c037a0cdbdb866ab618b84052e2aab371d5d2dcfaf8fdf6ddf979f8460c57a913da3d837cc221531cd1b9d0c3457e3c92bc8dfcfa088d9e89264cac0458bb3c2b355ca167947f6fe24969cc4f7ff67355e7e0f05a031b7b672ba6e741c5c73043a6bc5304a75a9a000e7063355ae81581f277849daadc5cdcd62d8aabb158be0d8be063e06e200488aaa6421f60b16ce62a46763ed943882318a7cd876c9a6bebc8f4c737a9ff4a13a3985e413f1bc16afc7f15f6d6b37f58afd6050d7212880a37c0cb2a0332f793a19d1477626cf13efd37279905120c97a683d6da83a843f957594562fab168c70a9d92273cb0e53ad8682436d399a100c0b471c881bc9a55f85679555f4723e343410b6e006357d98741f56f72e7094b11ba0242dc9c2025f155153cf00d1cfdd9d95217a6d4f086e3344694354dd7682777fc7c2fb382708917a6a9342c988f95a9b3ca14ee78f3f0f4f1cbf6bbfe2fe8f6c7de6113a9720a48326d77fb53502c380a6696933b1b6d84a766b94c188354a60028f83d733f460ec8413bbedcee9ec7e225e989212aa60159e8b0ac38ca8e5bcbdb9bd1fb9a8c67c1bec439e02960ba8d3ceb90befb85acab11ca2b69938e711721711e905d5bddbaa485d195864b0969c4cf384869bca66da503ff1f78a0441e4b7fd88d90cff17593fb379d7c9c65942da603fe6d666a046a96a3a6b187669a039bc578c6fe7b750b04fb66d5837c30cfa4c471c29f43259ddcafc5e0ddbdceaf042f40f0501e67223a630eabbec0cffefe02714fd9b33a66d0189b0931c1bdb1a3d3f64fb7caf55a7a314b753065d265b9009e0f6757ba7241d5f092ab91733d804259e6ba9cb10d75f0cd041a8077fa2afe7bd1c727c9ab1bd4241c8d94b14fd789c491522e179147801dd5f87d92648c34859f3ea39423a29cf484b9a9f15a2ae7575a2de8487055046bea0a95713d6a821b1607fddb79c7a9df8a13d7c01a96d76a620640e9338e467cfe76ff4068fcd72fe3e73a1b335699ef20239c1d08daee045135f8e4a028ad82d7f69125e55e05b683f9ef9d59c360115b739a997a16ddce62f1d98783db20d04b1a6c8a441780fd632f10a5ed2faa535ebb6bc944573d7d35f579067c78a467670aa3a48044477a345d1a527bf8685b9866985d7a19a162c77d973bc0e567dae080fad81edc699ece2aa026211d5bdc4e575d217b4450b4091688f9ba8e2b69fca44c5f857f99daf15044260235cfd43f6567872bdb0349cda651d252d0cda8a00b66342c3ed02cca2723c7236b467c32a0e5498633cbc14775d291caaed0a1ca0a94ccedc2e890ffc644198e5186d45f03b2423463fbde4655640398d33d378dbd0428e63a1dce5912cbad565eac5d59dbe1cff1bc022138ddc44cb90a170bcf972ef72e9de45854a3f69e39519cc28fa6c89561a899aef1d69a9dbbc8bfc916cfa567805e445ea61b401f7ff1f171d12b5fb7766d2056cf07862011b8d8b3e7312d00540ad2e10a9eba0e0c1dcc470268c75e8124eff77497e60722b8cd0fc2fd9811d8cbcc564f99cd3bda085943ab77f1655e84345b50c61c42848af29685e2fc89ba5d875dab8c938bfd34ecdbfb2df092eeee81252769cae45f16acf7c5d220e65893e458e9d0892858e48d8384d1b892b1d486e36da88ec42aea862a840e5496627a114a006636c55aed828a0ad0bb707c1594273f757242fdd68cdd06a695d48fec0f5ce736a4d8b74aae188413c1ce35f661d2fa19aba1312cf459b8a3a4a568a32081de6519478dd1fbfe9a7c59d335d946391b685f25c440f056a8dd2aae647a7f0ef6a43ff7b258fa881223b5e20409a9f50d98013e0345cb2378210d9c0982680b1924ae34f576c53dd48c873b2556ca2a3cd7a129be4bbe97f6bae887a8fa7473f88c9ce9be8dca7c3ab66c49cac31bd906377b4047aa5447edb13c8b5360a13e81c05122592b7c664584aaf6c9555b3cf448a97cf46f31e3e9c06c3f8bb87db2d9d9b6f5da9acc42407d0f17da773c59b229290504187bccb6d9c9f917aa2fc1e146b17154ca2e5dbfdc95ef6cbf7cccc73d0a1c1328e56257fab8f7e7ab49ccce463cbe67186abaf1c9768265ac5a8808db02ffc17c14c2616386cdea5db903cf81715e53325352dcc14c88a5f2dbafa0d5cae710332bca1ddd6ce8d6eb6083221ef9bfe65f1b9f761650e646793f2a14097d75341188b0f5e3f40561ee9e7ee62b6aa7bd4b98936a35b5fca7ccc982da5b3cb3af8952493e6fb8bee12f72225ad23fc5cf8760872334ed51cfbb6e6f68269269dcc4fc6fb0a518e5a8cda1e1a164a0398d79ac5fc615a65ac5ef9ef4f4e5af651659ba277f43579a716a168de3cdfe44942e86393f01509bc77706774f20f4d9b631edf6a261ae3cbe909c137b212437e2f634768658412aee3f9af70c6addc980ef78d1e36ef1926d9ec5457b8395162f806fa1c07ff9029bccd2b6d93d126427d8ea20c6e51977cfd964e67c8f4d18596f3ba98fa9073d9cb1f94d2ee3788aedbfdf3b8bd57c826ac253b06099b53bc51f2898e77bb2cc416da771e94e09f225e7c1160adeb8ab38efa6e50de59b16734e6c5cbe7e54a760f14ae926a58f29cdb29a9cfa339e197740268ed5be4525edcfd97d26da43c6287e1c380a4f898748625de7857f172d5537ce8102c286e02eb5d6d8c686d433bbf328cc6e1d95ea3510553f7c59497b42a43b35522afae20b7eaf481a856284caa2d4872103bcc84ad2901e7e5286c0f5757453ca5339c9896a2cd57e267e0164660036431cd88732b6d67208f7040c859dcbe1dbe622c18362036962cd602533d800f0cddc85689e52a43201ccf33e51b05b69788f016c36edf5eb9edc7e7c17597de7f1832b869e35f17bcdd2fcce722d5b07e016486e51dd3f09479e1586605687482be2a6749cd68fdfa6d3b2b9296c9086d9159e72c7235a1d936203d62513657495e30c1ff6cc4066ac9ce81f848bbd72e24355b9fb779ddbd6480b8235904d93d8220b46b134a6cce463af82c523af189a11919163084b61593b38e38543c744ceed9a0dc185827661cecc11af597d5c2104482c11121cf885c59e9271fd87cc8b4fe69d5409c4f7e32aa57501332860b55b1a78c1fabd7f854596f03e80971b187bdd3d3e75b011cbeb1c4b092081d5d9c420825de940c4dec22d750f96beedbbac56bca3b3a03bdbd538858f7f780dbf22b869907ef6d00d5e1bb79d791ff7753b1fe70caf95a3fe75b7668af2ae831ce78bb167a4b8fa6787a9f5bf188364dcbddbaaf1eff2447b3027fdc1b4d88f20c30ab0026cfee414b69198a7697da322aa4e0be3c98a7c3087080401bb74bb7ecafe918690980933fa596740abf2168db3ac6631cba0088ad7381af73f43db233b00b8be0d5379461fff11548f315489f92d5841c55bbe3e9f977f6715d9ba8c8d97f9b723be3104e2c9138ceeba75f481ff9764d9140e5b522b6ba20833ae17f9241a9389fe311b260997bc90a1cb05d3514262e6dcad90e5def9617bd8b92f27c4271565e08eb545d6cee76c7587413e52c6dfd25ea95ba515a97539a8f61f6d6458eef144662896ab1d6c9897be8b26da204059acbf51cdceba9d19aa5e6c46b4c2141e6a6911dfa0c7941f7496356d9c713c69dbeb6b9fec952fc78bba98e49c8947563ad31d73d3169539c9ac884acae0a0955bfc97615a742bb78992e2cba7eaeae5cf5930e5757173f5e1ac4a7dbb4485ecc885315d0f69961d46e2277959d845e2bcbb28f8b0dd886adc32d45be804892e028d49c71f9f9bbfcf1506d915b979f2ef74b7eb0c8554be5c478a10b5e7b2edacabbefacd3df304ff4bc305f5fffbe702ff9015def2499b4b766d8ab5dd7253c7b0cf26cf6139e5cd82449173b42923ea8da982333558009f66a7b5574449c34364f9a436f74b0b704315351c357dd0c65de5248d5ca5696f8e7b86eb6fcd3c5fced029b2cb000142b0d85647e055a6793459b8cb3e291eb291d67d2c7627de7a7649d79942f34f5f48820583f24e77d343a340fe028f74b927de9e2cb4d149632b7f670969be5809f6703e9b5bcb0cd29e1a5ecf04c2ee8f18d749e227d181b660ef0dfb3480b6808ff0a5af008bb5991653116844ee1e8dd724c203e87b3a11b7742c6b73c854f1eb828bd84b180ac753e497c2168e5132d6208c03f525999cbdbc4fbfed8cc6450f9fc9e1fb243f640365bcc13124b97d8756a59e27b5c6003bb5db598c879f3f298fed60048fabe147f7136e23212b95c61b1003a3ceab58807e2b1b17e405d4f8ae215730518a28d579a5e525153327d2786c0fa7853f867ca17aa2ad9ed6c72d6e05389683015446103369dc1b1f7119da076819c3070eb1b25184ced4f90d4373c9c210cae7de726f0cabd16d6b10f130dcf5fbc41f84170be03a28e5f16bdc4c3f320163a1105f2a86dbadb67e9e402cb23c30213b7222183405e7f4878e612748b2b8d203f27319da463272269ade0dc82fc976f8d18049ab2f891e32a7668e3c04df171bf348a38bbcb1ab7de32be2c1687147c19a1db92931d66060ce2aac422bd9df468cef51c7d409083df72e4ccb118a6384d6dd9ce5a933f35f866db3080b8cc6a2057addd481002807660163f13941186b6e912266faef353291ee75defae24bbe8ab0f7bd151820fac8f9bed631fa4ef3b73d314d49306a6a11180ee98bd5431e9fc73b59dc04acb82795b93d9af3a38769bfb8504b82401cfef2e07b288b324bdd067c8c5c33e16f76a70876cc95c8b6b5e646514aacc79b9fac9928a387ec16aec279c62b6d2617a8db0baabe72e78730b2ad03100d7b7cea954db0f5bfa39a35bba27137c491024dd45649fb688527f6cd7f487cb884ab713c8efd9dbb9aac0307e6415682817ab19253f757a09743fa21b123b41c503684a4c348b1e18caedd88d8308ec6e0a26e8dd2b59a4b92b569792aa690db57766ba3c6873c7a2c05a9ca232633759504c2f3d2933f74212f71ddb03887130ec960e940c7827aed80d36db38bc7dc6864862a9aef3ce94e740a5d54b67901cb620ffa97908d42cf99b67a28ee3442b0c8a8b52bd7efe3093c3b37491f6c19983c1029555f12176f6f5cc5a7ebb4ad0a94531386771c10a2def4df71540591ac68a717eb977db5d7376f32b01c5f29941cf415b704102cfb05ca720277abc87d5a7de4a7f58828a3702fe72a43e942c0021d25d2917515dba1e990e936a7c0f7ed8ec0cba7286107fd0c4efe44503b372b8be14b428fbca8dea7edd1730e605aec07982e7e898441cf88048bb93f9c2fcc3296c18947b87be539e681e9055d7e4e2b716f786d1737996603abca2c3138c194596e0c82444f5e96cf00ea45867cbac90c5ce704c3242c9b5ea1561a03fbc8096d9c7fd0282280d27aa0c6dea0ab9a3ba6d340beea8b2f6658c24330e3d8f37abd39a5dd5a7e82b8277c65ba80aa031f1b88e028e18db97b4a3de72f5c47022eb6000c520c0ae81d8cba60202b43ff5be3182a072245f252be1c616043e00e381302d5177178565148da1abd8c09f607770ccdadfc6a6d1d17374cf5dbdcfc8bf9214e1ac1d3e24c9967a764470e95367ea2688ef63a645e65d2e2fbec781b8359b1dd6933f5f943ac86f2612c99de86dd4234aeadbcadb6202eb04e476af9faade41273f03426739929b0f9f16d367940a593e7b58d3bd03391555dfb74c7a210ce323cf47eb36b4c1571b4f5914db143f9b7902c71c66e0a2d21af0a09f6e4b14611c787ada87e100d85f0e4d24d4c00070bf1ba25a9029ca825f8e9b673a8ce028319b839fe87cc6beff6e3caa559f73dc34b28d444801f1d17d678c317007ce6aaf4d224f04e7d7555022620f913da3b0466c3b4e2295265878e922fece3396f755f9ab934fc0a1dda9166a4889f40094d1bf960d5beeb7dc5896e3f8262961f96ea03e5c6b79d1388a773f10af8c63cd9eb","title":"160. 相交链表","link":"https://leetcode-cn.com/problems/intersection-of-two-linked-lists/","question_id":160,"issue_number":13},"11":{"day":11,"pres":null,"tags":["双指针","链表"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。\n\n为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。\n\n说明:不允许修改给定的链表。\n\n进阶:\n\n你是否可以使用 O(1) 空间解决此题?\n```","content":"0961e884611df7d4ac47a79a9e3b6f2d71853d84c3930af0524c30537954472490514debc96472cdec9c7be126a0a557be330cc8912f5ad2b362f921bda5ed33ff3c666096c78eff002dc9a08dd0517624f030858da2009b79b02c818dc9efce19a40feee6784544437c47fa453d4e51995fb6c15107b3498d393a4abb8370e335134b57630c1370f148e0334cc420b5637ae507d5e38333ade74d1dc1e5853d1d0722a5847745e8207647fbb0571d4200a7ccee782631618b36eb5668f41a28598b4ef4546aca51d99c5b058f712773843ecd68702f92a3095b86c9132b7185afa3ef3a95e26a0d28a582f591ca87d51f0b68d48fd9646a0c73cc365f491ce0b771e5d5afe731902f2f71688c742232dcaeeb069f6d8a2edbdb9747b3e504b52c8b4149cf05e8e538c1415f45ff432eb29c9cb518338522c249959d54f622a2750ebdd9471b0a2e9ee304c0a18858fcaadeaab5bfb6d8579d2bd6b3351d799de2ef941db7df07e53311776b084de4c830cbc316a07f16343e5e9e7bede6b963009d5c33533d9eeb1723e42f42fa0339b2323ae896b861b8925720c3b9c8a48cfb8c26f0fa33b83bd7d1191483fdd145f5a7d3c4a87bc90d563927f3420ffeaae66f9da08605cd3774f8527c2d387b7552cb22d89f82b2d2f644d953b1e1b81c1ac6127f1fd58e00d4c7fb3b7f0667cd9ae4e829c5ba0ecb9e26be30ec9f1edf8921182e23b50ead05ef19cbfb82ce7662928590c54b0eee1c8b530ee0e4dc9f67de9ce1fbe9bfa7fb0948abffc49fb98ea4ac9755f3270e45b675262eab612127671ebbb0dec7cd60613c502fc5642260b01fe420469e6b90d0282aaf8e1c32f5be27685c3d3514b6b48d60ffdb3f21e2d6cde5c6e0d6da2813de3b2b3b1e5f453222e3aa11d4b5a62f4c4f8d0fd1ae89637d76ca05ff4af7129fa47dbab8bd598d0b30b1767f6bda879a813b1b5c34960a3ac056f3454ed839e350b5aa38dff767cd3146529e5ab9ff5463e52096a1d549343510ea060ffd91666683c837c8a64d79e51a03108ce95b5a3e54af2a1ab79bcc55e97d78137cfbf959ebe4678a761607b716fb31b119acd1bf438d092c89c093ea34902f67eec6c9843648be86f06afc99e68923d79a70ac27f3329f6e3404710f81939a81b0e3dd2141a88ff9e88c6b6f3ebeb3fb794537fff7c851c30240127d9bac9459f33c64dd1edd47e9c38cfbc9eeeed77efe1486ff96ef7ca19e8cb14a7a90dc30fd37a17eb42c46bf63f0ff17935e32dbe072aaf1841f7b6fece6b6fe1f503da7faf4b1e7c5be9eeeae11f0bc5931ba43d95508dadb3af2c1f721852254dfe3c490b7308c1705a376fb1f1ca427ded218777ebd90c8c695f88e9de90213d4fdc999d84c8f490eee3281d6f5837ba8bbd88fb95a3a8da079a6aefc251e756e046ce4855c61c4e111089deafca64c1ef3f146ca66a104ae3ac33e615001df1569b0f204842ae5ea639957e84515b85c7e8bd17d3a9bb57a3ddee96b1ab9dffe9be468e44355631ce74d23fd791643bfc657ae136bb2f3ef2c883e54527aff4459498e04248fbaed74b0adb49a0efff21a1c7d3bace16175ca3fc53d096dcb5f5d9d3856592d8de4c571e06d5e225a20ea99e7f55e9da08c704c1ffc46dc1896a3ac870b66b077389467035167592355abc874b685ba1f140a1cb5ed5fc18b4a77573139dbaea074aba9481699ff6d8140766803d59161a3727d945892eb1acd04116e3d8b1cac049bf0992d539a784197a8d2ceb8a3586ba71dc00de38f9a8a096534d46c46fe1f71f796863341e5cd4504edff7cc39dab7a68e66d54623c7dc0bffbac7e185220285e3c0b6c8258678002f7323e6d199380e92e9de1752ca241132d4e38afa2a063a65e7595a4bc7d06236a64677d95286853a203e626d027be6093b46d254f01f1cc4509bb4bebcca910e9fafb0e9d51c3b0439c4deb861c86bd8d6d95c6e54a16836abe767b4e4e0396be0c9757ea3ec8f12634dc87aaafd84c3e858448c11ea064c0006747b88ceb433727d84f390fbe26311cbf4d6ecc6f882135c15a6b6d3e53fa75611320d14fb6ac0b57e519c96fd5693539e61c75d69ac9e0abc35a623ff8f8b0457be9f3afcb400e90aa5ae4277552384569606fde4c07e1c0ca36d05f3ee3c5d146490ecd72c445d46d0f7ecb3cbb2dcd322fddaf372d82180924be34e1d5bdb7aa54084910b828e50a56b9b1ad38d889c6ffa8fdeb896e8e36d09ab03cd96bd215b4a8213976330d6005e3fb37958503320f67f5e5cca1835982941ae79faa960d8a12b081e93abb509807bb33183c0150393f22021923d5fa22f192794cf19a1317ac59994b4228372612a9128bbb3ae6d3f28b4e855be731670de826d978e273ac2a42894e6d66e5ee852dd66bf7e8bbca3cdf6ea7975c3a47a557ef2b55385bcc4678e1d42d7dd380fd8613c67d89ca7a4c117f39f212d8db212c9a5d0bccdf57ccea1a0e530d9db2ae64db7b78ebb482540300dff1407630ec2eb3688ec3a3ef244ca211cb015eb6df5e51a01cb4b5fc305e54cd4862ee2d5d501cd672f8a3861e0e0ef842564201697761d8810066b1fd7edd92996bdb428f1ffdda6af5ca73ef1301e4f79797fe20d4a3cdaa3471d6bcab1bacd0bb6990ce385dae4ff74c38d1f30f4c6ec03710a546a9246002344600257eeb21765673fd8231b690ccfdf1db3e8499b9e1e0e14d62fef09cd7e92ef5485d01b01f00ca781759f9e9be0fb6e4255c38fdbefa02f599053462cf9d73535aba2c17807e05193d753655ae8980ab21b5167d8bd9963c59334f2f6212a20c9ef95435ffd3b9bc56973b0eddaee9cacf998718093b8c83674163e79d7db129ee1f64bd4470043b9dca808eb523c6b57ed829cd41c762f44abf7763705c5bd9ecb2b8ca17a00387d87895b532256904e77bd5cd56f51b43569a2cd10f3c81dbd5ef256f11cee34d7c149250d8f5fefc9aeb3c6144537667cdede390fd6e23824bde4a65b7fcfdf55e3d9ce39f9b91bdd7c9c3dc2acd25f17eff0fa2e516720d9ca3c6c991e8ab2986c3627d3e28c2e95c844a1e8a76a972bd7fe8d56587f35e80737fdec0d03484c28dc16e041c9156fd1dc8e57d8c688b35b5aa6da6883f8c87d584a8d4dbe5809057b8f213c1e2e9a8fc5bce6bbeb18c05f48cc17515a45f777422c22450ec535598f4c5b338a24fa8ee208d7996abf4d46efeba5497d7b25d7ecda169d101b5bd3f58353d4256a874267c0566b90c9284551a215957da0786c5edccb0b33a3ad4b71c9c95c30372875483c6ab28c1974a1a0d1e37a5249c34cc977a0d81449ad184a159dfd2cebefb210800a33a19ec82e2989b89e7519b2d5893351bb889df70a4a3139278530bc7da8091fae95b5dbf144dd965e79b8a930f830f08b690ecda40f6c80c5f7f2bbdad6429889460fe4f5e7782bba5dfd50211c8370f9cc8689d814c2e9e4efe56016c6586c077186c19aa09a5c137fee8e6ba8e0970c924f46958d0bd3e013d65157c17a3607b0f1e4a131f24443e849dedd53578af295054b8b548f3c0bde16aa9d526f150304ab29eaa073787d84739e94d178bc6ab96855c5d249aab5ef86d3245bfb44592141b06d4dca1d985fce6cd8ab3ceb2a007f7aded8de2e50178085048d67d25a0fd731735924b1d111a9dee14b6281ce87b119cb6c7088fed880c13316f31002792cd50ee15a7bb3d2c1ce556eff95c9918a0e1fd6b98d311cb32abbd42f0b919dbeaeb5646a2cb10f4e7f7ae2d8a19f3ee46b3b79ec6052dc281ac92393b044831e54fe9258ea497f31fc9738a08a8e2e0a2db00441beb449dc50d2e6674e7837bf09975b6a5ae7923f92261541a3478671747853d8acf99368fcb2d6ae1f52c62783b400475d46e1481abc357cbe51a59516e6b48762504c19bd4c16fc994bbecfc6039c4b86272764995388b1cecce0beb62cae41d8c983123efb77f274b5d8c2cc06317b57510bcb9a6d4f33c7e0ad863e2b4c5db5321de42d755a9f238a373507014d8a51beabf77ca862f2613b01c50fad946fd3ea7ec29c37c161e79f91e1fae98aceb60cb8b09867dd42b2381e1ada54203bed719f1fb491315402fc69f9817497add704c430e12a862f2a9ae3247c862cda0ff4252ab98f060bc17b55f79a3f8400dd8c9f02a6b5948ac863dad43deba3889895c32c59f2bb2e02b60abdff85da0dcffecdf9323f599ca97f051abf38534a4a0f7ec95937e333d3a3fe47d51aae15bb12e1f9debbe5c88dba724c12b4222d686aeb343efaaed4a7d3708239868c417d316f79598707846bf03a530f2229bfdc74f0cbabe54002b89dbe6096485356294bedcf1b9945822892632e5d1245c344e71abac996adb19afe2d48521d76302bffee61b36c17fd0ae04db9ec5a38feca1c4b9d4431d207c2d07e92469ec71803d872aa7610ea7c0712a5246081cfa1156d996ad3187a8dc1f6921aef082b63ed84c3e7ff50be2bb3284664fb2e3c98b139b1ea177a64632e20d23334a694d932aed59b7789952ef47d23b0e5b5b396541a25d7f7ed39dd9be76f886e24972097e8a498a02bda29dc95d54c2888bebee311f30f402301ffb66cd703471bfe0f384ba0a02b89b2783e4844fd64cb12f678fd4d472ab1724841e398d092bf7db451997a57aa7740d916df46ca9bcfed35d12e0d0186eab5171feab446ade21d2008af5b5e3d2694a0eccbf7f6c5ffe8a70c5372a394411a1d87cb22f41a531ee7969b92defe56d23f74f53ea866de02f918a3ba32f59f4831d75728b3f2a05ee43358fe0a69dd120ca880bfbdb60e426c18fef3d781c7614f439bdfab4ef03012c9ecc075223fd0cb969ec29584b30421bdd8053311eadd57916385d30a2de4bc9a3f537e081cd85889e2abafa0ab54758d0e41059ddc3fbd7a9b8c06a95fce19f3224defc5be29672804b45301b49c89f4936c14d539d93b12d6977bde1c30de99d011e9fae12a182c693a28bc7b1abd91c2bd4343482d74580c9253059577722bb7e14b7c6fa880c60594ed86ce0e7e2a628d21246b8a703a9313ada41020fbd4f3c0e8c89f1e641c991bbcfb9b8f9d04dbece6bf011bfe75e67e8a094f85a19272837b73b284afadb0f321eb81b6afcc42e8db1efd3e484a30363035e505fd430df00baf41fb16701e02cdac6dc7873abda40584073819be33c6a3b1cba867b0de5fc3ae9eb97231ccc68b92fc4dd4f695a139e0a762dd9498f9526af2690d43154a6abc0c3fc9cf653508006eae4a55f7edefacb6a23a0c054fd66263b2f481413706b10a8d5ebf4f576a307408b4fc29f4002c5e0dc2ab67a001803629e651a57e6fbab7c855781f310989710177bf1333c76bf1bfdcf177412cc0c42d8c33f4abc4c40cae3cc3f6a019eb8ec9b83916707b3b806dadd068b8e6e7802a62a8a4a9254f4d0267817bfb37b33d47e3a1ee429bb9aa7f67b936c4c3c098d14eb443f36c3ba52aaeda5aae4190da14bc5819f6a696a1bd3c4ef685f75251cf94b82cc6a6c313db0780162670569c951a53e52df9ddc627ac1245960b333f368a9aa8eebf09d5044fe37e6acab56bccacd900972c4dd65869f5d399ca3b6f1233bd913fe7447363a36b34e76ef7047e19d17ff6bf01fff289802d381902713611ccbac9c40ea2e6fa7c065d7ef08961566777795469cd1de99e5af278cb258c8758fc1187d31f59ca28668591c3453cf9165010ee199c9a58d8be70c02fde14132ab6d31129da4e514f18255a2f33484dcd34eded578aa7aba19a7553ba3df1e474e5bd4ec414b0f96811cd1401d3073d543c1f293135e9a34303746b73a9ab963a286171d3a665a95351f16f31e885b0480268ed4d0ef6f727d07e28ebae6ebe9160498fefc3eb6ba23be9a36f3a1a278cad2a29a4dcd0bf1feb3db6b195f1040291e79110c9e8472b12d65b39db42b2f820e281a2a78dbd3e1b589d81fc15018409221cad4cf3892ece8ef15dc5e966e94b9155f029c47024584fbd7f05872cc51c07ba9975bfbb500ea1e80ee831052d7dfd0899ef5c9d5a345e86388479e5acebeb1f9a56412cd5d10910699dae2787841d99b87e1e5c854f820e54978c75df37643c6b2bae3f62d5c1f3c10b20bd00042e9a970c965035cd55d85236493574b61f0023b4ea8242880728af74ccd162ee93ae758d3e203898b89e0a5265cb9c46ef12b8cdbd2247aea8efd225320b9ed87e23eaffebe471f86231b4d5558bf696286af12e953c208ce12a615ae2f44a51f55c2bdf8b8bac5f34bf5d158deaa6c8054ab5c59e9834ada4f3207c557d515cb5c0539917905fc75154e27475f0d28f46a3c37b692ab8acd2af7441ffa5ecf727a6770f92a60447ac30fb9ab4d1763274a579396493b43e77b057e98a378f032d9740d480aa0114b167ca48b5b31262695fbfc9965bae2627bb9038713f0b32b6170bb11c235c5061048f3b90f51afcb79ce9c09f9167c241040c8db4c100faecfca7a843f654f5fa05990c9c839487006e561d275ef65c8e1ae9567a1f4ec3572eb48f15af9416eccc3ed633b4974c4ef4754d3e894bd6efb9ea8c706a4a5973ddd61b1ba17c59d80b8caf2d4533cf7544973eccbb66f0a81fdec61e46f2d7216c38a3b8902caf64b65ac14b3b7c79854a14313659499b0b60cca5b06ef166225a98bd79f86eb63176250fbc9cf75093dc33be1c07ae1e09b4980f4278826cf3cfb416dc432c86396e37ea144ea833bd2318007efdee8f8a6f54fd70173c0b8e03c0ad14fa4ef7bc9810db77193a71d5702a87cae2045eec5b920d88305c1f337ea99999ca9b233981b8f6de8220bce000ea2b36f7c0df699ca9eeae532a299afe3e45cceee6e424445bbbc308aafb005becb9ab7fd07775eac99b4be5cff35c5683c355b3e4640333e590a6ae6e8de4817b5ed51469534b7922dcbd61789ffac9a3a88ee595cc34355aaddef7c39d97c0ed61774870977ae2b33a715768ac0d1bda8e34c1f42e2ce8d8ae8f939a381fc1ba6a9709d5a472617e49e5faaff72fa8778a4a00826014c7cb9d902a5fbece68a24e1cc132cee91021a9c1f05be688d2fb0cc6a0e7fe2d0fe1579d6a99dfb87b14d13aa10429fda1ee4de1ff748a0df06bb65d323ae1c11388ca0c848aad68ce89cdbce3edd83faf67dde8aed8005f4f969662aeed59a13176bb9c6983271250eb8d1520c3328bf04c2a197c76a266f2f30c69a65ce7c1adc728d6af98e62e9d4b76dd0c48399a7f83c00b0af7cf4342d201e18f72a52cb1140b6c28d820d89c5dd297cee291bf5dde4bd398a86f6777969640c5c3850d7727e66111a1a442a4f539af3cdbea80bf51947b83e524484d4f1de667e4dd4ed2cc50debfb34e683592076f515086cc350dd5cec002a31bf41cd58513be49f745a26cee6f9886aa36d2faf6f02ad23cc02556093d5173f8bf5bb90f436f794f2ab89c9d6f3724b06e00c0ce46e503b372b8be14b428fbca8dee6ed9f3f003914b45f9f6278988a4e8a951cc3d63fd46a8d76f4eb8947b87be539e681e958777e0c2b6c6f3a635972c13203e28c2c736ac18c5f7942ca515a48eccf00ea45867cbac90c0ea250962b489b1f8b165a43d1e2374c977fb36766c5c850d8c3cab5ba846bc2ea45a1a5cf60221dc2145dfba6da74a956ddfe46699ebe26210b968bab4e6978f1f406ee99a5516a36ee2f4b750e5d95050a522b0ae242a6b028656a43d814e30745536706a678a15f256d0ef20f155513c85f5a4c7e2748ea0fee9022f8075005d0bde2047438286a22e8dacdb3f3b721206fadbff966e02be833477fdc236b9f73caae302c4b4596d5fba43d5ac738aaf73133e8f941aa9be32549dd9b8cdd1256aeb0ebadba2d2fd2132c39adfaecfd1e3afa30752fc706f5a0b8774c1b49a5c8cdb58d3bd03391551bea4693bf0d9e157dba37bd4b7c2149baa4d45da028bdd5903671960f07336fea520ea181e6460cc7d4e1e7294e21c0b5b0a82f4c1d1a0b9fcf49c50283a824fba8b453fb8002ce66b574fc8dc325dedce3caa559aa17e94b28d444d25a4942dc36de4727269fa3f49264b064577f5fc7a28d3fae78fe9ee0444e01aea7ff8d84b805e1e3ffd8aad02d63be2ca7837d19a33e0e50dcb34974f10edcba9335911bb5eb4bbb4d94576dc55864720795473b9ab92aa7d728dd8936a4b5bde3b2e541825e3da130dcd21baccbeaa6049d7025511f6d698010ec9521964ca71c15c65150667a61de8ff1b8a5b7fd8f7593472f1f2690601a608c057d4c68da969e4f2906f4856b0e572e3acd75ee06d17a3fb182e96b84d5fa25814713a2742bd90bea980795e27ddb10e61ff8d38dfc5e9ad370e6697b84fb590461925ea1e83d76cf99c0a454ec6774fce6830d00e94e3fd95fc2994cdc1a5e5d74143219d886f28daeecec414d5522d80d0a5329f75dbc02d836b2f458c325ef698e71eba6da7ce0cd0b7dbef2eaf27d7e66aea62f152585b60e4c2ee2adccb036868a6494f35f0ec5c7a6c5d0aaf62b22ad2c96779737599d62122c18453ba1d90a4fcbfec6ed976fee115307265d2c51f66d133e380f47703663da3734ce099cc932dea72bd4e4b7497e0af5ce552a7ae5342eebf50af4ce91fdd500af7a183cec44ce241b1e0288e9c99b96186e1b7081d381044b7013ffc76a6ffd363f98262e29a9bad194afdf72bcde5992ca213ad5679bdf3293e8725d99383ea09bf8f86bef9a8e8249893d3f25340b44b23511ceb72b53be034b5770af48511b541bc85364c85419cf85568d9e54b6d23dd8852459a830bbb1e36ba204a67d6ee3bb24a246bcdb88627e46065dda881c937ed69e0c739707f76960efc7de97a06063cd1bdce0305d5f6959540ace190faa52fcf38e75fe9976a1c1d0c61d72a05841b24780def75111aa21db0cc4a009cc08638801df3315d34abcc3e1ff2533bbc24cf1a27a36549c6a096e5f6d6362741c4e33398dd97e725ee46c1311b2e3dac3d7bb4efea235e5ab5fa3e5e0522c36c9bc5807b8aae72498d70de42eae63d19bc13ccd317b51498c4b8e5e6eeb91ea37e5dd741a04cf36f6880f4d1153f9a4ef2230273df41a2cd36be8c55fa029c967c93eb3","title":"142. 环形链表 II","link":"https://leetcode-cn.com/problems/linked-list-cycle-ii/","question_id":142,"issue_number":14},"12":{"day":12,"pres":null,"tags":["哈希表","链表"],"whys":null,"difficulty":"- 困难","description":"```\n运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。\n实现 LRUCache 类:\n\nLRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存\nint get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。\nvoid put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。\n\n\n进阶:你是否可以在 O(1) 时间复杂度内完成这两种操作?\n\n\n\n示例:\n\n输入\n\n[\"LRUCache\", \"put\", \"put\", \"get\", \"put\", \"get\", \"put\", \"get\", \"get\", \"get\"]\n[[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]\n输出\n[null, null, null, 1, null, -1, null, -1, 3, 4]\n解释\n\nLRUCache lRUCache = new LRUCache(2);\nlRUCache.put(1, 1); // 缓存是 {1=1}\nlRUCache.put(2, 2); // 缓存是 {1=1, 2=2}\nlRUCache.get(1); // 返回 1\nlRUCache.put(3, 3); // 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}\nlRUCache.get(2); // 返回 -1 (未找到)\nlRUCache.put(4, 4); // 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3}\nlRUCache.get(1); // 返回 -1 (未找到)\nlRUCache.get(3); // 返回 3\nlRUCache.get(4); // 返回 4\n```","content":"0961e884611df7d4ac47a79a9e3b6f2d71813d84684ff03508524a256a2400100afd8c74ea6410d1ec9878a833a0e65ebe221bc49a2e129cbe22b42dbfe7b231e23168699ed9d2bc0531d7e88a9c5e7732ab17ecd7e24c18f45ea20339c9c6c019a73ce1e46d77a6e8f96d32ea583b63f6178c435109b080f71d6c0ea92f70ca3b1347566d003368f148ee30889908f7277366ea664644429948aeac6622f1025c76153667dcd52d7f4223a3ab1a5c4146f2e293222e7a099c57b16038b133998f19d2f34658c544eb906915815c3f73851bc253702e849c095bbec900197091a8adcf3d97d872efb50d458a85a9ddf94d575dadf5da2202382997083e123da4d178889e959770854663560ec76d5b5fe1da831ff11ba44a9cd32aa82e4ecdf71619acf142c38ec848996afba910aca607c4292f9fc74dcc9852eaf17a8a48961365a494340c52538fad66d2cadb748ed1c1dbe0a0e09e48dd60cbd6423617d6f9adfd23fc801d856c17fbaffc9f5550b2c5d514af423e31225cb96b99a4863a79951d89cd3283d01419dc2e50ef090d88f751f1fc0d10f3972e6cd3f7f19ab55b6dc79295f7e73088842366285f7ab31a03093e25b07b8dabf3ef318b9b27646881606e284e992e1eb3790b5c3731045f9078d0d3dc9d83be6880f44eaea85d8c3ad4feca044941e6b38d221c4243be0a1652c37bbb3cfd9e0396d3164f825e46a0d4abad41fe69d307875f7588d47c63b8bb90fc6d03c13c4eceb925333903e0b0dec5979697c1616209958abfae011a7372580fe76da6f16f250e47d5775d47485fc7b19e83c93913191d4bc126785ef469de4c29892cccc44f578206d7875ab21b662624295d362f78f13076b0d7391132285b767855e6e016e2ccb0e5958b8843a3ab72afaff645432afc1882e7a60b2e78b75acd33be32c0dd5ad7e2a40ce12e75d76e0b15e6d2fab060687962ff1c72a36a9ef3dfd530d550b3b832e6de6ae112467a8856afca5571d3239eb0dd4e213536e9071aeb9d707d83c63acc9d4b906f7e590ed698791b6763320d1b8a87c94dcb7b68377cc9c55aecd2669a51143da6df3396688e32d39e4980261288fea0e925952676c6cac59f3c4eb5643faf790f444f866e9a668124dd0e9f4811e8f68246093182b9f3d01e4e4b1c6c2030020a0adedbe135343ea4a8f610b7262c554007af897bf02b6ed712d745fdc280c3efe2dcef7fea1d88e6afef66839d84ba4a69a4de1de83a876cb0057eb160f5f82d9fbd9a49ef569ffeae08724fffeb92ce1c6608a4c5ddb0d0c0b2afc9ac0fe17b8c9d6eea455602ebd615cbc1c3208c035adfc2c2939c118f3118a145c7121cb82ac7cd1a6075b389c7c5aadd86bbf2eda54b10ba958615ad2659e84d1854f88564a59fd5622985f1555ccf654d957f5577a782cc726eb4a65552d6f1657654088bbe2d71ae40af12ae3bf73bf4ecd8c700ddf92a53c10bc27502e9999071859777d3bb2a7effd16974d69ff6bd204e7e24762621c65cc2edddb16341fb22f6d2a1050fca0fabce1f4054f3439cb684e66e919cca49d1b9350c49ca01247121f03b58c3caa2ae6f3ad022ecf72190b3974c5262943b6276c04c0e56b02fa6dfe2c9cc21517f16c3594c48d0f1d64a934af478673333dcd23ffcd658ef97cbafce8d930678b23079566b3a4e7b9d88e94723a0aff1dff55b483df17871eef97c72801195e99f821a1bc57ba5d977821e37b91aa4a781e168ac58d71f2373e68e77e9f50e604871740bf0a130b1cf10d889b7900a442d10afe3e904eb515630de8262028c884202ec39337deeec32e8cea589d608d2c5d8190c2e7e3014b2eabb27c6ac2e9f2d9ac783c84c3217e1d4a3f382472e6de1c3bb703923a426f060bf46638983d2874e32168d1b1d2de30eeb34de04ae6093ae612a53082f4fdac0032da1fac766dc92ae33d1e72e3c974fcd75799c626a8041b6c7f067d118f021c1c78b9dfa59e73de30ef0568de3424bf11e34024d98812d52cd7e8b0ba076ed89c3767c6bf1f839a6472b06a5747448ea102fccef52d4b47aeb6460eace417674342ed273b4a6029b5fc47da239efd8fe64a881466b4431084086c1863f55266fb3662b693da1994816c5529db1cfa74567716fe66c0bfce3c711c5988d7ac7e3484931f778eb41d6691073c70c5795426f5ec9b26b64c34fd29b44d71f0f0d6445d0c79734a247e34713e5f8e33896dc85bca83a7b3d6c9b07140f0cf95c15ab23fa2bffbc9e892e494a928e904f458cf7a00a9a99c47611c14514bb21242a5069b469e9803d4967e6781f8f0618b0d5b95408177c3b5dafe141bed63c59d4b09bc858d671df0e79496616a86ce0b824e65804748b6eb27bb8e61d07de3df41e87659194048ea145cfb6ac2ed6e411557b19f2a1056059abacea45d520cf999cee53f7d3264f80eb0e7f6c4ffd02ac644d86d83b134bda125a0bc1ac17beee5073906a119df8bbc466522fc31cfaa22a750eedcb9f2518e0d45283aa56cf5b4d756ccdb968c4029fb604319bdb36c16a2700f79bbf0fc29f5fc380bd9360f45556589b94c372b6a291aaddf2af1a0ed0853753b44d407ae536cb09f62b4a99577e922a83f03a7d473f608e6e6c5106a2953e347ff5693875ff540fb1a542860ab9a3081c9fb79a4bd8c869b240b1b8edbda2c2e0a71ba7b6c5b50f08f70a390b53781e9b7f1f76194a34a7e1462f16006efa5688dde852c38443bdb2ce3f5d20ca7929b5daf270761da9206e898dce5a74823024fe136a95361f083a26441bf291fda725e0393a8ec4a87c5420446179408646cebe5d1fd5163f49d860cb8d610f7004025c0887cfc85c0a99c0ab3335bb0e992a87ee7aeaf9c19e0a4c5a227bdd3e22ac00a919de418321da658de8b9e7cd3c15733e4f8b248a427def531eade0ce9e21c65002ca598fb7a40ac217c9dd644c5368e1f7bb0d43ef563e932ba5fdeba88bf73c3e4b070c6984bdaad3f3386ad244910177a4a9bbad5d3e92bef0f55a4713495316a32f862ec952c91e45d2eaa7551e440e2b1145b42b04fff3f894622fe41a8df259ea35c37b860742f04c70ae65acce520670af427a02079984da2df63bab5823d641e878fa2159e82f67d7073276410d431d0c3408c11a7bf1020b6369dd7acf738cfd814b8af6d22f5ae85f29171ec2340ad45541d2b19ba629ee53e5f0139333f0c438208a65719d1f276699ee2b22993fcc284bd0dcb2f8d2aa2b9c93d9f58522fe71058eb8fac68f5ad25918766a7628bb920742876e764fd9cb4ba040512d970761b39ee6addb198d55b5051abdc302e701556d589f685f097e0788c19e60c191c6a8e3e3e681af05863b0b816951adc99866a4ae59cc7256568798d995b0f01052a15d01bd0b293a3257c64a9ef26e164f04d30e79e0eed5ef2000a2952803bd10c8edbc0b52444a2f839738f2c02c7dad263f88b52d8b64a65cfbde1b04acd7f8a814837832aa584021002acdb04ee369e79f3960afdbf6ed8793ab6d8fa4bceba5fce8a2e296460886585722be4c3158fbc04e90a39595fb1538a2bc0e11dd3900ce5b35e5ac5e6aa7597fdbeef3f3b901213cf2c56495061601cd9e22f62b9ceb4452a1d396f3e5c78981f3b3b32cf792fc81defd2f3d01453cda1f7cf46aa997f32a8fd6dce71210b825fbca28f3bac1c8d77688a3f26119184531190e92d66ee1389eb701061cd570026ff45da104e0f35f95e1092488fee3599fc1279496fe3b0ba5af63f888bc9f47f11387b05bf9ca8157c4ed450b3e13300d02492ce44cca218eb0bafe25e57d890aa8f4eaa1c1044607f3822800c1a2c2b65be405ccf43591eede5741803a0414047f116878228263c1d1ea7797ab7771ad9133300c291e504c5f814c89de9f67818c3f10397f2a11467d5efbd78bc800af9ad4baf60070eed93a6f1024b37bd62daeb1218f23c6917695ff4401b3ef494f3252e875dd0262ae1945baddece694424d4fa57d81ded4ad3f34ae00ef2cdcc847d774100b2fbaf80db3ca6ab7f6304d6bb7702dc5b018f05b10482fc649f8a9cb45eda0205f4d74af6bae2cc77d9dbee4782b6245d6940e04982ab4595c0c446809191516646b1426522a7011ece7616c6bedfa571e958bbe0967e9285ea8e02fd1036bee76b3843a2b386b443726b4ed91c909cac271a0139e79edf56d9a9d5362c2aefb11286e11667b5a5beaecb38abb099fbeed11c6ccd282e3822267315962d023fa0826e115fa810ce896754f0155b218934307eb86ab8f8679cf8c4f097d296bcc4378d8b316aee08b263666ff66826c8230d44ba63617f2c040b8ab700776943dee2623e3a590b991ff1216dc4f15611c7a465f384ad6d584029c1ced6c44688f5ea6b5263804fdbd0bd2d99e0fd6b7e8ac8af5a3f7a4d868082f5818c3a90a00bb5fc68d2929b95a0f8fef70365f46383b3581fa3025011b683f651d4435adf3acbf0ec08f86fd1a68c9df78bb1d3d8a83ae875cea3d3d75a05138d70c2e22686a779028d341b4658150fd40d330005a631164768bb0ef1e8fabbdc469b0eacf372f2931c36dc94995eeeefe0008ebe3f9d09178047db33f5b7be11295715836a4b1b493eb6233ddd23be799b0068c4e14010587e2ddbee5034fc41c53c60969aacb2b5c94da079b1263aa0606b4d0c5307393380c629d6f8d587eddba4e5ef1ec76a5674211e3f14e491ff3b17d5c5eefa771e114253e57f41779b96da7408607ec595cb63de9e76a3ff7507eeb9264e005bf851d8d2c63cd8a0d587398112b04ec43108deea5bdde2cce8a03da39e04be10716ee3f531d6f0dfa348dfa81ca0c09119ef12e5135e90cde2cce392a32fbaaed4d4da6eda92d4aebf3a1a7ed64098a5f1365e81c48106c2413d864349a3bedef4d2dc4cddeffd9d7b198c35cb4f3ebb8fab521338f4f5b04ba20061b7813e4c02d02a91554ddfaa64c125dcdb2f7659ca5654dbac45ca5e3b683dce8f9dec2d46b5fef4646a7961bb1bd463d34e1d6e6e77d59e0f9b5f526f78df71ea8764a46158c1a8c25dd8676f22271b97a677bbd366d05c7f5eda110ddfdf8fef5e6c18e279b8237db5fcecac9c474075001c0d5b6fdfa7bb1eaf63e1a895b588c772afeab759de88fd5b1db9186e4a22b2056b072f15ae7e07cfb604cbf274d1260370cbc9631540c028cf9b80d206528d8e94266bad25991cdd34b1dbf3580709cf80b0762903693c3e5708d443c8160c6361182b7602d446f6a2434ef948b20e909142300d09f827645cce91aae4e52512d3c8753067f5df4e1a7bddddaa236498759f29c5136c6c0e4278e7502062462ab541a74e5f99c7b887c81f139ab9536277af539366e8710f8dc1a7b3acc345ad4df3245a86141f4eece2b61039688e0a2889e5c2bb2a71ad6cb3689b14278358629bc4f55a5154c83385d89f526258a0b027b913af7dd98a817942928096bd81384fabd30ccb0903f9cf6bab46516ec1ad1d8d042333a005b6845c198dff2d652e64407f6a58eca75f7acc0d36830ff13f9110686b5b71f5d996f570016b55acc1f6a388ca4a40418c959796f6f08958e929f650dd0af2bb2d92d17fd27553793990d89bd0d6d4f4538fb1c63b83246843db1ba49ea5ebabf3ff3f9cddcaebdcdf38b86d918dd6a1cb6a530e592a5279c9fb3f475807e1617021b0dfd2e63d8399f6d0decfbda5549246febb2f2fcd3459c50280fe682caa08787e50a0ce4d84306886c1929908ad31af093b77902fc4a6115f39e856fc013a650d3707ad5c66a337b1385d4270e0c1d46a6b32327791add26b6eae76a5cc14c1f7b16b750d3a4e4393ecf90de9fda2541492eab738b156b874d1656d0eb48715d1ce283b2efc0c516679ebe7ab81e7c914606c1444f73a40d107d05fa9edd633b0f0134670a420e299697c986281bb51b493090c2cd22740681024700e93930655a2bda22d3513a599125fdd4ce0e9ef5cded2ad050b84f7824c6487bd95dedda0f3d7b1ed7c0a308c30fe19f33a4ac64b6351fee831094725d162539fbfce6af4cdd6084499f72c0bca4dc4ba1b257b2e603f64ef0a4392b15f3dbc7a10a4ad7329a61486de75fcf5fac5fdee4f89d657c514c07f960cb6b18eb43c6965d851c940bc4ec3e89b7d7ae2289edfd60bcc138a8021a84273c4da67ea251e5f2e109690e0276b0dc7047c669aa7a045ea5ef320a27bebce493b1dbe2762f03728ce26bbed7e180c437e3af47269957c42ddc5df868d070de22c32e7081f8ebfda8ae8a56b3cc1393a0200a8e1384e529dc219e46292d4987618b5ae2cdda75beaf23f1e6860d46420d66678cdaff1a366c6e15be24d194179652c1e5b2f13fbaa89cba60dcb9ee0144267b2104c79654f39a12edeaced6eb318e7cd7717f361289124b8fe7620088d50c577b607f5ee55d6585a07fb2269239450d099527bd9f75845002cb20426c3cdf9435f19253ff1c6a5a2100d48d5a2b05b0c39a26c21d795f1a8b6ed0dac43c4c535e8369c726e747c6e7b8d93fd0bdec2b7be32db85be87b74dac8ed76440538dfc5425aceefc0f23bf08fa6d115c5b786789172f0fe04c1c7d4e3e1efd40070b8034073e3a9ff3c428bebe161e46f20761cbd8475cc5a9eed6165f80fb6ab9ece08ed451a2ade97a8b218cb0506b23c3060fdde85d1d2e56b17381b83ccd9353e17e72ffbcd5082afdf0c9ade0dc832c73fe91962ab3ac921c7aa73f44beae8688131f31589d6969baaf70edf7873acca950f1ed04ba8ac208fc85ee31f9fac160412bf7da8375edf94b92dcdca2ac1f43a8dd686f3a9fa76d95f866db35c43875300e1f23f3d07f9cd9bd6b2a435e3d4f3a0e35ddb8867421f6fbbbc308afbf84cedc5cfe4b811415ab888bfbe0faa69a37316355b3e4640333156572da7b88e0159f2be51659a67a8b93b828d5995f7a6c31095ee1119820759aacfe6663ed7294fcd1a7882425db32b68fa3f768ac086f5e1af094b02eddcd09abdb569faa7ec16aea06dc63e02711780d10ae8b33796ce36bca9031d48022884da09b7fdecf69e3cf6e65d79a2dd0b309c1f05be688d66f6982a016dbfc0a51671d789dcb3d6b11e46a8191c9fe57bb19c53b224e9914dfe21bf6afd487f778ea49352ff87c0a2ddc6cf7cdfcf88a27390cfb5d41edead212f79e091cf5e5a32d18384763a2718a585093b337cf74d91afd392276b365b718fd64f9c394e8920c36ab78f66ec9c93298589cec0d3b9754cbeff2eec482d3d1e4cbf6301c55515fb8f9dac48c0c7b67a28ee345bdfa4a8f26e83f9e40e1f3c28405431508c587e66111a1a442a23488cf3f6a3a24ea1015ab9301a1789d5c3ca3c1708d4f031d80dbfb37db58d1a6126b4561670d336985ce45023499540d0580208f98d30152ba188b6cc2fab2360eb2a0bad78e602556093d5173fdbefa6d4ac38f792e5f3c9c2cbff3d611be04243a02b5e757273dfcb4b428fbca8dee6ed823c0b2b1ae71a947a399fd64599cd55d8b270902f8326a6aedf6db87be539e681e9051331486e623f68260f72dc324db7c060593884d80a2b0cca014055b3a00ea400de28bad40c40f71cda5c629b1f8b165a43d1b02f32c22dfd67288a8c15a0869ee0e89741a6bf09edbe9a216659b6061fe3cdde3ca733b3cb163d8ddb68320bf5c4ef0b731194fa15fac9b43e0131a2731872466789471b532f08f530c9f16c6b2442c506c94300072245f21bf852266c43af041c4b4bc80a1f457f7c0cac46bdc44cb743150c98f5bd401621297b1aa78388e796f3640a6fadbff966b367a72a0826996b7a9e629cb32d645a4c9bacf5e068178a61c2b22877dff92fe5d5a60f63ddcfc4944158eae5f1a8aa092f93116324bca2f9b3473af23e623ee348b0f8ec304c3149a5c8cdf2c86fd878d40c54ab4eedbf109e533ce963b34c7f7915ffafc805bd4cbd81d87f229847466027a7130de4ceea6c11c787ada87e406f85ede4826c0353495f9f8106814783b56de9e0bb41a69c438033f866e0b9df7aada1c9caa559aa17e94b28d444d25a1d0acd65cd382023888391fa21f1205f2b178ef18340fc3db3d1b643720baba9ddc3cbfc40e8ead5d8e3962d2df178a7db6733a36c4b0489e10774bf4198ffcf268402b2e061d502da1247c558642f2d95473bc9f565f0d770919236e5aabde3b2e541825e3da167949b57bb8eedbf198470295d353573aa10ec952196118d1c15c6510d1f1c2e898fece8a3afba933e840e771d4ddc355f698c5e574c68da969e17291bbd9b6548593337e73ca006853276e28cf36f83c8e52ad11d5fb60901994baab22df6e976db73a954b2c9ce901e91d66ab67c09a1e15e0303dd4fb4ac7666cfcdd1af458f7d78e2f1ce3219f55415df55c09908db1b5a193c5a2d3395c9a4c8c2eceb15775566c94545002dfd4bf811f27ef7b51cd80fef698e7187efca67c0d11b38f0b7e8f62e3766e7ee2e036a89ec772e63a3fdb7ac3b96bb0b94fb194f9693a6c3d6aab06a3fb665cd37842e41c127491b18137aed8c4f65cbad8aa2c06ff311004b690a7507f17b451562610304790b9f7670c61b95d335d0c579d7e8ab4b367af4cf487639b43e2ebaa83bdece91fdd500af7a455faa44c67757515588b198c895596665798188ab044b7013f0c86a06bb3676cc673c7abcba82d1b09a78bd9c7db8ca213ad5679bdf3293e8720a983772edcfb8e274aeb2c7d032dc37327e690b44b23511ceb72b53be034b5770af48511b541b94102bf612049b9e5fc28a18ebd43d80986c73ee65f7fdef6bf041eb3238a6bb70ea03face9a7f325b4854df9e46b46098db54278c2df76960efc7de97a060208255d29e3013102d1c5417ce4d47e301a0f28f6de18e02b3c4d39f560ae50e6bb24780def70c3baa21db0c998a09cc08279f08ce32029d1e9affde9d7658b5a041f0b22b5211d2ea8388dc89bc8dee9a8b9b9f4b67ce7854ce46d78a36e3c08b5a70da4843ee606581202b34d1d39a4f59be85131921910814ad4604846ed15d76aa0486efc08568de3da9f8345356fb1e9a5e1f67ec32dc850f8a98c930137be7b4d7d149b8e949ed2759e5a446c176cf3599b82e58192e741c7f2809e9e22616ebd714837bebe529e16b554412454eab07916fdcf9ae3d151557bfbf9703b129cbdfaa97cd388e85ff35b5bb5377359b7441656861367e80541aadd489e5e8acb8a7d1fcd9e37b0b55cb7ac47afa710101caab73281fc89a70100d7fec972664b7ba22f1c614b031c7aa01e89d6a1f9eb130e01a98b57b1f1e04f9d23f0f540e7e30d97fab6d4ab464e78ae063c41b036ec32976e84ef97f64815590c4a6dab9f7b0328b779dfa65d10893c22ce6001fb0a61cff4528c107efd13df5aa44211a0e2acafc47a8012d4fc5382c1c6b76445fb482efa213e9e915b74a18a9fb9db6ab608f39867a332866298bdc3636c6582ec7030937dcfc62c4580eadce6e3d5855127c762758c628762a9d64103f059f4b0e372942077d4da4f8fa42d015e0f7c07aa871c57011db7682c03ba5a0d05d58b24b9ef7971a732d0fb29958ae559803948e14544a6fb1a4093f2e639a831731ad6cdc0beb5fdd503da3db3ebb0eee60a0de98a026217793c2e84128a77f54453950c5f051b3c96aeef5c3bced7a612d5248e2fed5e496a5cd51b7ec06ad9c02578f08ef69897aebf7016b2e3e2916b86ca98e9fb651afe3935a952eaf54dce0af736da537a404d88087cb56bbb192e9f44caa6721e37509019faecc701e00b37167ff90ad929cc8986d27de5c9b99ac752812d6931ec8baf4416045ae8b5ce6b55637abfd11f5c23d06972117cabfca15df591a983a6fd0d1d8975e6df5180a7d7e8e71b798f9eaaf96a8da8ee29688963e85c2ded6dca145ae889f6a414e3f8e2d20fac85615db4d2f25a4f68dd8040eafb864a5e4acb8d4681af9319361cecc763a3def54c5fbc07cf414ad1cda737d712726e00f145b5bb8a1de9914f331c350e41b057e080fa48bf658d9d4b95fd9abb4c8ec3cc7b3423fd5da010827ba2d7a9bdd0f18ae26837ef5a477f1aa1348c952e5e1ac9aad3ecbb53978e4ac49e3c1223c20d536fa7ac9f8cddadfb0743adc074c63c390e74dd22cc98531866a945c42cef6c6d0370a17f9387db294614cd7fe57599fb9f8d46d24fd2ba3eedc2756e216cecf2999dfac22c21a8ba22150d638b1bc425e5ce9c077d02452f69574fd551690ac0446aa9fe5b39a54fde00a04fc23ddd5f530b09e6eb4ba31a9a95faa8ff5ef8add0f5247e50bfd2bb273bb3b8ac3663b0a793c1134b58eed1968b4762d440114069163705ec6917db395db93aa041f699d1df6e00e0261e887d3587db99b004f5a68e9cc71fa3150f4f5f6e770e3c9430419beb0c1c8ea38504bb011f25434102d563e80056d81beaa0216350d66ed33d46a46d4b2ffdbd019e15ff84181ead7c65b48bf0976daf67bda17132e5efdd31e226583f871a99a1ad786517b5f363fb2b33bf850182a5c81aa73e906bd7ee42f33ae0f779b68c154affabda9659f41ffdd511e5164cc70d8a07de83729350bea01e9de533a310478ccbac3a36f05255338d22218ab3f74e51ca2596b06a1c6a5a452c68a3395d890163cbd31177b1fba9877bfc4cac4f3c5b3daa4176df597a42788f4f969091d1de622638fa0de0968678e9ca5747669e7f204f8486ceaa3aba2dcfb9062701b2f5a14dfb826b23810cccc071836b3736fa792ef76951be442ef2cc77468a3c2042750f1cac2ee2282e5dd11b474e03f1279c59aad917cb2a485a241be9e0fe5455bed6b23bb23d28db800a8d05dd004548db865d82703206b426612558ede6f14084a18ab96b5ead1ab94d9cd4467d14d5cdd0c4cf46cfb9b45331b1b3f8f55713ebad93758a66f6731957f8fd2f5308bd99ad20032cd6092122d0d1c86164435119fa682d2f4dd140dd7bef669e455f88210fb6670d78858c0684d0a2d9f6e10a971c92193beab0fcb2d22422510161d31e3ba21ea70f87a13cd0e34e000f16c729b5dbe1025e76b8e45d3d1d642dcf8f12abd16f1f230fd51c5beda98a3b57c7a8c8b4a7a4b24a5b4465fb3ff09aced3b550142792f351592183bc582e4cb4b62a3820e60c84f6916254e74654200212aaf84d8cceb651705abb1113133fceddf2bca4bd265f293c8aaaaa5b27fd18980bd9aa329ba5f21a5668c3ff5aa8828f772fd943840686728f80beaeebed1bd906935811626a6c1c5cff87b78c71aaa314bcdb2f051cee81363dd97e1a644c9387d541e2bc7d13e2fe8e094548f3edcffc10112c762a46827aff51c8920a45dd3b220aadf67566ff8e2565cac68493905a4eb787a67e4d794943fd18c38b041488a7a8a5b8fe755b4336f4aa043da6a74bf2a1c176db7115c0fa829872864b63c2dc992cb66af3ece030754193332fffbcc5fe8615405bc5ca05e228c20058c35ed55d191f1d877bf23845d126e1f2c6f6ca5aa009d5e212f0b907a0a8c34de65f2fd041f799dbde59b30d9fa8d855b4013baeb2cca7ebd8d5d5f0a1cc09c6500aabf73aba6fd42a60b00cc19aa8df5488a7bb2fd7073ffd0f68a998ac3563f49723abb3911d991a47435d8552ff0b1f95ea05751e89217a015a91b9c69e6d412b421e28cb6aa225d639871c4f9ee3c8f849256153cca2c08d77f426f010ba93b0f0f8d2c36458ba5587450c4fd32a8c7e9d1f85cd9717bc7464abdd6617232c19be35403fc38d1484bbb1f99a0daeaa8791641c780ab2ad9b7c9b1a4811de3af408a1a42346669014c7a6f2e94af9bc4346cfac1122997a7b7784e955d22055b35ec78fe7ac210bb850b0195d933335e7c32a52f18c9a87575e2fab8bd963d2a1c19a97ac77b5c273762e7dde119156597733c3ef470ca113ebb835de4bab5d88ccbc6fe5823cb71e898f35a0f9d764531a70738f511519a720fa7a2cb68d9442624d8c73faaeb3665d528fc4a7ddfde3e78c7580b8fe16fac270a48f845a95a955abfd6fa54626f1a1ae35d4430c3a1f3e181b8c74834d845d09317d461b5de77199ed03c6c8fec9f3605dda982853864c1b47d465f7e9b19b9d982f3e6e07146b35c00c0b25193cdbea444f1eb17a5d776b4c2ef7cd57069170446316fa6795f38dde0ed6b03c011a136fda71a6774c20330f25810bb690271dc8195b609859cdeb22ee80451ba3ebe361159a699bcb713f08f64cac270db893cee3c9fefd87782962b9c220db9291f935e5e34c830df0c0d28979234fa2be73ea6bf835501ee54da79118254f2c9eb7fd49825b7e6288bc55d60dce44b5c35ed39e183254bdf7ceab858a67dda6bf05e9df0e8554b8658947d8f783bce6046a493ff562a7a0857e026d989a47840bf5175668ca22103f5e8bf8f43866ea96b81a0fc335a4eb1d74542739cedb230e1beb6b5ccfabde665a5c0cd4d93387ce5d9075d17070597f199b11ffd1b7f78b899c1a93f9882ccc2f275f7136e685ba77d9f6c7e5e836235b9914d96ef371d89b63fa1236c2d7944899291436e86700ddfa69a21a48008d3af2894bbd62dbc682244639754829a96323f426eca8c0ff3de364e340dc8548a52c2288ca409c1bc2a5834eddd35d3f9a7a183d6b81b4185bf1e7835ac6bd96271511183af7d9a69ed500d085b9c6aeea1cf00db4aced1cbfaf7bfe4e5eba3d7656e83d9a68c7e3141289a38cc700780dce19a55728e6993fb417c11147b38d5df83a19b59e4fa188c9ac704f9554f12886e511aab6cb964e9eb036f5502e667aec5a82f819a218c8b6b151c356198da0d9b685f11756e002d7b6072dd43c7a1d8be13a31e61097af739c82fd73020bc225bcd8baf14d5d8ef416d5216457d24cb59425364f1750ea1daef53facf869c41aca023d506ba6b5c86ef1a36fa763bd7aeeddaed583d98cf9c04bfb8b5aa8940f7e774516046998075015c95498282419f776de2dfacd6d3ed971d242902649dc418c2b7afe4e28277993fc44517b7d9cf938d117fb412fda3dfe7514e2f92ad4f9d07ebe06f7f6ac618f1700e599439c8aa6fcdb4d0a5fefae8505e596cc02599b25c7df147522b068e5fd7e4fc3e4b4b71e7ac9b70a2ffac641e916b31e5b0ad62df259319847259ad8c28e75583c9ea03bd779a25b21f4f7febe908802c0ccd9bd08969a48497ef1d90750fb75361676baecd60d6afceaeeca8891a3490152aa14b381ffa913934df2c0c5a530dbbd9c6b98c4ee860c1e77f2a93d0f5125c18719a7f86d14f2e54e4b786eda310ff9b40469f0f4f2db93f3c1e16eff5c2d82317fb3420d0562d72b8d79a16b6905743fc4d4b3989b296e95f04838b3e0b05366e0919ccda0ff50267a40baa3aeecfdf437d3458802fdfcf738ff660378f6ddfd030ec4c9f83866f520d3732e1556586f48e142cfb1464919a8b017f3d7d65801a547865e54d314e0f90daaac3ea8b92cacddace302b2dee4873c20bf258e11ca64f56cfecf121b65d4709ed3fc067d4148e7c03bd3ef98eb7f6871cb01b5ad05b6557c23372221479cd8a9f4c60568f950f4cbc587ba70da00921bbbb84488aeb686346c4601427fc58afb4328aeecb32b51eeaa178e3e6b2e19ec5ee73a173f3b32b80f50f6c6a42996cb205c1279a69ba37cc87aff547d4d4d9cd53e15bd14359fad159b92566298acf50347b42c0393c8eeca7df85d56d242b4ef5527427e69f7d72ca2585be7be56515971d58ae99bc79f75e9732c33b07844366e6e4c1b647880f8fdd500cb7a23a3a87a17ed60ecb805c52ac370c719ab27ee9a7bc4a84ecafbf2eb228331668c33df13c692a6fcd0348b8b53525380e92c34e0583d9bf8d90ea91f0f19faae3b58510d009b7694086f18d6335efe237ce45449faee74b316350b65c69c75c3e8ab178240afdece3ae444ef25e215c3ad741a82df07e1bf4e457ba5d96ea80e05550f03f99c481812e5c04a75d8ec2ff78113105b174d59ca25429eab585c54e550b3b90dca69b7fa6da2a387be2e29f92548d7ddd1f03a3558b6c5913185879e8eb0140baa197bb998fa71ea95a42e965fbba541667c51ed0b9b61e979e36dd309b68f761b5293ca0c49d17a4786c1a3610532b95ba4ec549f58c1e916e779bb57a35576737c493da4dfac855628781bdbc7ee2e44cb7b10035d399d671e5c9c76f10f5e895522f6683954306ed2946a1d13e7562f4b3604b3b2eb2ead45f0c113e4ba0f285aec4ca804381b268cc9f51d1551e6fe7dfa167e73569934ac4d12ec1f8d7fe3ce38f1db1890373fa10d320cdd3af0ccf2a2a300584d0ec3c2807d2031a1e0e997c8455af87ac082f3ef423cdc259f4357a4e7d5e802f85c978c83156791415ed9ebc6cfa15c097bfd6d155e31ff1a2dba74f76d95bc9d37c58c1d03d5eb61747dd7c90dfdaaac5ce36c5c39597e62e86e64eb731809c9410e718cd868cf1e79405586605575157394bda97d6a358a9c62da6449b8c46b41b2e49475175bd4eca29801dc1059cfef39a4f5aa7d1ef5b5223e08d14e3bfcf28edf82fda92a20da0f9d25e78e28d98a91bd3a7bcfab4bfd7fcc10d807479b00981be589bb07f1c1e0d1ae30f61123bd1e8bbc189d6025b59c95e334baa0cb004f4c152cdef7167f90c82c484a82caa4e6e1e22a753c3489a93bce8bf7abda0f352722b436aecdeb0a420167124b02bbb90971ef964489f87b1065fb8231f2c00cf59019720ae77046a0531cc3a7fcc6eedec288a123ca5d128bcfd67202ba55cc7de4e421b1ee123cf6eab58ef7a422a425486a0f25319d4d43dd0b0fbd2eb2055d9255de7f55d89b929a01df702bce2f75ff99a7f47d30fc60bbbf80653394cba515b1c22ed471166c3ffc713b5a9217af1d1c21b5dc89500b90bdabd685ae684b370326d501bc7bc7327589b78d21d3b996bda9b8a68614bdcd7c0d10876d580c2a48b5c40fa15961af78abd7a3af2518d25e1b3c926de3068b777a64f5781eaa74d2076e1bf84aa564507c478714fe94d274dcc6cc2337a1611950e009d1ed7b26266dd427419c8eabc89966ea8f87ff285bd9856b55a564334e437fc5545f867dfeb0b6f7e84f2a28cbe58ca34a5f30caba5dc6ad0757971e5e18b5c88a7545de76f31c56bf9742e7257f4ef0938acc353880eaf1ab57874f80f7b088ee4fa7eb18d21ade49d7f41d590d7f4601f025c2516f53480034f850836d4476f454b6115316461faefb8d790f4fe1fec8e16e2115331de23e82089a95018e8df1779ca6b013ac507a5bade7d77c1c97487a546c4aec08ad7496ba2e474b1bfcf0d91fa15b614764379b36a042a6a5862a1d3f705dc52c759b885b7359e071f2d74559c3ae9c8d1d03f7f2e1b88187bab5dff42fe712b2593036efbab5ae1d7c7c14199c8487dac50101cc08c10254c7039307900cc42627da90019586e646408a08b71adc5f244f07a9c59243ef25c8203fe6483fdb3267d121e1d5bd254970b013da39285edc34787dae8e45d3e3d364f25fb663b66a1457413360ae4d1f93c47eac5849afdfc460f10f058d4e0c704ed47295509c2a247f16f3a65d5053ff89255db1a7c27b2a5f54728478a403fa4330c1441226589fd91621d8f5ef8a0e0a65e9e2ef02b51073de092bf7976192652fce121d0848d9aceb5863fb997763167d08c97de5c7980599e0656a0b15aa3869784dd3bdf1f555063d7d208f5083099fdfa3e630e185b822c7bd3f055b461ddcf04751fc689b64c0c37b94e2bd534d727b62a9a8b0f82fa29b9a413f4c2eeddc44741572c8d0e0551b1ed884bdbd02fca221b019918e6658be5ddd62001f92a7c91dc7c0953814873ce89c938a08e11f55e17ac9cd87a43be2d21b034aadcb93f4b3db9f114ca94c95dc6b3bb0e7d1cacb9ad081db6bad68c89b2b2250b0629b76c2cbdc4b959343af904333524958f2fd03d607d47d639151381dee5cfac60281cda538bab65bdc3adee1afccb61798e4d4a5472a3b7619ce01b1b57ec088334f332d32e3d7712ddb0bf7199cb8e49ea9f82c59233cfe4db2fa1662e2cfa1d2b833a6a8700456a235875c3e519026ed14fadf14d1011adbcd26392bd706c50e67be2f92d423a238e70dacff8303e61afbdd1625c847b2ee63c119a8ff5b12f4b90093de3c010dbe90863f11b532a6ac1e32b6a56527db248a52c2ec3eedb04b1b2aaed35557adaa476ff1c09ebbb2994ab433e0ed5cd4e128b9a3072d129d16b19873800aa971090148d3a3faba6b8d53a7326233c53505a0dade681d686cd8ab46e55225132893d5dca0c98597fe18d35dad9286c516462421d21ac477e223c69e91268a53ff3f8dc783e0ba676ada03098c4a1830500e7860dcd2954da8d6874dccb49e770f468860f077cca0e5bbed209b675f4668ea2a3111ba277e165752d01aef8082e29de816652f8c22f5d12f7b4befce15bbaa1d69abc279e5476b7fef36b716c1c9f5d9dbc6a84bbdcc9b89ed6dc0af06a89b00a4ea4c0a5632c497f7bbbbbc1677dfb11f364c61dda3872805ee7f5167c0ac642a940021966480329055961ce81837703b23f18954fb6f90985244d1a714af183e3779e5ff3529289484c03d270f0e7204c3454f48e62ea5ac4c9293abc1b3d2ad70ad5a8ca59850ab4295033f769fe0fa5d9fa58b2e6ec356ae24800f7e2c28b5a220a73f3f16b8d0288b81d25b8fffca0cbb5fb5ebb8fbe4d3624cdd01a16e80a0cf9de693f32c1b9c8d6a2af2c448c1cbf2a80f4899c48a5d31e5a60af3cee6602a944fb2a5b237ed0b93e385bbdc2f95c586ef05e4009e19760639d107c04dde36b59f9defbcc02ac3399d709d7618fcbeb41745bda17aa163a22bb486fe18e2c30c99746d165aa6713d677c92c97ee54b5d254cf7a493d921490cac619fba7802a4450405c86a492c475911e404a8b4e1c9ba6fd3f8121a168e19fdfe8f4cdfe522c3b66732e6ce9546cf1158f7d8394e71231110a59b30fdeae6b91836bd3de35220add321ada3fd510a65256713a6573846a3cb71a50feacec4ce510cc40e61f6ec1659497cb8b4081af9eb46e9d313056aaa64b7cf3704cda540d232d55e30e1b5ad07843fe6be116e967b0ad4357c5f05edb2360c2a3f06d50c6bb4c6e0876503938046f638e551bdebdd91890e33fa7ed7f930500d2dead3f08b1b799c18dab6ed913e1981e352136ceccb2f30d2128bcf1bd22727d52f81d82349d1d68d441c75ac54cea3431589fbae2f6befbf23e40213b7c298429ea5f7ee52492b774ebfd0e45c8e6293b269bfb47a497545f94c06bbcabbc347b18f228109bff3e757143c793ed957a0f51f58442e53b74e1046d840dfe874feab16cbaef7c193c79c8d8b95ecb9e291400abc20c9aa987e1a825dffce8d2780f5a59f966822c45a60f5eb546a9d20e6e8d4e0669ef214134926e206a3fbea7f32187362ef377708358f7f6662b58eac83dfa0ffe348bfba7c8722f3d041117657731fe7477f9e8bd8916f138b80bb22332d5dccbcbf6fa98da7ae8e1fc4fc372bf5db8a2f9c1c189656fc44ef68f6ca0a13d1b278048ab1585e48ce7c55427dcda4830ab9306fe5c2b7f36dbcc5351241d75da09147767fc341c18512f24db15cb30f7fab473acbdd0d1d512dcde710c9a4c7900f5b8bc458966ce8ab48b3a6841e94220f7451e9d3d2fecccc1693a6346d3132b74bacef5bde1862b8b4133efe0ee62c69afde2e60f62eab510ca20a755f86d936ce845df1afed1e0a92e30694230b2e612400e12d9522995039edd0e7c7b8b6af3c1266b94234fac9cb4b29bb2f2c795e2970e816123a35d446b0b82af5ff995ac9a33a7b0cefd1a52e0383197a88be1b50a5d5a3523a4f65591eea4ab0f7bab00357b795b8967d805dc2082d6633558a68ae14f02331fe0a52f0cd48f52da962938436345db0fd26a13e3d5a56f15ba0902ea78b727f37333b680d96741d7d58fa30ba85bf9086632498ef21a79470fc8411718cd242b2c4e1fbc542fc9b43ee8b8b3bead3956bf8590c3dc8bb7cc646357e909da4e45a012b9ca15c3598859a4c44e73db8a4e6493147f67053d9e40adcfdca622db5992a972e65249142122c51a5c023b9d0734e54bb797de93d090c510e752da95cc1a398358d83659aa59edc8e4a056a985170cbfb51b09881e5ee633fe14bbc16a6690dd3ec26ea0068906e62223cca7e6370d6fe09589d9ed0a7056761d5a197cbdf96f62c8493d3f1b436d229430aa4cd18f1047bad3ee9aaf7bb030ae367eaf3efc9c963a4fde43c3d1df62d6457d4a862b3a59f7353f7568434a6bbd8fe78185a2e670381cfbc3dcb6c3f2eaab14caaa235d07f288dddee0872ea4444f5787156c1a4bcc707947867e3f250052a1dd51377c7ab30d8a0ffb1f5ef7187d99de5b0a4d2f15f9906a10bb919194cfb8d289ba81c6f27b5192789470c123effc57250fdbdec8fc4bd7ba42a6e436e8174b95f1b8fc254412e6dab4e6506ca85617e72d9bbfbbef857960015a2e48aad853a3e6e33efaa64de400c7303b4ec26ccc5ad9601755ba30f1d009d8c16790b1cdae7031eade30a75ad8484e72125cee0b685cd940410efaaa61151a693bf6a0cacfee567145439d858f0b2ef6d1f4fab3b56966dc541921199c7f69d5816a1ac15c3c179dae28b8b2bf847f75e218195ed246a1cc864b625d3a431b2a6a13c936fb46e4be11a8e596cf915ae11146d54aac537b088da298cf464a76daa3b13d852c84fa0db6fbd5ad178c48deb11cd2916bb9fbdacb5ef8ae3e87427c2810e0932b0897d3b42704d63ea64fb0ed6b31fb7bde0a9ab059856a002c6a9d095578523786e2131a32c90e83bf29c23f3b94b689d1b460e712333e0c541c56b7aa91fea48ca0b500ab38af3a89fa87501e9bb813310ecc05eda19b4516756a883a6069647c18a63e6be5046d4d4c8794bed6c7aa60e060cb4a3280d6e556b9ed94223c39cd5a62f96fa267d9a4082f1eb3eb6d95cd091268ae42bca13ad8cc18338cd976f1c71d3feb84b0701928e48d29061edc2a21db0c0f372e3c897373df1e60a38fcb2719890647c42a092b2af45fe1cda4b39488a712e70e93c9624d32f974bdab40c6e237fb57c7e75d96081d281ace4003e03da6cf2b158315fd6e17101cdc42614d78577bfa6388de450c6a6460565e896a7e58d61596e726d775aa07da2f7835c6741cf78bbb22b0e4c8f85aac3020f651c3a41d82f168b2d930483d146ec20a74644be73cfa46853e43954300cf940ac4f548271c25b804453b21420734ebdcbad99849d67fa38b3e44c057e06d4c03ffd80e26b2661c86a163b5765c7c1f617dd117c8cf06be56da762df0436cd64461d23f54ef114b67684c080c1e198097a6e6649f9f9670e83e29cb717a38cf50dbaa354588a48571d0c69ce94299289b86bf864040a9f4cdd8f75db9766d81f7e13e9e57b79267466e3b39f31d64d5b78fc85b1e4a75ed06442c8aafab416d9d2f391b92c1986b92c0b75cb3667797ca6aa50230c9c38d4c639f0d55ded8e3c66fb06dae8e2a4c604f097959697f363cdee5ae250bc82ad2d05a8486063f031fd1f507dcacef67034cee0462fd04e4b35c28637010cf0462b3dc2ce1c672b00fd2d3b48811f82bca6d30fbccb9d5fcdad2ff8a410a949756fe50bbfc4a6cdef1058ac060d8cf8e5080405247c76a86316614bc255840f628be04e2b4bd75fecb0c7de92ce611bbb89c9cce796ae7463ab98082c73ffe8b25e4496a1468c3e02ba09583895bc337847cca60efb15bf3fc0b2c42be2a21319e04883c445acc876d3c7a6150a03e98cd1b5e2da4f48c6b835f38e8eedc2dacdb35ff248a7f81bd3939ca1d0a668a224c6efe1bf77afaec80dd5b60cded83a3f0f6f5471edba4bb23cde00d55ba0c5fc081b8aefe09d5981063d01e0fbfaaba9eb81f2d7d81a6778d85d807b1542ca89843313fc69f8713b098305ec03a392ed23ceee47e3b2584adc4c324347d00285f94945dd59718b660d066e966d3f6cc792f2b1ef7275997b112aaaf4a482196402348da66bd848dfe31bd6b20b81624064f00b34de9acb449cc6ad6d0c0ad7272c3d0d6c44933a6526672f9c8c70703b86eb0c562fe12bf3455fd1940c68a48e963240db86eb40165b6e0f1d6e8dff5faf9d635b27a3a7e29b5007819fbf9719261bcdaefb390ff6d45ed75cb68ca1d64bd","title":"146. LRU 缓存机制","link":"https://leetcode-cn.com/problems/lru-cache/","question_id":146,"issue_number":15},"13":{"day":13,"pres":["递归"],"tags":["DFS","树"],"whys":null,"difficulty":"- 简单","description":"```\n给定一个二叉树,找出其最大深度。\n\n二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。\n\n说明: 叶子节点是指没有子节点的节点。\n\n示例:\n给定二叉树 [3,9,20,null,null,15,7],\n\n 3\n / \\\n 9 20\n / \\\n 15 7\n返回它的最大深度 3 。\n```","content":"0961e884611df7d4ac47a79a9e3b6f2d75833d84c0a729f060673f60565b7c085684842767c9fc0e2909b27d2085c35aaf331fd4cf6558ddb829ee2dbfeef86cf330246694d98ee31b2cc0a98c904e303ae5658f99b401d330bc35daefeea38b1420c60760a782633d23027ac0bb8bfe3e5084cebc872daa14aaf2af55da70ed36d5025cd7e38af5dbab57ad4dc62b58c4decfea5840465bbd48aebe6b22f03e5f7a132669d6ed2f5155c11705df105930a8f6d97b051f63af15e54e6ff61135598f483b8d875e936a9e51098e6608728235c56f7f22ab810a5e86cb302b739281acfd1594ff57eeb8134190834c4c554e4275a2cbd922022024b807311627a9e94b88bc9f9a63be404773e144fb5564e7d99427fc309a4685d1c93f938855a65139f3824ba4e6dd24ce5a7244f27529b1a07330d2b75da5cd4d8b9e66e52180710c92c54b082d20a7e40fc1b1845fd2a6e7acbbb7a6d76cb12ad2b339395a9defcc9614a2df13d13b0157673041e4c817c5d13ba2703a303570b45b8ba5941a768139455a67dcc373be4eebef750527a63029df98887ab5b679e869b7dda8eaffb73d1f5e4de439b38f2756c6efba04c0c98efddc3aef68230e71b76d51a382b71385c7ed0e856d4faf3f576f605713e57e21f6bb81a8eff671f8945b0a2d8b4dbe0d315ac5d342ce97800f15404d91cfd2b070c7dc68d1e74b816f9a8c6696ab4747017dc810cd5efe7e9fc0d29a492ac399f19d6660b2082f8ba487bfdec326c0c3bef288352f33435acf81d439b91b4469521efb60a4ea60182344d6465e4e7c50e1be9db2d73b240d1041ff2e466bf663fc412b9223f1e9494c9e2cf051deeb7f5aa7bdfaae58e8b31da1f0435df7bdbcc2abbcf8ada8cf05b894f0a2c08ec6d36945b85f467facdcf25d9a5017de5215c05ac162f633992f61d2187108b56397b061d6cdbc623d5f26a6dde6a452ee9d03f6517e7110b6778127cc68f78818eb590d54f82893a12c5cae62a5fe8543486a1850d2b59af877d20b09ff212cec50cf17350682cc43521d6b4d8f78003107edaf187a5024e65cb77362a3d1496c7ba899be1366901dd18c7d8d3c0086fc9eea0cab204ac8cafb943e60896a0daf75137e4fbd65997e8127ca249a5d232e9eb3185626cbd4c6bf737c2e6368574b186a55cba19a2b726587c6873de35b32373a0bc5ed56a84e5d974ae004a1d8c0aae39481e80b9a30ca99aa931c8ff7edac150da3b96cc857ef6ac8a6cebd6ce1ff15a75130d2e171abf38e3e7a54e8e6affc1f4335a6cfffb3cadfb099c2ae28dabd5d31bc43e75815d1d82bc8c0df138c0e44ddccc692a2148c3c21a16dc61f1ca429fbdf145b78bdbccbc896cc8c89eb022af7fcd4b1da6d9a453cd63090e7ff877ba89afc8eb34234adac7dbca81f978bbd35330bada2260df9946808f798f2c1060cacb44b8b008f6ad32dab6e401e45d05f178c9c61ab579bd62d1814bb5d6be64126efe2105d9dd41f2f5c3dd192b5f9ee98c766e773686e27ec844ccc3e487cd4a36837fc0a80828c29e35b562e2fea052448df6e30e3c7d21cd1b0d1f20a9a9d1e621602dd845eed274dfe415e45a02c65e16d70ece03d84997ba6197e6b072faaedd99e05a00a4e13407860f70eb634aebd84094796772489652e5b67753e5bb6e97db8a8b83b100a06b2e54dec8a774c573b21d7908e7884ba4a16aff965b3a2c3155ce3d222b1152b9407daf376b209742c1fdf43bd50e1eef36664e62454dacbd5a6c88035048079ab11a8ec9828086122d55b7d308e33bdb0e86346a984535c8af12aa5aaee244490ebdf611c5ecda6f8ac472e51082e91b8720a98120fa4448c28522f25f9f8f16936587e0aa1ae98531629cbfdba0ce265c4792d59f8d6f8f1cf8ff85bcfa7d20e8503dd16f455f00215a8a4fec69adf1367b221b6d2c65bf099af23dcd9173eb25fcf6b6f9c61458e4f9cc6e77b17a95526fcd9642d8033ec55b921852e85930b67b182c3d5f8384491e118eb77e656a05d403dfd97b33907f3f845fe9407b1faf22e878008bf47a4eb6d90cbc43d4ef877721a20d14fb6ac0b5de924c748ee6b2008e53d54dba0f5e19cca5a623ff8f8b0abe373682f17c4f7776da357e0cff6fd0d49002af23878ecabbe3cb71c1bbc94ef31162d42bdb44db3300211823a0fe552d6c14525bacf5e9a7a18dd65c97d3ec4a4314670b9219b1f86b5622a61805e410676044420113320ff1c5052b600dad4099ea84b6b3819e0e288257549cb82437b19c3164f74a0aa76808414e89cab9923931a969f46ece70ba7f639c5fbd9b734dcee9aafb08c006941f8de6e1994e45a57248c73a596e7aa91d821c4727887445818538a6d9b769cc6de45f254973d36ea2a5883407d61b7fce865822bb12d01227dcd27fb90523d41a157e83b55fec73ba9e5521389b9507c1910c64af15726f9f3adbba102d73804b7f6390667cc19f7626ac2f2d78d623144fc509e9b8597df76514fcd8f4976bc31c1f72e9b91a4e53106fe16c9115ea4f5c6c95e59a6e8fc31114e96486bb35314109a40f15679709b97c572a3809fb8d8f2901a04dd8ff013b625196fbc5ffe67961b1339b5a83ca84618ece0d1d1ad589bec99a4366dd3b8b651a0bcb43296ef384de503f64f389db91bec9721517f688270bfabd5b2a5e9e39e1fa4a9d3bb3910f52e3d0b4274129f5bd0acb5480ea7e36708160a57f45b90dffa50cbb666bc8aff3f5131c96d10b5dbd8717a3cab217285a4ce5f7c90de9459ac8d1abbf8fdadeef1d34d673454d160c6941e1c5ab0bdd47b0d75094d822030ed903b4b132db66fb3d051610600553835c193d31653878ecb0d73e63def4eb1a024ecb7bbbe5422754907d1407a88a6469a4184e53b9b3b9b88eaf4b95322097651e44c8e051ec51471a9b3aaa44551ff08d0578fb8be06de2dcaf17c4d6655e0c0870b6efdb4be30977a6c64467b61d8b281a8e5a851412b0f49ab983c4bce4aa01a6f380c98ad7515f0f59cff9349500fa21e8dc07e3b94212296d3cb282c0065307a1d93f69a36357166d126c028200f936466f31145d449f765d576a4427fae99847ccb8c8da27c6a595eca4737e2a53d9e7d864ae4e409ad9b3a8ed5abcde79adbfee59f7dd3b211c8868299ae509a5ab4b0c95191e2c43b7fa443660d1d8b044bce494594bb81ed57f60aebba07917cdaa3bde043e8be6e909ba41838c3e828c747fab20f58416f0740836f7e554535e07cdd895e442573049f42c8dec7ccb0fa7c56d3ab1cf288c80926971784d1ff6093910f4b63051da5249c349bdf61049011c0dcd1e259d5cf8391d645374cef273da1c3bafcded9b319da3917d43250b1829762e4e157c97e4a1fc097c0d49eff4e4cb9125ad86ebb9cd1da1a8e0f54edf4acd9558ef94c1e296abdce2b6dcddd0f9141107e86a9b6ccab491edc3655879127d1d41867d100fe4e7e3e659bc064187c58fd04e0d02db1c2abfbd66d68b370bc612cd0bd2f3a206f5012308043342c433b795f646e148e972851d1f81ad9da816a70fd48064d042ceff6571fcbb44afc9e6e9fad4e6bd9f13a8087461923360e80cd805201fc3fcfab83570e8632b6312cd9dc673c5661040b01370e3549ed3c7a2a1a7612444f647b11861f20f275b5d9f2699a9ec1be5753fb32eafe62b7ffd0d19d29c9bdac74597527a096a55463d239a22a588f84da76beef8e75da5be00d77bc2344fdae5c2a3fc21344db5c1a1cbbc032088d60287363bb76e97739c02e7b4383442c858be0cbf6f5e7cee7778858ab294c766fd520f432c5200f222403cdde85634e9680537e3d70aa0599301bac782419f0e502f2e790cdb891bad4ef75ba4a1e55b07625b0df6d1296af9bf6c0cccae359cf295452800b29b58dbff5ee8cebe88621464320c31f2336254e95d47e1cf69d82d950f14dcc285fcd49e9230cd6617bace23923b1c186a06fa538ca92429b8b291963291cada7cd4f8d0e780f27d5f768d407ad253a8b62fcddb79e654afa615da8310e84a0b45bc797023bc11886a7ecac26ab91d39a14d3e429584a248f3eed76c33a9ba0ad600f6459c4d757509b51fb0f52465d615433729fa3b694e697a4c0ea7b2dbd0248dbca5dd95b7734d0d62ec9d06c788f159be129f85a079f9fa2a388aa881e7c743f992332b418987cf76c32e32d5beff8425721d8e69393aad18ee6256b566b31c567314bca4c2611494c64a3bcc894e279eb7b80e15bb13f11d4607afadad4a13fc12b998e3c0e447f0cb53702efeaf6fdb308db9c5451f6335530c4b0c737c621a43b8141b456aaf232098f4135c0c4f74ff62592f96f51522a1f52dfa35d9292efdbe1f5c4acb30b42418a5dbe00e2d46aa57aa5ad133b2fd1bc3ed9d0bc131826474e196ba0e8a2d85d242d673bcd920903b07bceab37eb61c4a8317f7a2e5e45200f3483f1f3eba3f5daafa7715362c8f1cec502bc252efd3dad88f424cc1660efaec5ea688e4d3734f4694d4fcfe3d1e1aa209643b86de7048e1841cc5d85aa5a6626666e90b0ef1e8da181c66eb8e1cf212f391bc06de34883c0edf33e02d1da314b60b89c30f8253225d2ae56a5f83f8f8bb881e9632ffd14e84598b21a825c39c2c8164a612ae5034fc6097ac73279a9fb325cb6c204930b699e3a9f461d5e725bf2b28442bda53dc670f5bb4453fbcc564ac9c8d4a8e128161e8ad7523103c1ea25cd4d59371aaa2913f050e626b07b877121c4338d965163ae4f1690a13ca204c4eb24e0776d91e006302883615e21810b03d38893fd8232b3d212a745c2209e1a4a8132327a629b51e56af099cb0d0f279dc52d5310f9cb6ecb03b0a5f3a9a88b1651c68a9e653fd35f0a7200ac4e8a186a5db1707b4b03295bb95d51e53ab89c414a733b7d0874d7a48bc25dbef1cf8d3f0dc6ff79f596499e4b4c0c136fc0944930c262649cab94277b74bdebe802d2950f32b6a11bbc83e5baa394e1b39cd51202d1302e8439","title":"104. 二叉树的最大深度","link":"https://leetcode-cn.com/problems/maximum-depth-of-binary-tree","question_id":104,"issue_number":16},"14":{"day":14,"pres":["递归","层序遍历","前中序确定一棵树"],"tags":["DFS","BFS","树"],"whys":null,"difficulty":"- 简单","description":"```\n给定两个二叉树,编写一个函数来检验它们是否相同。\n\n如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。\n\n示例 1:\n\n输入: 1 1\n / \\ / \\\n 2 3 2 3\n\n [1,2,3], [1,2,3]\n\n输出: true\n示例 2:\n\n输入: 1 1\n / \\\n 2 2\n\n [1,2], [1,null,2]\n\n输出: false\n示例 3:\n\n输入: 1 1\n / \\ / \\\n 2 1 1 2\n\n [1,2,1], [1,1,2]\n\n输出: false\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f2294143385f274563c504b5b7c0856b8952d7fe710b3f0987cab7ab5e61db7220ad3962513d4f02ff460b3e5f06ee02c656797d1cce04630c3a88cd0496d32e132ecfee24fdeb279c2492a7dc6e71462eb2f52dfd66e0b173415e7914e7d8fbc2e6a780a7a3aa062684d198357e0f19d2228507ca3dcd861edf62dd964d247147f8b115412dc22738abdaea2845c60177a0d16a1f066227e4ff9907f1c5e03aad6db7a021c618f10e86f51f7121b528b6d11dac80d03d0c72e37c1202b18fe1f9c356b640b668ebd77c0313b7391b1aef51097fc70e0a12645ab98a3c5d24d4167aed0f22e102e25900f32152f4763c541db99ce3a962d21517a8e41393cc5acea169c6f8026d4fbb247b0ff0b9e136ef7e60a8590a03aa233533b975768eab83e59e5f60293a616b5d813fb68f35772e0fb28601365daf5639ab1e900fce7aa88d0ca949c1f97568e8a4f5c6ad783f2f375b88f976bf79efb661255e7eb34c5c61baf421fddb4bc3cbb02a7801c7baf2f445571dbfb5b50fe4429da65639e465dcdf2e049cbec4f7b876f3d2c58b2e923471642b067aece795fa2bc9c6daaeeebb9f679b57c6a625ff40d70fee29179fac78aa0286e5e9c3c7355676f350bcc6faa97f5c2fab836d2e027104fd844d1500c0698f9288192e4602e112b90beb28a14bcde398bfe19e845f6c66dc6c4552c645eab6fc9048d42fab0e5eb162b82c3cdc33b44d67610cfc89df7bbe178b0e3d19590bbc65b6ee423fefeb97d40401d17825182248039097f27ebd398e2db96733f5b1f7efea9bdd8eb5de9e4e31bd958898130e453708aec3306a6965a71bbc40c7269140e0528a4647ef9996d11797f027a780fa8b416b48deeb0d0829bac0f09b4111333e0d0e333874b781dddc4e670c1628d2286176dc165542201d72475df4cd7ae26450a638c1a6d3e960c1c03e44b454ed828c453a881ed434da3559c83e63f92376790fc6be6223803f88df09e50c1b55958d5f84449bf0b06ef53cfd29cab452de795a2ee8500de2a1b0aff66b8c895b954769d7061a317e9c39915169439a010ac1636a255b2aa3c4b102f9203e9917b030569b5980dbecd00967b5239e570c5d904a42ad20ab8abe9df96460e31a5904d0f9ce44a3b5b232927d4937b1d5dbff0a32a6f4298709c8893f597780ef5358bf2188e7b81666c47633f264475b95c8d4f530b55f9135b29348fc93819a843ff20f6668ce478d7612a8d3d97a2490dc92437169ebdd345541e42c8d2961c795b757f3467385d65a11451c95de15080372f671fe41e4814c860feb85a726e5539b48f1619a070f91d3c8426d0eff7cdd575f3cab3f2fcfb0d40c74af098b88bb318922053da51187330de7ecdfec8c5c6645cfeaf34c3826cf388d56d015be4bb518e7351d7a1f982e4c1160e401ef941a0126acb1fa7616ff2ef81240defd161cc3f9591513156d05114b0647192f371348fb3472d3b66c9d2e3e095faf6118466293d0ba8da479b627913b7b10f80640687928d08ee5b5917c0448fe10fe9186ed5b28c168feddeb642abf4716c516bedf905e34030d4240b47d35d46833866492f91d529f163637f1e591ddf95effb51a18882707b1cf252da16afaea38305518a7a0497663d586464155685db759ea0b51433043082ed5fc1874d63541e21dabab37488bc4b1192fe59ab406b5a01f98d6fbc6b7f9e5190ce11cf231c6e00af1e81329ac8932d78b797f01fa5e8d2b88d4266af12cf38e38b808c0b5434d9437c3d970ebea8ee6e6c9388734385d001aba9ee245089254f214f62ae3f73ae4c3c5e373d5c0639639a6565b33ff526016103bd82d23350502e49b0c7fe537674eb88098e37f16fbf4b549b8eeeba8abba604e4d88715c36af3689b67985c06f5eff0adf3f571098354ebd7a71df6d5f7178fbe037ecf5db82d76d60249cf32839ab8607dc56c4999d4ddc2c826bd29ab57f315c7e01c36ceb245015e898de4e162a84b9329a3022f2db62e2e3a22cf34cf88c635ccb1d26cdbb85627dc60b776c3abf1570be1340e0865b24dc3cb0f20b02f9512f52db19c22a5d213fbd7a6c3c033e2b7f7d5a4a7f349681b01caf174659d744d065e38f0a092e20cb1d187f1aef633ceddb59fd297fcdb629d1d9e1196ecf20f7b0d97e745459def353be90a8eda19b4000e394a41e7dd977fe51fb70957a2a0b771d9928abbf8fee4d8a020e23e021db012d31fa86c823d253618766a06bbd1f30e06c4e0eb198a9f8265198a4512bd212a744b8b2bdd7111834926896038a82b59fbb7fc5a4f52783d1fe7b641a3cb21568abe0516a013cc67246d632656a115b9fa6aa3e9e5990bfe4ebd752b50967d9160a07ae9645ec50f2f69cfb5af2dd66be29bf2c338ff7dec9a153941bf5be927083d5bc6622aa893657b9ffea8d454dd1f919014177b3f138562c4c33a26d41521af901389b4717052439ca6b346d07278fcee990d4c4cd78f093936b345f76893c3afef2308e50cfd1847e881513eb751b3a5e238521ac81e2e8155585532b31cd7eed00e146dc354561d450c736491cb4c2ef09561c79ccf089842cc53bc8939f5f07aa3081af9b88997e44490a383e53024c5eac858acbcf23ac4a07719eb4fb35b29c0e5096137f72900e800e077346c7b0245257fe8607c1027a6f831f9c2ccb3be8f3eb9cac0b58eae0927fea0d384e933f5525d14a15664ca1e5615aaac940fc5a1714054b4edfc29ee88126462c9da765b42ff750a9d2f450a2b395e55b385f3bd30e53c3a91de8b32503325752e4c805c90b51173abdfb9ba1092320d89afb9c4d2dd86564c399fc1621b10fdfa38c57bab5a6ced4a224d7cd5d7ca8eec7bddaf70c4388065c46dfa34d4546c75150bf5f0fff405d03029ad9838d5ff7373282ea437949e05f53a494e9a2ad64022ced3e4c5256f119eb60f305dd1509abaecb09ae621240d5b2f2680a897c2b82b2bf6199b0f0bf8b8b8a34762d5c3889ada92dcc98e8c34972cb17eff0fa2e516720d9cea80c999e581349bc32c287264c2ef5a841b4ed838a921e863eb8f6b9bf352813a1bde948261c1d9a7c1332e1c9156fd1d81a37dd67ddf7dfae423bd913fc0c0a384f9d4c6a5aa8328defe5a819a869fa2028008b7b4854c9bbdab3555e70f275e4e8b3e42821441d3a28ebb7df717ebeb4d827b96e7fcea62f9bb689693b11c38d6a133bf08b5e61558353d4257a8746f420235a431ae815d554b0b41da4a98d08b89f6e73656ccea04b79cd34f728b11d6ddf84680924a2f1b4058ad749266d2987b15c844c39c83ba1e969bc7cba44d6409a33c19b1a8c8d8dbc9cd7bb11b289b0511b982cb1cc7ad17da785609e499cdcda9e91e6bbe565dc368a0dc83c877960e1fa897af833fa4d3265f3d64f2e16460dbb464f644246c89ade8f9d34f17f32a42c2e868cd8d4c5acc0bbb7b1b7a2091c065443e4f9e47e09963e5c2affc8e017de339e96916d7b426043b79151464cf5d60385e601d0a282244dac52151cafb46dec7803e24b20043187b60a3ff0c35cbfd0cfc963e9fb0536b97a424898347196d30189bb680531cfc719ae7cf5a70d43bb663698d893520137310151c72785e1da532376b423719051f503e40cf5766f576b6dda877dfde93b70a53ab6eb2d472abe7c88d9d6f86bbe772456021f4d9ed183b97339300728f84da76b180870ac855a07750c80605d2e1057225b9341acd5d1c4f97c9384bf413633e469f65fe737c9078115d834716c6cff49be8ebedc7e7548854ad49576048c13fff46cc2b1f67364b81d1e6240ccda6056e626eb50d861c0af5374619ede544fa838e82dbf4b494a70ddf0f40993480c90d7de1ce1062611f49267af44ef80317070af0b67c6101306a212d0761b08997a15fb53c732d20c1fab180081d731ac627c0a1070b41df3ea4d46feb80504ed6d1222b1734957aaf647c2dd0dfe79cf9adea61060cb21ffbd298f21c6cfa3c4a8565268b6f334a1b4adbf663e2fae8394e6a124ded3726a6ce219417350376e0287221e01493ab68ce888639eb0eea36de11400b110f370f859bd8b33cb36c80786cd18784f589533f4a557040790e1e98ae40e3c22f09906291fdcb2810b23e3fc3f246a93b29af59d6e913584661017e30d99495ad79e5b82c8244cd44aa8c47eae0773dbbb579d86f7e5138671e20e89bc9b5d052a8ca8526a7affdcb9798603d27053ce347b41c4d9e1eb5d8218ee67c29584ef3539d0948f1fedba1ed23ece522291b7741a0004084d006e8999b68777caf039108f821b1db283908cdcd598ca86707769227ec3214e3bc93b7aeed110bfb4c36511c4f655c174cd6e48003bc39ef467860bd7ba689273b09dfbf19d0d08e22d783dbadacd4a3dba0d44f132f7716cc950f009d6bc497342981780ea6d8712a7646060c369bcd343f07f8fa8aaa5f6560cfcbcfe412b93d0312802b8be51ecd0660e98acae9538e4e130eff6d5a8f384b514f3a209643ba73e506b8108957a1441120fefae1a27232961ae9f396a13280929b03764c0c8b15c223f0c7b6960946b1f3988a870d5b59e5486e12b836f2035b64d6b7ecece01372cbaa86110e7fc58956392f408c8fd7baee0460c7045f2baf27e0f64b1db6a475b07b009765ca4fe9e5ffd3414b7220d8e82dcab63673d78342850cff67657b55778fc0e50ab7414fb26e6ef812c0be95897ad9d535825cc650fb5d85a33b9756208ef37ca384646bba258f5141b77ee2c10f6f91f4f975f3e3e71cd6fb5371597578b76a4ff6308c51c326a5c36cd1f7988dc95fc64f7a4905caa9b3203ad58ca74c0cda148e616f7338020cdc826c6e47e7c9165124513debdc4a99aae62ef6838aaac3823fb1912ed36e169cb03b501b205e110c3a068a77615379bfe91a57a4101a87478cdeabafa87f7de99a04d2941e6b16aa9e872118169c1675ab893f69ef475f541c642e4534483086cd7cbadd4978dd190ccccee58a96a34194834b126a75cf680813e600aeb1c4e349d212cd4d59aa73ecb93a84c7bd5bc2f1ca2776036b9a155a3d1a38791279a7674fbc17df10455e0be8abdddd5a1a6e3550bf322311b4d20ffa9f30dcad3359de64220f09411c33036346c0bcbc54e21d884141f23ccec57a82da9489eda54a4ab080e4c60c5431d5f6f5dc37709b861c54d55943528cce08b670b91f6ad1e4c013f20a6b2d8342d6d17de15adc957564e3bbeaa7f59cfd0e1e43a615e4a59ac50c7912bbb74671c434bfa68f8ad194bc9f91cd220e3b751a9d64c29f3c962f1cafd6503701b55291cdebf8f56286898d215c0bdb0fb07b59e15017e7cbb26dddbcaa7fb824359aa7ca068c9b5901c7ee59bfc0202c03b3b0ec25206c7c245e9ef62676da4800ea2d22bbfbf46eb96cc554f34d15c0a8807c75ead401d3a8fe67ea78085869bd6dc48a90ae44f4061a60a122121ee169637f3889a96981524619b7e2a081dbecaa375f346b0ce85299b0296c255ef326536a2b9cb029f432cdd2014b4e92ee09e2c6ad1fb16eee0e633c43714ec08865d8b5bbeade5324464ce6bd1c3df04455ccc674c283b85337c8506e9a83b4d6d737bbb0618bd52b3deeff418457be7c9f03969489395c4b704e7c45c16a87a82761aa167f22bc552674689472f3c1da86d0d473f1fa1b8f31ebd70c660ab0d7e7824c1608610f885cb9df9a285e594c66232eedb65030c2d858a481e00d721d98044f3387c77da2f881075c02a765cd37d015fdfe503b899ba5c90924e5bdc3c1811a11e5d1b38726e6360c13ef8d51d4cba0961fbf426e25bad00519115156e8feccd873ef069deb72bd503942328ed7bdd6580d41691b376844c5d43a924c59911601d03a3068ac0d0f6a09bf407a86d499cf7b03491647661e2c1413edca30f485b8761e00cca768c4634b0061dcdee892801ddb6096bd8b128d651c33df12312428f218991a891d4ac666219c1cedda0f3d7b05d49431c63eca2268b17a4ca0318e18c4cd5fd0373f0d0f393c265766f50be36cbc088c6e367338ca5836c95908c449cac7a4776451b6b9c9f78eae4cd123e582ec44c836833cbe38212e7ee9b8b8888269ba71819117866106a5f3369c458ba8bd5e271433b8033a19e1464bf604a09369fa532ca828e3db4f4534becb87efab3014fed42fb56ad2b0cb0e27b7ce995d6f35edf994ac65eadcb50d14d951650d0805ef7e1d89af5aba52872fd40cbd41a93546f32e7f8ef8acfcb9c2a056a6bf199bbc549d46ee490ae48a4d92467937816c870ba4324a3492750deb2e466e7503076329e5637937bd8aab8ec336ef507bbf069b727b7a70b7366a083d8c0093fa4d562d250b4a88c2546b1f8c285170d6e620a43c9731551c43cf451e1932e1b35a216357bffbfc9965fca33166ff1ec912f1ff367a15e911d1509106121e96ee0f4caf983581cb07b75324224e3ec089555820a3c69937e87e361b5fa144909ad5671f641d8c67d839a260ddfbb5db29b2b0e7316be2498a58c11c119e8ded2d6e0538df9413159dbcd7ef22ff9eaad754c1bc8c7ad561e0e7148cb585c5c2c5d40070b8034073b7b6fe260085aee970f92e257745c6966fe65a9eed6165ac47fff8909849ef5f1b6fd297e3f3058f4e7cfd6c7c25bb8a8dd8acad2244364bd1898f352317a934f8c53f90afc20ccbcc039829df3aff5178e66bb721daaa3da107a6c2688131f301e58bf2feadfe5e827d328cb8e1715fdd4ca9e969ab9e1faf05f6e3585746ed28eb63118d9cfa6c9d8b69dae537d18493d9cfbb3a8a1aac6db3080bce000ea2b36f7c44fcdc8482bea876f0cdf5abfe1882bf670c502bfead3ec6eaf651b2cbd4f8b9102304ab82bdf6468079897316355b3e4640333e591b05a0bccc4417e7a416628875e3e162c1dc539fa1ed817fd3ba1d19cc481def89a07d249e295ab45235c3125dae2b33a715768a89c0f5e9e1464b4ae8ca988af9f124ddcfa119a5f4708a35017205ed8475aaff72fa8778f7ec477101517cea954da0b0f6f6803efa805260bdd4281a9c1f05be688d66f6cc624877f784f81573dafdcfb3ddf95757ef5c359f897aab8a1fa501e79752a96cc909ae1c1138cae19b1caacb8caedd889a30c183f6f721decfd395528dbc43662aeed59a13176bb9c6c5327d2f5db1944f7222329504c2a197c76a266f2f30c69a659c394ed831cd2be78b6beb8b95219582d788aed23c00b0af7ca91e2d201e18f76314cb4309f18a90d517ab839c7a28ee3406f58ea8f26e8386ad5d28786a4d0c681599367634585d52103b2a30c9a7a3f1ec4ef54913ea3e4f0d8a91fcdf3b005fcec72cc50debfb34e683592076f5155f248a4d8a52a5002e26f104d8144731ffda74707de4e6f9886aa36d2faf6f02e465cc501c27db810525f1a1e990e936a7c0a0a5c78c8ea7696106b11e02a53e007e796f83b30205c7e8bad7ccedcc734f6e14a95f9e6b639ad64ecf83078cfc6ec56acc38b0ebc708ec7bb42bccaba9451d5426412d397b633a3d857719c8a66c3378ce995c6a26894d4f49a4e573a509d328f386420ef97a9676629b4fde54160a92e22829d833f62628c58103f9c7d3a59c982ec9b77dbffba00e6d59874927aa8cee66ac3999c15b78d6a0613250dfc4ef0b7352dbb446df9cb92e0569d63c5d6360619e0c41063310e90dc9b035652442ca528f0a4e4c67019e52ab4875360ea85173131fc8171f0d3a3d01c046b5944caa5e154285fcb0041e777b6f4cba8388e78cfb6d296ffffaad33e129a7301537997e00cc27cab330640e049bb9fbac6d5ada25aab93c7fb9f973b9d5f70f7ec09bc2885e1aa7b0eea0a734389c552b2bb5a9e8a8703abc71267bc948b0a9b928335e47ea8e8bf0df33803a8a7f5dab15c7bf109e536dbc26e64037365bf2afc30da50ba6ffba3671960f07336fea0515a482f44619c6d6f8ed2b0561ccbe81cf7f1844120296cf12ef0283a86dbda8f212a8d402d30fe762f5acdb7bb1dca583f70afe17f44b798101871f4712cb7a8f4f687ce6f7de9264b064577f5fc7a28d4bfc3dbbf0af425944bca996c2cafc05fce3ae8da6c36823a137eb976f3ab8140e50dcb34974f10edcbac1708c08e7ad0d9c50894647d845643c52d90b3bcff365a39276928f37e5ec8ae3fcb00dce573de228dacf1ea79efcf161ca70244c1f3573aa10ec9521df0aa714538f0303613633948fa2edbab7b28427dd51320843de241a7d9105331924969f9e456c4fa18f2b40543722b430f52cd17a3fb182bb2ed080a86b815d19ed2b47d019f9e623a0a83adb72b45bee8ce499509e9d65f77558e8e04f045a8f54e4ae767ed9889ecd008f3e37b0a38b6149ba1a51c74ec2cc039a10595f3846617591d4a1d9cce9fa5377137db70d000065b80abc1fd87ef7b54d8d4aba2c803ec1a9cc7a86d10a7bf1b6e8bd626f20e7af7c7a64c1ad24662ee2adcce77ecf9774d1ae5c41d9d5e08684a2f62323aa75866b9b2845c06b522c18453ba1d90a4fcbad8aa2c03ea654550e67456709fd7a43396666083e726d887e73861bd4814cdeba2b92a5e41d7349918b0d7e77fb7a6bb3f3548a9bc3b3d554fd2f5d6e8044c677570c7fd5defedb901917651af1f8ab67043456e5ed402fbd767cc8304539b1fb9fc7e7e97cb49027db856f3a8e4dcb8a70dfa13110fb5b72e59bf0e968ef818eca07fa3a3333145001ac17659cf26e3df1470e5d70ff44516f065ede7164db110ecf8713c29273a89c7880d13f73a879fdb1eb3ba219bb7d0096d748a240fc9a8a3663460675eeb7249760ca9e0072de63f73d32ba82c5bda06063cd1b81ca3014196951040ad3040fc427c2dada7cf0d727f2908291682dcc3448b215c58aa25e75aa679a40cacf12e60863da448b66479d1b87f3d8d6226db4ad49dfad14595488afdc96dccbeba7ee9a8b9b9f4b679f2d11c01682d97eebc4ca0823d4371ea4072ad765457b9596925043bfce4a6672d90045a45d048461de7776aa0486ef94cd21da7bb5e734172daa0e8c5e1c2f8b6288dc078391c96b137be8bba0fb49b8e949ed2759e5a446c102927fdcb533591d7031507b6e13c2fa621da48e51d26fe0af6ff2605f10531855ff19c47e9aece125585d089b959703b129cbdfaa97cd388ef1ee3fbe8648333ede30562c32292c5598103be29ccbf8f885ffafc8f6d3db3a511aa564d57afc6a0b08cea23e43539ddf793a0d7fec972664b7f364f1ce15a83cc8ad61ef987c57d5f6609a0394ab4e4b6d4bf3d8724a250e7e3fd655ab6d4ab464e78ab42b8d480d11826d32df4edf6e6c8b089b90c89fb0ddb0328b779dfa65d108cee82cb24856e3a849ac006cb257a19d52fea16e211a0e2acafc47a85c4e09c53024400d6e2821f0c2a1ed39b5bf15cf5704bcb3a5aa91478b7a9263336f682688cb0c79d5546f95550a3edcb431975e06a4d2731243541371293f5d8a623e6fd17a7e3f44cc4b5d626a0a1d574daef8ac038247eae1df28fb71cd740a885feb9f58e4e3981850f10aceb6d4537a5e06989952ae03d95194de55065a778bbb59777d64d0855c30bc569b04eb0bca3678ef8f78e244e030fa85baeb63787bc583a4146dae55541e633f8be044caab08fdeac5f4da5b6a2cd8d94698bae282ec9c10eea206eed04304dc08831bfc19aab4187b6b6b5343eb24a18196b15692acb373d17eb658dfc6b43e33a56c810bf28087cb56bbb1dba7a04ce12229ba30511086a8c1636649f4393391dfe9d7f5ba836a2bd34cfccde830274daed648c4baba043811e88b5ce6b55637abfd11f7d22b1f8c2c17fa81d61e8f365ef6752bc8f38c8c2f1a9f584a5754847b721c047950782403084352671ecb708cbab3b2e94d21715da38991bf538ce60e24c78f22d4f2d3f5dc8cb656206024c860413a7c4ce51a97311cbc0d0aeb8b851eb5544a48bb568d6ba94ab0ddd30d2be09edc8dc74a35061dc663cd2dc03b86e0e2b20bcb838751dd460ff31c0e22515e9bc7c242fb1d1281e6d92bc0cd3126fbcd72f712a13427995d6ff3a345bc326b745827c60663a6826c48ad625992f8f22aa96cb7403422702578a1f1099791a04353498a0ce44861d8048c63d5b31b2f747dea9cb73cbcfa2766b4d936083873d5f4ac1197c063f6222b05c9c178b20b41935d175ead17ce1967901e9072fcf407dc921b4ca55f463d7278d5389bf81c52b3a81812202935c312068fec12e61f0147c8421b984d75f96938d1530a3d0e0f17cecdce549f4b877bd138ff136ba3f5f0e7e195ef360b30b3d971df80819bbbcf738fe5f07d548c5e01025d26cae9bb16b0334ea8c5fa5b4162ebf55e42c7b097e01439be2ed8d812767111bb263d9081db7302382f628ad48d338434d485d4fcacb87f9db5315c2cf5b47b4b2ca07b91eab318313a72f32803d07589094a1172d4da52e1f5465111e75e44447bc7db7a434ab4965da29b571101c15175767ff2f968d24e1c3918c6b745f01ff817b63e37e75e6cf73d8f17fbb3f2e765c350ba910e47037ab070c5e37ae325392e71b844a68c4a55497478d1bac3a468063e547dc9641ca7784acc1df03d3f06a9ccb2fe069df061d097c25279ef40730a56a48177b4f8c1c5e4cdac99e02910e18ccd66cbfff3291d0c49a7276984ed80711867939cec3a393beaf156f8562fae9dd6b6dad1de377f186809129aa53daf2454848f6d322bb33a21e8c0ab33c81cfc08ef1cff2473cc9a4d2641a99fddef74cfcf9445b420ff6d1f73d69ae88155bcbb99a241f19c44b81646bc3960aa25de8da444bed6638c0b1b8db86db264596820051c38558ede265a47185ca38b93a1efabb5d284026d9602058518579722b4c90176496a31975f6c25e095351fc32b2236d8149e9c9a01e78cd4915426a80492427f480381104d2e5acdbf82cfbcdd050ad1bfbf7c9a55b38e0ff76e6bd6930c96341c4268d83b07cf78c97ab9beab0fcb081c59650b060a17a4fc64e837ac1456cd1334f104e67165db1aba167fb704d74c95d1d6429daaa324ed43ebfc38a750c5ae91ceffe4752ff3c70623193ac0e6021ae1f75be3a26f5b4d0730747454970f698d99808e1c5cbe830432c54c3b5723017f7e09016823a884d489f27e16589a9b113161b9b98a79844b9337c4e4abb9cbcab044d08e91f49ba87e9d5e2ab222d46db3bd9067c712b49b215725093c964ee2ecbd88b9c2703b99437eb2c7ef81ad3734ce1af11b4bcdb2f053ddf955768694fcfa4e827f2d43346582865032e9f1c81deb3e9dad931a38c762f94227affd168206af70c4fb36edde760f4df2e04759b7031b6b0cbfc1787a26b6859ac461899779b84b1cf474dc1ac3ee4e9e336f03ee0cc16831e571070267e3010e05ae31da243fdd6e7fc089e166af6c8b575206573373adcdbb3cfb0051019239ce7163882448a02cec54bffa92d437e269974e1e0b46631107ecec08f0004d6645d92e43c37ade23bdaf045e79dff4e89b21c8bfd7855b485ca2e160dd35dac2011a1e3dc399604de1b966e3ee8442d259458977e5c9b048d151b2f77073f2dda58a8d9bd82a7e056910bb3311d991a47441d73a6a9efebd1ba01b14f3c649c646e61bc743e6d466e664a7e2f9ee675d319f79c8e8fb40cec2c7131521ca0e1bde6f693b6f4ea1320f54d006364f8ba558391fe6ea03a2c1e3d4f95cde706b821910dbdf61293295d3aa075080799d4856e663f2ecc1eaf503440291c1ff6fd995d4bda5ef13e3ae3c8c3c53757420292c33553794ae9bc4346cfac3182b86a2ec261cd0184c4a1f70ec64f879cf4ae2d7157d95ce337b1b3d76be0518c9fc3d3cb1f4eeb29579721201ad6e8851412d7f27a699ef57503dc33c5e77a77e865478ef8308a1b7b4909695b4aa5c739934be98ee5a41d2664863de096abc5619ce7212efb5c36b9f5e78568ccd22aaa57921cd19d6407d82f46358e27221ccad7ead3d5c7ae34cfc58935cb5d6f33b2f204c5fdd47423982869fea80bcce491bd901dcc02ada68b5a37e76dbd8483ecaa9f1790fd7ed97876842d6a7366655628a19f5d0cce788a57f08f60454db985e9ccdeef601beb91dafc119ba8caa24817e39452d596226ba5e5e28dda9f86b58965ad973a9f55b6c1bba5071be2840f4201a75dfc4f4b2148d81b2b632ea5d3bfd5fe05d5551c2f5f5f958b5a743d6d229b28927ef3ed3e6ec77d2c46ec8704cef3e088d504400a6629b074031d8b723a1719452efecd7491fe65d801755f61b9a8caa3bdc8638b6ec73d4aa0f688ce816264da86db3c2235cc479eaa06daf029c22be15d8b4861a0f930a8377907328d91c56e1dfa70d34045a16b6638bdae53455da031107c9e64f4cb1adbfdd09da6efd259ab3f13a0634e3921359599cedb25ca8ede2a9f7f1a4ec74a5fc9c099f7e7af2cb58036f5444db8199ac1fb30c6d2c8c99dde834b19884bcee6bff1a2868068d579066747483047c938a04ada10f2abb902cfc6b60636254828197453d90753093bbd82ae19e46e1a93b9bb6f325bb797a5a2ad00ba8d9d77e73072acacd15bdc231493945ea048c52e714ad9509d4b13d0b3ae3e73cd5d3e9e4d4d6d46934e6b7137f22e06dca3a611e589eb820d302bb1f5f1254841bb7fbb76b9635dfd1d6fab8fdfcaef8b3d12325ced0fdd200630a7e9028d53f1ba583ebd31925c76e87f6586a1007016a9a84fba08d5c9c833acbe0cc65b4180338a4281152a172bd1cebf1076e5543ce7bec89e163cbb3398a9e49095078288da40f8f7c560a6535665c7062709d04888bb9d14ab834615450dd70867bd73633b9215f82e4af429a91cf2d744e184f6b0cc7581e4979f07560e4cef816fe9be3c84daccc0eea1be8495796c61420fc0674c7b9ac86e64f368d98bf04e492b5cee509b9ac31154549cadc4901578441969f5bd16964f7debc84f5edc15c687c476c8dcd14c2e7a9f3f5dc5cbe00e90015f6d3cec3974c5d8d778a80dfbc0c550592ad4f9d6387a973717bd726f6387037db7d8da22683e08dc4f2faa11e0a593a813dc2f31038e8514a6f43c61793baef3d515a77e7ac9b70b5d5fc365bc7635f90dc9139966a8f1899745991b60bdf52cfd7f14c9b2ad55dd90a466cebfb44e54553aeda93c12ca4dfbdef1a977614b00c196f39e18258aa88e4a8e7b4c012298c007ca7583b1ff5d17647d62c165a4d66c19885f0d847c521d4e77b2ed0cfee02111863fe30d4950a7c5c90e5cca7cd9a1365858f4a8483a57dcbff4d06a6d1c1d5669814c4f9729bb98e6b5546e53270e88514ca8fa4357d0a45979b730bbe9492e9b099817c00bb33908271c424cb01404686e3919d04bb1a5fed470890b17bb14919d78a42dec7c2671c587b3abd0302df8bc6516dbf6b648c9ac5447a784d5c9b1a0417218904621a61df9eb2e1e390b8cacddace307b7fab4374cb03f92fe712a0572783b4b73bff0a133fc020cb7ec211ae3c4bc350b6caf2fe8e079a4f08910d200591727a791870d0fd85466e46fece504ef01b05a710a04d74f6f6dd678cef6e7d7d9a181c75b317fbba60c3edd62bf447c1a778fcef9fbfc1d9b52ddd73eeb36f88921f1f3f4a9c6ddc50d0075fed17f12c0f6a6fc111567f0bed5118953d73b094cb06fae1ca1e4191c0b4ff39d6a608233b6581ba6503644a32cf93a71a76fcb20e76bfedc075b4964ea59614665ed3559935ab058e9747e3c4ccbb84259b40883844849330648798423bf819922c6ec1cd6b8384b50014b57e2a68de2becaea8238329311f64c13eee32561e6fd10d4a8b81faf2d19229860711c28482d0e3f9cd9fd7f5cec73d408a56cd2ff34082918a0d2ee52d6ef22629a3c8b864a8cad7e9015b91153cd3c35d6465dbbf88940ad1629d81fe10","title":"100. 相同的树","link":"https://leetcode-cn.com/problems/same-tree/","question_id":100,"issue_number":17},"15":{"day":15,"pres":["DFS","BFS","前序遍历"],"tags":["树","BFS","DFS"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。\n\n例如,从根到叶子节点路径 1->2->3 代表数字 123。\n\n计算从根到叶子节点生成的所有数字之和。\n\n说明: 叶子节点是指没有子节点的节点。\n\n示例 1:\n\n输入: [1,2,3]\n 1\n / \\\n 2 3\n输出: 25\n解释:\n从根到叶子节点路径 1->2 代表数字 12.\n从根到叶子节点路径 1->3 代表数字 13.\n因此,数字总和 = 12 + 13 = 25.\n示例 2:\n\n输入: [4,9,0,5,1]\n 4\n / \\\n 9 0\n / \\\n5 1\n输出: 1026\n解释:\n从根到叶子节点路径 4->9->5 代表数字 495.\n从根到叶子节点路径 4->9->1 代表数字 491.\n从根到叶子节点路径 4->0 代表数字 40.\n因此,数字总和 = 495 + 491 + 40 = 1026.\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f22961d3385f35e6c3f607e596e3c5597b2276efef2331a0b8a62ef1a79d776d08b1e7eafe53d32f01344dae2e935e02d302ad4d8c4f61d20cda18cd05e7179e7728bdbb11e9136b520c3f4ecbf98546fdd066ea1d63a267c0b7aabd785b36bdb462c2959bcaa14a4f1cbf60cdf2996ba455d5b0e3d67f148fc3d88943afd2b4d6beb6e6f476ea8a50310afb99a5e7f2b74350aa0cb59227e4ff48a671f7d07a1d2fa79331361981ee4637ef615175baf5dfd4877c855cf906a36805e1473931bc2504e2f92880b768e258794b40addebd65eddf9dd0d37ab44b0904c4c55eaa9824144618fc4f1cb22acf58d4dd7ee0edb9a0775f30c477f5c0cc452b7d15d1c2c61ba10fd39939daf2de5d25d14bee12b0ae6c2bade458840151bf0287ea7c82c339ddc6cce8563e3c476896899127081950107507e95ac50efcae25e81ccf8d1f1b4eea448d176ead7681030d857674a51b8df07e532286b6a1d5aefcc16c5e61ba1600e330552ba7bb1a5b3357b8e03454045d7c97353c6712bcf686d897857cffaee76e0ed72418b76152c5898e81c501642b0649efc7c7ca05f3c05f1cb8dfbcf3aef68213c41b44a52a38fb11096f1ed07b263729c3d6f706b603e0aca416c064919543def5a53253568d45df351020e98c4334e1f5ab674274d2220b2ae37bcf2178ac020e879c6c47ecec44a166669bf62c33a857ccfb2f9ed180db6c0effd3863d57437eac890e8b9d757b1cad69798b3c65b6ee423f1f5b77f6645e575138e07988d2a0a7228cc0e3a7b1d2efcf9f7a9b86c287b64429864543a9b7b9f2b18f75ef7b8204efba44355fad391eecbf6fcd0ec8428b57e54d351f3a2bcc887607867b9b804b89e819ad08288863423b411133ce0acc94896556a11ceaac0b85fd13394101f61c00d54c04eca5e17d2cce76ae9b999a63f184134973d21c67be1a7ceb271d50fc5937886d307558d8ee92d92f3fc1334ea6ee48d821700479e41d3bb739c4e568dc926ceae7f9660445926f5996737654c1cc849a5de944966a9c58baa54b206f3a9229f2f6423fa9b2339b103a23cf362c47835c5888c8354b6792fe7b88d9c6211b300b037bca2de8a2bd74ed004ff6b8c4cf3abe9df96460e314702443f9c061c162d4309b8cee86f1144b3e0af2e6353e55a9c8893f5834324f53584f264a47b817f6c4863530ca6f5b65cf165490b29d30271e1aa3c0c9f83b251ee30e461a62cff54a89c2727bd74f8890fa4aed3362d16eab9cac36a162dc3b2f9ecb7d8f9f1d2cdb37d76fd8c72fd509071e69c6ade8c8138da7b75ad58504f2fba607b2fc92bf74346a97e9ae64b2255c5f2c0a3f0c3d0efda484aff9e7d0511cf2a808865f7f6e5b3d356e8fce5d8c67344393aa31702fcf38bdb6d0257e7937061f6c4112c80eafca64c1ef3fc6dcd668c086bb662e8f0d801dc1b65a9d707bc02e5db5c958463ccf8e66a37ecf13c5ba1da1c2a643fe8adbaf9c798e87821d3edb2b97a41e15feecbcb1708ca09c6c2023b549e5d8ac3bdaa2ec2cbec4aa9ab8da9e47688a6b68a08ffd71ef1f5af6f25a52ccafa5ae6a8994c97fce2576829709889a251a6047986b6836e5d1b3ee53f2a47d3e3da8c7da270a3e419140b4f9d7618ba651b5267771156bae277a9b4bb19190525b5e75dc98b4b71572c1adc919174a8874b108efe5e9d4d465b0ef1bb618f717c9c6b90fd1ece103d6d2d831c930699c4a02d53927a47bba4dfefb88e5468962fcd2bf18a87ad03600ed56d64328414bea8ee6e4cb0846b4283ce15a5a4d62b4b8c26612d86bd6e6659ae721a5e3f0b542e1dce5ca4a0ea148f4e22264282e7b12e0e2d0e3fc6c8aa2c7a22ac838767865d45958dff3e46ada2cde4bc6043428a39ce64f171924fbb5d11cce5dcbb5e3c1a53af8f6f29401aedfa50841eb408547a895ca38117edd32afe33021e9f954feacf763b0e4706c62bbb67de02c0535bf7bc324b3b5a1fc78d766b8038946da54782c08235342eb6f128f21c6c42be697458f13520cc27cd293f95553738b6a01cfd8afbba28e5055cd7d71bc74b9250aec9f96ef2d813646625044092c89d3f5a6d2928e1fce0c15851d5ba08d50d75523880f9c6aa43ad871c3850d272cbc9371854f48cab48ea5dc711f5a3b61cfbd869cd2b438ea70b3a8619a1c75db8597d2a484bc783d273ab56b70157a1eae363bcdc8ab3a8f2e489a969ff140a1cab1b9c43a03cd0242d634b69782ce0fbf30e06c4b2ae0499cdc4644a950a40b63f676016f52bdb2a3b821b3b836060e43710b4d5a8534f09023349a6fa41bed63c56dbb05304b95eca6a136d2d731be84ccaaa37e696b78e01b94abe2738578e6abb31ae36ac220acc0f296fe5b5fd688277e3a6a8a47d8b2fa9df1d694fb038ae6f5c315b976c78a5927e27c49be78050d87989cd6a5b3b316ce212979763799a0d219e901898a3450c534fd5edc06c933e39afbd997e4746d1d3123937fd62e93ada84a3fe6908e20ac35900ade4137bf959b2afe12a5304ce4562fc1c37105cfc58cfc88d44242df74639724102616098a80e74b5cd04a2909562d2039a1296a37ab9f86ff04626e2f48cc3ec459aa39680642494f0b20deef0bb79c4e9394deb0efd5a77be9a5b2f37832b00ef66a93434253556457663e30e671231e3fa62bee49eb8b4b571ac95eae7c1e15d2efefbf984e933f5001840f4406c99704516b6bdb20fd5a86a6a54b4edae6cbadd407827cd8172540ebe264486544b5c6a75033ed7c1f3ee75f92f7694c4bb734b3918636b4dce5f968d0670babdf6af5bde250492f2b585d5d7d20545348a9b221349bcb77db129ee1f64f402785674d2d7c693a075c1b37bc065891dc179ef4cb0250723540b96bfbbb1ca05cc0bd59737c1bb7e602f50e766c8cd18a0054a02c9789f5d2381dcc0976c28599ae3506114dc0594b9aafc848d6f2444085c67cdede390fd6e62cc18de4178b7b0bcf0436edfb7cbcf9ff793df84c331907aab18e425a2e516720d9ca3c6c991b5817bc397372f7033e8e95c844a4ec525a932972fa7866bc9b606d42c138dc8827bcb96838d7668489d56b15c9bb17dd42dce70e7ef6dba923c9492a9c5e4ddc092aacd7d92b25381c8878da4589c47bea1c74d97e1c96159e743660d1a8b7d04930c11d6f49db832a204bdfb0fdd21f0eefcb827f0c467f2d3b71d5eaf9471c140faa8153b7a79071fc70a7a500c65b448dec0745579104ad616819189ccf6fc6856dce40abb94c6142b8d4384d1ee358f904b1e472f1ea567d075c88c33359601d7fc9eb71cc4e5cdd08e4d6409e72475ecfd9dd1d5c0b32ead630bde2a18f1c7893ff7c7549a3b0659ceda818cfae95b54b7145ed66def8f83cb77c55b5de4deec9915a4d3751a336db3e1216fdcc738bb6f1f7089c2e38d810a529d650687e23bd8cd0a20cc07b95d003e789bae7b037b3e9e04acd830b6c295f5c25c79aa6bba737282f86a542b6e5312319a410e700e22160d376647cbdb6e5d98ec5dc4c1d43e04b210436d1e24e6f60c38d5b403b2ca74b5ad4e6bd9f168c5d3570e2b365addb488004eb36bc3abc05f768f289c312cd9dc676e133551594f372a321deb7d636b103110510d006c0486027aee3aeaa7fc25dfd895b75b53b673b29a6ea1abd6969b66d4a6ed721e7e2ab2cbac15269628f74f268fd69539b7cb8116dd53f43d5d841510cbb3566f66bd6b04911c415f91c43850e82f767d55aa7b913674c0750f11c60142cacfa5c4b3f3fdd3fd5dcc14f8414c7c74d47cf677d83a566f2513cd83a5635589aa0e3f3d3fa810cf021fb0256c12eda102f4a181d6be8afa86ae60bd51465cf3785db0d5244586a7c2b9ddd785aa4a8468560ee64720b5d695f5ee8cb9ff9720415f6e87496b14770187aa721cb4d1fccc42ff678b03788524eb2611c40610b4c63c39b6a3c8a76ea9388d9149dd8c75580d3110b786da4cc84e221227ceaa66dd64ea6d22c73ffc85e2c27e7da76a6cc2714ee8df9968e3de2e3a8519dadecebe29a4868fca7dc5fa610b420efc71a123de35d4e6ac696a7b588f9b4539817bfb0f5246466a54666d90e0f8d1b6c3ec95b42968f86c4bdadb579a5c6a08d1922e8ffa2f2ddd1591e138e8134a97ccbfa393f0d75f622a41cc717cb441c556ff6d60ac620fe1b44e5f21d8acd0d5ff83dca93c245c4633dd677043c3296945445228e6a9c9d0f958f67bc3b409c26a5c86042efa889de677c76ed0db2301073149e5634aba92b9b2e70581884e1eec28137fe0fc8271922da478d4418257b2a96723c2006dc8ccf45aaa7bdde472184837511a80af4ccaedbda8b4b8909dc410685ce01d946eae8da773982c44bdfea55e62bc7f1650e646793f2a143833122f3bb79aa8a3d62105a1ccef79acf1304dcb5640fdd313744c308f93da31b86801a37f42f1f741390fc8afaae954df1e4a62a062d3d1be4da130b2b0aeac64eb32097bb04d32d12628394a84c507efbb7fe709a101844cb847173c3b262621bdcd51d543781907de332e9404734c0c9115c822ffd989950141b8d38b4b47b4d4fe71a6dcbc7fae30ad8fda39247e277f6117cddc11ca760045cc545dbbd6470340ba4ef9900042468e4062ebbe252ed1c94dfa1829f936fa302c2035669dd7b6ce5e2088012cdbfd1d6e8744ff4bd4e71144119f8f64dfe91b4d1781ae1a970a4f7952b84d58ff1eb32bd523af1e6ff251fa860d3a922f4c81e165874290ef71816309cbfe52541752c190a48c2b18de8481ff8b36beed0ea468e22dba1d4692203847745fae25df878aa1641875f4ea6e1f0ca0b145875f83e68696cdc12917bbbfd43214b1e7e7d3f6124dbb116f408c9ffc10402712eb5f35a006eef04b23c9fdded4e2d4818ac17c96fdc4b83f2feafc5be29a798a435f071d77e791412bc049549d95bc204352bcc3c70cdc960d1182ac059881f185a1b4f1b0bdda1039e03a2dbbd54ca6c9220750765e29be6d14bae4f9992ea5dae473d64f2f2b0def7c8b48a08403992c39fb560317b7400b0784aff9e87cde93b2cdb8bbf2d042adcd4bed13a1ef9ba67b6e3b1499b2854c15d738204a5a498c3d1f91f6c4a29031e6f4eb839493e8af8ccc0452ba627bc4684a1b8e7dc2b523d6929892acc56c6c85e6acac62541cdfeae47fee9cf4e03e0fbf131078cac646b068a315248a9d955e9c5f266f9455d18c7de015cedd396c8ca0c0ebb0c8fd00610ea655ce9f81ef5e3c0aabb10832c53486a6c2e5c08f8bb5ace577676f3c1c9564839e00983650ccd8285b44e3179e90fac1e2588693c63d68549344b7667af00f4981a9be30b9f9f27c9c282f9aeba349d987701cc5c750e7c929004de7a3cf257b0f3a2456ddef314e9f5000fe1840b2e8ff65ed39c52e934b3f83fdd21076f3c34db9eaf776a4765c0d60ad2deec390b244e5161c59b63a5714ae69757464f7e172dc314d12f8ada9abd3a0ef635f7d2754bc42c1e5326c245ef326536a2b9cb029ee75fc8c650c1adaf509ab84e016b976915c6d70067e5cc9803fbbe6c8ab93164a0908e0e00d66ee6d56ce8d6ee2b4f1333b8b4669c6b9b0cc9271d9da38f6d7227ee0874fc812f8289107928cc741124b360f30168471e3ed7f35c60e0367f05b76626e8e16f5c2cdc4fdea7cd8f306a331a592543266a8aba2ce2d185834158654f2c99d16155d406d0a01adcb0556879e0ca881a35820328800042daffb7c8bf8850f574aee6c9548821babbf5f6ed1f7f18f4c638785dfee8f4e5ea2d7a2d124cb3f417ca3ef5f849ef3de17b252641d93c316103f244fc0a3c89576ee5893fa6ea874281d6ce8b5c69f2503137d767f3c4ddefe3adb5773991710c03c6b76a74b0f385afc5b5198abe1877c044d0a5a20507777409e8b7db1ebf732085dcfe8279c0204557d9dccecbc9237804a96bdc254d0471d7d905674456bfb16f55e911742831928d2029f8e63782d12dddb4e9470ca6c7adf3f2dfd06930596c644c1201316766c7160573bdf19e678c370a82f2e7d7cec767cdad7d87e7efd9ae4796154a59aede283a304a82396c2af11ce3a9827ec2d0b6031adfd89dddd38ee32cf971d970355ace258c14686a9aa6c2f6667fd081b12e0614ba24def892fbe4d67a67ea2974f5829a3ba9ce5ba306a84d02bbc0d86ded33a67a6dbf6225a6ca4b195a721ead3b3071a863f23041b11a3393fc3f831e901875c9b40e815b12f4dbc4171c1beeafdae8cf250ba9851cdd320cf03ab4159a1c642d012297ed455d553e14c1e5afd790dba34461a274615452fed63703fb1c5fe89d93cad0302da4bcb26227279be7f772273c35493ab4d1763610b04c7df1a6f05f5610b35d6fb20f569d264101242c34b0e4375faed0874267dbffbfc9965fca33169f64c8755ecb1337a13bb0c9f0fde060a04a0ee5c05f5dd2e81820cbc5a242b216a95db1b5846e28aca72c27e361b5fa130c2dfc118503d58cf6bc127e73e89e3afd02ff9faf22f72eb49f813963f3b9e8ded2d6e0538dfc5011580bc94a027f5dbe1c048dcfc9331d770b1af4c848081f487efd20670fb56127de5a8f12718c0b3a561b73a277f4c97df5fcc5a9eed6165ac47fff8909849a1105f2ac397fea001d34031b26f652dfdd58592d3ff2c127707caa38f352317a97ab7817a82afdf0c9ade0d954ca576ba172cee629d21daaa3da107a6c268c877f340e0deeebfa5fe09d82b72ddb8ae3913df0aedf751a5c85ee31fdce3585746ed28eb63118d9cfa6c9dc83cdaae2fc19089d7ffbb3ad942862ee65a05984142a2b96f6d54b092c295faf678eec1f4b7a45fc3ee7c681f6fbbbc308aafb005becb9ab7fd55320af9cbfaef47ef2ccc7d59731d7b1448706b0b590ca3ae8a410c9fed512adc67e3fc628f9317dab3e3cd3ac8c43b19820759aa9bae2f6dd9610e9e5235c35b1bae2370f24778d889c1bdb5af08024aeada9292e1f87f89cfa957eaa070c670472617e49e5faaff72fa8778b4b9157f53183ba2c143a4b4eea3cf70b9b34122b8d04e1a961f14ae688666b59930466cf8c3b80f32d8bcd1e1b0b10346e65c4b9f8134e4de1ff748a0df06bb65d372fb59447dc4aedd5aef9984ed88da9462da81eaf67a8be5b5d41edef969662aeed59a13176bb9c6981834695dfdd109263328bf04c2fcbdc76a266f2f30c69a38b6134e8920c36ab7db2ef78ac938828a83caf2b5272ab0af7ca943077d3432b76a12e13b30ef968c8b439283ff356cab2e2cdfcee8b23edaacae5d1d2c22451271049e3d3066575548446b235880e9e2a3b54ea11b56af3e010b88d4beb07e540e98ac7f960d9fa971a3ed166433ef3f5c248a1c985ca0153863c03f99164b23d4b7750938a8a0f5883ce22132bf6302e1668a56480edc9b5233dbf3a0d7a162baaeefeb8285948d6a6106e00c0ce46e503b646ec7a74514cef0a8c3e6bb8d3f656d14a95fcc2e37cf84009c88049ef273912cd976e9ebc502fe2fcf3ae681e9055d7e0c2b6c3c7f2f1f7c937b44aad82c6e38d6914d6358e042425ba4b600990aca29ee804340b87a9676629b5bce505a1084af0433da3df63535cd9b15c6c092e0ba8524d8a50999eca0254c52860c7ea6818434a032a394353dd6f168320bf5c4bd4e2052c6b45684c9fc7b4075a26e18770e33da0d1a573700a451a6b028656a079d52e3120e467215b755bc14617a49ee1e550316c13d1f0d3a3d488646bd9304fe0f500c81aad60418717b3e4ca79e88a9d9b76f6f2be8b3af27ff32e2645a628d6b7a837786f67630060df8fffba43d5ac738aaf76933f5b069e59be94b26d3d7c99b464c84b0bce5f3616ad2556d6af9faadb35a3aed7f672b990dfebce46528540de0c681f0cb6fdc65d01908ee1fd6af1bd01c78ac6de5447570149eea9105f402bdd5903671960f4e756fa41d19a8c0e30f568fd3b7827e406f85ede4822f4c1d1a0b9fcf49c5538de93dededbc56a0dc4c9c3ff029e28bd377a0d0b58be90cef1df85b239a0b961f4714c57aca4e4b67ccf7de9264b064577f5fc7ebcb3fe037aa9eae495801e1a090cbd0b844afa7ff96acc22d63be3ce2d5357ae4765a4af6b34974f10edcbac170c54ee7a54bd502885714c553797251d40b6e8cff74e0dc7b928536eba7d6af98e541825e3da16794c912bd9eeba44b98357766357533ea3ac6f651e64cc45351834b7a1f766ec9ccbce8dcd1f1943a8e51773843dc354e29c34b7d17428ac3dc5b6058eef76540127627a921ee55843751e4cff96b82d3a01fd3511a836c45dc41aae062b9bd7fdb28835bbdc9a7d61eda937af03959e9e0451f5bd41ab6ad6367d88385f71ba53e37b0a38b6149ba4b04d34ec28532c61a5a7732502c39c686a3d9d98fbf15231a669d0d005131b65ae94c9076a5fa538c06f443a47187ef89288e824f71f0acace07b6766aea6774b4eebad24662ee2adcce729878f6dd1fb114ec7c7a8869bfae43379f0288862f86f0d9462490618453ba1d90a0685f98af18935b6111d4b385e2f1cf1720e622a3e6d703663da3734ce4fdd9a66deed63dbe9a11d7b47f2d148737af27a3099a111dece91fdd500af7a1875aa44c677230310cd9a9bdf95533d0136c5cdab194b2147f1813820b36237917b457afdbacc94e79a33f8c57392ca213ad536cfd162dcb87a03ca5b58e59bf0ab27a0cd8e8354897b7e7660020daf1f1980f86f16b31d071236fb4151407e1b9b1f2b9f5404cfd61ac2c959a89c7880d13f73e67ffff4ee75ee41e02963fded65ee46f187db276e5b0c1bd5940cdb6d868d156b9707f76960efc7de97a06063cd1b81ca305d5f6959545b9a175fff01e6be946fe8927becc1dad75251bb7241b24780def70c3baa21db0c998a09cc5549f0448b66479d4ad2b68d933e19e6e80cb1ab161c56d8e0c98694ce93eea9d2df929f104dce7854ce46d78a36e394c31323d43711ab2d2ad72b0a3fd09b8c535fbd884e3e3fc74958ad4d19847fc15d7caa4ac9abd1c03fdb72b0b05b1725ab5fd91b126ac632dc850f8a98c930137be7e5def519edba01e56916a1e14bdf24897dd18f7506727a311c3e2847acb52658a49351833aa5fc038a2f11445b114eff48913b94bcae7550545af7959f02ff668f9aa789817dc8d1bc7cfde80639349075097b27283f73835d7eb981c4a6ad8cb4a8dcb9d3c0761d2ba535803ff23a4458c6ab2569539ddf793a0d7fecc47329b7b13ff1885ba03c83e759e190227dd3f0609b51ddec061f0304b79d7b4a7e535430d97fab6d4ab464e78ab42bd0620d11826d329c0191670fef5dde8be29fb0ddb060ce23c8a82bd15bc68f37984856e3a814865d77987d84d238be8b442b10cbae673afa0a999dc900908a87ff9b647fb4a72133bde9ad150a9dd7335153037c9a08da55f986f7ebff629f33365589f842bbf4b77402e522938a791ce4dcae3a7c7137afab50a280f214a5f9f9f96e8ec7e4a596a75322a6b6a507a818af7203e07cc61ff0c276dc4d179d7e655784eaf565c6e7dd57e4d4a45e25f26bbe76962e7a93a5aee76820cf9aa1ea4348ddec44fd7be9688665b5a1051dfc7d8257a630383ceb2d78be752f6dacfb6df5f6651cbe1d2ad50243c4360b453514fc92fc5850f5124206137f01d553012cea9e470419b82fd2448f6f05cbe1b2dacb8901aa1142164c82387b6df373f6219c28464a95ef07f549be7c46325b91003f1e1b288a5f83bf64fa99e3763e2ffef09818b7df7055233e3d0159e7f637dd5a7f2eb0998d187a8e493e7cb3aed60f0599492393ba1b35bb0750ddd319d8b36866139c2f929b61fbef0d741413bff56db40a79308163b3986e04751d6c304d2658047de2041b035f366c88685a03f599c2f27ce4a611429abe67bbcc43db771f5c5f6caf7cfc3f222c091de3a23cab5ee7376e411046ef1181e0a27cf914bc18f059793f273be00a005a71a6e8de8936db2bc458fa125137550ba44947d8f3a39711d6b9b488c64592fe3d64cc95454f3b903331fb8d025fd5169e66b6e1e74c2b5d0e8452a1b6e8e9e268f0e03936a59347f4807c677fcd3ae84f8cab47061ee0655350e2880eacc69f45f84980d67ad150b1131b8ba6ced63e201cf9443bb0876b4187f7494b8bf3acc93e02af20a6c4","title":"129. 求根到叶子节点数字之和","link":"https://leetcode-cn.com/problems/sum-root-to-leaf-numbers/","question_id":129,"issue_number":18},"16":{"day":16,"pres":null,"tags":["树","BFS","DFS"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个二叉树,在树的最后一行找到最左边的值。\n\n示例 1:\n\n输入:\n\n 2\n / \\\n 1 3\n\n输出:\n1\n \n\n示例 2:\n\n输入:\n\n 1\n / \\\n 2 3\n / / \\\n 4 5 6\n /\n 7\n\n输出:\n7\n \n\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f2695173385f366503f605659512a54a08f2a64fcfd231c098867e6334038d12f1bd385394d9ef220ff2ba4e9f225f573696bd5d7cefe4633d0aa8b91587224ab7b8f9aa5419c3bad31c1eaeea0885f36821d73b09e633f300b6aaf9ea2d73d9504acde8f7a209760426df41dcbca1c028ced387b253063ea28b7019835d2285358e24a4c4b69b1a43c32acba95527b00762a36a3f543227e4ffb886e1f7c2da8feea78093d6eb527e3685df60f34589944fc7c4ec952ee9e6c0081540c72ad39cc454a2e978c094a91ca02207392bbafe9327a4df4243a6d0297e6ebdf7fa2c2f1adc9d0c1af82836edcdc80840916b86b362e5cfec539791451cfd1b7f65edbb425ff2593a837580382e4cf75f92f2fade563cdbef7aa2cba91c37a2b7d94c938259ceb65cc9d58e8c276894993134a949c1204515a97ad4bedcafa638ed3c5d1cca2ec8876dd6fe6d5590417f0d7acef13fd8f3b896a043c15342880cc79a3cb9e4d1a0b6d5a62d7fb397a318f76bf264568700549fb9464e8ec67e6a51ef79d51220dd57d38e9c243e4b7c208a69f417d4aed0ab039a93ff628b2925babfee37d7fef59ee2d395cb76f4e7c0d0bd53967288a02abd82fd0cde9a3f7b1cf54ea6c6b6e074630f14953f3aeeb1ccf5197b79e5d498b4e0e48aab7fbc5080a7a20a27b7ca05b5b8e2eef7501d65e01e580a3eb25aa699842de56626778163bb5c2f2c3e4e0629869c3240f383c1aca5f507e52487976d1e6cd0a3a7ae51963236818b9616dabde6234044bd94751606350cfb39394f53b392c1d5af7216b5bf544d84f219e20cad84f4d86c24030705ba5c4c9ceeed2f29eef1ec0b84539a8a1d7a99adab09d0472bf2a485420163e2843b28f7c8f8af45a7426e80a84cab3e49323c74fab748b4fa3cc17b0d8c04eca5328d8125505583d522660747761fa0271834796d5c0d60ad753bdaa33dbed6bd430a9fa3f549ef95554fb2f80bbd64a2d381ffc060ffd9f59748fd11fcf9e659b65705b09dc7be7513a4342b456ef8aa828fc1701341491d83bb7ef03d0524576b08f50a10dd83981fe46fd7a20cb8ea7a15b815125f6a383a3401da60078be2877542ae44ff4069540ae04f63420839ea2245720e3d6cbb47146298fc2a6cce2e457e0991eeaa2cf7e3907d4b4041254791badbc55f01a50d024d946c4f58cfafce3d4e47fe4021d13447d1bb9f9ee9616e3fd9712956689b832d4b01492377ec1f90f2aa7bf62e1a6b4561771828d9664137f2aa4dbfd3b300b33340527b32a2eb1f93ab500dcb9571fa211411fd926fbae5f144a066fe702b7fa28a932d4cf44a80b40f7e7d83b7f32555b241f6201c9df34693519529e77c89826be75366412fda4a1d40b56ac9f7c78ff4a0ccb375e30f3d6a2676da5e855521d069de7d2a94f27eff062e865870dac2ac4315b4c00ef08ee7d0dad4cc4651a2f0d0ab44b480991f76a5692973e75da5b6f79a29add737699c157e64e4c6014e08746fe354e607d7005817ab2466f0dc10153513b802fd4a009d506c83870639b7f5b7156c2731d774765884501831faaa470d28fb866dcb569baa7a3be630f4e9026ec8bdaddcc38187f459653550a93b49305931fb066247c6ac4de64988314efde9fa29cd4c17931e461487cbebdb6e0756d971054f8da92d2f3470d6ff8590490b86d758a4586bf908b5631a90987f27f8d1372b94bf8eec7e84c9c7798102e78af8a6ab4fd444648607d10bceb6bb146c93318566d9ab9ee10e9f28f68ad511a42abe1650e96cd441efc393b26e2f120f1cea5cfd914151a3e8eedd3eecdd7bcfdef7490f4669630c191a28d3e1c5ea097ebb68c00286cbbbef73d7c6fdf6f8261f3cbba69466f3f4e6d79993d040bf408ef7f8001a87c93fe38782c44620a99b44a9820334493255f28a5157b94f80ad04bbe9c3582af0cb9434b00de8343b7ad087b480145d83ec970fe06c545178aa32b4d271b13dcdf410486289a5aa57996b8cb727c7af6a456f24f390fe35e7448ea1f728974cd7d7182003601be980cfcb3ae9575bb304289b875880fd719fbc9da64f0945f3f51254a05ca9cf17a0c6c2360c3aeafd3265dd5f8449a72271c38d2bc95b169a2d9622d42dc58b2ec235736bbc2ab2bf833a80bdf89f60af4c174e72c499cfc2c68b01383dd4db41c33704846d9ca916eec189d4f02ece3a77dd0dcccfae6b686c6fd74f6596e58bf00a556e569c7692a7355616f06b2b4bc5a0fde98ae4ddfcdcc6518da1441fe746e254da168926077c60a20857b23a96b1db6cca91f475b023349a6fa41bed63c078ef50612e2529a314b23272e04a7099eb20de69db7dc4ef61eb36e265f8e349160fb73f96710e60f296fe5b5af2dd622b1e8b3c238c568fd971d744fa157e0670d641ec22971cbd42d2f96d4a8d45dc635cc8b6c12687f24af43c8d2272ce1165cc2891680845b5a1203dcf6ea6c933e39affbd62c037f82920e762ae821b02d9b8faee4225ce45694730aadf5037bf259e0e0ae7e5e1a98042eb6524f1041fc09c7a7851a003df8565f1d6d173f28b2cb4130f0d72e88d0d5229842cc53bc8970b3b97ff6145be1fd9fc3bf20d4a3cdaa642494f0e258acbcf23ac4a07719eb4fe25c29c1f5556e67d33e1be922a3226662374703713f8460325f73a6a831b690ccfdf1db3ee8d0a3f38eed5c75f0f29ac3a167ef2a1840f4042aca781759f9e9be0fc5a1714054b4edff39ff88052423c98465544af72b42cf7019152d3d0a1dd7c1f3ee75a97a34d8dfbd2748241f27394cdb26deb9141fd5b9f8bd5f11ebf1f78cf9c5dcd3c753485f9a836a1b30bcc432fd7cba562bf3442b2e3b9d83c6e3fc25938f79d829ce0ad621d350aa7b6a66061596f2fae1ca518a4dc28f78fdf4616d0445b767cbc55fee630602cf7ed64138cec58f9d492a478baf4d6114824bf2f5a3fcdff73a6608411f6784a3b790bb276dc629911e31f8b191e6513aa3f6968adaf4e7df8ec90bd168af54ad40edb11f7256b6a3c6c991b58129868a247d367a8da608845753c56bfc23f126a7d42e9de3549a6845c5ead03484c28dc1332e70d818b6588c89348d79c314b5a1288692378582ffc0ed858efdaad07ddcf70481a48a85bc158a64b8a69d03c0ae882e7fe70f275e4e8b7704c6594088b1c1b639b202b9f50c8033c1c4fcb827adee3ad893be132085b66dc608a8e605431f3d4205ed203a104c62a52b918518117b1c55ca07c69794a9fde36e0f95ed41f281ad46728d17d694ab35c1df0f5b004b49a577d56ededf2e418001c3c794fd0a97958bd887564e09a36133ec82e2989b89e75194240a9b6e17b393d17fedf0578a200610cec681dfb3e05b03f153039c28efc9a9935dc65b5de4deec9915a4d3265f7f2bc9ff216ce68861fe011e7188ade090814e17cc304389b227d1cd2a67cc1daa1d5d254f9bc0344d3e14b447e09963e5c2e6ba8e406be32cbd69459ff87a5d6f703f1262cf0c60254360535f646e148e97285198be12d9d09d3e6de01b4947146ef5be402ee1b44afc9e6e9fad4e6bd9f168c5d3134b301c1e9be7805201fc3fcfab830a248632b6786ad9d4292157705f150a7137741cb832793e0e32564152516b04dc166ce456bbdea82d9197d1f2551ff335e6933ccdab98d9cf6686e9a22610326ff49fac54219428b14e3dcbc1d424aa829b0b9a1abd2713831c0897a55d3e70ad3745df583c0ec29b304ce824677d51a270f3627ddb5f0f11c60142cacfa596f6a7a8dc995d8852ab491e333bdd58ba329e6e5a6f6646cdc6fb3616d7aa577a3c6bcd44c1545ea1063133ada5048d83b0e98111686ecd0db5450a1fe07d25f3936507c5a7baf6c3cd9eb70b9c29412d9c1262f99fd6efc48cebbac33c5d456e8546765847019caa3151c89d90d874fe01f42c74c701f76a208c697f9ac93836ef89dcbd6fbe65c4852ddddf201563645df592dd5a8c036c293adfe608c90aaf6770823ae7fcb78f7e60a77a77e8051cebcfb964f3d26b74c413cf8ddbec089ebeefd11490a8680b1924fc71f02dc72687a6a5696a7b588f803413817bfb0f52461478487a739bfbdad0e7cda985ce7d31f0650e9fd47dd909387b84df2e92fa6c788f54d5b229e5131099d8a2a389aa8917351b6bcc717cb4088356f76c32e36415bbf858502f9daacbd5afdfc0af326f06066fbf33794398036945445228e6facbd5b01fae7b88b212eb7a1c90272ea1a29de677952b848e714f1c1b49e5634ae7ccebf7a26b8a8a581cbe240979eeadc766c867f674cf47f90be48a7c09c2006dc888b209a22992ab26161a2f18029bf34480a3c5dbe1f59986ee106801ca1d942ae8deaf68916318f2abe75a67da3a5056a31b066d64146b665f3411eab0e8e3960b2fabc62afd016683bf5b9f8e3038e0e0ff9ec9dcb64f75e8afa33142356fdbf1a56a680870927f858c9e76ad473eeb57acea78632f648125a2adb23bf5f74ba0eb99e8aeef0aef7dc871c0169510c645d4f9d6f6fff5bc2c6907f30c7e440aef142e538de985bb05d04c8f3964767a9bc7774f314f28bcc1dd758cf6bf7cae52cbaeb547722f6a7fe6f9231998131d669b60f69b056ad2a689906adfa32aaef40b406bc2bd3e37d3f847fa150af014e6ff89bcd9de31d491fe5e11aa0332f1f43c608b7cfa40d1f515497f8286a580e471303dd2ea20df8a83bf1ba31113fc60e83db976837521dc0e8d9558659242fa202433ac1dc8fa23ea6f6c92f833312fb6687f1e4deb9f672e18f6851bb2ea1ba469c7e957a54bb11f3e63675e9b34d08a9aa250327cc7c76e2b2da3b175847c8ce5959dcfe91c16b8a4d73904b3c5c4d1dc054e8228637c82735b5c003142bf4f5f20f12b9d6b48bae18db4e8bdc99f9002aab85359fa75d6a127c6ee0c9c280b017612c6ce2f3a9f146dcb153ce7d8df111220e0793aca8a22af34878ce9934e0483f7b6b96f3dba4f2ee3a373c094255517671d4fbc0479b791809046f7cd8e2af52c5d256a8842dd12b4c35bba7f50c022531dd11f025bdba2939659b2ffa393f1ad828d42f5927ab07191a8f09b2f11305dcd83e2fcb91287838f1a55c8403bf8764ca1a92beee8e68dbfa5e7a481c42c6015b41c9d5e8f9379910b6bdc47744c191e73c08059092350d4dac154362c75e889176bd38a51ff87cb3356a77cf871dfa5166205bc78c3d78d19812340b012921575fca020686a05323e649688cb63e75d473067999edf2b4ca5b912ed2f6730673c295318445dc3c2ac9cf7f9a12e5b8b4ad19e4234c4c8f1278f470a340162ab6b1a52c2f4a676894b8f35f6491dff6622c1546266ed7ee5a7474b6f920613a0f956069b2f12fd8b90352c7c81e58a82edf1726ce8b65790d563d199313115ed75ae0dff4c97b71a3a68b4f62b00882b207dbe08fadab2a6038a2b17236bed0b8be49734ce8b9e37b4f5a0a56526dd1ac4e6dc752a3416426575e597fbcad46cc54d2ccca991e776c895c0d85a33d935f90510899b8b1f6f8f6e7f0ad12a8602b0dff5c2a1cb60224ebbe5cba893d2d18acf2314754266b3935d0399654c7ee89769dca77285824f0ed7a9927cbe936cf229792bc501ffb303fdb0b0ac413821450f5359c03462349d4b800b1562f6060c7168885de2ded084b1e973c2be7fc665f1dd195e23b3d5d48f614d1d3c0e8f1bae83c81f310f09660701a4861f24e3db5cfcc9a3452061c6780a7faaf960dfa4961d1b57f33e9952841babbf5f75f1dde09f082ed4ced8f3ce4819a9dab08b7e8a63534d89ef5fc0d8a0d645b3586847adcf071d27261f85f99bb71fbb0acfed73ba6e32142587e6ddb50f03136609317f1997b174925535c21e10c03c693aa6480b6c14f35b0bf1feb3892e044c42062813790f499ed057b1ebf7325b08d0ad78d450091b05939aadf0d437804a96bd811bc33e497dd30326216dfe10d11bda524ac6547cd447ccda1e26515791c064dd36ca6464a06d49e57cc74dc49d10d9330572606968337466ae73a638e95ac26e357d24eb7c68cb5044d954948ff65d6e45a793dc8bcfe257fb23e5dfa6179a6ed72ab9242f3670e1e6f3889f74a72ce5de53c30342bffc3ed75e96e2b47a614639b80e200fc0611ba44aa9c60cbe164da63ae4c4471b7cf1c59be9a83d22fc822dac31addfc6702ffe9599771f3193ecf1a236aa95d03908973300034826f06372d0c931a941c70cc26aab59a1295be97730c2adf8f1b3caa850b7861d95ad29d529814159a1c64fdb002952fe519b07b5237a78843c41fc3d5c302746420d66a1267064f5d8edc2de3cf04a4cbf16b1727b7a70b77f2c08208618d5a500563b1e474191d3183b18a6387b5ad6e620a478d277555a58c455290428b5884518633beb8dbdd530b9ab626af5588b5df7b0282e53a13b9f1fc5064304bcee5c09e3de3bd38e54b74e24224425c1d54d190ac88aca72c27e361b5fe501d69ac0304c714f8067c079e76fcce4bfd973a6dea2603ea741f108bc153b9e8da46b6e4b778bc5535acfe88e8a6eb3dbe9831d8ef2df749124b1b251849c91ec9ebd9a2a70b8034073b7e1b66f4cc0aef127f9232e6500db846bcc09dba1276be106a787dcdd1fe45c4500c397fef3549e402cb23c3060fdde85d1d5e86e02381994da8f282345e635e38f2cc3e3f50c9ade0dc8668f76ba172cee629d21daf978ed41a88f29d94ebf0df5cef0b1f4bb03c97d368c92e06c5f9303edac7ba5c85ee35b9ab0500509a27ce52f54cbc8f66cd1ce3fcdec638fd6ccd083fa76d95f866db3080bce000ee6f53c7416ffd696d8fded31ead0bee3e64cd4e72b42146faab51a8aafb005becb9ab7b9136102ab84b5ea1eaa6980593c355b3e4640333e590505b2bd8c0617e6a81d6cd235a6af48cfd357f099898c6cd4ee7256c6424380b1ee6f2d932058df78768f530efd2b40e85923de89c9bbe1f4231f4aa48f9790bcf869e297a94aeab06bec7047261789df0fb6963caec23fb2be4b184f0539add01fecf5efe28270e7e65d69b9916a5bcf5768ff389178fec579623eb184f00b69ccb1d4b99af84d12e61a02d1c556ab8a4bb805cc9a40ef13926ffb59194c98a4de72e58fc9ae8fc7d5649ac6f9887390cfb5d41edef920202ae687d55c436ba4dbc57c612511f4d15b63677ded4ac2b18ced6a266f2f30c69a65d87f1d81728c25e3d73eacd4b76dd0c48399a7f83c52f5fb29fb502d6d5f48f96d179f190df79acddf2781839c7a75c41e06f58ea8a421cac2ad193f3a6404286a15921c3122541a540b6e661680e9f7f1a00ba30c5fe3656544cc91b09a7d544d9dab2ccd43a4bf71e69e442038a059132dd136985ce4507e63bf40d0580277f98d290f2faafdd3886aa36d2faf6f02f009cc02556093d5173f92efbd90aa63f5ace5f382c08eba692d43b64940ef7f4b11372b8be14b428fbcec98b5e5823c0b2b1ae51a8a7a3b8cd152a3881e9db036cf408d76f4eb8947b87bac7fe689aa500f12497d29233a7d593f806a03e48a2c7275c58804684384554f53b9b66baf1c8e3fef9b604bf415da7f6bc0358b165a43d1e26a66977fb3672b84985edad3cae8ab9f39e0fa5fa8f2e92e6d59874721e7c0932fc37cf78e1f3dd6f168320bf5c4a24a2b52c6b405fb9b903e1630ee7532260e2eda495f06621886588cb028656a079d16a51008496d01b715aa552e6052ad090c41738d415a413326628646bdc4119d69482690f0bc2e32120b4e568db4c8e999f4717045eef3b835e067d42b0b37882c658227919960314c489bbce18e3d5ac738e3b93d33a7bc7cfeffa60f63ddd2c289121befe8c3a1b6313e9a55706ae9e187b35a3abc2769328d48f6b1a22904541df18780d9c87d8445d01908ee6a84f042db5b48bb26f66b763d58beeac34abb56b1d5d97825964b42633ba25b5db6e4b14611c787ada87e092985e5b6cd6018100447da891dc55edfa83ff2e7a61fb6864b9433e12eb099be3ff4dce3caa559aa17e94b289d02d2521b0dcb62ce592d228aa3d7b864b064577f5fc7a28d3fae78fe9ee0065a0da1a8b7c2d0ec4aac8fba9eb7e06c61a43dd8982861e6365c1f93e7446abd4b9aeecd70810bb7f103d509da034ede7264720795473bc9f565f0d735948773eda3d8ace6e85fd0177ae9339db157e9cbb9ea4bca70244c1f3573aa10ecd368d808c55341921e1d597368ddf9adf4a3becd9b348f477f1943df34177ede4c3a043cd696da52794fbcdd6e40037f75cd75ee06d17a3fb182e62e95ccfb2e814f75ed2301994baab22df6e976db3aef5bb58de2864a92932db67410b0cd4e155f8952ede86c188acd85e7008f3e37b0a38b6149ba1a51c45ed4995b940d50562919776599cae9a7c2a5bf15231a669d0d000065b80abc1f953fafca589d5fbb218e6c87abcc78daca5412bef8acb32e2a66b3a66750649c8724662ee2adcce77e92ec2194fb1912bc93a6c3d6e3fe3e71bf68c67db02059c02d046a5d036fd798461a8ea5fef0852a9d5e440e630a7300f77c426a780f47703663da3734ce0994d422bcf57fc6eaa9713652effd4c3222be0528fcf354d69cdeb2810caf6b116e8044c67757515588f486de840c6f0179d3cdf81f617013ffc73745a02d15b2202f3ad790c69e221e9e3e78d15750a7ff7dc15d618299e25820dc71b4520d391cb365492345e92bbee4f0af9efeed7019a0be2f9c22af8ef2e66bd0dc1b3a1b5f87b159d4b5086cbe0a63fb6f3ee14671a4b51da078114141af0461f4f42a0cb067c2575c6694bbc180d407614cf168d0d250e8108132ccf62b5f5397e860a75581474a819ae5cd90dfb20b838969f20c9c","title":"513. 找树左下角的值","link":"https://leetcode-cn.com/problems/find-bottom-left-tree-value/","question_id":513,"issue_number":19},"17":{"day":17,"pres":null,"tags":["树","BFS","DFS"],"whys":null,"difficulty":"- 困难","description":"```\n序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。\n\n请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。\n\n示例: \n\n你可以将以下二叉树:\n\n 1\n / \\\n 2 3\n / \\\n 4 5\n\n序列化为 \"[1,2,3,null,null,4,5]\"\n提示: 这与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。\n\n说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f219d133385f155623c4f4e5a461d5782802779e1ff310f09844ded3747d754ca8a1d7aafff2638c00ca16c03974bf82a7e75888e8ebc0526c7b18a92597a7ae773c897ae01d124ab2acceba6a19e1631ca1b68b4972733344a7ea4d585b97bc5413b324bffc964e2ff897ae71bb26f1ed6bfb88c86dcf161ee334df928bb4e7a089d70273767224895b368eb8f051f29354b36cb8e784a035199cc47780211e487d40752230bf3028a3249bc4d1b2cd0689f0e46bc0ef2ea222fff211523fc35b4364479ccb8602b86a96b2907ce81cdb906e9ae5694f3293affbdca84e5240971fc8cce64661964cc32694a30e5b453c5dbaaf238ba1a224d648f461833d99ce90eab67a62ed8df8747a3db0b831169e4ff048a94a23081d0fb8053ec20adab7112c659ef050514ace9f041e658b3b90f5e8eccf2953541c85f0d897dd6aaff925626251013ae7e83a96eb0f85b446a9a3180df06cf323254670f7d0a7afa43299ea2472032364bb9579ea6a32a7bb133445555dbfb5b52d1782ad84262854454effae17dcbe149678678042051b9e41956165aa2658bd17743bcb28d4ca8daecbbe241b46d7c6372df0d71c2e19278fdfa94459e0710a14105490f321e40907ee9d2d4a18ead7d8ffe636b5bb21bc133712bcd8f29c0cbc51d722567cdb6f2e42edbb838c49d38893dc49710f6b72d200621a90fac15fa1acef882ce7260b6ab93ee680eec0d4eec81e1e3f99340cf9be2f5ed82b43c5772cda5faeb276d2e570756e42ecad0077e2208a64719255521b583c1c9d0716c3f7b24c1452d55961cf73f468b7c96df272a8a9f1f0af5b81c69caccc2d1ec98ed0cf4bb5726aba4e9abaff4bbbc0a9e3c7c026b785e1c4008a4cd2cb1d7ab6a176dff50d4dfd7733c2ffe7fa558a34e9fcd17b7d7ce49f8500adc135701b7bfe8e30a6b2d3cfc5718ae33cbc0a1b801b23abbc757e1853cec55245bfb0a9aae294cae6898fc8f524a4a3a955b1a9cf062f844497aa4ab2ac96017341c80fd7b522c5943936becb28d25e7140135229ce82cbffd0fd3745176909c5d8500d82ab7f246f97637e083888f569b632ef0a38e935012811d75853377570fe855d4069e4dae36ee382d989f94185402e7d4c69f734335626460483a5c56e28b99274466abc98a07c9581019301adee379b34f6a8a4bd42ca3f6e7a6eb9181d90f9815d599a5961694f0ee8e2b0fb8a86fca4ce648d34f44dafd4bfc09a7532ec83d2ba41d3c5a20538080808a415b42f1d39feefa8bee9f88f31facd44a53ff528a0c0f5735a25f04479c60bef81a57442a10b44aadb467ed64f08301ee5f49d2e7a45f3a6a01377549274dd2a54bffe7bed97984483ac233aae43019ac7136424410f2bd6c62f60a42837b5c79bf8edb5f39ca62f6e21325aa38b4844323d3f062eca37ee92ef60cb9a49dc5802323edf66ccd0fbf915f1d57c96614954872b6d37c0c9dbe7d0b3b66c9d2f3df9afeff1cae59280902a6f94fbd7abe9f5257a95292871ffedf218a347a5246d8467b6a8c05028e80f876af8cb7b511f2c417187f00abdc439a79619339702ff93f35a6650c4b4df2efb534fc13182b3146dbc4bac439da9ce8147d5a8e44a07d9be4f7a54817981544a02b5e6e341b1a25d2ce16e2b2e5652e787abda106cbdc1a452b5a2e99c48a33c386357b9f98ef3b40664501f5b5b3eb507eae6c9ef410cc30236c19921eaa0d9bd1922e7692784ca76c4760b8b5786bae1108836b8587910a5c03d55b4a3db219bda7c76e6c9b8466458bf82fab9bce2d708c2548254163acd0c3c41929217d242d770306ff780deb179f4d321e4192f1b32e202d2539c5f18d215d37ad81ac62917fa815183a9de7ae83eae09c6343280ee2678972d3543d942675faa54863523cdce52920a8ddc76bcd909b3ed0eb323c9270cc73449d5d558c5a91c4fd6116b05420d2d78ba2cd52e13de13dea5580ea416efcdbf3bc951322e8e967a87a972398342d26a3f19e5176dc4887a6a8be16123beada8f61e257cfb469e2a1c14d01d51c002151bf75dccb0203b3308012f0155d1fa2635fabf9fabcc1da3d0d35889f85d9bd691f6834a89b6333c45288b1cb904f65796ccc4b07cecfcd00c8b2b63a433ede8cab48b766c711f5a3b94ac8bb2dcd7d05ddaf6c42c35ccf8819f25301520704938fc63ae502a26542aca3c91253462576004521251fe4218e021f8245df05a52f8e2f2c7a552b2d53acb7ff1a0ad1cfac8e7f6fccad8763818c16e4bbb49619a41b848a46e1ce099cd73dd1c23427589fc1feed96c16260ed7b7995905b0197ce44dc56decbfdf2e0ee67835a1de37e3d7344c430a73df0ceac05cb35f5349a698da30a8f98a86439689969e505577613ce4d87191a93c58a489a6af5f0f4f43eaaf8501399a7524e0e17fd641fe6953e929ee9fc21ac5508cbac0390e554729174219ec0bdc674412fc025f8911f7903d8c68e2e1ee5febc33c332c73a056b1baa94009b16f2c31077c7e7489e7a6068f3ddd938a604dfc28db69864f85b606799b7e37ea6a99eabf2f2bb370ee987357b984c484fe716ee09f6344da3597c930a80d51c7d473f62847466601fabb838354dd2643a53ff5406b090718719abab36299eb28445d3e56b936ebe94d6b3a8e7e29437a597daba1e17f432340b4d571e937b15453a4d0eabe36523140448fc69ba326ab4446a9a213d1ab5a8ed5cc5c23e0411f7f78446badd402a26dc9220494bad2156d137111962261b58bbcdf3bc3ae62e3dc2a7f8731d7651276b09d90c83f9177ab39ffca84a9738058ea8fdc0cdccc30d722796807f356a96b77db129ee1f64bd053e573b8083c18997758fe6378c6c894fd365f352bb3e7c397e0b96bfbbb1ca4c8a0387d878d6e060257404b675858206b90c4056c777b50f6cce88cec5256f11cee34d355292138da7b9d6dfa76f2444085c67cdede390fd6e23820a901965bce1fdf0433cddf48f8d91aad2c1c28c6e9e2be653d50fa2e516720d9ca3c6c991b5812986c333737f7892ac12c0420d9077a723f869f38f41c9b606d46855dec0d03484c28dc1332e4d9f17ad4d8dab39d66e8a32e9b624af9527c9b6ff84a8d4dbb8aacd7d92b253c484908eed7ace08f1f5c91fdea6813555e70f275e4e8877cd3b98d547520768c43fad477edb79fe424e3a38b06272961d366199ef33219a39ce0c68dcf88ffaf8a129b897d8c2a528ff680581b2f8e3a09f20aeadc70a2232fffa0721e079f08746728d17d694ab35c1df0f5b49051de46acf3490c233468a11dededdf473decfced08e4d6409a061f550092708054d7beb17efe25ffefe395f5bff4d5a9235acc9c5621c293d3e2192dd5f81ce39882a1c2050fd64715de4deec9915a4d3741a2b7eefe36468c6945ea10c4143e6a8a0cdab209506c3c31841af2725899e328b73939191ea5363a989a2ae71e8515ecd750d7a1648a19c27bc5ea0e5003fd0f0abb096d5e26ec9c5b386eeed9afdf8d0163aeee9177b822d534e8fb57afac3abe6a50f49ca9d7b70d05a5be03368ebe31d6bc4007cba8ded87d1074b48cdb838a7456d2bbbe01dbe71b9811c6cc9ab83a495c5f5ffede6d80da2f4cbe0bbf083d284888462f9e11db83f0946e14261520dff943fe97a30852009011d56d9427102e389a4aa6e3069fcdf17840fc4e829477ad42b5a6a9a3f8d65a9e310e8cb5b4e97abbe6dfd9823d9fcf956759ccd3bcce6efbb2e9b0df1ce64b3b988039ded0e561a53680f6f0f139825e764d5b2fa9903b72aa358d6d5aac8dd563a2ba5f8126f95a1a8ca43448f0112b02ca9b47e20eb286a733bdbf4304967e25a8f82da11e8922b1abee151176f71081b0c56f51781a0c165eae83b44524f4acc2d1272b1889dab6c80fc87a0895347bb92081d7304c625e164c6a243c715a5c868e9956349e0df2d163734a07dab6c48c2506fe48cc8adea6106188e1ce9ff99f31f6ac63c8675caa91edd39792047e3fb61c7e92ee0ec6b2d4de81735a7fb31981a2f0044d72c493a0c97306ed4a2d18e5eb603ba53e87a2b3abde09c9c43348dd71ad53f97f883bcbfc4ab941a656f173a422853302979f8a99b3f4ad072cea4cd4170b9515aceb12d965f78813d84d3502175285f5e4586a4f9c16eb6de2dcf39f230f0842682cc294084193c17367a1c5c52577fc0efab99b102b5bcce28cbc3e783f0b1236a0d5b41dceb6980eb5bf8f08d31eb81694d1056bf3f89432ce88a8c8a8f5dec4af5b8b3b2ae05cece0cd922cb9b8378786d9501833dfe118237ba70a03509cd007f0b281049a2e10d12e3b99fb699ef1b3fe0401a6c1f785d5c2943d5f2ae0fb523ef44686aae4ea78d313b25c6bd0ed2d0ba2cdb96f3a08ec0a5ff963bc0756e4150b5936d6e9b3ab5bf4977ae085eb2bc3b3f370411517193bb771f6b9be0f2cd42361fceafa0e657f2354972a36adce671990d33a4a7ada841ea240a778b443fe1022c3b716955ae2be54cb5589c50cc78dd2b08595c256f728dbef7398fafb8c670b9e8d52f2f3d34cd4ff549b9f3ecea3f08ebf51b6529c7e1ff3dd8a2ef2fb45dc4acfe5a77346771f1fe201bd715096dd20df8d1552d86a6fe7c822e279b083ba93f29c6d6453aa6a769af79369065ca4fa9bcfed32012e3c7006e946471feab4678ea22e40b89d79be3fa5c470bedbf7f6c5ffe8ab8408a2810483b4e67d0d13c87d811be1446dcbd4620daa6f74f47e58e56e225988a0d8b2f59d081097e70bd172b0eeb43358fe0a69d19a3778a22f7f18f5b8aa59a2940584c1b3b91a9143fc6c7687713f9a80835a76b0c93430387b4fe92a8882b49c791b5661df39bf09eb62138ca330e278c2c116262869468fdf920d66b581e4be459dec9d8114c2806cc327c533cfaa00e3b24e9c808862ee9811258e0915e0cc04f589e90992c7842b1e8e90ff5800c2eb8ae05a180e280acb1fcb187e91223d83715a5d45da5c31927bce19ba66291880d573c3083240e00b428aeb4c4fd619f5ec7424ece65ffb030eacbf954d3e8975119552ed674563d547d680015a6705eb175cb166f5945bde7d89c401275236b81696d4af09d41bfb530dcee660bb22174040a64597d033003dca98450ba0b946c138c34c9c97d8bf0d7dcbfc90f1cf5ccd4895e007f8daed5e23763b0853a0af7170c16c9c073e341e3706a8acec013f20a6b2ed1c3192aeb37fa5f7baef23a0005205e5b61e5f1ec318752235d59e8f9e9792197f056c765270c00441a0170721da5f5d01655d3648bcc4fd76208cc9e02180baf5b9886fce4e84090d18c286c529e449e2167eb4906a7a9af64eef0d82bd46163dfebab0adb9d5515d6824df3af6c4e0ab3ebc62520253a24569ef626169f5745bb4c7df9eef579a1618301e6593f83fdd21030bc914db1a6b222a73f4e106abd7fee4c28218131c5869f51abb0c16fb99cf2830fa97bdc724650f16a6e37160f78a6d0e4ae8b5c853814a5c9af9b3ecdc7bee10d61e750a03453d7961ac8f503ab84a61bb124c4c9d998869dab0714e45e7a64ab56b9d9c1a20172fdf16798bc5d339e605853043bc8133bc8eff180927bd9cb61b0dc303dbfd508845abe6d9f4dd38c99251a05794b75458d6bade47161b74b1b6df810754c2fc614b6de9fc7b1be47a6fa1d8931a592543266f581a2876b184a3456c01dfa96c8085e4101640d11e198576687cc5aa89ca3166f359801716de6b634968bf94e1b4af36cd61dd015fdfe13279df7acc94c699ac68df2d4505be285dcdf728a735a56a3ef5f849ef3de17fc177049e2863407366f71dab4c59579ed03b7a827ef3c7c1477c2b5c69f250313205c7c3c884e58ff0597bb3bb49437f7a0884e0d9eb6ff3de1f41c62054c81da0a500e2350655d853b0eb40954dd325b0882e82c810247002f939aadf0894c8e0bc6ed871ac96515319c56664522ae0d9012ed520e8304289c47c7da0f3d7b5791c064d72598626bb07979a0319349ee831094725d1625393c7b7d66bc1fa66abf5ac373783b32da757498026ec454d7daa4392b15f3dbc7a1cfe257fb71e590e330c8369207a332646863fbf4f3889f74a771cfde53c30306f9af36940bc7ec3daf81d79a2b85dfff6386d235b00cdde330b58a1cda650bf99d8634cbdba0e5753ff0896ee8630c3f13eddf48a4b3771f6cb9b1dbe276eabffa4951c37b1e430915ef62798eeb13bb0d874e9b4ae85ce07108f80d76a4f8acb8fc84a01ff5cc58d6f920cf03ab020cf3c859d70161798105d51ccb760570d7790dba3446486212175f28a1743f78e4beeb8ccc53898ecc19c023fdbfe2da7ec2aecfc9679008288a97c2a7b38b030ef9fe8a3fefebd4197a8c618717f5cd86d722a08fd0f0245da7b18eca7a574a5edf586586b97cbe3e980069a2f4e47f8932d97d89868a102baac46b02994464ae71d395bf97c65d44a29cdf5d4c72fd06e69cd2e22382382b41c9b4bd8564ef2ed123bf26757621b91c5667dbbe61cc75c11db2fe361d2abcf5c1a4430d9eac463c0367d417dbaac24ecbf21ae400e02d0897286c1b2471c5fe010bc50b0827e3b1e57543cffeb628a926283d13ded47a850fd0a27421a20dafbf99b263698fe6ee5a28384bdb58e89d77959da9405c4d5e126f82f9f2d37b4032b7e78c2abd3720bd380b1a96351ba57fa323c07f8eba2afa30e76225f939a76f40df44bf5f8d0603782b457ee025edf3717a40d09829a72802c46073de20bf7ec97292e37bed65ddd912253ef4174ef72065e6191e5a5a6c5ce516c32a6d7588930b9fad6a2cd7bafc3f5d5a7c6619f4642c03241e924518c38bbdec7c3b9d4f142eca2271b09dfc2e4f02b19faeee41b0768623187c0b77054e6577095811b6bd991a50bba7016dd54dc939c719569964754b7cfe0e62d4b60dc3c22f54329547f36c0e59e6bd078af46ab3b961b9d143722e304909ccb7c16223791b5849e2165f6ecc4e67fc4ab4df86de6507903653b5760bbc6d408ef09894ce4652c17e313a0a1bf163298f842b17a0dc22a3c033d048da7e0bd8ecf63e393fc795416131320508cae14a9bff178164f511835b18b2109a1735c02368a194fe4a4653923a04100218203cf53b4d6a23fb574b2f11836d3cc0cbef6a715da3b1ac03620d9896aeff641e958af6b50cc16b0c5243cee1df89f77c3ead369b892bb904d0131eb9230a10dd186e215e0561f9b21c6ae11adb848ddb9c53ede26dd6fa120a6e66ca231a5bc08c2b9b953003183ac421410fc4bac9c626513800c672b8e9bedc96c5eda4810c0d2b3574ee31d4be25a2e314de917528d1541dc7edea4aa22d77b52104c2e5dc7dd1c7a04e81359f44f2546ebf10c1564e32ed9c7d477db4f4e2883ab2637de6284af923d10205735075b515d6a12f3c48f13c4d643d6d453325aedba22681892de4d4fc8cbf4e49db42dfada819617609d9c7abbc3999708ef27f2ac36f6f62f2398454ac00f230700a8038da20a9774571a894c492eecad6ffc4c3b65b94c0422ee9dc954142a5eea47dc4a2ac337e832dc527b93c6bc896099f0acc48b15fcb560a1afba62f20973bf63423978111c6cfc4a5e0992ec0f905edfaa4346314d86377a68c9a7daf7cb3cf4b7cd6ec75320cbb91a3477448dbe603fa9cae35401bed205d0c0e2eda4911492600ff5891b06c243e469301b30f49532a42fe1cf136692806a118165c4bc80a1f7968780de809f98144f90c514983cbec79115b7b3e4ca7cf88b4d9f46e6c23e8fcad2ffc29f46a03278d306fc45c98fc7f30730df8fffba43d13c725aae74333f5f92fb29def4326ddca8c9c5c12aef9bcf9f32d2f9c5d2325bdbffeba5a37bc633c51c948b0f8ec6d661b0af09acda88d6ade63de0511ee5393b719b4533ce963b305397951e2ea8c05ba4df990c34d389604072212c0525dedceb14611c7d5fba8634021caa9a1d154051d110b8db263c50283a86dbda8f25ba8df1fd3699f27b0c2943ff4dce383e359e641e94a35d4439c0f050e832ce9476167ccf7de9264b064577f13c7bf8d4bfc3dbbf0af42594ca3badca784b805e1e3ffd8e3962d2df129a99a3763e6704a5890ba6374f10edcbac170c54ee7a54b9657881c0b801e30721a950b11c9f565f0d735ddc13aa3f1c5b5b2e45c825973f42bd89c4dc3cbb9ea4bca70244c1f3573aa42ec8821e21ee2597b8915153d647880a5ecb8f6fbb2d87bdd02774b0cc16e5b30dc40330860889fb417291bf4dd654012766ee775ad5383746df8c5f37ad09da839ab3e5fed2301cb0efee77fb8e924943cfd71fd89e7fc34120c8a72a1db2130b297b453d25d75f0961c081c71c41793f1082c4eefe57fbfd952812b5ce93d999fa8baaecdfa5a3e35364c6a23b9e787c05bb58fc5c82ccf0eb31df05b70b950cb75c54bde2e2909994b1ce7fd1d57632f82ecda1a63c7efad6839e1e88227084423e463038e3d3d99fe512902066a3a76dce83a812a13f86c0e94a6d285dfc59a8bf3ced4486a0a0306db7cd7aceaa6969b25cbe7d7c6537c1338792df01d5ebd4fbed5229b75b7288fce5d3354f1d8273d38b5293fb3f2548c87d0b19c5aea7a0575a216893803585595ead4c0fa593d0c36cfdbff041a2556aa826a72fd4d6dd72f3b07e690cc94abdf67f89736c1ca3c3aae1a80f53293bf3a439d3472edcaa5ee72e5c3c2c61ace2f367f60596ee91f11cef4641ded574b193feb0d5106544ace5a7eda5a57879f5c96c150b3b67880d13f3aee30b3ffac2fe70da62644e3bb24a246fac89e65700b5348d3d306d124ddd50266c024ec4360efc7de97a03136884ec4c460080c21511a458a5c01e617e8e2d33b86d776f28d9f91570de50d04bc17d58dbf0475e5659e02cbc34e845c6ac16e8b66479d17d2f3c1c07b19bdc20cb1e2501c5ec4eadecdc98592efe698889996504dce7854ce1bfd8a36bebec31371916344f9632a85201675dfd9db4f1ef8cc183a3abb550f876c47cb20820976ee41d5aac68460c17aa6ee710a25a31b984f5363c62fc28554a098c979557beff0cbaf08b8f454ed255ae7ad469333946fcb957c530d367d07140247acf66916f7c751cf73f6f529bd2f55050f5040ac18dd72c0b4ac79525d089bbf9703f266858cfe979f77c1d1bc67fba642207ba06241201b2e3c7edf1837b1d5b0b9d0c9eac39ab9dec07c0b55a564d57aa77f4445c6d077261cc9a262100d7fa0d27264f4ef70a28946e4648ee8148af6395784b829d714dde4454a5157f8cf7b567e4237638d71e72804f330af83b470a7480d11822e7dd252c53a6b8a199b8bff9fe188f567ce79ceb22c975c9bcb37986256e3a849ef4f22e103aede3db8f51860560e37cab00efb087c0c906a7f0e1356755f9e8de5a87aa6ad469a051fb2bcb990a842827ad33f7f2e7737b5dc3764c25e308b084b63a1ae06bd0c4fe39a6e3a0c181a39713d6a87273767cc21563c46c54b06486a0a1d574daebbe34dd141aff9cf3ce11fc47103db07f0fb1db3e3ec4a15b46481f2915b6b3140ccef13e20ac27b94de55060b2280fa4d6720609d8f4d76f5389805e852ba3579ecc05bf944e030f58ac1be262d3ecbd3f14725a61911096214caf45490f82aafa382bcd31f25689dd41192ffac84acc058b5db6da2d04219dc0a8019f519f19e492e2e650316fb23e79e87f750b5a4bf62b22fa0549893e0796df26cfa569dc5e98412feb989eee704b55439a37c446ad3fb896b3400fd3e23ba9effdbbfec8523719b4abc91a064460dc09353eebaba043811b5f009a3e01339fba842ed9f2d03992a43c09cc71e9d0774f6752b9584fb970530df5b5f2f2dc123b793b4bfffc1cb998edbd0c1d82785d2e5cbd6e41fa8899f71145861fd6160f3ac2865fd4f2626bfb3e7971b61b5924ee5a4ece88d4219f9559d62de82226e0beb5f9ca6a52ef455ad5e933d3c237e26b40b10520eb3ee87dc658f738f46ed417c2d087bf6ceb33696cdd65796e9fed08542cea9683c8588485e66aa2d3cf6e3204d89218344cde976b8e631288044a7bec2f7e27a8eab393ba5ef01f584737a60c620b61295abdd9d9de068539253092486c2b808fa068e873f857afa0e06e5a7809c062317f9387de2c6281a96f9571590f9fe9d7925f36eb2eef12948bc16e48c65d8dcad6bf7149ba2622e9071fff7075e77e08461953e5ef69d31a7445f8aa5532a8c9fb7fcd550a1b86c4dbf23b1a78053f19c68a2b265e7fa58c3cea5aec9945b0b4eb405927ef773a63bf1912927175e531129b59ef63368b421650d4d51068377650b9e8b14f2c59ad0e3504672b71df6e0404d25ad87c1576da89a554e0175ebc579a27d3bb0f5b7a934e38d164954e7c4c9c7a65c1f0ff50bd854341065137fc4057081f0ef551651616eed2b9125359ba5ee81d14c841bbd4fd7ab9bcf5b17fe4736ddc17b9452442e3a919a506920c7963eeddf438bd82e3e51776fe2f675bc1013245ccaea7af414e96ace7b72e7436cb168c154affabda965cb00e7c41a1b462fdb2095e57be97e236165af0fbb9749584f0d52ccba93f62d496c10389b6c4cee3462f40ec1173f06ea83fcad529da03395d890163cfc7f20175de9d335f8a682aab6c5fd95e0526de8c7b52f85e8b426000b32f46437aba0ef2368678e9ca574763bebe051a24823efa8f8c4dbf6cf4a167d0c70469aec73a43356c199596173e13a2eebdbb5339247e848a96b826929b2db577457a99886bb5ec7e59445b420af3f137a849aec8764b2eccbeb08fa995cb1441ef57132b477f58db845d18412824154c4f665fe29142d75032b3811cf8a2e1a5b1a54af8deba8a9e3f5b68c006f9f021898051e986cb5d4113355547b98433f6bbad26343bb6522518c7086adb02ba1d99ad2006fb505dd462d104ca7064d393cd0b48893fe92001dd0cdaf5ab97fb3c749f7663999dc09c36c541a688b6e30d13e8675ee94ab0fcb494e0b6b5b50599a3b6ca371917182ffcd417bec15b2e0ad33d567e8e817ae11c14c3f4decdce9f1ef21b67d339bdf1f8afa9f98bea87c7dd9da066261558fb4465fb3ff09acba731c4d0776697848d6117eca8ae4c15849bfcf4b6d81187375714e302a07532164e0d0d889fd63001481ac116066b9b89a259a04826d86f6abe4e1e0f6119ecdc5bdd4e67e984665fd66df70ffaa8c53da639eda73052c0967bc4ee2a5fb88e3c63f69cd0d2ceb9fbcb4b17b73c70bd71b4bcdb2f0128fab5b26d3c7b4bb4c8960244a346582865060aca59d4fa53edcb687015e9162a57527a8b75fd77eeb3596f364a291220101b7a61355b742053918a49f2a3f228a98d0d13c968978c00453a07a8a5b8fe755b4336f4aa04393623bf33c5b016df15b5c51e935a4283f9c3c2dc992cb66af3ece030754196267bacae518e77a41049c57ec572bf44f48c363a811a5d0b89477a2239f5e5f731f691a30ece10b935f212f0b907a0a8c34de65f2fd041f799dbdf4da6e91cbd1925b6313a8eb2cca6df9e80b1a4e6881d5290ee1fa2aa2bdd742a6454f885ca4dfbc0fc22fb2e07021d8dda5c3c3cfd87c3f49723abb3911d991f52170d03a21b1e1a91bee1359e79b78ec46ec1bc743e6d440f175b7def8aa70122c8214aafca02ae4e2cd19d0a567bcf439ef9df2eea30ffdb1bf87261c6f86a59e8e895b0fd2222b015601f652a4b94dd3eb93b9691c3bc5547ff89b73ae15d0c6e65bb36442706ea9f5cf2b6537c57b2624612634cc644b96ef7f07b2abfbac97a7e4e17c2d4829b5b37c40c1d7d6c1e423479192bea99e907af229b3876feb13d6cd5c7c8cbeb38abf0b9add532ebae94e3c04531cc4c0d5ed48e430de8481eae11e1629ccd1f959c4d3915db64aa0f1272fd32c7f3761544b2c06561d99f10e3427e2d71daeacef2891fc6d9c51f472cb777d4cac66cdd9d8446d806d07e0e730a810ffedf5f407349e58ce2a77fa70d09aa911c83e831e8a4410109ee8b1d79b118ec7cf6f0a0304cf350db89f11a3533be85fb86f1098bb5b7991a915435697e657436144f49a4d40f0cc838e0b82271e4c1d6735eece4e8b9c442197135a791ee03e77e3c0b943e3d8e26bcf7e5a0a05552b588c77503cc8b7977a0ad759d8369ee85e7f1df22930f25840ad651230db81c7a907809184ba69ed0469b35afb251a1e96fcefd358b5cb0a858635db8336ec79c6e6b738d0d26ece2a5ff6340ed70b2271a67f9b490566d8d671f3308478a6f1cc0101bc1bd4694fdc1b9a8caa3bdcd66af3a32190ef5d60dcb653224abf77e1813b4cda66a7ee37a619b622be15d8b4861a0fc30a836c9765238b4753bfd7a5103e040601a16ad089af7826df1a3b26c9b61d09fefffb9854dd3cfb2481eff93a124aea92185909cea8fd62a5fbe4bdccf0bffd3db2e7c5418239048a8a0e463d070597f1cbf44ba81b742cbd99cae63f999485e0a03ab8473a391c8046ed4c5e74836835849b5ec4ab1e3cb98737a3276077730e90929e5162d17d00c7e7c264f79d1489e143daef9f6ce82d66446c9654c78ad76373436b9e8c52a0dd2f44281fe058825b8470f9c74882f46f587bebd273cea9bba19b84902c66eeb7542a5aa4289832301258d7f6748143a41c0d0815d677beacd80f9e7b909593a9b1fde1b9aca8cc296095fbe6ea542c5628d734d3321bd792c3d1102b823fd2b71439180f5138dfd0a9b39e4d9b823587d8cb67d85e447d882e115ae83ce94eaaa7423c0650cd44b38bfe6ab1a42d9ab14a1e1d782f8cb4189d515a253f5e2a2d7b6072940d93a193fb4af238615b35b8248837922035f06a1e86f3ea5b879cce7f2c555d0b39598b20163d2bb5300eab8abd16acd4e79041feef08ed41a6695e8ad75378ae4826d6a4bf94e64f6d86d4bd04aeb19fcee509b9ac31150c0fcad41b1c5d8414d9cc5bd43028e998f38bf5c7c15c687c476c8dcd4687b3a8f3fa8a49be16e71e5ff2c582dbd06200bc54d1ea9f96265f0f5729e25bde256cbbb2ea2ad27e9dea3dd157a7af2645574627456e649aa79f8723ac0a3489e10006642b238e57182e11b7bb98bd2960d717ae3b64ac9d47d2982a7809c171e27fc51a93c10059e6a15183553e825e9d15ca1cf1c5831a7f926a91e514defcc964addb7223e4179cd030d1c66723ae09943e1c2d5e685a68dbf66684b064c5f4f27f64cda86b83d1e0b48a483d40564dd12fe74b15b1a351116ed7f9dea734b931478a9cf8e4d9892713799e9813129967120ceb632e9352d4b84b19b919d12720c86b23659fd7b62fb59c7a43fa70a5","title":"297. 二叉树的序列化与反序列化","link":"https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree/","question_id":297,"issue_number":20},"18":{"day":18,"pres":["DFS","排序"],"tags":["哈希表","树","排序"],"whys":null,"difficulty":"- 中等","description":"```\n给定二叉树,按垂序遍历返回其结点值。\n\n对位于 (X, Y) 的每个结点而言,其左右子结点分别位于 (X-1, Y-1) 和 (X+1, Y-1)。\n\n把一条垂线从 X = -infinity 移动到 X = +infinity ,每当该垂线与结点接触时,我们按从上到下的顺序报告结点的值(Y 坐标递减)。\n\n如果两个结点位置相同,则首先报告的结点值较小。\n\n按 X 坐标顺序返回非空报告的列表。每个报告都有一个结点值列表。\n\n\n\n示例 1:\n\n\n\n输入:[3,9,20,null,null,15,7]\n输出:[[9],[3,15],[20],[7]]\n解释:\n在不丧失其普遍性的情况下,我们可以假设根结点位于 (0, 0):\n然后,值为 9 的结点出现在 (-1, -1);\n值为 3 和 15 的两个结点分别出现在 (0, 0) 和 (0, -2);\n值为 20 的结点出现在 (1, -1);\n值为 7 的结点出现在 (2, -2)。\n示例 2:\n\n\n\n输入:[1,2,3,4,5,6,7]\n输出:[[4],[2],[1,5,6],[3],[7]]\n解释:\n根据给定的方案,值为 5 和 6 的两个结点出现在同一位置。\n然而,在报告 \"[1,5,6]\" 中,结点值 5 排在前面,因为 5 小于 6。\n\n\n提示:\n\n树的结点数介于 1 和 1000 之间。\n每个结点值介于 0 和 1000 之间。\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f2a9c133385f155623c4f4e5a461d578280275decff0317058956ec014fdd67ce65ad9d3e03c1ae76b561bceff835f3316e60d6d7cfbd0a2ccfea998f527d3be17095dbb7098c20b026cfebeea39f5d27dd4475a79a382c23147ea69cc7bb33d7092b3244f2d267aaa69976ec70ca3510822b7d6e4e7b4548c73e88991eda2b4b63e55768a9fb08a4040c422f355d74017615014c61ebe6c42287961a4240a34443567b053260ba3606def2308b7638921b9b6101bd6caded7a876df5beb5fc25a2356f42cd8760288eb26a2d13ce83cbb501daae759ffd100cffbdca85cd280b69e18cff43652b78ce215c4a3ec9b96aecd983f938ba1a224d648a5b3f3fc3b9e830956fb403dbfbae46b4e508bb3369dac30bbf85ae21ab3f7f259f704aeba4075bc3ff0cab981783d71ed763fd6142e0ec146f1546d8d16f95aced02e6c9a3a2e5c9b4bf10a86b8294735f74cb6d4050b038d13ff9332675693f42e8cf2a2943f4279da5300545b97592a481097b8e3c464d44d0ff7d52c84129cb6e6084585bf0f3e27bdbe17676864c232d65aeeb1f691755b964b3d77c7ca05f3c04e0f98ce0c031e96ae5af977ecab26f27e66f9da1a725c63352f9617e2e016e796ff82de4b78b9beaf554df9676282eb34fbe1a0759c6fa43ec978d0d11424783cee78d72e1d2a04623833ff55f78db4f08e54511480fa2119353d2560c4043d766a6a57f733860df7613e3c898f9b9e442b2c9e296b1b10583ccd30934336dff97a5b6c3ca4b6f89d362103247c659989adb8b7334124038b7e7f48cb25d26785ef756f74c1c832cdcf54f529ec140099ee9150397c1a1b6ebe98621acf97f5fda87b6f1aebcd0ad6c2f9a722155744b2c4c1e8fcc1c81d7ab4b1759ec5fc6f0d454162cda44a747994d9ed215bae7cf73ed5210e41951060b179a9b161b69039b3205c651fea0f8b975d734272e32c5ef65eb20476fbb56afed5767d82180a1d64f203703de060ec19d655484d513ceae569a4964590eed976710675f2fc7648edc915ea11a515019c8be03d3a433b82a7111153c52950910d416f364f47838e68e91b557994622f5bb8e87471dbc1277a32675660fe566f504be46ae36ee3500a698ac205615e8d4c69f70640760594c45015355c7b499275067a3e58503c35b2a0a3037f5e15d824373904ddb234c46624984a2deb127f78d5e939793f9397103fc117afdbc2d9e639a8d6480fd74c57137c368dbfc6f699c687b1a8fa8df52522586446d42c6ef94e9c5340d2d3165c87a77f28002ef3e82a50013d948793aa782397bd3ffee99a60e607a08ef29ef774799699acd4c227de3fcd38ffec0e4e1ed4048db9ebbb2b914951852ec5cfde29cdd7fd1fecbc4c6517cfdb53fc3ad71ff9eeb6d0257e5a05363fbcb103c9de6ccaa8bb47a38fa52aadd30d188a852761d75e95731849a619556b8cceb8c90b47876e44a04edde21519aec1d31643fd9927c51514c56d42cdfe4693cd46b2fff6616428d03d91d1370b33b549b4f5b77332ef606255ec36d30fbc7eb28d080d7f025bc9d1f41180cff847fd7e0ff4a88cefa6f9a399552c5e4fa3b400eee6a654317b645cdc1bbc00c151254d02760ee1a840bf3c9aafb6a44f81c13d11f13cbaace8d931865bbeb98c789786d2efeba596d58d21d283a7188befa1f93c12a22f89455d43461d1cf5f17a904c2b3f561f458768c377835061acbf40ae6411cc2f4ea234edac9cdafe1aa8bbf33a3049f6758363dc0eaae0789d83c8b05bebdd8647d993abfd9315ec27f466399fd2cf4d9b3fbd573062467a796ebc5a2533532639d7d6fb2371a4e1a304293c9b33b2e2e3836c7d19d2f642badb88b6bba53aa1f1238a5dc692c4ee68e6d697e4e65f707b548d03fac117af69987a3ad8a7255c44bbebabd5db4e69f4b8ddb5065a71795650df965d38e51aecadd7c1e965c20e0f388adc053ca3b249038820c4e88e5031c6fd7c80442b1ed17f665e64e9d5d4a1e35212e3911ce37f3b1ca17d9bdf568d0bc60e276e0b559cf6478fb0bd91f0c24467bfbb2ae30b85fa2c978ea691f2cee3a6b39158aa5b587286c5aa4e9eecde22f1b3f4a97f61130afce3675978a2cf9d7ba53efc28cf4a955c50c5fdaa1543203048c2ffd2a8a466414d37131b109f4ae1935d168d35c0a3ab5fd426d681704571679f3529674efa0c6a3a378bcf689b0a8374d246ebd37d3bd9831db753d833182051f45332a63c04e493694a9ee98ad4edf0b6cd8d04dca3e91e6b08a983e8c1885964af4f60993ed3fe1d03427589fc2d4ecaac96966ed7b4e9090670b96d36bd644f7cbe2fa26328e35ca7e954a9dd5ba3df6db24aba98d6db72d986aac0ae6926ccaa7d5220f0be94c84796f304ae72dec097d37438945a36af4d0f4fe3faac56413a38f53781e10c566f15420f7e0b5b6bb17d13d35b7c83dc3a76e16d57469e0d4d4915d3056c5d3faa2017901d4c6a8121fd8ddbf13cb3ee909067105a3a2299a3ff3cd3646c4d96b9e5a446bdec2d504ac57f5c2a0a09a7cff5b42629aa9c2789aba18e4df9be62c7189976313b7371647a35efe6513790f9b33078067ded1692053503eb91301546ef989536d6c9f1724378a686febb52ee70ac0ea2275fe87f129fe901c8027cd90abe0b18287af6bc0ae97ed056da119536c5fb1dbf95274230c3e6ba1b13d00714251bc3198b5864c8bef5ae9d1d64d2120ac022fd185f9012934ca7541ff004898af5d1246ab3c47ce6444533a7b1744b482fdb83cf9757d8ec7ac6754781b772c00a2265b7ff6f167797c508011ebe71b0e0841071543aa83bc656fe3cec27428c679a842dbfc1d82fc85fd2d3f011a3fba134af314c14cc90ce92781398aa523306de57027190cde0bc53b71bf3c2cf4abc3c357dd1279c73ad5aac467cf5b97cc0620420c86f2d7766c4d1872e19f445c6c607362ff828ca2fea06f74261d45ab810a8e76daa12f5c393b9dab661f1f47333412050f14e851b046915a99667d9b7246d9fac60d092f49832404c0e4f99266e904848fee59ea35c3eb6eebd32ec9729e4eaedd54056d8442422a05abb41cc9563aa76c2dd77cea7df92244f12d75c4081d774b347c1f200708fb1a75e7090e765b30cb6ac0707d0e9b44691d9c9647ade2c3cc4ef1a64d80abf7de8fb73dbc59c1e169d43adaeeeda227d6ff36cb9fe3205e85e4289505a4fc152320406858c70a7a500c1fc77cdd06a580f9f48a59fa47197962772f8c912740876e7643dedf48a57a5d298d0664819fd7aed828945a88321a96d20ce526b8fb34c2710751774ad5cec01ee3f45626271c3f4e57f71df7f49baec1440349bc2b5ac15f9bbf9c615048305a7298b9349591529247571b3f9547d3997c532b23b16266b699d2a57532dfe1096be123a196b24d2e4e3f4490fd55fbb54245f2582cdfeb31c13db5f6144fd48bfbd192d132e52627df2d5d5f7e1683e97ea432cefa4662cc9bf387d3bad30b97ece0d3dd9bd0d1abbe0e53b0fb5103904c2f6afae864919e8998d9133aa4a30e1eca3806c45a03d5a8795342efc21d4ba9adb05f7f2a97a96cfb570044b0804fb32cf4b6761acdebd684fb9ed484a4d684628893aee2e29099bf793e846fe7ee209d332d4ee078775a2bf279a47db25fa1456d26650bfe022d3aacd7a9dc333d3590f57fef248eb5341c1fc64f0a4ff35fb319eedb6095e13627b2eae05993c321b897d422089a9b62c0bebb9d48f22b99b760d7253b03a4d10e550b517a2b6c19139910d862f0aef69316b11a905bcbccaae8f8592b1ea7df156faab0abeb628167f99b4f84a981412dc52f6d4b143478591d659a3081fc993293ca1a5fe0cc3662581b49254f36c351ecbc940fe782704b1730682e2426795f39512e83456b367e64c8fe7e1cb5c2d6d728bf4da1690b8547a46f46d2572bf895706798a38ef220ea6cc4de07d0cc2c6e761977dfc3881fd91b7c77689aa3668b5ff06d35a86bfcd6b78f7e60a77764f27135b8f7fd2bb7976129af00b6cd86ac4cc11a1c73f8103faea3a8e067fd689a13b74e4868b4bc3454865db0a144e154c0ceead189adf6b04732757d73524e0f248d68a16cc1313d9243a6fdd6171a811d39ccdaa53f5e47843eaec450225b2b4b72458482f5f346b8c504cd2bc034cc902688cd2a76b5dec9736f7e453a49392fd5a8c9b5d05080d18600afa1c4cc95b3553c22393cc37abd0f55932f9cd7058be84318597cd15ab72848d9fed880c520c5e72237207747990360afd324c899867d7568b805810611abd55199381ad8cf7f85a5471c7d950eef3a1ae28d96b7aaf21c25ed4127541360595d1e47d6e4800cb326ef727160bd7ba6b8173b1ddcbf2ef0d38d3a12746da1a9dba0df93de761cb1e353b69f6d468dfdc48521efcb6c5afbdb1798d849271a3482d4353235f8f5a1aa5f5c63d7cacdea14b93d0312b4178aed0fc01076e5b6d7ea7d9d4c363efd48728e084d5f561e2b924fb950da0f8a2f6be218816f2d56793842e9f6dd7cf796d58742fbbff14a5321bb4e95158fffc4b094034db1faa18990335a4bd5497238ba16dd0d7c41d49dd9e1f13a72ea9245e5fe008d4a3328adaf17201c3ba2586f8c4064ad407ecdbc393116298466bd6a9631926d09504643f7aaa9ae1717f97c1295b93907d460bf2fef651c26b25f2764d7d4157410818e24953049797fa04260e314b501db06a61166cf50f184000c902772b4e241b544a1ef9d052f58eb8001657388282b2bdd4124bee28495d136ff8837c437ea72e32b16e022581e6a37f503a8f8bfc30c14289cd10c5f27c4cb78da009db3f080858a397cc99387653fd39cc8b6b61708c4142827a72f1f6f524350d73b4e825ab1de1f7ce9591f147c7f053ec95a9e3595994874d49426fcfb0ea22105167610fed12c1e831a7fcffb8e7edbdb1b381c8d3d3d06158eac31ac80e691644045b39fe41319cd343482db77a6cb2704506b402097511287f5161a80634b822fef2c672085021a890ddf8b67f00e73b04a6a72893dd9c71f7b1a6019e8fa5727b2bdea76924120da058f5f271145e8c8dbdf1f080d4c7f947b7313b49143bbcc63dc9d2947e7753d050b28536c496840cce1ca3bb458c4201e9d7ace933fd08e9e9ffe857b4eb49ac39442153398fde4fc342ade983100ab5059788c9308f33cea5a6ad98b855df2176b6e9e4bcec16cfb13d59a6a39e2e586e6a0d0a9177d00f240e48f9ac55e3c46eee508719066a6a2d9e2c8ce8cb594d720012a7f019a2bc59f4193271f8dd64e0f00aa5489cde4e4f45acad6e2473d07db4ce52935a44217eda9fa2bc0f1a0649b356fdfb3b61a80d54544838b06c3856c4e0ab3ebc62520253a241f9ba33a55cb1e17e90378ed94ba29ed24c555ee501583fdd21030bc911ff4f2e770ea155c1060bd36ee8a90ae44a6431d70b6226900dd5e69472de2f93999360211a3e2bdd5ddf6ae2f56576b11e84282b0606c395eb07345403dc2a72ada688fdb0a4a4ed6f551a6dcaa16e83ed507493c433808c0806491e6c8ab93520c5a00f1fa103cac7a59ddcb6caff8a9252ac41362c3fef8aab87bd9cb28f6dc223df193128c05f133cb58f9c0dc6b124b360f3057ca22adb5271ad7615522bc5526373dc61db6cf9f0c1f1dff1655de29908f92543266f581a2ce6b570a3404c01db48a9b0b495b4c6e4a06e18e10759db40ca881a3582071dd520a7fe6f07189b39f4e064a8811fc1dd015fdfe136edbf7e09f4c6b879f8a7a2faed27f30dcdf728a735a56a3ef5f849ef39858ae176549b6c840063c784bd0b488ce70fe44e6f05ae626561477c2b5c69f250313205c7f3c4ddefe3992d4d30dd0fd27abff95c80d5b385cfa5b50dbfeb3892e4d0a420e65157a180c9e8060b1b8b8600f4dc6e07a814408522fc59ae4be894ec50fd8c69a29f6346074ba56744528ae44991bc7520e834566cf49868a5f783513998c21c23586650ddf3f2da02c9305c48342d12608446b397d352e4cb519e612c330b16e1b7338ca317ac6182497018291ed7022da6f61ed8b8fa217b170cf82e94eb073dd69883367297fe4a990c7d174e13e9dde12c3414fb7ee64cd0b90bebd7a275c7afc087b77a42e4bb657ee9e72f75903a60af0d20a3666e78ec1f6ae397ff0d944f969c99a962467a3c6fa24113af8fddbff76bcfeb6527bc3714f4d4845bf737f83b015a544c1089b5de841a8335be75636c9b0f8b8e184ee4ab98043fcf92acf5e814153aeec04944c032d8b18b51ea00e443dd72279e87103746802075066f3693f639a94a1ccec2be61e04ed489b29352f3df53a7e730eb829ce814d1d6c4b5d459596027e57f26112319a9272e56ad263065d5d8a0c4b0d29af845c3d6933bff3aed62aa8aa3174931e8714e3ff6f7b08f45ecb16c5540650e9bc414cd4e52eabe107b75c2b70ced7251d9bff8f592c0fc26abaad9e5ff944552734b09fded8678e53ee430989b2b9da34efa0a23071f441ec08e74820b48ded2261057c999601dc2111510ec87b714b44bf173746e259aa2177cc31085b170f775ec8da1ac4e2ea705b12aaf1706838c6d36f6b7703c48c278315cae16175a047eff18bb263a1105025c35260449136d0ea1b9cf6dc54162f73410fbb818bfb170928f093b966e61b44df2a6973a59a860d0ddb3fb03ab0e943c558bb756c9313c23c6d428131bf0df78beffebbef0ac82b6ec0d7a2261ad057e3e73efc9b56b3508fea725746ed28e5305edfc8f264dc8769caa96399c8ddd2e8fa7bd954c46499080bce0000eff23f744cfbdc9bdfafb968a2d4fdb0d142c7fb1a4b044591bc3085a0b0c018665d2c44556a0a3c764a78920dbe32ebd385f7f9fce4f5b1f690db422074ead0177494976ca1635ba72735d272382563885074be3382070ae5c9fa6a29d97c0ecd1d67975719a06672f71d7ecdc986e8ffaf52354aa48fde99e6ab6bf19ba15fabac708479473b09e4c575aaff72fa8778f8e347280194c15a53cd5532193b17c05621a988210daedc30b6cd14ca4ac46f09c2d4fb1c2335c19348532fd09ab10346e65c02d9813ca5a50f8a48bdc21bbb27a833d315116a8fb5ce4ee4cbcdd5ccf59a3d9384d9b30e8be5b5d41edef9696925ee102a95d2c30009599ef2c5f4fd8809e38e98798465682e6aafbcc0e99e74b0659c394e89208626e49e2ef78ac938828a83dbdce84100bdaf3dd20e503b3418f72a5296185b9cc2c4c40d8e8c9cbc8244345ff54b1542a8032168f3e2afcaa593a4fc1fedcaa3aaa4d2ee88e4b85062036dc64ef54913b87b1b119edfb0dd73190c84e5248041e2fb29f8831c6c0de468563fa01c9801ed4b5449bf40821d5622f9867d0932b6b2bccc7189472faf600dad29c6085f6a99df1d35d1abe39ae33cadcaaaafcd8684ad636b0cea0606ee645a311d2b8ba71e0ccce8e191a8ed88351c6646e61098223797880096c44883d63fd46a8d3fb2eb8146ea34aa6def81bb40092b5e65774510635972c16a03abc22c2377d7d856770cc25141498cbd7dea588607c7c01724a25096766d941f4f89e7865c5aafdb27b933c0a07058962708517c440ceb107a9542785def381db9107ba6dadb789456f78e1f3d86be3b495388cabf5e201ad3cf1fa2c9ae340f21ac38596a7327c16375066245ac1ccae320372548c95caf0646532e45aa1bf51c782406f84a54130ec10c350d3a3d48c200eecc1ef80c410282f9bb4c4c7d7b664cac9e99a5d9ee212d6fbcb6e24cb367fa4e1a79f6256a8c0de0d0401406468bff9bc26f1b897be3a4646ba6ba26ffff8c4f239dd8dc8d3815e2f1efb6f312259e003923b6b4ade8706ae9336a328a529af8ec6d66481df79d8ee18d759f77d47f5dab15c7e43a9e533ce963b305393053e0eac744b81997d5903671960f073326a4065db5d59b4611c787ada87e4026cbb9e4db34661d1a0b9fcf49c502cde729f8a0bb5cfcd454df32fb73b0ba9876ba88e3b3ac43fc56a5437edd488a52314b886fcb3e683c91ecf49264b0640a6475c7a28d3ffd2cbfcaa9451c06a0a3998dc7f555e9adb09ca6966c21bf37e39e6771aa140e50dcb3125ef10edcbac170c54eaee343940c826c05cb006d580795473bc9f565f0d735ddc121a0a5c2b1fce5008c0621e369cc807de9cbb9ea4bca702405593d32a44992d72fcf458d1c15c6515035362e898fecb8a4bee68d2993023645558c221439972f7d4c68da969e172949b18930125c762fe923af4acd3831e7c3f735fa80a86b814975ed2301991deff179b9bb6a953ced1ea3c9e6cd34da9333b6701fbcb24719418507f5f827228680c4bf58923326a0b39b7a63ba1a51964dc2da12db0d034f38573d7c8a9abbc396bba115755f34c944434129cc58fd499d2ca4f450d07bbd2ccb1fc8abcc228ed00077eaf1ace8042a66b3a6675064c1e9623526b0e283b372dfca319de0334f9693a6c3d6aab0393eab758078dc2d48d32b070e11497aaf9c440bc3a486e18d3ffa0a2a4b690a214fb8284b3c6666133f647f8c72779a008f862f90ee358ce4aa4e7b59fad355733ab23433b8b018c5e491fdd500af7a1875ec0b947f160401c7f48cc3ca183465798188ab044b7013a4ed6a6ffd363f98606f7afdbaccd5a9c948a09d7dcac76c739b3fe6d162c6bb3a75933031ae93a8f329f68cc28a4fa37b7e76600244e91f4ce4b72b53be034b5770fd0d054e06559b5e65cc4f2ecfd61ac29473a89c788087703aec30fff7b063d656e33800acff61a846a8d594627212484f9b8344d72eccdb0d2ea62df76960b4edde97a06063cd1b818376550d26160017d3575ae61efee2882986d776f28d9f910658a05841b215c58aa25e75b10bdb0c998a09cc08639302833e5bd0039cee84b93e19e6e80cb1e2501c5e96afc08ad788dcfff5b08b9b9f4b67ce78548700dfd228aed59b4b2afe3711ab2d2ad765457b9596924c57a298076b3abb0814ad4604846ed11c78fa51d5a7eb8f60ce78f4e53e5360a30d96544667d8649dc903d29490391a60cdb48afb49b8e949ed631fb6ac148e3994378797395b0c7669112f241ea7a42f438e9351833aa5a129a06b5717534301b01c9c25c6f5e93d04584bba849b5aba38c2c48097cd388ed89627e0c247373bfe1a0e6fb0e5d5fd6af6bb78070e010b064f5990b3b7a53f58c712a3498866ffc0f5001687acc91b10e5800910e4f96a2bf0d42bf5098848bc2b6fcb38513939d334f801975d5dc1a5a7cc1d3fbce8e7c8deab1fca3baeea164eea8a73a21781ba8547e99f5abc33ffbf43924231e6f0b8b3b93644eb313fc047cc0b4f2cdc48927b328f2cb1ab08f36638da3903f7e7ba95ec7f6c8408fe2d","title":"987. 二叉树的垂序遍历","link":"https://leetcode-cn.com/problems/vertical-order-traversal-of-a-binary-tree","question_id":1029,"issue_number":21},"19":{"day":19,"pres":["哈希表"],"tags":["哈希表","双指针"],"whys":null,"difficulty":"- 简单","description":"```\n给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。\n你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。\n示例:\n\n给定 nums = [2, 7, 11, 15], target = 9\n\n因为 nums[0] + nums[1] = 2 + 7 = 9\n所以返回 [0, 1]\n\n来源:力扣(LeetCode)\n链接:https://leetcode-cn.com/problems/two-sum\n著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。\n```","content":"096221cf5b628be1e73e8bcfe626c734a10fb742b1ad41ac640b4b4ceeb6ece4c46c74b1f94135d5fd897cb866ebac1fb82941c49a2758c1af23f822b5e7ee6ee429652888c1cc99636081e50c7898f6d70dfa767226f84f5ed37480a7277449dfd71f8db85e1edcc5b6fd9b2d0a27389b0ec3e1d0cf2906fa3f5f0c87219c4887d6065735461d3241c422af249929f52b5d59e4757d466cbcaa0b38af9db0527b00702f0c4c59e6e50c7484c17e6b0f0bd68ace12592402f127a33154b6420415de50830f7d8305f6f5230deb202801fc09a6366345c29e4d2886be690c3bc29dcab917c2a04d83ff042ef68dc188e720094dc281c05f65117acb0f54a7ae6e73cb889e9598458245487e03d66bb7d11e5f6c82ff33834793e1c41a8d8955b45214ff8c7995e7d210c16175831eb9ab7e0c732df4b75da8c14aa69f61c220ba720f85cf8efcd5b4582e9f9391ec0fc7f8a189fcc994981e9a6b8ca6605d49fc83f2de75918678e66e5849035475ba97018daf34c0182f6b5946d8328ae31b6126a5511847f5d9d64552d17823e9606087615aceeae26ec3ed7274876c112f7a9cea314a176c84658be0795ca5b6b66345a4d5fda85afc007e222ad36d03e8b9e75a96a0af27ca356bfb5f482c0c7d7553ee20e38e819df2f469e99779242c9168bd161f5dfdeb40d3a88e1d384873a4cccfb071e0d864d6d64b9e559b99769a996f450647c83ee95cda739ed6d096433ac1b3dd9d664ebc132680ae8752bbde7ab1cdd6480035c260750b87837a6dec93b8ff8a9330ba0248b0b6ba937fc598f3ceeb7f3f0f4f2cb9ece9d8f65df0ced8f462d84d19aae41d25c7bf4716a7965171f59141211d050f2f35a4767ef2997a11646d1b50beb508708d31456304153936865e19b811024ecafa25f51381f0a1012550b56bd9309a09cafd7a743b4d9d2ad8f43d19510758deecb860736c6bce28ff57a2013c7e1fb93bd34850b40c09e658dfcdf97cdd7a68c0ae24a46e7d5f8182a4c91fcce60c15ff30fafe7b96ba29ee6c1701198cd36b530b6d429d6fed80b62bcf180e291097d63fb5d405d3716b7ba29a5ca43dd82381fe78f0792bda829e9754b5702cc4a78d815a1b9d0079970276792ce44fe50b996ea303c4350eb99d9f0a5622e9d5f98f734a26664844a6e28ed351375ebcf065bbc88515eeb6a29ef552da8c30ad273a9906518c66a9e7cf858ae3bc0bf4a7655f08291aa9c5ecae09e31214a896718033da39ce52fd62388e3d5219cee054aaf0a91b755ce3052543da1b34c9b0c3d9b7cefe1e666ab06a7b2535c22bd21fb5701f64e5908227f194d2dcf8f99ead3b8f211ca063d71f2eb421c3e5144675b094ccc782f18f8ac30813cdfff288da5e9c490ed433aaf4f5bc4da794c08fb95af3777bf706c97eb3d6c326476bb4fe4f229dca74649d885644dffd3873bf16a31fac25f722b6e01e7dc85d1dae9b58b65787cc2c3b00b67e5ae56427ede71c50a5fb1f32673fca9556735f5e59d7210a762567efe0c0753e4959d0836bdb624dd997e441d326a7d6bc2fa8cb8609eaab02411ff015736668a7670dfa9796e16f028f1eb3a45af781a633ceb568b0c5b7c01d4003fc63fa8aeed0c92e5d3616c26e7d4484b795398852b07d256745b0de71e7ce47af9b82ec8b81c75426f5615075a3e6e7b23a22c36d4fd2f0929eb6130d3dbd4c4bdfb076749111c1e9ccc75d00a940d0a6368f033fe206e1f9e5ea4e91209615603de1f422bdfd1f6c48607d10f0ae79fe5a8422026e2886fcbf10bdf2ff15a7601a08abfd230f91801f5cf5287528b6a43be19fae8dd02215596bdc8196b8889bb2b1aa3ad7a067cb38c6cfe4d7450e09a09cebf8d94d3842a3afb2762423f067ad28fadaf5174669394e233cc169684ea24da371d054fb349bef287e15537a4f9b8a54e5673155ae0c0d7a831531c9e320fa08ebce59c7f949a77d5628829f0abea00b7b074911ed06ca29834f930d4ad9e8541e6f1350d4a7706b902d960bc6079be98135f1aa5279c1508aa3897bdcd28e54af0ae62acda7f85b9cd3f93e4ae476751c2de16b6b0e96fd7d9906d370a39b70963018a4ab89a1a9862f6a58a5dce6f3c1edc1a7c0724fdcae0dce233b56fc1863001fd33859eca4b703b7021a50297df78fab8e17ca25867a899c8e2c3be470edc36520b8dc4b985526df4defbaec85c2261b16a26fc402dfc577472482321a3c2a6d6e4b4f14a57cbc86db4fd9d357fd7dd0263c62192a6348b5b6b30ec07c3d6bfd590955dadd57fdd107a92b651ef4668e6c37838fdc7df0f676a1c04c5853d58bc9adf4fd2e3ff21613a4fa1331db9f62830ffcbbabca869054ef0f2cb521061815ef5bdb1d9fa68965b62b9568833ce7877bc0b5c3201d2beb60afb1a8e7cf2fcc6afddf106901b85fee6f9a89d452dcfe2473b7e838446e63cb09a9604c85c3fdd1bc69ad185ff3e15fabb20970d80f0ef9703800dff5e96c57a5ba683d3854290a881ef3debd31c33fe91b055325acb5129a16c1cf356dc4cf7a9e5a4468c9c8d32f90e85885da99c635ef06256afbc8db2ec38ff721491d0bb20fdab337578f4e645ae434e303cf06e378a3f816890615edb893d6f34bd4f8d4a7753498e1f00586ffbe7b97f3776aa403e65d25dbfe5b741da97b55ad2ab02276203241456c78fa1b4f5f27f1e742e3ddc4b4bf8f4595d0a4e0c3fd0527b7ee8784bd72a7475d14fd0471e0781759f9e9be0fc58b714054b4edae6cbab0017a7ef09a745f49ba3a1b9d1705082f321b46e3c1beaf25a9673496c8af737537026f0648d81080f15d2ed5d3b9eb1ede774bdd8cb9859c99860509759f8079486bf5f929b160ee0264ad5f704d3b818388dbf02681aa72c22bdd079f2df315f5372d787e0b96bfbbb1ca4c8a0387d878bfb532256904e77bd5cd56f5494f44cf76d24e3cc0cb818b712e5880b026394d9a1e8db8f08796da662d6e085c67cdede390fd6e23824bde4a65b7aeb8f7423c9bb7949ac8fcdac39ff718c561ab04f148e7b11e3c58d1f0bd80ecbc8d29cf9e79573e28c2e95c844a4ec525a96f972fa7866bc9b606d46855dec09d75d4ccdd94672648d004ba589ce570de638a2db49f2495d1738995e4aea8d4dbb8aacd7d92ef7981c8c3cbf750ce08dbf5c91fdea6813555b54a730b1cc5774ac74b1194ba9b8c00ad57f09043d43adab3d6e50dedae7af2b9f45e778521ac38ce0844d0c2b3f8eaa32b9e8a3a6638eda5545ad9a7ab9c803284757c025636a93a52f2ec06fbdead4b724ba0405d1ca1045ba29df4a7d83fa286349fb03b0fcd40b8","title":"两数之和","link":"https://leetcode-cn.com/problems/two-sum","question_id":1,"issue_number":22},"20":{"day":20,"pres":["哈希表","堆排序","快速选择"],"tags":["堆","排序","哈希表"],"whys":null,"difficulty":"- 中等","description":"```\n给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。\n\n \n\n示例 1:\n\n输入: nums = [1,1,1,2,2,3], k = 2\n输出: [1,2]\n示例 2:\n\n输入: nums = [1], k = 1\n输出: [1]\n \n\n提示:\n\n1 <= nums.length <= 10^5\nk 的取值范围是 [1, 数组中不相同的元素的个数]\n题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的\n \n\n进阶:你所设计算法的时间复杂度 必须 优于 O(n log n) ,其中 n 是数组大小。\n\n```","content":"096221cf5b628be1e73e8bcfe626c7347683248a04f82c98cfa5f9247f160f2728f1a65326eb995e2c4c21d103e7bd46ab345588da2612d4a92ff52ab5a7fe2fbe3d6568d4c4d3fc0b2fc7a89ad2497027a976cb92b3098f21bc2bdaaaa6a0885427c11d72faf1446a7247fa4f14415d9751b4cfbcbe22aa14aaf20ca816926eb7da005c3a672e3063ed2880209935de265247ea6c44476ea8a61c37adb8815c6e3b702f0ca3d65b22607df88e7d1e7835a8fbc67930316f9b3ce94f65f61b1c528b7efe6749c951ef914b0e8f5d0171a424cd475b2dbeb308758ac0313b70babda3ff0396c770ef9936448bb5a3c4c8475359aecdcc2d1f20249229321529a8df738e808475f30c45495903e44b587fd9daa23efd1a964686f1c506a48a779a510bd08c6586e7e82fc04d5447c84c2fafb47104ebb675a0c2498f9c43cc259a77827107defb8ee910278e195903880c2a685732026b5f9b1abe185cb2d69715146517f67f4af804f9d2bda2d1a32d11e85128ed68dd46551d35dd48e1e2a36d1e82500f723185c5150cc42c74ff0916b6320afd96a65db5a77907de425b5460f0b3351f625be61db3832060c6e8bb06f2ee8fc7c932d15d2a3b43ba5572a2bfab1d99c4ef289b6f41813f5341666f2907d344afb7e62d6c33f2499a63162ca752bd381856c2d9ae644e08e59d4074b1cee7a072e3dc64d6d1489b6d99b44698b4754738400fe43cd511de93c7e1964605c29fdf9f4b5eb3071b434525b7e0f628fac4b9cfaad79a4f0975b7fcdfb57d46663a30098c069e81250b7d2cc90c314fdbdd73f6d0b6b9440d787d489a7d6431917b9c1401f54bdcb41169faaa73969eea2002a8ddaf95e8eab20b64b6662da8aac7aa8fcebe9d0077b616a7d65250a8a241a193708fb833f1cac9625ed9d9d46b3cf0708f37bb608a1861a9097219c5589ba274c4c1bd0f1b5f6da6c0e9b6785a29b033f6f57e10cd669a1f79dd84c939910228f72d881d4d5862d82387bd08d2c3a5d303c1a85923c4854749f40b1bef42e51a021880f6578fa295947df4c89b20c7a01778523dceb901ca4b8906e9cdae3f58c174f31ee053789e10f6b85d5a103e827dfcc0210f8c865d11ae1a758a207b6029e56ccb05bc6d6be548f181e8ee9c450b3e8388d3d12e63451e70233c0e0929dfd8f81c3737bba8f83cb40402554007140e3cb73335a300bd34f6aae5ed87b9f9bd36fd4ac2e8cda87bd6efa6f01769f785049752a233d8092cf76aa9b419f20b1ca59259e3acb25a255e8086a24e91de43f9ff92fec786f48589cc10aeef6352c5478c2b13b8af0a99bcc848fe313c82f883ec9e9ea83f9e4d25e8614ab97890d5672345f5fcc3a1ffefd7efc34648ef8dbb82a916892950c361fbc9a4de53cdfcedeac6647539eb25a3c557ac10b1373a0ab895e0cb511cd4ed7f65564a82bca5a85687068468f32f6fb8025803ff176b9dcf069236e5d26c5000dc017281fb9d6a3cf8be1775d99f327ac2ddf1c7767757d4e44e4b8cad6f8744ed3f48753d0ecad8656adaa3e946ce14e7bde96d82287cd76f31ce2a63bc15ece9b84abaf192f1dca16f846af2276ad443716fae155a0dd4c8ec2f84e8c664cf625e24b68d6d98fffe50bbb2814a4ff047ddda27bfa29381047e9674289d89b1c8a1df4733a8bc12872e566406597494a705edd614771c5734abcb9912c598217d90b5018a0d2f7b6d84ac27c05202f36de0ba368b69242f698253fe06f3a2816617a005d7356148a8f391372088778723afd4b0ee796c65aa503b76a470f79b68a6e1e6fd4c0af8ed7fc58ba85848e96364630a58c1b2f5ae73375134049bd9b16fbe506794291aa2522705f9c9c366184472148aad8c791508cff0a115e073ee783458f5c9d4f6d28ffa69d8acd52e880cfe14cf7efd3c1aaa9ec8c487e71057af2daff70dd53a136a8fd1e30e3da267c06a469e7d5d8f40a8cde17c874bbcb0197b8a9fdf53dc0be33cd354baff4d71cfd8e39293292fe5de69a86aa9248a0a2e1b9cf0b67279c05b87a6a87aefdf8f71b2e36c85e74ab675eaa2c54b09f314013c59bd61f0c7353eb027b910d6229bdd21635594f8f681cbdc3e0c04809fb9febd51216926bd994e26c66898b3f091808da9da4394c281da8c55f0205fdaa1ba6c2c63e03bb150943d2c2285283deb65dec14623bac74c98540dd05de9b5e7a0c0080a16a24ec401d6c7704c25a934192505676e5ea38331b714c4b34b9149b86c8c2ca8d98cd1b8c4c174793692b303093a8b714809caae1dc998bb4a2be0d426ec6788f41fe5b24380a87cc79d683339dec89780a38c3655871064f9cc7475e3f929bc7ca69aefa6bae32cde50bb6ce690b7cd4e31a417faceb4e8639f316bad36e78a6acc89cd201d26ea62aa7754134bed24ea2979dbe6e02b9e2fa6ffac9334f1bd4e62eb933611387b9a7c910b22a7919bf8f633be5838c469d106e7405e91700e9ecabdc671652fc31c142aa1bd5ce188c9226489d6d16fc47eab3361c180a190079633dbcc0544c7e07e9c48466bd6d5dc2581ea6eacda8bf13ff830c8fa5c0d6d72b5bb9db3efffa010c087b16611803a154f8db268cf50bf89ff5504f434c97f877e580162b070a386ef3d2452486d9d0c203da668f63655be0ab3cfd41b75fbb3f00ed2913784e03c71357bc5ff81f306d7fadefb6508939cbaddf3f11e9655156d1e4b02bfe36600171c63f574961802a147618f2cd8c5552d26af0139fb85e71c2836c0725cc82a21d6816e4e4bad68df13ee8ec1dfb3eb8438616f27f718bcb859a7ea7d1db2ca89adb528c92e5790ad5f172161d85fe18e41067c02375027a8ccdb7f0890dca61427b81e9f2bb8febd2f70c0a31745731e975f91e6f211df4eeb12e9279e3aa792e6fb8452243e7557d34db70f1ddd0371a993afaa55be4f629043d0c0917ab103a36c0a1248038dd9d96e468bc49b55eb4c330d791737cce3f0809bf4562a782f3ad4878218911831b7395a3ed1db459df09fdfbcd9cc9dcd65c535e745ef03b3fc1b6018c1898585d0e6d229f58c2e286a618da75cdf6064c525a96fed7ae5ca228ab64f9a3c2ea3c0847bd4a9eb93767f49d418a91581ab29a550df2eb2a93ee4dd3a8ec8ffcfa1d4809280cd7d92b25381c8c3a7be039a1498bb9d5a99e3d32b55b54a745e538b3941d51c7d94ba84b2399a43b8ee5fca32d3f5d6b827adee3ad893f7313dd6b034fc46e1a3521d67233978ed626f530770b962c0c05e55685968d6119ca58999fde0341ad8aa0fa692874d729c6acdbeab35c1df0f5b490570e474805dd58b760681169e92b8bd0d9b888b82904d2746f62f67a9d0e2859bc7a206d20319c82e33bc97cd28e5e44cb0110659ceda818cfaba5857a31a00de6fbb92cdc610dc5b13b193bf903fa4d3265f7f2bbdad642988c766f4541e6a89baeeddd45e5ad3304b8be22bd2d4027adb1cf052116a0ac9a4710b7f41f813e8d736a8cee6aa870926e335fd7272a8f86a546f2b151262894332254b0d120f6a0b5adac5714df1f046ced28b6c7ce03c48571427e6ad12358efa1eaec7749fee013e97a52d97dd5605396447e8a2d45a08f53f9481830a248632b6312cd9dc676e5a7b055919762f7400a577793f10275142525448009e026da833e1a7fc25dfd895b75b53b673b29a6ea1ab909b9a25cdacf65d467323899fb149689c7df54c7ba584da76e3c5d35f9a1ba0275dd650449ea34d2c6ead6d7fcd5d1c3291d2384ce237221f4aa57cfe721889265b0dd8094bd1e5a596f6a7a881b35d8852ab495c6678cb37ee49c82f16126807dbc7a7260acdf85c312835b32f840d56f5257733ede544a7a9d399f183defee727f5054a5cb02d46fe8b241ff8f284b99298dae56ed2291a07cc4720b590daa7ee84a2f497755a1173c34d6d5f6e0b9cf03259ea9f82c402b24db0720bcc47ba7f54ce373abd8b717acf898ef220ea6cc4de07dddf205c256455b796cb549c120b14159aa27b8600bf21228b41fcd6b78f7e60a77a77e8714eae8ad72bf1d833748d14d2d9c6a92aae9f99ca7cc5eb234e4d5fb50ca878bd59d4eead3b25340c869b1e13817bfb0f5246142f00617a8df59395f2cba984db6461e346079f8f57d909387b84df2e92fa6c788f159be129b37d14da95fbf7edfe811e2e316bcc717cb4088356f76c32be0771eff80b1975d8aad69cb085e89b68784b5b7488333706cf03200b1029639be1b69df953eb7b80e15bf770439d2667b4dc9daf77882b949571061c0749b7261ee9f4fcfca0518dd51d5fb56c5501eeb0c737c621a43b8113f102ade528728b7d6dd588e04cf127d5ee721e53770d78fea34c89b8efdbe1f5cbc3ba453a4fca4fd17ef3f4af21d7634d9ba39f1739d6553c0fa3d49bfbada3ffa3db99d757122d7910112fafa92293083381ef0aa2c2fce32f744710420254d2c96c4039b768386f1c783fa3df9cb516d2433175f537c967be01cefc44236c20d528e6a976a36f31fe302c024c675a952ae74e5bea1596410da6296f06527421662ab2d51c8d98a2c66e9104798eea86bbc370f147aeeb017a5c7bdc8a99df287a0d55b0255bbf37ae965376f0dbb8c4e2ff3070cab040eaf3e21fda3e3c8fad2b1a1026905742b4425d924047ffbc371d16a74199bd6a8b2f9e6a385e727ff7bc94ad0d09fd661476188cc28952f48f88cb96eff67a4a21e9781a4f3c8ca1059d164176639b4353dd14bf21db1789115ad79730e67d36f76d67212432a906c7f82752eb04f1e6566f11f9047e61ec01529681d3a5b572d1e245ff4a82688aa5c429437b5a1d348545a79ec0c7567309ffad1b3a49fbb019e364022e36ffbec789159084d82313b2dfce14b4162cca16112fb21913774c4f68da35758158b0cc1d48d29c9bddb3aba8ff8241f7a5fcf3621189807580e74426c7c36e7946a1f86659a470f271f7895d1278d9b2fb7b97a2454085ce538eccb990e8eadfdbc0f9785fdc4e46b19c1ea4aeafb787c5db23b95b16acfcf8a823a4d3ccb43fa2bdc4afec46888e730b018c1e39e649023c8342293884aff9eb56d292a5d9b8acfed25895cc48fa1084c09a93626d210b9da883afbd65fdafcb5a4d8e3c3ebf1f4ec4ce3287b1e2f8e59b85c681b55c704ad63dc20780f8f22ec0c5bf0d431153100d97963c4e37009dd57ff3ae6e2cdee24664bbcf5990c2c48ce70835b35e92f429015cbf378cc9eb6fbb82e72fb15aeed83954a6667b3833317f53408c3ae409140e03f29d837e4ac1f006a36a4552000b47023d1438ce67453f56d3a0104f8857c373e64799d88363b61b71276b0baf0c43720e4d7714d0494374f2477881e9fe2dd0f2f92b8f7073d2fab257a6965018c0d11c9aca201b5efaa488257b0f6a711491ea3700b51e45a64c7ab2fdee66bf388c1bba4e15d7b2827b56eed41ce4e3fc76ac69195334f264f2c3defa5aa0430060be3f1e58e96b643a68aaa932f6784619f1adf281d3f5a12c0d392e43ad06fdfd213c2517fe270d4f209eeb65d673d4d91b5f01f0f509abcda616b135cb0163f4cdb9cf4e37ad13570e27123c4a0908a3b55f68a26e5fc88b71edacf1673bd213759da2a2899238969e66a28f5974c8de4a9f7dbe7c9f51d3c0dc6b1d4436c98cb641e1026da7c7804b5522bc5526373d964cffd8cd83e5f645ddaf58dc74b9c2157b34e9c8ec9a2151166042cc54accf8b10545d157a031cf6d71732d39245e6d5bd462c719a004f3eb2f966c3a692074956ba228211995ba9e00d70dba6fbb54c6887c68abc811c18ea9f335fd44eebd793064c98101e37468dfc6cf5cb4e40ccd4bcb6b3534510589527779d6d824cfbe7b0b85e190306b3c593b99ad2b2845c4ffc1e90b40a82953feaa0aa4dc4daae997afd9772677529a9670a420e29502c5d40d8c42fb9aaa2661408cbbc2c9b02044f7addcefef98946aa4a96bdc2548d6d1d7d9056740c6eae4cc815941b54c60c219c46dada44347b0cbbc0649470ca6c27f53f2da02c9305c483419a2208456d31713a36238a09e771bb528b3a766f39cc7676db14448d00d99ced6b7841fad2dc8bcfe257fb23e58de3449a73d734ec336d3374ada6f3889f74a771cfde53c30306f9af36940b8daaf8376e463beb083612ea604bee02f1d372f14645af70e4de1d0b7daacb928aef7576f0826ef963c99a962467f78eb3771f6cb9e0d5b239bab7f3527bc37b4f4d4845bf2737cae31be901875c9b40e815b17458bc573786b5edf3b9fbf05ebc9e509fad2e9c46e80e17e5ca0bd712276bc84a861ae8551e5ad7790dba34461a2746420d66a1267037edbeabcc8c79a34a51bf069b727b275ab77f2c0873c35493f6671763610b04c796546d40e57c1e22caaf6ef0229763104f0aa0114b4b7ce1c708747135f6b7b99134f2f07875fc168e54a5a44d7a5abb119f1fc5064304bcee5d09fc9665d4984fc81165334062c4d54f1716ea83c421873d79551ba85fba9a84761f791dcf289475e723d8bcaada2ab4fdb94a3ea741f108bc153bc3a7ed2d6e0538dfc50147c5e8c1f220b38dacc049c1a0c33ddf70afba03c19ddaea89aa93493eb00a4c73e5a4e5611e85e0fc69f0667019459784759170c3f64b25ec07d5d2fad91fe0103c6587d2f6b506d10d2cfe797534be91c1948bee6c4df9d76ba3a5756357e33be1c050c1e39e5fc9de7e872ada22f35862ee39b721daaa3df152e48e21c231ba06f7f0c1b1bdf41fe74d2185e9b52911c70ba4e22fdeb55ead4a91b054570fa37ceb28188dc7d06c9d8b6988a06384bb9c89b593388d1ac128e1040ba74e5ae7f42a2e5ab0d68195faf624e7caf1a6f9099fa22907486fd3fd63c2c2f155a2a2d4e3b8127758f5cb93f046ef3ecc21083d52256c40333e595740e6e8980745b5e518648867ada92f8f891794e6ae9e3395b53b19820759aa9bae2f6dd9610ed1117696400feb6570e24678da95d2fdaffa44134aebcc9d8bbaaa61ed8cec04e4e735921f154252a2df0ae6ab7ab4d235fbec5778015a7cfb9c56d8f5a2a3d270fae61371c4bb021a9c1f05be688d69f9cc2b066acaf9f09c862a3a11765e29a3827ed68e3a22f3705edb6ccb685e8e7dd043e435b8d6826e243b806557206951045eaa3f023a28b6356c72409e1a62eaaeab661100b5dfe43c0365aef1cec73a7f99e1898c79884367225740266f2f30c69a659c491cc06f9123e3825ff08ac828cc8dcdcddc852200e1fa39fc5b2d3d1e56b27d52bb4309f9908d9054f0d6d92f6df27d48a1f5d5ec66cdc3fa5d1a26295c1d6a11833d2c7a58544e3f573d12c0a7f8dbec4ef54913ea3e4f44cc91b0ca2816019dae2c8c43bffb77a9ce096124b01d166ade67e55ca95c7e2af114ab250239a2c826707de4e6f9886aa36d2faf6f02ad23cc020725c7804571dbec92819436aac0eeded6f1958d696106e00c0ce46e503b372bd6cb4b428fbca8dee6ed917a544414a95fcc2e37cf8446809f48d0917e8464e838a0b9d05bd135b17ca1c4bb095d17427f29287f314772847c57b0d52c6938cb9b497e5e98444059b2b60eaf0bd22ee3ba495aaa599f7639b11f8b165a43d1e26a66977fb32e2891c81edfcb9efde88f25d8ed50e3f9a03449589b417eaa8cd97bbc32a38e023d93bf3c6052fb83aa5f051397e103a6c0e7514075a26e18260e2eda495f062b03ac50dde56d302f09ce1bb906080e2258ef1bb31569732ca14a59131fc8171f0d3a3d488646bdc405f1431d5d85f5a94116213e7b07af97f3b8a4b73d202ce2eab732ba67fc4e4762dc652acc27cab330640e04d2fffba43d5ac769ffb23c76fba960a999ae0678f79b8cdd1256aeb0bce5f3616ad2556d6af9faadb30b6ff9246375860ef6bdbe65285e1ea58183e1f6468b7dc41851ab5688ea5eca0e35f249b30539791db4ea9105f402bdd5903671cb2507336fea525dedceb14611c7daaded32132a85b6ce822f4c1d1a0b9fcf49c50283a86dbda8a347ed8147dd34f361f5909c71b18be383eb0dd16ab2057d9948d2190617ca629e4e7a4dccf7de9264b064577f5fc7a2d015ae78fe9ee0061c44b2c6d58d84b805e1e3ff91adc25650f12ae28f672ea3704b07dcfa07208a45a1a1eb70c54ee7a54bd5029c5d15c5502d3c53950e3bd4f575ebd77cdddd73aeea97e8b9ac48820517a167949b57e9cbb9ea4bca7076094b4e3ad710f19570c309f2591b961e1c793e27f29f91a3dcfbb2d87bdd02774b51ba601a608c057d4c6888d3ca427b55f48f2014095c6ee775ee5bfb27159ba8fb6e90aa826681d2e87beab60d8e2e1feb4b4bb341f5b35bb9a6afb81ed0937ff97e3ae1b606500bb31e2070adf43f5d427ca4468ba875390d4b44baddd80cd2300d8310f2d9a4dfd1f3b5c286f6e2cacbb6112f1a62f309c498ff7ebf2cd843da3e00831d9569a612dd437712e008238ba0243d1f1bebb2ca7b27ef95f8616490c604c8aecfe47e09669c5c6c964f9b93635c5d6310d5b859884e925b452751fdc2cfb8fafd0f6bcfd56468251a07e85ede9ce7ac95aa8618978dc491e0dddff1d97ef1b4568a4239a06635e2320c21bae9d0232bc9e6fd3dd1cd7609b7196c083249ac6aeabeb31fd401ecf394fd2e304c01d019710a3fd5c8a7040b225ab88f3e2ffdf2a71ca4f7f0fdea8dc6b355af5400fc0b0eb9be11ff11df62d2ba260a14d7d72221546e82030a1a039121ddb8e4fbc7c04dd8a16878b7ff78b4dd9ec73b8ee994541ff417659f5e0483995d8cc05da49cbc1d77f9cb27f6283925cf0dcb3ad1a84b0ae039ca3f3551f0c6d4cfa73b13ce3fa63145918016e85ec46084c71a0f2aa6d65dd41d66f5c4c9adc1f9c372b9c72cf36b134ce6107eb36822500daa9e09f8870eee497e4dc4a40de770aa5c22af09aff9da2f8ba2df178c6726420f92dd7b77c92f5595b5f396c48d07015a07127e5328065acfe00ae2fa0bf679438b61948d132ed47c116fb5a011d0d5be380557ae993960b8190b54bab868d98f4dce6e9bd818c11c405377854887736fe9b7e133f21cabbeac7ebd1319a34f0742f9b3c42e14233de2312fc642e1d56460de6cb25c80507bced8c5c8f992a1e1f022b57611f2dc0583fe3d25ed3ea8ded8f7d9ee538e29b450270bbddecbda061b539b11ed555869376f12a4400ed63e778cbedb6bf6aad7b0fbd7ff4ff4b86216043501064d495f04324888fcc70690459967fcf3ce0f1cb1acd73019c498c8e56a519eeb7223b137708d27d92c319019198bfbd3a029cd1e89ecc1a5a7cd1734bde1f7c8c2991cda38a2d618a15c0a72a6098d83af4bd497599b25fd914d9946062424241834884ccd393cdd5ece1062ea27e3934b388f1990ab29f36929e03b2ef7e7ad8eef50538101f1c3d37ffcb1de869fe6bd110822268e2f70a00da5efd1d1f2c7dd030ae14df8b3c60e490a04e1f111b0a43f8c8dde7d7ab02d6f44e855bbd06651003d3f2f4e8926372a9464007c0b880e50212403d2cbe1c48b8629e165dfb5e935f134911f6c9b5ab0f608b4c9db5411a259cec59b1f72204fd7d752f5298904d6921c451108ceb509227863918d1927bb778614a650913969e6896da905a962e9c3debf6f78328bd7ba0a6bae03584f7f34d1b042cda252fbaf82f5c061252dd39054d4a9e195b1c842fde462bace45048e4dd717fc50e4e049652765583cb86ca9cdd3f702fcaab962dc30ad52d3cba43735a53ecf4a9c888ecb53bbb99ee9e44cec222bbb340d14d3f0897a3d00b87134abd1ffc6e38ed1236c9b18f5d6e8637f03d4de1ebfeaf3477354f1dc50e6e32d64ffbc43f1ea7651f44817aed3835b941c5ebf3b7f958998c14a64df050a2b05dd25f6cafdc2e389a4dac1c8bedaf275c086b09998e44dae889f6a774b3e927920ae865141e5493a72dbb384d85f24afb864e3abfeb8dc2154ad3191248acc386e03f6459cebea6def14e41cc66e7d346962fb591c1c05f4a198b36ba5708f05a1002f7e080fa4c2b058d1dfe816a4a5e7d0855989f742219888181730a13c73f6c77504c768d73bb2e125fdaa7724801caea4bba3a32a86fd4272ebab44fec1343c7fed6dfa44f3e2f8be85ca68539253092486c2eb4db64080cb7ac367b45743d3e3c5c2062017f9387de2c6281a96aa1204fcf7acd43e6da76eafb3b56606f93ccecf2999dca92ac453899c7260fb23ab8a0b1a64ddcd7c94294fcad863d72b57d9e01f6c809fe5fadc04a0e94651a223f8e9c416a9dd2bf1e12ca6af0be0cefe84c9945b0b4ee550d72bb273bb6ad98c343c4b7575117ae1dfa46764b43f6300444c06df223152dbc37ba6c99a9bea4b6c72b71df6e00e0261b587991b6fb8df5b210f25a49571b27411b0f5b7a972acdf16411da99080c8a60f5018e450a0002f102c1363d90539cfb4aa0d0d512824a8719175029bf6bad3d902cb5ff84181ead7c65b1cac056ed4bb2ec71a3b6c7bd2d1583f5b8eeb30ab96408dc9726075363fb2b33bf8185d6b188fe46b9b52bd63e47b72e7436cb168c11de9fab5e265d500ffdf1b0b5b21977096f474ff226d2521fb08e98524101b0478ccba93f62d496c10389b6c4cfa2b7ee340e3413306a3cdb8e80a9dab3384d4905372f93d734513a0df32b0aa8880be8cb3d1a50a6de597b4328aeee867455858e7603dfca9c52368678e9ca5747669aee92ef00623aee6abbfc1a6f4373c5726076cb0ec73e07646849e487d64af3a21f38cef22d544c662bd22d3782da8ce452241be9ec0f3688eabc05bb220e16a176f88dee49d71b2badfeb54d39e46b1165ba12460af39d490b245a9c156fd0c1594ea2cfe325c686f4d622655c19d2c415a185da89aa6fcbecefc9c8c006f9f0218de4a05de64bace117c1d1b69c7106b3ea5c43e16b201223fc33ec387b02ba1d99ad24f2ca41fc04068430f9607732a2f94fbd6b1b0dd445883b6bf27ed7f99c749f7663999dc58c06c420b27c4721bc2389b3ddaf0ff03cb00005f7545530f1ee0ab21b9259d3e56cd1334a341b26278c71af30578f861d14c83adcc4293bbb27fef44fdfa73b04c83fac4b2bea87c34d9c706734b7f8fb4101effaa4cffe36b00520a096239179d5570d28bb1a41c0cecc64b6081093475714e302a07532164b6959bddfc7e5818cfe50f3161b9b9c401ca4bd26596ff81e4b0b3b943cac593fc98b33b871c65f06a9169faa38a6dc010e7932940240067b14ef3a9fbdaf4c43374864a7885daefcff87b78c71af8741f98e0be12ddee0f3df9c7b4f24cdf577943344fc2c6104a86cfdc19e43ebfb0854408ed48e42867e5f50e8c7ea879d7a037a2e26d4d54e3ef5c1bb719633905a4eb282f25a89ed7947d948b0a970407ef2ae13ddda204e176211ea80add780fca791b1865e4035c05a72d8e63369c6707c992cb66af3ece036a15492f5bb1cbe551e3781d41bb5db05e659b3756c32ceb52f082ead139e16685184221072c4c2d84a75bdc284a7f17f9345ec9739b37fefd6d512dd8fae3886d99b698fd1e0d5cecae24983bb68d591a4621cf812940b4b72ab8bd9917eb5809cc42808df5488a7bb2fd7073f2dda58c808c8d2e6d0c3c79fe6a1f89c4f07c7bd03223f0feba1df50503f0dc11a915e25c8217898676f167a3d9fafe2a13369b3280ace96ac5c8d61a0e0bca7a499b2a07742b5683110f0f8d2c36458ba534704cc6a40fa9fbd7eda254c17f73d70a0297cb613c77969b82060c9761bd0118b229faee8e91d5374c018aebff6fd9e186f8e0811ae8b934cd1f46252c042b74617879b8a5a1ce376ca8835d049cfaa9150bc74322401561be6fb1248751a8941b05c7817d385e6e78fb4b4c9bf10630b6f2b1fad922451257ec22937b41277f27a699a619043d8d3d5b3ee9708f5f6ae9da1be6bea5bd87d796a35a73da7bebd6ba5a5cd2774e7edf5e36b25405ec3343baa28225cc20637c8cc722aaa579219033d61c3c938b2601e3194fcbe971bb395c40e254d271815dae9ba4116c6f1911d94f096ee1c59fa8cff3820c5aca2b9593599b25f0d72c7ad08447118fbeda624b8fed89ce3f36cdac2773515bd433a4d9ccbca2a57f08a7571b89cc59c58cf2f101a2e759fa9f33eccde671c42d3716084a747aaf371d7c89e2bd6b03c2068b26f1a7513345c20330f25840e9205462cd90c0b208cc8a9bab7a944125f556a65d7f51c2f5f5a90df78743c68663948e37aa28c5fba0238afa62cf7611f0350ea56c1671f03ed71c4035d4d638bd64cd6df2fed1010dee1dd56955b355de80aa729282118ea373d5bb516095aa42764da86d88cd315cce26aba553f219fd2bbe4ef2b4861a0fc358c6388b79398b444eae94b21b714d085fa9688d80a47049924c73239ba70108fee0b7d406df6ebc2e9ba5b572544db7d3410d5997eda339e8bebdb5cdebb1fb67fb848209d6302ea08a0e25724b49d2b2cdf850b31a347fba8adfa13b9c9d82ada179f7437a014dc8139c662720c23a61c9c532eeef5b6ffcd57ee26b60636206939e84583ad12441c5e79431e19a48c7be3dd2bccb2dba796f3f33a40ba8d9d77e73072acacd15bdd963443253a70c804fae09ad861ad6ef45587baf9735cef9e9a29b84d4617da8aa5d7970b928cb6671400cd7fd749058ed130d5d08c82ff0a48641df3ed4d8d6a192fdaeebace6836d25c680af971d774b20833bca2b128686ae944423cb36a9a66939061251689686e6b5d21995fa7b8791c767b6110a38a22e115ae83ce92de5eb0e794556cb44a9d8ed3992b738d78944160d3532cff014806e5600367f2a3c77603b9d16b9a193fb4ab83461097af770867bd76661b9395a93f9a41fcef28b2d241c5d003948820a163d769f300eab8abd16acd4f1b641aca047b94ff4207a8dcf1f20ed4c3ddca5bedef04a249cdce045f3edf09de909eaf870475803ca9d550a5d884890a8719f3c28bbd7bcdfdfa4875c6037477090cd5d8ca3b8f9b48719bf07e91e4fbe97d1e1d91911c17e91aadfbc0c5505c3fe00cf378fff60787ac727b42309639a2fd9ae26caae94abaafaac1e1b553ad32cc4be462fff56626d09c20bdbb2f67b052479b1edd779aefffc6b5b822f0cd5dc9a41d325dd5cdc2651c3f9448b5cc5dde5189f63cf5b98150323b8e95cad0c2db5dadac130b9dff4f10c97615df400406c62ae9626a4daadefafe0cc127dde412ae20a685eeb9d3916846942335e08aec08efba5178a68d4e7633e95caaf0c104c22f976fdc132357ee4b789e2a3d5572085dd05cb8a837da7b61e52bab88f8123df51dfa172c7a0cf23105df83779b98542e0dcf0742f5e459c9b2b44bec7eaa6ffcd81611dbb7dc5ce3dcd24902b4017d5acc3c90ced5b13b8020fcef064ba5f0fcec6479f928a6f1743737ab44a6d8b87c60328eb022ac8df9d4828761904c95c567365cc5c6217618ccaae99b790b3cadcd3c72b012dee0c268f46ab27b55def0374e5f1f16ff30a476d812ba42c9150e2687ab47a9ce0b2bece2db0711b861a1614907a66235957dbb192c6bda8dab25142b94a7c8d1faa475ef6fcdd578eeb736e74df115a72b11aeae649f7f79e31ad0ac6df39a0aaadbcc1c7fd7bf728a0e62297fd10681541f62dfc7aba5fdf3def65dfadf4bb1299bc9c9f289c4fb51753b2be5bf03e2829c5d47e0b2007ca4679c0b8a7c2859338232e1ab41c7162b7ae6d67d07ad1a60ded757ace1412e18cc52df71dd8678d6f54845e66bdeb9fc812da07c082411fd1e76e3ac9f433d641d0aa1207e1640571c19871e6a7ad07cb704151b556c1a3e8bd06b85dfcabedfc2ac9de6b6b60230057ce5ac18c4f43004a3b55735a5305227a9fc9558409e72809d4ad827e278ea0b81ba0d83b4765b0fbac9462cc8f03c6841a34b8fcc771336f54c564ef402127799814e676ac0543bfbde229e918146755f6e91db700017258481947f3559eceff2834141eac31dc9d805a2ef6dbc7811a59013ed683c99b62f4d43b3456e2ad8b9662926f833334a15397195235181370e6a64010b2e491b999bdfa51cb0c07e175c1ff61485e890ce1b9b61e98913618af10f3128a29dbdb66215b79e1753419391f5227c1de4e960cb99477c5663bded92e39573528cc92ca41aad2472c9d8abdb535fc9740b7f84e2895cf9f71f5ca9a6f55c2e8c71b682ed79c431481294eea94670a75e9ae664d264a90a19106054514108af285ed8b84d31781e2219ad00ab71b116fe6df79ea0fb1874fc42a3ca72c555e1def9d831de3c0443bae19c80acdd3cb60c52b2f260ea4dcb124090f9e1d1a44019f6a9259b2d7ae1b3915d322cdc27eb929232a2c15c576f89b14c8390630425ab9f7f228bf4d8ec5e68edc04f318eeb2caae522da51a85863943eb82780ae34509c65690dfdaaad5ab4a80bcc1d8d020c3af5a816f8187b91baa46bf8690ece7db431e351d031d1b3124daccfca358a99568ea01d8d84ee452770913737ea00b56b126d85db15910321abdaa6d7205d8b2e56a45a7d295cf28edf872dad7ee5ee5f9867b78f383986c9d22244e0330776c7509f313f1e329f7433797733aa1ff8991bb26bbc0ccb951210245116c9c93ae41b391d26a9f1c07f9ca51d3d97249f303b3c287922f44d6eadaba2d03821aceb9bce8f620f3f1a91bf8d5c5ff05352356e09990ef7ed16e135888319ca31f6d7c255fe3091f2c00cf1a4ed973fa3e393a442ed01144993fa1c361ca496f85a961fbb5335d308f5cc7de4e0e5e4ae160fe50e20ba47343005f1cf8cebd175c989b3d91b5f294a25050de3c79f0ce4c90f078df5cac14babc8b44d39a7f109b468a4ebbf045066b4ca651090720e85c4e23e79b8857f0d6292ef9de8e1a16a3dc52ea7099e83a279d94ce702c6d0052dab67e51168f16976276d83ba595cf697759c9d7d8d5076ea8dfdbb5bb1b1f954d9d11fb8afe2f68fb4aa725bc99e326de6d42b777a64f5781a9f27b4734b4dec1ee3a0c09ba163e0bac1e7a42d933ef34721a0099134c961dd4c24758c0657118c9defcc1e800e7bc3aa88bac9408fb0c5b4a27f54ea62d1191299bae53745484f2ffa6d51c8e0da4f230b7a9d260af2e6075e2969d1fccbb5446964531c56bf937613c04a0ef5d36bbd72cdb41bb1e836766d3287d58e1bd877eacdd2ea1e1b14a56ecd5d1de305e4b0e766dac49c6034f850836d92c7645514c0d182166d0bbfd85ddba9a50be9779ed4f3d0ed3229216cde7c2a37e72cca441a4e9b814ec337436283380ac62e9e70791d1487933c9a9406d8753614d9d91fe7ada16411f3bf2046563fe8596272026c052bb54a9571952fbc1465f3d6711953ec3","title":"347. 前 K 个高频元素","link":"https://leetcode-cn.com/problems/top-k-frequent-elements/","question_id":347,"issue_number":23},"21":{"day":21,"pres":["哈希表","两点间距离计算方法","排列组合基础知识"],"tags":["Math","哈希表"],"whys":null,"difficulty":"- 中等","description":"```\n给定平面上  n 对不同的点,“回旋镖” 是由点表示的元组  (i, j, k) ,其中  i  和  j  之间的距离和  i  和  k  之间的距离相等(需要考虑元组的顺序)。\n\n找到所有回旋镖的数量。你可以假设  n 最大为 500,所有点的坐标在闭区间 [-10000, 10000] 中。\n\n示例:\n\n\n输入:\n[[0,0],[1,0],[2,0]]\n\n输出:\n2\n\n解释:\n两个回旋镖为 [[1,0],[0,0],[2,0]] 和 [[1,0],[2,0],[0,0]]\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f2790133385f074703f574c55731a5782802456def33e1703b4520385a146af371c9dda651bd4b838f921b4efb022fe70696a969bd1e10621cea0848e127122e97f8386ec039879bb2ac1eaa6be8c5725dc460bdfd86d69b4e2ba2331213a8e30c3ddea20999130a737789b6cc24cfe920a2a476d4d6e7ba675b941fb00ba68720bb06a27377ecdf2157bd0adf212407a041b68cbc92e5252228a9c10446a4cf3fd92221d7904a45a8b6e37891f7637ac15b57f009e7fa5c54768e86b742ebc73aa501b52bae57761ebbf2b521885dcdff95ce3cf32bf966303b8e7dbc491147734c7ffa24b004752a06a6e214cecf80fdda4e8f348ca3471187cdd3e195698a28e6da22efd0caa9db80debf16df82801acc46cc08cd247bc5e151bf02b6180c82a279ddf73ceac79ead64f887c9c166a879435305269abae66e9c5d0648eefcddbe0a0ec8a7ad046ecd47d3315d6e7affe06fd8615847027380f32c70a53b903a036df1a34795853d333b7f0318ffe61d5aa0a6ea6a65f2ea1717fbc7127da6f3851bca79b7dec665b876f302d7094eb3e7e1755b96e8fe77d7cbeb0ad7fa9d7e3b4d843b16458a729ca450cd2b6e677a0afa902c52f42f940692c06547654f0e58e974c4e4a30bb4553aaa7099c13e73b723bcb8d1cc30eaa25fe656f08cfc88cb699fceaacdb8eea60f4c861cac65f246b73b26def03876cfa75afd29747860790eb52ca9732c0a18e25bce5f129c2c7bae88ed792460b4892fec1bb7e5342300b3b8214ae80211b7222cd0121531e33d0f8c0aab9440d74597198734b3dad709b29231ace95d9142994961c3ffab7076dc9c9d8d2c584e111d2b9433daba4e9a4a5d5bbbc0a708b3448533f14190d4384ae7c9f8d330250ad4850fbcad44a3e2ee85b62e3239acafd7eded7a80ff53e77da4f0a14d6d2e296605d4e61ee1a7eb47b94c3fed901e3967609e6535db3459083e62f822777edfcaf7eaffbb270a7da59d45b71c7f3cfd261637795b52af64ac8b6d03e41c185dfe2fe11d23a66069674b4d8e8c47e5c55eed266b073cb992d3cbef1279365b19cc36e7a20c58388a557b8572cdda482894f109936b051c7a2c09a5ddb24d308f2169222ef8d3e2671825528eb10256ea7c292d8e49d9eaedeee77664db3e0de464502d830b6a290f697afa452f2066c32a476810b2d1c2b692b44b00af448d7f0c3a85b39712a378f0082876dcb790adc7a8c20e05aa6b62417bdb360270c8d9ad1033314faaac7c17cf4ad6c759ec6d78aee9884e83b4376e351e76782322cb4a8369793fa4acc253094d983d88d72fc2672f4585dd783c740ed8c75501fee9eafb19fa4f6bd8a462fa685f8d9937719a79577f7f4de8dd340ef107a8d87443bb6b57e9e881f96bdbc293a01be972520de945203f5b2c7c23312ad8d678639b465e91aa9524f1759fd5d3db99979865489c82e320ab56b72e56d1eedf03e518dde1e075d3efd90bbfbc55d02d878c2b7693cc38473c93e4a6e1747834ede9a13624c930bd59e9fb262d8e80ed6136ccfad8e138cefcb9149afd27e6e4f61cfe30ad95632ff2c066cc75c44893944622eafc4c45efa6368385417d09af9c350b5ae80494812c45cd83683a4af84e7f4fa3d1ad039350c004681974d69ba7c1570fbafc4b6f5be6f6916cfd2cb8fba4a1f34b9c59821719db9018820e9d5830448a151dce33fc14b72cd5bfceefff612812a96516b6ff9d75ce6ef426c43607548e2ae32b1519e624c4473dea1ff14ded833a127bf80ec6d7081867e698aea36aab5d82459b0244c36406f91d3d9f2131d3a7e213b762a2ffc7f11ea16bc4f141e4ca9fab3260c2c0c28c6dcaf2c720bafa09c62b47eaa202b34bbe7aca5eee5bc58acc7d966d705b270f63d9c2a79f6a685aebb8b4e4ac67b86ba8f4cb7ee804aa9eb525b9915a07b08e3533ce34ef085fe1642bf3f79f0bfd7b88006ea579c1d852e859f1c797414ab8bf9402a80844ee7118f630e922922971e04bfff3cb80e6f4e945e241da853698f27842e25c11b3120b98b1bdf8edca734a0345cd3dc32db079e14fae0cb5adbd14370056b50139bc8c61570296f7be9e7e98e040d9ae34f9a74754f2580b793e60fff9e146d52d33bd6c8290d32b1c2ec1cff77f10cf5b1bf60b4912dcd6f05ddaf2d2d97099dc619ed4857520704938f9b74b102e50a51ecfee3288df6a0b3a8f2e4cfe672b91c4b53ad549a17b43c927a797f193b6356afb2bd5a55cafeeb039899847e18934e1fb221700f7aa12bdd2c3b8349748a7b3ffa6d10bdc9fc104f4f282352a6b041a2d66c1992fe0704e25f8f2f49392b3d56a24dc1b227bdb79ddc4ef61eb3396e16c2719131e770ac2a43cc12346fafbc852dd622b1e8b38e7d8b2fa9df1d694fed51e121087815c22963cbfe2d2f96d4a8d45dc635cc8b3e11742d39a75bd3c372229a1b21dcc45787ae475a424c95b8be3f9d727ce1facd361800c9d04b7f78f245dd6893c3ebaa6508ac5f8e590aadf5037bbb1fe0e8e57e4307984d2ea95b1d5b5ce14592a8d9750e6db70613582b43372198cb4130f0d72e88d0d561d70c981af2dc7cee9316a34655adb8d997a50ad4a3cdaa642494b9a458a4fbb76ea0e9244daa01f04c64c4ff126163d0001cd026e0277b253556165e7cd36932426ea6ef74e2f485aea59a70ab95e2e5c1e74773addb9af9e533a54f510ea0575181051e50d3e9be0fc5a1714054b4edae6cbadd402a6299d420484bac631c86544b5c6a755e14fdc1f3ee75a9271ed88df8731d7651273623880c9ef9091fd5d3b9eb1e8c321f88f4f785cedcd51e2328f3e57b1a2aeaf629f429a75130bd0335505fd4d092cff336caee7ec238f2328475b61eb7707958290bcfb6bbeae0668a0387d831dbe1327d7804fa7b8cb64688490b0297058f7277e488cec525265f9ae3146d148f50818eb281dfaa6f7c3f19217ce7c7e390fd6e71c71f8b182bb7a4eca31d6e8da6dad49fa5828dc18c3c8f37c009d54fe2a53c58c5031a035900723ab1435ed1b9a4860443f64dc8f6029e27a822b46f09da0d2ca010f0f517617dfb186e495c95e8a41e9052ad0c7ff91bbd4ea47b5ea8476cb46e0cfff0c4b1db7c306bb20e1e97187707535a997496345a78d870364782c32eb8b39bca26b1b920d98b5b32777879990285c418c767d3ea33248b87c4fe412c32cde5435ca753a004228ed4fc81e2cd6b81fe8cf4f041d4195b93d7bff8c005e40b7e650f1011f9f63fce623b5c3183d725de542c6c8e4f1780cf494b1d61bc16f33946f7d96981223e156bed19427a160fe5aca900a98a5d47473b5c12439853f19d01c991616b18946e29ce32fdaee80a410d4a461adb9c47df9935e47118443dd200e3d22c495d5d8d091588f6bbb11b62f8854d7ca57f99caf77048280b20cfe907a0883d24e73245d48e5ad674d2f6a7a63b621e67f7b3188e5d1ba77d46232b2cccb369e35ae69d2d77aeccc2eeba9da65489a4b9fba5ffe9a0f6b44a0f8394293cdd172ae414b545c3c38defa43b52c58f5572e96f51f23368d3d81f59d901489f8ed6acdb155d45f79738a7426f1baae01eb87193b5d9bd67a9a99197eed9f2c3cdd2399ef2f2d4bac7b1d1a3ad865ce0e037873d0b67e1474295a45b940cd77538be20113c1d57ec405c32e98c9ea6561c68cdc0148008c4e903414ae7256c4d9a3d81668efd10eced5b53b4a8877139659bd4c7f25649a3c63ffa2260032c8d1ff1d659ba93bd01a5d40f7f0b504b226c19139910d86cc7bef69635b5009658c0e8aacef158180ba6f4316fbd84a0ec466eeb92d148e9eabb2b4cda6201435d6b78f49ae7e36d8f82cb0dea892b1bbcce96b4c97e353c0d5cdd1db5b6ce6ec4e42c7e535d5f487036c97fdab1c705a4b1dba9c20c64d2d83c52112e9b79f1086945858023cf9268b5fc752eb3ef49402e5be641e503528b194789d1fbee9a575a4ea3704e3e5d659ab26f42d660abd81bad7d7ebd85bdc005b3d56bb5d7064f6cb17219dbb327c49cecc628fe5f1a1477f91633ac938324ef71669933b57d4e6b878cf1a30953bd8e44eb6ac9eac9142b4e393790f6c3d8b2c32b4f33e6f454a498264af853c198d84c669f5660cab018a85c67b23c8bdb978d3f706b361ea6e88dc204ffe4718c399352faf6789b937845cc9fee1d1b541a627d5b79d1ee96a2b105a2bcec30c6d2fb81fab822603a5b51e22fe00c26c00ef79f1ceb8b594f0966be179a4320d688a6bf8052ed8365007d2a4dc15f68d8ae05a8c0872b2d74f062b7618829d669ae3721f4ce7688a55d1f74b427e60e0ae28eb7b8aefc131ad14e024b1c5d5e5d1e45d8e6930e843de9487c850b10d78175641b9efb2eb8ad8c6b948dabf5b6affcf93e1b230c482b10aae70b65e244b0f2284cc95762ffc1117b731a40035f11763c190ff4f9b5a9567563d4d2cce80cb83f2811873b8add07c13959e289f5e44a954e2d25fd4b4d8f3875567414c520af3d8821993cd30e9a15c8aad7b0bcf2af6f3010b2053f0a29f43e2e53cba6d7bb4fd005c139366a1edc827f063a5e24f295ed5f8cf6bf7cae52cbfca052742e0e3fe7f75a3e4ee5f0e33cea3e1da4a21035123abd595dba40669f4a73d551a9d55622916697ea79f856bc83dfbdd36353682fd2ae70cfac763281c24ea033dd4d05116f39ecdde0013f98fdd64d3492528aedbfdf3b8bd52c907cd437fe6997cc549448200d03a12964a3e356bcad2b40b7eb765e93f119310698627b0881051fdfa5b8fc9d13b0ff2ba753d32db92449880addd6d8d5334781b5c3d25a711cedaf301349fe861cf656ef9992fdafc74f7eb2eeb91542f0f2af85e86a308d99a8bb4fe8a996b894d0b5615fe406949d4b75b5e1947b3a6d063248cb233c791df9b24eff7ac5984b87a6e96f4f56a3d7485cb05d1ef79ed97861df1f35058b9ca565f97b3ddc750a6d364e440421467eb6d638b6940c399d444ccfdcc08adbbd33d2dc36433021946d5a5ee946bbb2c3e3619d12c7565fc678efb134a399d253e5e6d10676076f983305351d33753d68994c0aa03a9f453b0d02e8f0beb15a12276676923b2b1ad19b41aecc30c1f36645e76d384a197c1c7e4c644dccbbde5df116837412d820d3c5688bf0d7dcbfc90f1cf5ccd48345012ddeaeb1ab580cdeca7e4fb6171752ded65bf321ea4a71a0cec013f2672a7dcd6eccd06ae81fc8d8395ee8f485e0b0cee3537112f30982ecd590106846f3e54634c76682a2c7e8e1cec6a9c9906556451655d3648b8a0085625185cd565b0de30addd5b3adee0edfdf982274498f1feb6570ea4106e3b2be6698b0fb2b8f4b49dfebab0a8cd51c59d5cd4ee98d25005eb3a1c638203521241cddbf744ad0570bf21f22bbfbf46eb96cde55e55b5f8afd893a1abc914db1a6b222a43f5c1060f478ba8ad4e70af5170f7bb0291245a062756e47eafa3d9d36055cf9fdbdc89df4bc1816006711b80dcbfe343f4214cd7a1a2c6ecaf565953c81974f0c1adab058fe8cea75fe608a5a6d6c166c0084c92ac2b289e5d05346094df2e01e24c16745d4d736e4bda54169ac567d89babdd49a3f90857ba29d6c7ef0d941945ebe779f40dadbf66b124b360f3016842c87822761aa4b5522bc5560786fc616ffd9cbcaf2e06fc2ae1d9331e0c301732a96cef78079160e75109511a982c14d310f092a4255a4cb5e7c879e0cfac4f0582b6cdd11452aa8e834d5f6db0d541fbd38d610d004f4e5396edbf7e09f4c688783dbe9c05074aacab88b7cc93f1f17f1e7569fb4f3de17fc4a1663ff864055216f4bc0a2ce9d67fe5986827ac5162c463e94f492da254a5d745c387919bab769c6503dd2535bdc2031419f0d03345cb31504a083b3d0274d51682429502c5d09d0df7de9faf72f5b51f9f851810f47585483e7b6da891d804adff39654d47c1d60900f0f5455ae499943bc4373982e029c47c7da5d782f02c38e64cc61ca6627ad2e2dab2cca14c48910cd63463c78137c3b3d4cdf29ff6ca1158c7d785f33cb7c22b53204841487838e7a6754a088c7d280ae02af6aaac3f96e9a73d769a83367607ff8b09bcdcd1be11380911e865147b7e8659c5881a0be3327427af103210ebe2427b951f4a64af74519dd37ecc3322520a3c6d7a0a63b22eaa86ef963c99a962467b98eae775329f7b98bad3fa4eba9407bc37b4f4d4845bf277684b01bf40197769b40e815e07a08e94230dcf8e5b8b5caa04db4821f93f16ec619814159a1c60b9e46292d8118d503e1410533983541ff7712536808110322e4603162fcc0ef85cf2dab031feb0fb1727b7a70b77f2c0873c35493ed0245632b0b4d8996067a4be16d593edffc0aa43c9731551c118a114b4b7ce1c708746234ecaffc8465bde16227e951ce13f1ac1c3327c001e21fc806134bf5a05b1fd4d248fadb7abe532e7a0b7895d01b1904b1829a3d8b30624824e839eb8bf97612794d8061da21b458c3cf818407b5f4a86a3eb56bf108bc153b9e8ded2d6e0538dfc50115cdc7d0e93de7a6e988008ee3f5749124b1b25184ced4b8cbef924f22b8400f26f9b5b62602c0e3b637b8233e76169f8d6fe65a9eed6165ac47fff8909849a1105f2a82d9adf35f83406ffd697e34fdd485d9c5e2770a6246c080a5352317a97ab7817ad0ea8b59c8900d8928dc5cfa576cc448972b1f2e9067ba0407f207f45bee65350cbbe39165812bb5772e29dbcb5687406ac6070dc46505dce7375f08933ae2673b809c3de50742de1c65e72910607b6c60f016c33c69dc0045c70424","title":"447. 回旋镖的数量","link":"https://leetcode-cn.com/problems/number-of-boomerangs/","question_id":447,"issue_number":24},"22":{"day":22,"pres":["哈希表","双指针"],"tags":["双指针","滑动窗口","哈希表"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。\n\n示例 1:\n\n输入: \"abcabcbb\"\n输出: 3\n解释: 因为无重复字符的最长子串是 \"abc\",所以其长度为 3。\n\n示例 2:\n\n输入: \"bbbbb\"\n输出: 1\n解释: 因为无重复字符的最长子串是 \"b\",所以其长度为 1。\n示例 3:\n\n输入: \"pwwkew\"\n输出: 3\n解释: 因为无重复字符的最长子串是 \"wke\",所以其长度为 3。\n  请注意,你的答案必须是 子串 的长度,\"pwke\" 是一个子序列,不是子串。\n```","content":"096221cf5b628be1e73e8bcfe626c73476993342b3bd4c92620b7d4d2211716b1cbee358478886397179b73ea41f2d8a696e65ad9d3e03c1ae76b561bceff835f3316e60d6d7cfbd0a2ccfea998f527d3be17095dbad039033bc36daaab0b98f4a36dd006fb2d63920250f70bfc585af7bc641282f43fdc733e4ba8a61e819b47341d1e2d7e38af5dba748b641fc04b55e75089947caa9e706624c22d1e48d141c0f134912c68c734a014ea5cf657c0012df8bfc375a3510f230af3d738b4c0813d472990e5dbc0fc0d12c27f0211f36ff07a335647dce8376289680642b17c29dcab917d1a142b7fd1126ffbdca88f70b0845e38dfa4b661b49c021774b31fdb57ac3d3b1e03bbf2b226263493f05509a878c6fb70fff308c9e9013e5c35ffb3b0dade66bcc93cf4f9a561718e1294ca5cb3c289ddc46cd9543eae0558949961366829a3c00507e92ac71f8c9d8678cf7efdddf84edb870d64ee8d6741d17d6d1affc3cfc833888542733303725bfe973a2da7de56546753a38e57becf8bb61268a56206fdf3560d294ad6a54b2772bd8583d99c1b7ff5769a9826930065105b69640427033b82bd6c6081b8ef3d259fdafd4d1a57ae400782729db540ec1bde470afa3b007c63375fb4a462f1f5e7868f920e8ba818af1f77dcf945b0a099c1ac7377e2bc28c09fecad037550728b2aeb39529bee6268dfb2c04d398854c9a9f4e6223f515804350dc6d93d0c848dea747451618bc8937f08969c6bbcbb9fd7a6f536e78e29886326b641339bf98391a73655124cb61a9e5623e1747e37e5f6e5d51c99b9db2de371c221d66ed2d7c60f761d7898371a61072457090c073369eea3e01a9e4afa1edeab222a0e663997ed2d9cf2850bf983270881f8deeaafaa8401896cc11940933e292a10ad405683b062759b566f8ec339b2fa9559bb7af63539775c3560936e8d1e8a66f7a4461d63f728e4196e3e2d70cd350b1a43ef6d266d82c476fad548fe890fe29e4eda4be1424505acb4470fcce1c4dd48c258dc277c9cfc35f0be77b0a11382a1babde390120c7ae267b501cd16c9d7231f440a294e43d3c5ca713d50b8c2cd9579470c6c4d9883819e92fd18f8fa46312b62c798d11764827e55ae8048864ac24fd3b3d8e92b91d5517f7d4c68770760d4768e4dbe98b91b481f1795903fff4c75dd50a41266a52f3a231ad11f20b4ddb234c8ec863432644bd36cb4bdcd4cd8d7cdcc785f01249ffa30c96729430f62421e772a8ba16fb2f3f63e24494f38e0cbd14ff8bc6fb451b1de7bac7d97d1f217f096b51e9bd5b1abb7be5542df7da2fefc1dd228f164fd5c4e892a2198c073ba260c71e1b932dffebf7a7983510400234618fa7ea0002ff10571c1c149c2150d850fbcc9831da60fccbf9c6547bfea40dc3a3551d1d756e3166e7a34c6cd8dafe8b332156cd3122afae7c68891facaf3ae2316d71ef6d9bae289a68a455bdd82c2a15bb4d7409fbba2ab90b3cf8ee765775724f177c9cf3f19c7886075f0e8a456be95cfa146c8ec559a8c7d8d981d14be527e7bd2cc633255dc56f04c7c4d234d396cbf115a99e117b191ec68679fb257aea405678a53a5ee267532a79bf86a753a6025b6a2a0dabe5f09d2693c6df51284cd9d7157e83ebfa99601bbb1f4699145c4724183b371f7e749985b8382b0e129808e96e4cd1da560535d48d9c9720c0163bf8ba64d73c66176becd435b3d0d077971701f25ae4ecff8730b37ac01d3875ba9772e9fd7c230c25673adaee7ff142df41433022e6fca81094a2b547f7361a19f8b571088a8a1152ea473b65e28c72a481f0d497084e173e91c3d3ead5b1b2bba51081e17c8d7ccdd4eed0762832ccd8a5f1c9533f4abc90e13f6b6aea61ff72bfc8a973053d70016d3cc93a614ef967a3719c11af34c9f83e2a5d012454ffcf03a3612d01dd3d13678f5c7b89f81acb08a2ce45c7aa47b97d4c3a849911f0ac577047071ebc7b9124920fd6545bc9b22e1e72130bd4960741d06dd667a35698e2ce70602eb5bf61f206220ff4746848b9116c89698a3439da552e66f0c749ebe2bee87bed710edbd4758042960ad5c8cd6bdbac133e51380415dc8cd87913672a3fe0aef4a40c5dd5aa01ce2775106ac5b88db169ffc2486d029c2fb29c7a037ef48ce609e70cbe6abfdecb4aa991799f3a40c6857f68c35ccf884bb8007d650769d2db9a34a843ef4750a9b0ef38dcdc87b3e1f2ef89b829a23e021df9548e3da93cdf4b79364b623753b2b5f35c4397a98410c4e78c2558f06f1eb1e4af88961c8918b6bd46e1d20a8addf06f73d990fc9cf8c4e184dd637eec786b9e9341364957e87cc22f707f6a225ae84284bfe37e077251f9319235fdf6840bc40ef434b0862f0a0b86b3a652216aa97be40c4a7614fb912fadb0153a46e91eae6b0f359f0ff6bd6c63eaa3101d13729863960b1fbe93a3f5ff1a82b7bd716a9ac0975519c479bc419fa1ab196e46a412b639a4bd5fe5b2c5285387fccf6cc07442b9c0e8a965ce0ce246ce85ccdf2976f259e02735ea98b01cc0b655c3859a9a67e95748589884da72a99097b7eff2bc2b0ccb873578ad4c4858e522e609de0b4eb5737da40e8ff2007d5d3a63bd426c5106a3bf133779d5690c43ff6b33b1b0628a378eab1e079e80b440dbf78727e07734a9e6b18c84916bc8a296d40b6db51b55414a3657b8e890aef58e68beb1313c7f417995328aaf855b87ef5dfed3c77e2f0a99023df885fc24edee28fadd85a7d55e58a6de9655ae9b1cbbecc6addbced347653773d86ee7bad886f862ded6f30d6609880c5a61cef165757c749517d7f41b0f274034094388beb25549efd0c97a3bfc748e74d8ca2d83caa0ff002e011333ba134af124dd4dd408e815913aa5a8e4e08352271b7552c64fb02f1de0397db3adafb962b35b5d9368fcc08d60ba0785a9433f0949a3a9ad6e25fbecd135ca1f5b333b6503abb9e9cfc1e90e4d41baf06e23828e62c2a32c4d38099fa95f001f701c3532200e22c358997a9364ab655fb2ba923b644e62552d0cee324ba6e59eec5a63992bf287628a61e12dea3a33ac4301c37beb926464168824070946fa9b8354cc7bde684757f42ca41defac39bc8d20da93f0d4a69d8bf1e9c32bdbe25cd9809580e445c042a1b2c035f4a58236552394a499ce2a7f6ec34a50aeb79dbe2da20588b148dd10f084bdee66dead6891c3a35d17caa06dbf22f5a6551266174d0fe70a3a1a4c55bd238f815d10640a50cd0b86999acce3993a5c9d841ab78ed2143c8d4c98c1e677848d5271490f128f72dd669b93760f8310dafd979f1690888b83da3e314bf03561a5cca5988689a1049c280cd22910fdcf823fedb67d9a3b06598d95cfdfaeba5359a11a15977ab289a9935dc65b11a18aecd515b9d33653552bbdad642988c725e9014d3edce4ca8d810a529d650687af29c581512e8e55d43f543e659b977c047251b44fb2997fe591e8f6cb476ab76cfd6903a8f86a546f2b1512628c432e7617600310376e098eda6901e3ed69d9e8b3255ae05506035160a3ff033acb71cc5e58d023ad1d108b8c6803688d8ed1be1ee0ab8c5253813f093032cf8e0ef53c86e9765fa3f69ef0f6c38899f35e1da532376b427e5f0a1800fbd143919c36fd66043abe6e1d3f3f9cd901b61d19e2702d5c4748a91a45648cba3223f45900f3a160807e87e94a2e52b34b55d30ce149dd27994efa821260ddc8bf2f97945ca6f48b0c62ff9f2960297312c137bb3674c0750f118f4742c29feac5f6b9b581ff5d8e54ab1951603b9c6fba60976e166f7b46cfccfc634f99bb1e154570e744c1545efc2c6316ed23ff336f6509f18d8f869a2730a2d09b1ebdc80a7be0c93b605437a598cafe44d2291a07810670ce85eea793f1eba7c327083b6ec30f381c254ec8f1711c6c56574b8c088b3ad8ce2fcf63e8e31b83b93102fbb67526a4f220ea6cc4de07dd92614d63795d9882dc57d70b310560d7e23e8a4eb86d638227fcddb79e777b8d7a77e8714eae8ad724b897a7ef349836050166d12e7d000da5176ff386dc8b6fb626b851da5d2b31bb0f340c869b1e13817ba904595d3e2f00333f83d1d2d1b6c3be8dca7c3ab66c4aded74cf3542351c49f6eb8d00f738415f8ae6dbd396bd7deb0af97aeab5d6270389f710ffb44d602be237ce37671bfad49553c9bb0fcd5fed193af267e0e4331db742d0bf745050a0a156db5aeefc8bb00bf29c9af1cb96c45cf6760bd88ceef77ce01848e714f1c1b49e53604a8eafdf7b54081b15057ee7b1f63afe2cb7e8875ba3bd256b44ce48a7c09c2006dc888b240ec7d92e6674e6532531cd4be4c99b4ef97e1e89996e2103a01d71d8431c2deaf21d76310b1fee21f30da3a160af112306d371a382f057119e3b9e8b8bc0b2fabc62afd01378def0ecc8f7e7bbde1b7c5cb97b35429bdd1ab62396712d2f1bb6a780170c955858cd730ad4f7dbe05a1f42a2a682cd565c6f9b277b4a41fdfbbd6bbaef20abc388d3fbb45ee13b5689a809efebca0ee217755ba4b361003f43e2e1acbe98df7448318f0692b785085da770331492ebcd0b626d889ef33fd52d7e1f0412e7d7f55a7b7701486455c2a804af69b056a8f8cd4ba2a9faf0099fe4dc4bc3b04d3da4562ca3facb71caa56f58396f3d33112266897a63ec6b6011881c24ee67c8f4d4f112677ecd28b4f78ddf598442eb8528aedbf927ad3aa3094618700be6496be76da0a78b7ea77aedc2d76f428874d4dbc2ffac84f6f91f4b530a7e3a449849716274f7c5cf90c1cf6328c37e93ba5dd32aff7dbd89b3383193f0567cab4e15060b3bd8d660cda43c628236b120a4f89d0002b11a2d7320b3d463dacc543c1d3ac6bfbcdf2c686d47aa0d97d8401189ba4597318787711ca9abb0ea5ba311dd074e6b226f2d7c12ce482f89ca62103e390c26f5d9e9792226d52b3ccdc0fe3bf0f358ba0339781fab1a1a3f2b08bf81a05d03617b0d745b0cb311552537b22ba4b1488eff5972ca8c5d671f15e2f1438ed59b94a85a601ab3433ea4a031690d4ecca8fabd8eb71ee9193c4b9bbe0dc459ccf74d81386d899876e6408379fba9ea0944bfebef95b7ba23f12871876f4c207beb1d0c3e5ae824e6c5bf4ad9ed41bee029cfa1db84900da1e154b7079678adb486c4356b79cea076b261bb6bb730de3c1f55386fd1f548f68f44dc9a32d6305975fcfe69a168b0443950b9f2a7afdaf0664582d31015094a9cdac4201133600c7aa80444fcce83ba3434e531a284a1b021014ea89f4920696304f54c2dd689c6218cbe2c0e91d1e650a6b1bae066f66207c5fb709abecb81cc1e80f6c1ef1565461ef4cfba5634b62bf1312a6fd571ab12022c18b8e1e2c7c81e5a88ae0ce4f6ce8b6598dcd60e88331021aec5d8a0dca5a95ae3d3b6f91f42707852e1e7b9e04f7dab1a515b2283c1d6adc0685c2b43cf0be9d1ba5f4a2b96606e614dbdbd0731536195e6646c398e6d2d652e6473dd7a8a1cc75e493c1f56533dd1af8193a86abb71f71a46c7702d22b9307aec116693b0bc380a00a650f2b323c60cd932072dfc9649c9f5c2f996c644b2e5189457ae2c59bc1c43ad9a867b29938179f9501c457f43dc910d39bcd7a1e5a2202210ed95beee46632f94b266df000727e72881eedbd9fcab1af108cfa1d8961f0d0187b25f5c8ec9a2d541d7a1b941c95cca40b55484c791626f1890d28d5d742ef89d00c723893150a2cefbc6ff5dcd34e1b4af36cd61d995ba9fe5f2b9da3e0824c789cec8abc811c17e59ff6963cde731717fb831aca9eeede07e73d3c49ff864055732a6cd0a49cfe7dfa58dceb73aa6e62142487e1c682254d56775c177d1e968d7fc60d6d991f48bf44653ae20d5b385cfa1d1f89febbc060190a0b0e34503c4640d78b61b1b8f97e1e46c5bc64890b5c00669891a4f0d237aa4a96bdc2548d6d1d7d9056740c6eae4c9848820600c2406c9414c999477c2936c5c82d9d79c36c7cdf3f2da02c9305c4831094725d1625393c517d66f559a638e95ac26e783c7c8f3938d2591ca81199dab9394654a793c9ec8eba5fb662bde1a60a9673842cb87872296be8f5d081845ea771cfde53c30306f9af36940bc4ecf8686f5b79fd4d7d0eaa6703b150c1892ef2530bf277a29652587aad8881e1bd1422f8cb67f06392b0bc2467f78eb3771f6cb9b1dbe276eabffa4951c37b1c081c4bed627a85b55ee152891fd301ba74b47244ac422b87f1b792fc84a01ff5cc58d6f920cf03ab4159a1c60b9e466568c74cde45fa760570d7790dba34461a2746420d66a1262d1d9a94abcc8c79a34a51bf069b727b7a70b733694e27c35f8eab5c0c49610b04c796543b05a62851708bcc20a43c9731551c11d73b614b7ce1c70874267dedbea8cc37b2a35c6eed568910e4a76f371be37dda51c9061041e8e05c05f5dd3d88c21c9d5324700b37bf86311806a2a0e078c8bbb2b6991ce6550002b3b7dfdb71989e7fcd0984b23c22ec754336a5ba0a874caa798fbd848de942664b31db0a9db984f29064f6291e6434da02741bec03ed042d941e48feb5cb285d9ab90f9785f71a270bcd895a2877fd436b043b169e80ba50f69abe65a134dd3a75275fc527d9e48c06325d34c01e84b438fa85f0d7","title":"3. 无重复字符的最长子串","link":"https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/","question_id":3,"issue_number":25},"23":{"day":23,"pres":["哈希表","双指针"],"tags":["字符串","双指针","哈希表"],"whys":null,"difficulty":"- 困难","description":"```\n给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。\n\n注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。\n\n示例 1:\n输入:\ns = \"barfoothefoobarman\",\nwords = [\"foo\",\"bar\"]\n输出:[0,9]\n解释:\n从索引 0 和 9 开始的子串分别是 \"barfoo\" 和 \"foobar\" 。\n输出的顺序不重要, [9,0] 也是有效答案。\n示例 2:\n\n输入:\ns = \"wordgoodgoodgoodbestword\",\nwords = [\"word\",\"good\",\"best\",\"word\"]\n输出:[]\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f20940a3d41ad5d0658542135666a2c91e14f5686b5347f768c3ea41f2d8a69a8d32eff401fc5a93ce974ffa5f124f52a696a9fd18cf0076dc1aa84d24d6d38e6718399b2438d21bb36daf5aaa28a1435c61d69f898212732066bafdfc9a977d94a64344cbec172ebff9c7cfb1eb31c3981eefd0c2c7312c244f438fa6ac67ff9e53cd8e0476da2a70034ad90995d621d760b27afe875237c64f8b34f117c17a7f4c87a073968ab33e8694df7132958b979f35552ce6ac873f9a3472c2f0cf01ab93a5153ce90672bb6a36b2f38cf9dc9b504e5a36b9fff0734f689d785ce04084bcf8eef5c641154cf15524835efbf57fe36075cfd0c4a65690cf2755b54f1d7b33812827ac25d71c719948843845039cb8e548fe4ea37c1765747c87ee67e0c732df4b75da8c14897916fd323a0530d9ecb4b183821a5cf0ef1b88848e56f325b2e487bd376b728e38d353d4858146a972bb5de1cd13118666a3f62e4cb3fc4dd25678ac0a5daaf7c3fb0eddd0c1ee729290858aaab5e39a0707ebd6d11db6a1097f69712c78d2c4ff333057a0782884c4f4732a70ad7d6121b9ffbd561cd4a62bbfe7db5604a6262c20e53f4efa774fdff868a55e48a7aa9cd2d3b7a7675f020c1a28c88ebf57fe59644262eb045b2321a51c1e540d6838112234377a5c2d9bd70c7d565ebcd4ab54f9a8c61998d634f3f48cb37cf5cda739fc9ed9a5804cea7f691477b75e5c4114a7678b8c26db0fec89aa5b2c1635e06a88dbd991d176a655209e46baeea8d907d06f40d0649db87bca3e124b6601a787d6e92755ed862d945898372a50136c5a3684e9fd0153ef9855e3f275a702302f32b2cbdca6d0c7916003c3753aab814f6ccaeb2ada8401896cc138bdcaf5aabf3448f3a40d9493a23d76bad6a89a0c1fa7cdfea8a0cd522b068d6081cde17462663414961d53970b95294e2d4d42ee553a5a232ebc665ed1383f57dd36521dfb369e6e78abed28fb6d11f83f40b5ad53bebeb95c3985c9668485b11e1984c0f67742ac44687d2ad40ae3e6999b92f6f91601ca3d3706e758799528509d619bef154f07839e984b08db8c46d70ae91e03ceb1b9d169a00742d7f4f8552905fbec8389e44fd8379145ec6d7d50854195af98ac5eaa7a2cee79dc72c520ffbf2af11380dca34cf888ef5ec6b73ba67cff0148c3cce29284a6f41640126ed5e814d0b447b97112603fc117afdbe329e639a8d0aa6a438974b118e3e9776e3800ea9a93cb4b0d380a2b889565843f9e771787f8ad9988ac514a0c94bbf72e380231db8870e9785cfa760bdfb1a91fec8ff2ecc959e6aedb26113c854c163f7e4db75ffc3acf0fcc7e0f24247ee9c573b11d1f63e3eb16f9eb6b193fd6d3a95e7af385f9ee708ae26fc3413756d2273eaac6f8e739a4b19f69ad9c01012a3b6428407bd6ad136aa5c5b1d60c25e04839c61ab57a4d12f0823b75a78e74d0decc01150a5f21e077e3cc689bacae992c66e0be4fca8a0abda445fad9d885350cad87347d992ee41d3309ad8b82ad1e100e00a6df4a98c1ca0e0fe984b99ea7d736865dbfe05f75032d7330966e05e64b5febde0eafee0b934fc0d1a212b47e1dbbbc004d0acdd1945778c629a7f88c03346cd1b833a8347a35f532f183b37d0d328e3aaec67206075a7ace97f41d21e0930b6400df92598c1283df9936ede14451866e0de07afd0e93605cee07590207a020ddc65925fe9f4f37258e625671f641f2f2f54a3d52fcc06c02e027d7c84fcde1af4a5bb47f228140eeeaf64158cc44c9503c9fee25228b873d5dc4945a4d3e6ee1b3d3db8f19b740925ff6726eb22bf4c012c438ad674f7d8b9f2df00ad8c791529cfff9d00ef5fef783a43fbeed91364e69969aed4e565c12fb548f43cb3367bcd978896bb55d509bd41e7df81d50956f435b1bd236ec3679c2e52f90e4de933808d7dd88645a2a10f7502420bd12fd92d93439c0053d3bc2c5a3c13941100e8ec65a5598c25a3352f0698f2a27e79c9628882977aedcc41e61fe67bb104d7e504d1c9ab466c8c2a4e7a70e1ed1e06df937c840f9a5a6a032c21f19e417b1f25cdf50d0d07b99989cdb251386b17b49a6f0ec779b1bce5ac457d6b6cfe5d07d2ebc723e85e20f6c7e6594904c77fd470d855197ed513528d6f452f1937d4a17ede0834b23adff1bc9da854087ffc45bf7fd88df6e327a333142a10604b5540088d7cbaa4d566f3149f02f31ecd79ffb88aa6a846fba00ec25c2069f77b0b7bf3d16dd1d13f8ced98f264b15be8a3194970a33c23fa6859be9df75a5e5b2c3f49635fd77a4eb15695b097cf76139961cbe0d4e1da6e825229ee53027246c8fa1efe39aa8e5871c67efc72ff591ab101652aabf2fb65d65ebbe8e4c12fcf7ca793582708b95a61f3f0f5c228a9e8701295a09683e7861995350b319a92b6c8fe23945b37e9af2f96e26c7d9e7b2092d8aac6796523d81dfb85277903d0c686201fddc3bd01eb31de1ec3b8aaa2b2089a03e9ce35670302f29f586f6bced8df378bea6e82daa4cdfc0fddb0940c0eab0296d4c38f848d855e75e5f65867e1147c1296098656fdbcde76a7fd6fa382cd207d74226d85796a7835a1be123559c2693248f5580cb1b15a8b2885a93b3f9fb4b246ebf3ad53e0b19fcabeaae3e39e1ea5bdc6b63c1c31e1df9eb9a2a02e95195f2a4b348fe04404171c49f76d8adcd87ec1a77abc8fcbf9b9ff5d91f27d40911b6767d01a15c68ba73150e6ac83ff3f58cf3a185cafc7f214ad80a1ba26a9beac554a42d7d8dbe4efe4a44eb4113ce4b33b4b192f867eb2e7446f1c28593415c0a6fa16538780fc057eda1dee5a97a025c0b49cb158306e4b25d94767bf44ed01890b997f9167fb8ab993a5067937300cf91ac62a4bbd3a3af185cbc07fdb137ad031d1a6c657f45a80f50b127a01bdc2d5564982e0b854f47730126f181acfe2c98c9be060284b3638c7b144fd478cf60238650ed1e356705b5150603f4a500ba205a12fc442c72d50d2eaa6583b660e161844841506cdf2fd8860c37687494dc5e132ec7aaf06ac4189f646be29039fc08b2696ce9fd93f3d0c9c45ec11dbf070cd3b824aa4a82cbb8e73b3d3b3d1fc9d94f6aa9657b8b25381c8939eb51c874bf199804c8abae87b01a248620c508b314dcc586288b69ca32fbf44acb230806893a0bbb874a1ee498cc1be1333fe9928c247e7a246513566682fed203a104c35ed62b189434423304acb078f9b95d2b0e17f059df948bc9fd04613df4597cdc77c928b1345410c068f0e9c349bdf3341c444ffd381ef2a8a9d879ec9416460ed3576abc7b0869bc4a601d27658d52309fdaf9065a58016ca271851c7c1aba6faba1e18f11a089768a9928bc412941f0ee4c3f1995bf19f6a5f2377bdfa2b7bcc942bf7441e7998a0e0909c0a42944f0687e2689d814c2e9e4efe15067b31ce927a4d6c51e75ccab363e5c2e6ba8e092da56ba66950f1ac381d216c15452d9d48603f43371c0d203d1da497285198be128b95ce3e70e01847535f30f6ab046284e60ef09e23defd402c9ca50797b7560d2c6352cfefd71d53b833cfbb8a0a2f8623bf2a06f3dc676e133551594f7e2d201df65e722542635f56194c7b0f950360a833f68dab6a8d9cf9f21553ab73e5d575a3f8e3c9b268caacec61447a67fd93ac17278766ed006f8fd39524a796dd13df55e77315cd7a6e9ee1186f25e83904d252044fdc8e6c41ef603f7313f01d913674c0750f11c60104859da59ebfe9fc81fa5d9552bb521e7a3b9c72e95edb205a626611d0d1eb0f01d7aa0f3f2c3fb20a955455fc3d7719a4ee4faea988b3dbdef4d4e727f5054a5cb02d0fbfd0e1ca216261294a05793bed7fee90b009e8a3705b2232620a2f22515f13116ec30f381c254ec8fe7e6ff08a9fc245bf0ef43b0b9847f76c078b6e69a0d4353da281c7fe20a36ccfde50928d6479262a5dffc3cb508c08245473b0a366864eea6d6e826bfcd6b7e23f30bb0923ba3800e986d742f9c32433c00f828d92a92bbbd29eca70d5ff68635877b41ce0738b6ddce7b61125340c869b1e13817bfb0f520f5a7b00793fc3fbc2ca9ce9ecc89e2968f86c079f8f57d94f772984d73592b06c648f56ceb327b4560fd0cab8e4cee581542e3a76cc2633e64cef13b96532b80771eff80b1975d8aad6d5fed193e6682a0e7c20c77a370498542617005235e6b9c9cff700be39d3b509f87156956422fac29ded77c264d6ca1d0a521252cf634ae7b8b9b2e705c5ce1d16be675c2be1bfc7f26fab62853c39f102ffa07c09c2006dc888b209a22992e26016127f5b1384ad0fc6f6bb9aa8bbcaedab496056854fd023e1f4af21d76310b1feb55779967f1602a3122c6d641429341a755af19ac2e3960b2fabc62afd01378def0eccc6382ff0ffa28ed5cca4132bbcd7e73d42612a96a1ab2d2d5c1fc01bc0ca9665e11b75e94af3b0262a7825d52788bcbb20dff74ba0eb99e8aeef0aef7dc871c016954ec71544031438021dc4217755ba4b361003f43e2e538de985bb4c964c876d2166009580321b391867eed8fe7592f6f23dfe5c8cb9a41b7032763baebe5a1486455c2a804af69b056a8f8cd4ba2a9fe30084bc53c0ae2460a9951662c13fbdac36aa56f583cbd9f93112266897a63ec6b65c32818b08e674c54d520c2634b9ddaf033d93b2cc0c26b15ba0edbfdf3b8bd57cd12f871dbe29d7e67ec50e73c6e776a4d8642def0f87014db72febc15418bbdeb530a7e3a44984974462486c4bf9771dc833ea60e926a58f74afaaf198db73a933350fa24e1975e6c96d0d0ba3a47c857898293c12208b1254006511661ded9ae5a3b4200ec6013ee05db51f6d59434efcf1f36d9fefc041e42416493f2711ca8f9601a99196925976dabb25ded50d931ccfab9fd5a0cf735fa9671cc3b516b3948d31749647e4fd511bebdc0bffdef8dfc48c6f5d0a7e132eea3a39b2d659a9ca383f53515dfc22076dab9fa8b847f8e1801cdd2f7c0d68927ad500afcd55837c44f9235b1b15d4a95be381908670b0cea79cd6a4838c70f59056b3589ea0c2a720342d5fc0a9e1e8aa138187832b4dca6019f44474660fff217e4a0e24d3b2afe88c012c4abf72d76be4c278fa4050bc2a6b1347330fb3bc30483c0fadf4b7160f6733d2e0614f7e4bb1594e52c19302f377ee5aac064f0f8f5ecfd0ad178a06429839932d40fcb30b667d0530067b97acd9a64ca187d4c5543c0beeef083a99622943368a818f513c4d51dbd9aab8f815d92909d551785998c64f0b4426ab550130066396631944ecf899518b4ba6f138bc9a2d0f79d6253d6a8110f9c319672acd36711c0dd6cf4c2619c08bb1332d4ba120717f6906dd64cebe5897df6ffbb8320232ed76bf03f14196a215387a8bf91f0c89290b77a623fbc6be60b959e6c799aa48a686f5b535e1969f29bff98db7662dc41ac5e4dc6b2b361949a0eb0c573062152be2209a","title":"30. 串联所有单词的子串","link":"https://leetcode-cn.com/problems/substring-with-concatenation-of-all-words","question_id":30,"issue_number":26},"24":{"day":24,"pres":["哈希表","同余定理及简单推导","前缀和"],"tags":["前缀和","数组","Math","哈希表"],"whys":null,"difficulty":"- 中等","description":"```\n给你一个正整数数组 nums,请你移除 最短 子数组(可以为 空),使得剩余元素的 和 能被 p 整除。 不允许 将整个数组都移除。\n\n请你返回你需要移除的最短子数组的长度,如果无法满足题目要求,返回 -1 。\n\n子数组 定义为原数组中连续的一组元素。\n\n\n\n示例 1:\n\n输入:nums = [3,1,4,2], p = 6\n输出:1\n解释:nums 中元素和为 10,不能被 p 整除。我们可以移除子数组 [4] ,剩余元素的和为 6 。\n示例 2:\n\n输入:nums = [6,3,5,2], p = 9\n输出:2\n解释:我们无法移除任何一个元素使得和被 9 整除,最优方案是移除子数组 [5,2] ,剩余元素为 [6,3],和为 9 。\n示例 3:\n\n输入:nums = [1,2,3], p = 3\n输出:0\n解释:和恰好为 6 ,已经能被 3 整除了。所以我们不需要移除任何元素。\n示例 4:\n\n输入:nums = [1,2,3], p = 7\n输出:-1\n解释:没有任何方案使得移除子数组后剩余元素的和被 7 整除。\n示例 5:\n\n输入:nums = [1000000000,1000000000,1000000000], p = 3\n输出:0\n\n\n提示:\n\n1 <= nums.length <= 105\n1 <= nums[i] <= 109\n1 <= p <= 109\n```","content":"096221cf5b628be1e73e8bcfe626c73474822a940a3d41a850084c70200762692294ec417e86b812b8bc283d9c3b20ab7f6e65ad9d3e03c1ae76b561bceff835f3316e60d5d7cfbc1931cda78598506c78e97c8d91ec1f8b39f421c7f1aabf845b2eca4463acd63e665b6d3ce9914d58bb5fa4c0bcba15478a36d8e122a75a2586bf4670440c074c1cd24b384df500b572730a9f7a273952cdf50378ee9bf20069760327844c48ebe50d6985cf64560026c186c92fb795e777df06336a8a4f2e1dd34a9b0c5e870ce7da2d18d3220525ff0e9a34484f0b6d9aa37dc0313b7f858cafec1997e06cee832f82f69dc686ea05cf34e6f9a75e32457aac606a2541c2ff0fda99e9c7640c446e4b04d5525267f2dbb137fd368d47b4d2c41f9488689d5335eb8d76a121a232aafa1920cd2464a60ce69f9ec651c1bc56eff8784c22a2780f80f246260ce6dafb6d9ab8d403d0e5a3a1eccbb3b41fb6738d946b536bdc84caf19912d032d630007b670f59e5eb04c7f434ae612f3f185dbb7cb3a9a221799b31467155d8dc5c51e9582ac05c62855355ebfaee60e2ec73448c6b312d469aea3a661640a06780fe794783bd8052a6e2f0bad67bbb4244617ed00557caefbe61fcdc968a0fbad8fd5a6fc389323c7f9250fcd0dfa346f57ff39778072f8446be390858e8d943d5aa8c3d3a4f70b6cde1ad71c1d864d6fb49b55d9aa475999565430346258043b2855accb1d3f9deb4c99bef73d402eb014ee68beae4c614b538007d4f2a6416f7ddc21d35685eb5debbff8a935d82c6d6147f1d18a15522f3f15ef4bc92a9d431350796be10bae436a9549d2c22f770d3b53840f89e40964b617458a0b6feb9ba8cb56ce6f5f9c96dd7ccf9cbc3fcdf0816d01c3c382b5c472709e19231d694a82969678d1bf7aca45e7e71d4c119e24e8acafd7eddd7810dd42e75dd750a3af2d0e582636f4560ca08b715f692cfc63a71f30cc99a5c435f6cc926a9ddf70c84a23579a47a9876479fdef08350baa3554bd9ed475bc20706bf53d2d285818dcf7e5005744a9c643831c26ae5716f3f76c8cc5bd8d0678c651704bfd0078c679737df8f5d80252385daa5eb0aa32d72e0caee9f3e4081682db5792d7b4f927b97418fe2729e9f4815e7e2884d0c3681acfed12a76441371200d0a082bf4dada24391abfaacf28b62918546e33695fe039998f1841e72da3c5c1a7de9f81d01a9b19cf9893b3d3684d2527f206a4b56de353e46eed8cfd7814c199a7fa132aa7b9622424d90207f96fe791fd1f7b02aee9e13b2a0225345169c87877f1996c9e4990e57d02a24c2e8f13f97b5f8097d8ec2a9e823837ae4add151fbb2bede51b4648b0bff7c5affb49314d0813cdffea83db4a9c4535e93fb0f53008d7a68fc481ba7a37a38879a6ae109eb0b13007088a8a243fd5964c0cf99ef6cc0d1dadb3618b1a9668f039ab6b551d60e45f39a89c61abb8e7d271510ed8c2d2371e2b9056925ca3c51f3a7135f9a0320c110e5ac921b5fcaab263529753fa82da0a03dd371e5cacfee2148000779afb444a6645800d01879cf37787a9b78924f3c3231f4217a9f75a99615f9e19512ff82d3ba0650c556ef2cdb33ad63a18373845ddf3baf11fd19dfd1545798d499f7f8ecff68c6116bd398303a35d7e36163817d6d4100ec3f8397953193a370cf1f5f8f05a0005d6a8b87296bec3ed7269c50c8892c0d75d0bb919c0aa26d15a63a118bdacbbbd0ac92b9a4d7b26f8ce32aded0f7c356c7d40f0b33fa22244f5ffff8f56333eaae4d8de3f70d4aa852f7becdd7ee76643b971266facb96db2dbe9c3974f41116bc09c96a9988e98a0aa26caa060d87ddbe1e0f93e5b69a086fbafa6116b25f4d2e26b253ea437ef7695cebc7d6c433a4d23fa41ceafc33c67897cd09152995c21cdeff2ad1e42d509b675e9e4a5ff7c565ece4133bef50a15bb430bc16b31c87d12287ed3d1c34a7b99e1c82d6f9b7b55bc1f841ea971aef07d1eaabafd4e10a3866fe81eae4a2eb2e782f087863a27d03aceb125b374b1f846dbbd75e243dab671f3a1c25109c7100d135dbd43f9cb1d0e5f850f12f3035c2a816363bf1566260740546820f7cda64551202c1749b7d31210a50883da94983d3f7e258b714b8ec5b358e9145bfd98b74d086fd017b16384ffa970f614569240a79a6368e4e506d17f4eac6d94e6dc0d0e5c137efe789d72d1b5294a6afc0e774d090c3451196cad0ed1b0b13dcc4917e23c45dbddf0acb3a5b3703e53a3c564108467197758a0b26182ae1fe78b989836a419b79644ede20a8ce23cdbe33705629ce6f2ee8fe06140e576498291403d96da5cd57ff1c9f6c7e9ca44816e2de256337f52cf319004f1f1a805ea1cf423866a979a0b948da85f116a9f7a22e2bdfef12fca61ee9adec9ed28940ca9e28d9d22fcbf7a70ea953212084f987499ccdf71037a3339a212cec23f16c8476f8b9a570a16d45a59031b4c4eaa26aaff1a2d5cdeaecf1e7789d4fb6df65fae3b722f31e9cd3cce4bc7bd685d93bf68ff24780ebac6905d80893da4b3dfc05091334f15f1a8a839aad5f18b858b885f71e5f57d67e83d4012b93c8d50ff79268f303d9b6be5fb6920545119aa131c406dde80515d719d0333319a6665eaaa2ceb25ccea3676e593f111fa93118324ecafa8e6b780a19166c39c90ef0a618d16584a5c39448a2d6b54b583bfca875c8af941748032a48e8f68a8ee52d2dfc6692f08960332c485f9272933f37f77c0eefa33118990c841d5d12ae882ebfeb0dab93b7c512bef2fbead674a43ebd8f9c8eff5aa41872636c899386f122eb64ebfc956a6e1855a2c12ccb0f11653878ef21e73e008ef5b8fa330edb9b3b554017e471ee84a49b848f70c8a149072914bf68d809cb22779033e0ffc0cc62857bc0e30f6b8f6c353f31378c630c480c657f358b5c80b386201b8d6d440598accb25dcc74321f571a0fffecdbb69bfc40286e203bdbb345d07a8ff52639522cd3f5507f7a7c5745224a7f04a037812dc85fca1049deedb654226a0d0d0d44853000c2df14020455d04dc8f6008a26ab26aa631bf40e028e11c1f8195c70f1366e8dca33ebac3d9260a40d6bc7199d79a8785fa56971b75c243a281e1b470280e7709275e7100d6a6630cc6ecd43590fb76f621ab992588aeefffd4efab444a9811a6f6bf71c8d43f1f03ed4fd604a390a8b687eab1e2b785d24d7a17bee42c8e61858656f07569669370131fa71ce186586d4a7d404cf108d8dc70828293a379d23f2561f2eebb511b7132607f6617d255649c2a934e12c985f428a844afe55227735f16f0b555c49f2e1c002d2f774062600114f6fd0d220585ffbe73b7241f15675922a97c1e36a1c341c3f37a9df4a82cd308e200e2f56c3719ef57419563dd0044fe3d1c5ee1222a0b20d0fa730011b3e0a5d7444388e913dc72cad26f23347f4a151d252d3fc8fa1004cf1e2b1d02fc22509c5206b4b7d12a9e8518832e1d982b36a93d58fd18fdb09b9f0251b6095ebfaabbc1e529bf95d26be431446fae86d9a9aaf99ff1a3b94bf0e07e23906c2572cc6ae4960ad6076d6d6def2843d2229ffc6609f0a192fcd9e22fa3183e4704ea8f2bff3ecdc87b9f3b18010f48bcb84c8cfc2ada4fadc6b919d303aa28d39aa461d0f039ce912b72a31e1670c574563ae087967bba5f4d354591ac4af688c7ebbfc483e7eb05b4a17c700df3a819b7fce81397bdfe3a32d89ac539af189006dffb8036a28b5bf4bf004bb7ecab2b5b50e9efc0d5428537b176e34239a13f668e9bc191147fc0df40ddb9ef7cc89032f69cbf55d3189fac0ff23df4491fb54e4e2982a6bf3620e495f5145304954e04fa18ce920ea94141a96f896f386edced4ca38cc532951070bfd84714b2c335b1c24266fbd9d81aa5b953848641c8fbb2ad338741f2e817bd409afa334833fee936488fd4f08baf3424c1e63e652e3ced4c17441e5bdf3a0c55505068a1fcef15d239a64eb2f8a70c36ed62aae91f2db7ea71ddeb265c1881b1a10b0139d6bb725ff5a1e4e2ac2441d1f66f83819ac9095ed40d169a536b57b5e689288f1b00e5eadbb44e357c7d3ced0b78df58b403f4a71725b66c8840342b82c47cfd67d8223387b84df3e88fa6169a548b1a169b8396b530575295d4a4491b7f5f062b7c924cf18f230f8b026b1eeefe80bdcf17c6f4a753b563823c79ccb82c45386e98403a7aeffe0948b433f3a083af349718a27c839f9b532e1b24040025fb12da44016d18b84918058dd8f7f2070154acd436fdaac1aa1f68b2b2740f85a8d6cb416d65b833a3fd9cf6cacab670971a90029571b88dfa7fcd0fa656bd3317c774124711e436086aea854d90e8c2d792fe876d0d7206571cbe551c5b2cb21aaebd6ead0f5dd9ab0962f3e7e240da8eb324620f72b1d8eec0e0a68b0be3a2e3a1f225e78b0b36f2d6481e4fde858361fceada7ff5ae8164448976bc2f977a62931828ca7b07c06a2acc946fdbf1ff4bbcaf2a1e05ae13498388318c308981a97eecabdfef6e06b2712b3611c1300f4fab5d04a6924912f14d70cfee48a962f48b1e39080b4069c9d34dab770e00252a88c801f57247037e8f97c14ec367600ea0ba0da0509c0c891a000b5e90a426d894a73d57692951362d53f7934aca7473a1f3a3b739dd48ed9533db2000ae3f43d798a7ee68f5e808d8ab3741565d5de15721b81882b94076e774b844d60ec17be25d92390107dc153d380073a9e29778ae340ad876c0ce367e587180adea6d87fe32c38e5431abfe2ac95dd2dd98a28c8fa5ee9e30322ef0d76dbcc9139a933faa8f40528097141e8d7cd255c8a698f6677367e4600c6826d6455aac638113b4073e5c6569faca122b5959788d5807ab4bd74992b1ad2ce28731b7b74115e7f5293607b533fbbb1453ba34f5fce26ced88189ff2417a9b02eb8990d7e1687949b30bbcf70791389c96223d56c057e47753b49651473c78f21d9c76b4392565885d7d79d9ae87795986b59362ba94a080af53fb8e7f2e0648b46c75745c66d90d676e6cbbd45d2ebd202705567982056701d33521357a36358b12cde42210a7095abdace17412b66769a6f230197d254d0b530dcee660bb22174060a6e5b2e576c5198f5d001af72ee205ad83ccec57a829c988ebfc14652a1ccc8c60b5431c5e3f2b95826deca7e4fff5943528c9308a77db85a6197ce8e08d8206b2dd10782842faf0edb86392aa6cd81f3bd92bb1f7b0cf42581cb92911f6e4aeeae016aba66eae394a08c8f96fc919864192e6e55ce798bdc46d7301c98d6501544f30cf7c5a8ada70ec3dfc8007c57c725ab7d70e34300a7a9d723c7bcb56e867f6392aafb0a91d5521cc48274a8d624234be3f7d82d293e102456dda3741a9f1e08e71c22a7ebee21fd28c558ff590ea9d7d21030bc914db1a6fe6dea785c4032f870a7d290b344b60f551ff36c1258a025303a6aedfd698e3d1519ecadbcd49ef3e12f1a332c45a059a89a606c395eb07301062885a7659d75cfc34f451ac7f519b0cdef16ad358a5b2e6f4d744d8ec730d9fdc8e2981d430953899f5f68a228109a8338a3f8f12e6b9a567d81b7f18b8f7b979e65a5a76b40aeff418457be7c9f51d3c0dc6b1202785b305bcb35adb5270ceb1f1d2cfa1969786fab51f29fcf98f4e973d4f61dc238beb87e1866f581a2ce2d1858345cc054b3ccc84c564e5924011aea9f1f35c9cd67edd8ab356125955c4c33a9f366b2b997464b18b62a9f45d018fdaa523cd7f7ab964561adc68abc811c17e59ff6df728a735a56a3bd1ad79eeede7abd437447b2cf0e5d216f4c99f0c99d38bb47dcf829a879281c1a83e18e91634f5c6f0e127309d6ae68d7573ac9165e953a2468ee0d103155f3407adbfeb3892e4d0a420e29502c5d0ddfdb73e1bea33a1647c6e42cc80b5c2a2f939aadf0891d8017bc97c2548d6d1d7d905626007cfb16d71b95175d8319359c0992975c333712df8730dc70d56c2ae43f37a07ed656dfa91094725d4b0f64163b3d26df73c533e25aa1213c7966a51378df58079404fd99e8787846f3a888ed9ab61eb46de5d6c914cf319b20af6c0b6031adfd90c6cb74e13d809101ae4c42f1ec79da5890ecb470695533b80c795de76b05a356a09169f0514ba63cabbd4f5829a390e3a0ef7576f0826ef9318ccec37629f786f2771a6cfbb1d0e234e3bfff4913d8514f4d4845e20d37cae31ba04fd35cd609a666b53849bb563ed7f0fafdbfd0ef4de9851682e726cf4dfe0c0aadc642d012296688188e64e15c0570d7790dba780954604603412ad2733d37ad94bbd7a679a34a51bf069b723d3522b777654627c554ddfe0017796145518ac55d1105a6285170d6e620a43c973114505df944064b77fcc746216b6695fbfc9965fca3312fb91e875de4b32b090ff6119a02c54d582e96ee0f4caf983581cb46fb1f5725466a88db5d1409add8a73d8676775713d211dd96843d166237cf289475e72389b2b3d37ab4b5ee2c4df20cf115a1152b978dbf683a506a91c5110eaabc94a06eb3dbe98348c0bd8d30d476f4f62ec98f84a482a1800c70f14d146db7a5ff2c18db84b861f96f6b334597c03c8f0ee5fd1c65b147f2e98bb263a1105f2ac397fef318d10e6bb26c62258e8bc8d19bad325f1c4bd1898f352317a933f9d57acfe69160df900dd566c123f74422bd2bc764d2a3268b07a6c2688131f348e5c4eeb1e1f201d82b3ac0a5e07c44934aedb07beb9d13b0118faa02124ee433eb2a1a8695fa37b78b6988a06384d6ddd9a9fa76890dc31ee6450bc51d0eece6222f3ff9e4d9fcafa476a284b2e3aa0982a2670b513bbbf17fceafad05f887d5f8af387d4ef19ba8fb61ff3485735d3c40144640333e595740e6e8de4817f1a4127ea72aacb81f8f8e1793a8c9e73a95ee1119820759aa9bae2f249f6106da1b76971c1ee17e7df31d30c68fc9a78ce04d171af6caad8ba5f829a38ee51b99f53dca700c2f1eedb45faaff72fa8778f7ec477101517cea9500bbbbcee69c70e7e65e65a0994f53d27340f0648d2ff6c1620c77f2d08b1d70c1b2cf97d5f50b16b41938cacc34e9de5ebb04d38a4bb765982ad3150a12cae19b1caacb8cae80a29a3093c6a2a273909df0804b8cb7692b63a0b9df5d1776a4c68b67793a53ae9853633b21bf1bc2ac86c7702622667eaadf2b87134e8920c3379d86358f8fdd2dfaeef3c0f3b0734eaa8556e95e6d704732b46613984240c58d889159c8ccd26002ee3406f5caedb46ececfe32e2c2b255e0e7909df213b2a57161a0a7f6e49c5a7e8f8f664f54913ea3e4f44ccc5ffce3c184dc9ed7f9040e3b561abd0500a76f5155f248a1c9811ab147e7ebf149f0c433babcd7d1157e4e6f9886aa36d2fe62902e06c8802487d93c50d3f89e4bdc5bb78a7d08a8fc78c8ea7696106e04d42b76e4d3b7b6ec5e90517c2efa1f4e6edcc734f6e14a90b837a7683841dcfdd62d8fc3fd46a8d76f4afc004b866e562f69be9084c23262b6c6f3a635972c1744cb08c667371cad8586a428d440656b2ab08a410cb2fb3c01624a2509676629b1f8b165a43d1b62532d633b36c7bc58605c7d5e5aa95e06b8cbf09edbee560221dc24934f3de9a29e928b8da5e71d6f4687921f5c4ef0b7352dbb446aec9fc2f0127e52b4c26132ed20a0a546248ac15c3f4286e6a4c9452e6434b2d2245f21bf81c692806a14a595a59c8435e5f7d781c860ff3c408fe000f26d0b0fc0418717b3e4ca79e88a9d9b7216121febfe466fe2ee96c062c8f692a8627c7b3742d4d7f86bea9e3780eba3180f76933f5f92fe5d5a60f63dddfc59e6915fbe2c1e5ee6120f87f6d6af9faadb35a3af537263a871bb0e5f16d2a5e07ad8698f8de32ca1991555dab15c7bf109e533ce931f6516c2b53b4e7802ff402bdd5903671965d42673ab81c5dac80e26c5187c78782143375afc7a4c26f064e305dde9d49834ecce73fd0e7b612b5d4448635f673f98dda3ffc9defcae750aa4cc34b288601860f1b0c843ecb066162ccb5d7926fb0265e7f5ac7e09615f363d4b4a6535207bba59ac384f54caf90aa9aa2c47f6ca870e98e2a60af3e4559dce86374f1589de8c13d841ee7b84b9b478d122a84086c7b1cbf473b84b435fe847089c963e9f19af2bbfe6b825e6be03594c912bacba4ea059f3d774253703ded44a48e0b964cf15d47c6051167716bdd8ff1b8e6e098d87b8b43254b4fc5324813d9487d5168ca8db417295dbb8f65485e333ae73cee1bd16a24b1cbbb32d0cefd26d21a13a86d46cd03b1b264fde27fdb28835bbdc9a7825f88d476e2395af5b24405428e61ad952c188acdd8cd008f6a76e2e4ce3549a71a05d749c0dc12945a1f52663e693391c0f28596e4ed52664e6680101d0075b10aee5a8c2ba5fb1cc814c5698e37c8bd8920c2c71b38f7f8b1b33e3166faa67b502a94e0776862a7e38bb336d4c6689ff0104fcdb9a6c3d6aaf33f23ab52dd74d2720d9c2c1c4b4b3e72dcd9014f88f8d8f0b33abe18004e69413a6592284b6a237306223633887262bd1a909a7bdefc67ddeab6703c50b3c8582c25882f26b3ac118a8fc3ba9054a37a537cb16ec67757511ccef4dcd69109330738d280fb560e2660aa8a6366fd6d1598606f7afdba9ed1b49a2ef8a832c6822f779c29938d77c0e47243d17c72a8daa0a560e59986d306cc2d0d232d0b4df23511ceb72b0e94034b5770e2090115075ecf1768ca0656bc8357cec910a1875280d16259a830e9f4b73ef04aa62f2bb0bb39bf5bfad48e7b2d554a5ed59c1cd66087db59368c37f73b25bcdcf4ca8a20238d31abc03a98dbc49fe9a80b83896ffa08706490a6dd5cd84904150616a09cd92881354e30979f639444c9030cca6caa49f0498ba0f00b836522481793df5b4ac92b649f80e492c0858d90d4ebaaee5d020156fcf30bfcf908fb754fac655b5fa927bb3f5ce26322996945309c9f962b3cf9c31af49a09cdb13e8f863ca96ad3b936ac4042160a9b03fa7e13be8b8c8175c51a1f67c63fdcfe6487fc80665a28aef6c6be49cbbc0ba16e0ab1d94e8922946acac173121a337f5d6c7114e9f4741bec9d12cc77aaf17bef6d5d011642419445f572c2f5fd3c121856bce6c241fd60988ba397c03590af9677fb931e606fda30c1d7d9a4d7b41fd6f5e2eacb6f185438501e7e272bf7d5b1638010f8699e39508eff71390087d07676483ab8d46920f2b761bfc857ab3481a95def9e75129ea36fc8049fad544d425dbace2e072d033a798f36f82408f821eac8ed26c647043b8f6d4989138234250dc2604c7912776714f706c75b4ff5169337079e1e355eabfc1dfc5376bd58e2d73daae221655f036984f204e711081f97776e0d04663d7addc2abfc70a7b65a9b5640a8aeb3858c518f23c36c662a2b6ae492624d5893da4cb8c57fcca72297c5fb435f93f2c9b7ccb49efbd96af1fed1455c5c7710981b0e786505511208fabbe347c71becfb8539fa3fdf70158f15b8fd0aa7f1880a42fe5a9cf9961f623955978925f617a9129bd77f0b0b59d8a61835202c1f52a6be66b913de00c24ce7f8246bb74cd427ab514c257ba4c3f5b88bec4039fe064e403936c0f545daac44eaadc1f281657727df981d99acab95aad25eb5a078a6954e4a8945c15eae14e5f2446c6b245642f12afc81dea457bea2a5649d39b71e918e259e8562f02ec144224163e0742d77611cc029b6f02bedf58561574cc299c72fd1a24d3c690a586251b446","title":"1590. 使数组和能被 P 整除","link":"https://leetcode.cn/problems/make-sum-divisible-by-p/","question_id":1694,"issue_number":27},"25":{"day":25,"pres":null,"tags":["双指针","链表"],"whys":null,"difficulty":"- 简单","description":"```\n给定一个头结点为 head 的非空单链表,返回链表的中间结点。\n\n如果有两个中间结点,则返回第二个中间结点。\n\n \n\n示例 1:\n\n输入:[1,2,3,4,5]\n输出:此列表中的结点 3 (序列化形式:[3,4,5])\n返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。\n注意,我们返回了一个 ListNode 类型的对象 ans,这样:\nans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.\n示例 2:\n\n输入:[1,2,3,4,5,6]\n输出:此列表中的结点 4 (序列化形式:[4,5,6])\n由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。\n \n\n提示:\n\n给定链表的结点数介于 1 和 100 之间。\n\n```","content":"096221cf5b628be1e73e8bcfe626c7347d80258a04f436ab074f71275d3802341df1937624d5895e1a5521d103e7bd46ab345588da2612d4a92ff52ab5a7fe2fbe3d6568d4c4d3fc0b2fc7a89ad2507633e07183d9ae0ad320b12083ebaaa2865c26820568a68f61435b443cea542d78f736adaecbac7434af8dd8da3da99d6e96d62f583473173341e42a892c9902de287f68e464484056aaa42a38acba9e5d673676282ea3cf61227e4ff48a671f7d07a9dfcd7a2314629f39e95c7af5333c528b68ff526ac862cc967701827b3b739c39cc5f7422b98b007282c9362672a093acfb2e95c8740d10a88130e7e6e6920551db4144612e0d2e27a4083f3f2c477dcb88afb3977f84a9cdd2c8493227659b85aa8212a53a4593fbc52f9867e73d97a1a2c874c29ae946a955191cc0c6cc6d4cf6b59fe87ccd8b68e8c07a887eb0104eb194151b534486af53c60d0882092b8794bbb68cd96bab29c38935376791f4f49b32b0d721ed3c024f6a2b53e9e324cbe83ca0672b330671b54cbca7801679830c436d5735491412c62e52c90a19b7330ad59abf5fb9b1640bf4635a7373ff8e1d154c5be509aa832068c7cea806e3ec8ce7c131eb4e213f62bb7d5fa1bc92129bfeeb2aa081f2dc7ae7c364732b0bca4e6c068b9bfc1adb81cd526b4e9913e72dcc8f515b885d025ca9a2fac5c094c9e511e1b33cf49d03aa3cf7b61edf8921182e23b50eae03f119f4ec4d41deadc39dfa9c567db01e3d8693a7bde0f52fe9e90641260b09eeb1c723f1e5977c6555382d378c33bd8f05237f22f20d0078db8573fcfbac7ef66f287323d24d2361aa1ec33644bf7d9bff0f2ba7b51d34c3b4216bc9dad1d1de99e025ecb66609aba9f66d79697408a4a16bbd4e5c12fa441b0ee3ad1bde8f9f2678528c0dcba28e7a7c51ce05f850f712a5a54a927e64801ac3de379288aeb586c4e318762e1ef657389a3ec0ee6451f8245991a83fdcf465d50b4c6b85b87629c3f23da76e380fd29efc9e118fe6571690a01f47e94a4aef4ecfc690ab041f9e9becabdd54d0645e52b968ee89d9b94976887c61678c6c141c9516d577f31ee2536e8d4af0fd19131e61d75bbdea770f254995b80f8677ae26775221c2574d0c985841b4916332ebfe894d0c203c015207badd8eb1e4f380b4b3b9b383ee7a5739f4f3f85efd184d3b425fe8ac31ad0635a22abc1ad5abeafa4332447d7cc6228af4bcec7fa59eb4b64a5597d634eb8434fa6280f205de4bfc39ac532acdef46a1f2be297552cde9b3e71e4603a5edd1b1e7c2bf83d8ae28dabc410cb07fe95515e1da0af9c1ef068e26621a4b449388184aab7bfb41b17232c575d38142531dce84ad8dbba5d38b895f05a6a1ced6be48f02d345e15b2541add78d0fdd4d2cc624913047d9db513b9aabc181c06a3b3271efd954f12f780cfc23e2caeaf518639bc4eebb38d76256a69a518bc384f238956b9fd222204b0627009fbf76a3c92be3e75da595447ad8df373769aee5ce556696238e58746f8336072df8d5ad94e58daa4ce48e33b042542ab304d00ec286de4a78003bd2471f012bc9e147c1610c7874cf0267bdb4c5b7a6688fce1734023769b86a67ea50678652e28abd2d09e1a94c8d140e0cb4a1b923dfbf79ffb506dfa2d08d20f3c021077490685b11ab4c2c028785d2cfd9867abf8441f3227798fa1fb1888c2211ff6886dd420531442d0de01991824a808e5ec798925783320dd7ba255fcc91cc2df59c0f557381c302e0affa16fbf41dc220f347e85acad08a7e3bd59fa755012ece8096b0c42ed9401c3fdd97b2ab3541d22271186879df27542361aa2b1b1b2aafe4c23e90d91a2b06d1fbd80f401515f394aaccaf67568d818f6bf0856a63bf7c1b22e6c43533d235f8e2d2d548867e331901ea81e94b76700400b342f858e51a4637f5ab9380567e15a3fd1a50a984daa8a73c7f349956a4729858344f0be30321d532bd93fd479b843990f71d2b22c1e225a14cdc1682f9f299321f104debfcc766067b0f17cfa077c4efa7d7413c01f2080629960228d1a336de6ce41f689edbc7bf07146d7d3318114fd5aaeccfe68ea9413371f694b1792ce9b3f1c683c2fe9a8a98e4a1c86fe0f80622d063180a2ecaa43ffc20e2c51c872859c3c422da082e50def23e35fb0fbe2519e912dcd6f5691e02868de5c9cc456aa5d333d5f5088a5d23ab828b74f50a9b7b66ad8dcd9ffe7a5ffa3f43b9354425dd37ea34efd74cd2f6a367a682743fad1d94e4684e2f7679c818d364bda365bf7747f6c1fef31f72c3b83493089726db72c1db7d1b93400166d3b1ae3b607b2d674139af44957805a9935602227635fe84bd4bb4bafcee3b201b25ba9136e16c2719131ae36ff6e459b0f346fa3f4fc79d63fb1a0f6cf39a12fa9df1d694fed12f927157d1e972a39b2802d6ed890a8921c9561c2c57b0f6f6513af129d9772699a0621ccdf578aef080e121edcb0ab3fc73077eae5cd704d45da8f6a7678a96ff76893c3ebaa6508ff13c10e0ab0f55037bd0eeeaeeb260a3098042ef5071d105cae1dc6b782110e3efb4944726b03770bb2c14bf5747ae8357210b81e8764f57a3789ffb3168982ce29b8979761924e6a7e34aca51c3957c769267410eead77df5cd97abef85134f6e98a21becf2b30e0735b64350b410f3baea7bbc5ba113cf4323d0a40531ea46ecaeab1e1a6182efa8a","title":"876. 链表的中间结点","link":"https://leetcode-cn.com/problems/middle-of-the-linked-list/","question_id":908,"issue_number":28},"26":{"day":26,"pres":null,"tags":["数组","双指针"],"whys":null,"difficulty":"- 简单","description":"```\n给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。\n\n不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。\n\n\n\n示例 1:\n\n给定数组 nums = [1,1,2],\n\n函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。\n\n你不需要考虑数组中超出新长度后面的元素。\n示例 2:\n\n给定 nums = [0,0,1,1,1,2,2,3,3,4],\n\n函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。\n\n你不需要考虑数组中超出新长度后面的元素。\n\n\n说明:\n\n为什么返回数值是整数,但输出的答案是数组呢?\n\n请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。\n\n你可以想象内部操作如下:\n\n// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝\nint len = removeDuplicates(nums);\n\n// 在函数里修改输入数组对于调用者是可见的。\n// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。\nfor (int i = 0; i < len; i++) {\n print(nums[i]);\n}\n```","content":"0961e884611df7d4ac47a79a9e3ba8a0cd85258ac19505fc764a3f4e55595c03568db42578eafe01350b925fe00844d77fca86064ca5cb38d746f23aa4faee7bbf7166609ec0c2fc0d268fa687d35e703aab6d949ba3009b39aa6adce2aea39b5c6fcb1c71b9922d2825026ce7d7dab2739b5726295ef6c433e6a09972f055ca1c1081ed386c0c3f7bcb2a832e9b19e3c4f9de23d6252c5acece2374da8af1035774092b6afeeb2f62692cac931a666d46f2f49e30067a018e5a8358379f2c7a2fbff811cbc50d0ceafe2c20d9ce9ab8397dbf631470af09c2eeeba001511badd2d9d9b37a64f427f3111cf5bbe06b7f85cf36e5e9a44617a8cb0bacf64406d5b770cfda82f0369313cdfb8b09bbb73cc5a6e926826ca222d9c38a4483ff08a43b67deda0b9e85a81caa3e4c03995046e58a175ae4fbc5cdab6de9e44a4c239255039cd7470f39239bc60efb978769d8a8dfb0b9a98bd7429521d6bf34074d9dd9dd953c97dc25cb31385868046de5ff30c6ce2ea0731f33065cba77a9af870976be2145764bd8e44a5ddd6c29c56263ab6755cafae06fd9ef5f528a42022d5abeef2478fadde439be83397dc6e88906dbe881ffd030f772221d4bb47f5ba1bc8512b0fde13d966444923e506966681406d57ea9abcc07839e4e8cef71ae2f8352bd232e56c3fa41eb8b8e10274074ac0abfb920bec0288ac611e94dd701b95610ec806a66b26fed2e8557ccbcfac6191fa2c1e8d83a51e37613e8cbabd4baf250b6f3df7800352f3c4854cda7d123a8c4c1d55008f26d80f2610f2a45f56d98ac8edb203f460e05efa5acd4f920e5ced8f47ec54f34a021c9c44263b9ce45229fca0502bae2a1aed6e69d3ba1e47f997f1d79a89becbc841c71b80b4b492017192c866b5cf94213f45a7426e13b83f2950a2160b564c131a70acde359dce1860ffd0e74e04ccdbf7e174de5067fc38e960f37c76efca6d8b07ef137c5a4548bf41293291330a436f3ff1d34fd43e79f88143b6057e55e70c3de1048e5800289c155f70a773f6cd1d10e3500c4428444ee85a1ed74a2e2bf7ecfcf58fedba359bc9ce03f0b9442b01cbc1a27d555b2a94d551c3d9e10e5f9661b3630d3fec40b2dec09230910941fd046cc7ddf5be2434798cbcb383453f28f9b8f30ce97a9e82315340a0bcfd8f3003616aba8d93c70d2dddea697ae9e51f0225fdc14cf45fee68dc6e0e1d0f571de068bc385ef678a9fb1ae8fd93419b95dff32fa779fe878c3a29b2f17bd74fea70dbc9adf221d1bc38ec7ee79163ed0b3eee5b8d4d2f0d4e47bffde2632e525f3007cc88067c582823de47745989ffef2ff11e97820e72ed778a92bc497c6492160db20402bf3f9d3e3d6674bf892b58ea814883350c167f7deacdd6feffce5dcc54b63f6b216c29170ff8ec66e2554e5814463d4e6122098e4ee8b4d09faf361e666a32e7488453e6f4f03d4106b8cf00e953ee8c8585035f60467b3162c8eba001bf9ed5f5c5456a086c99ee8d599748c085b3f65f3ee2ec37a1b7aa5c470b9195eb3f3da37893862525bfd455c668c16238da7d477a0b8b89221f3c7361d6b3ba7df709a45729c315e2dfd3e39a867017644ffd0a03bd722170c3946d5d2baf719dd87e5175a7e897dbd921eafaebe0871b07618916538586a4e0056b3d17b878cba1010092f86e745cf8b4a7188b49c1c023df35f49deb8f9824ad5136c1367f1de35bc170ebe03f6cf77be34793702de45bb5ffcd9f1527ae11d5fdbf5f7a5ed813616b0798718a4d096ec5451679f6d377aab73d4b8870a5be7da5f09d1e77fc6aca776510aa89bf186954d5b5976dcd3d3f5c7cdf7d5ff6a9be96dcc64cdc9a1ca6b0a27a98cc19c830f6bfc555a77cca4e511b636c8134a63b380dda086bd8f04cced8817dd64ea749174ad5f27c3e2d0a2f3fb5d07a340e8c78e10ded9fb08b4bc2e5cc970aac1c156c73fc96cfeaff3144c8a375ff8bee99a8323eb59bb268628be9c3e57b7abf0d6ca0f812d845ece12bd56c231594798a4eb5825ba47dffe941ab0ecc52290a5059252a5eb479dc8ce3e75dd756e1b2fc149b7a73254c921ca72f9690f36e20673397903770448db86c93f1329727bf9b5afc70c41d5e644803c751b338bf0c6f169ffc2486d52ce3bd6c8724d2bb9dfd001ca7ef63ba889f60af4bb07ce6c051800d3ae6ffb063ab1d7797e7b0404552f6ff2728d9d650fec2457b052442a7730782c0632e615b3cbaf519b4fbb6da422a5e1bcdc81dac04c5c3abcae0d130388716b0ad0881ddeb07881890f5da1e27c8bfe2bd9bd6b99a87ec89e493939ffec95bcb349e632ce251090f11202fb17ecd65af0c9f6e4e1cd65836316e06106747cecdc13b3f0cfb107d901f5369b6992a60bb58daa401668b95622f12d1537bb2788606db5294f28823faaf59c9c10f7bc7974eba2131b347898608c092ebb9e99fcfd37985832d1ae0e86e26c7d7de6af20271a4b88a2ba3f893136ffb3d02e4a438c8d092677e226b327cb95e5e0354fa575a45a09aef5c7e0719e604184549a811bc3ae54c1a99f9a50f95d7e6a357da22baa63017f0b786f8be16b5a83d74dc7949038b2688c13fcc36adfb636a96c55a7b8b9c7e45895eecdf12a71d9b2a70ad7c1af3a8af53a4ac14fb9090cc6f50f7a65cd7b0ee37fad35713e2628452f398436730d73f4ed7cf9c68999a48b72a193abe1cbfd093afee686caaa67bc4f5640fc4a7f872b1e59a2c3be0f89e4254004a5edb36caad16a2a6299d470080ee268078654615c6a22165db184f3e625bb7a28d8c3ad3e4e781d62254edc4497f90f1fffd3b9eb5798774393f3f4d6e7c997780974c4cf651d2eefcc2da354e71f3f974470043b9d83969fb67e94cc378c6c894f8463ef53ad457d32290b8bbff5e4871ff15395a563bfb532256959cd7bd5cd56a55b0d09d4549f0f31e488ce97603b449cad4d2c05925bd8e4b8d682bc45640448764dbdb4b7d8b220308228910e20add6d7e3572e85eef09cd3bdc0decbff2ad279be1db041aaaa543848dff7cfd3bbb581298687273b3e7a87a413d20f2a9075e526fe6ef3c338c1e543982e59de8e8579d7cb97eb332e1c9156fd1dc8e77fdc07df60e7e46de8dd73dac8a6d4edd495ede79e6792de1ad29cb882b904b322f1f5c91fdea681354fb55b7e0e0b91774dcc483bddf4cff77df60aebb841d610daeefcb827adee3a91d5f7133bd1e466c045e6fc150a70691757a3202a3a6635ed62ddc010103f15089f10c8c3c7dcbcb32a7c9de448f2da874672da5f9fd8ee3593df135b054053ad6ac979c8d6296bc4449292d1f359decfced08e042209ed347ebff9aee59b88fa519c3e15c81d0c80ddfb36eded579a3b0659ceda818cfaba1e18bd1a038a21feb883935dc65b5de4deec9915a4d3265f7f65e8e03752c4ba25a6011e6b81bb9bdffc20529d650687e2689d814c2e9e1cfe1e493e74b1c0344d3e14b447e0cb26b197b4f48e452de824e54318c2b8407e6521d096cf09b1c2e0d9e696f7c2a8aa3e9d227bb27a890f95803eb478cfc0b6c1a7385bc5805471d07ab444591ad8a26e65ad417ed5f6cff3841dfd80566ef471c6afa9cdad1cfb01a5e95d71a1d3b1f0cbdf5537671b15b43b3341","title":"26.删除排序数组中的重复项","link":"https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/","question_id":26,"issue_number":29},"27":{"day":27,"pres":null,"tags":["双指针","二分"],"whys":null,"difficulty":"- 简单","description":"给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。\n\n你可以假设数组中无重复元素。\n\n```\n示例 1:\n\n输入: [1,3,5,6], 5\n输出: 2\n示例 2:\n\n输入: [1,3,5,6], 2\n输出: 1\n示例 3:\n\n输入: [1,3,5,6], 7\n输出: 4\n示例 4:\n\n输入: [1,3,5,6], 0\n输出: 0\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f20910a3d438573096d622133746935bde07f4e89a717775081d103e7bd46ab345588da2612d4a92ff52ab5a7fe2fbe3d6568d4c4d3fc0b2fc7a89ad24e7a36f67e8ed9a8028d31ab3183f7acbf844d2bc0070bdfd86d69b4e2ba2331213a8e30c3ddea20999130a73650996cde69f0ab0d2967654c5e7dad719f4df301b44274069f7e241b7bcfd82079f082f21c777422146bd8e02b4566ebf9906c114431a9c1f17b0105629a2aeb5f7df6042a598d7efe6060c555d1916a018f6b3672a21dcc46472cbb85007282ca013271bfa2aedd3c94fb4de0800f4b92a2a1c6f888b18d14374bf9ac8228b231331702abc84486928d9a53b94c7b7d0ecd7c5875c8dbb408fd26804a9bfac62b9e8860bf5112ed60e606226746865d160ecec6cc200c7330f4b569afcc608472d74c22a0790f8df5a48297e51fa271c2c8da4162456814bb8288d57ba0c46010f39a1bdaffade83dfeb712896b0dd1855776999534b9ad2cc719177d5852ce3eb2cfdd102ee60e240847b3a74934a07066b2772bd8773594febb1ae1852c7ecb31287807a38840425d31893fd6e32f1bb9fbd041c8a5e8e1a269df017c3127ed7e0edd99e470afa0bc08c7376dfd5a6f2c25557771e822d7998287e1f551d59779032e9164be2b3f5ac7e742fb9e8f3e13437785c5e68c7ee4c865f5e54ba05a9a91709a9d5f48216fc906c051c34493efe2947117c3a2d09e446eb12f268493abbbdcf8ca5f97e0d2efb08a3f574bcc98ddeb37402d4a0754d00ccad02a7c0d02a76e35275f3bb69af8c9ea7e6a1d7ac177a9a4b21b1edc1345ae4f536190c616ce44259fd43ede0c09771861233da87203f599783bb1f3b1bfdf86b2b4049e4a782a141c2364a51bae3b39fb7e6326ed135d6a6adfb5f97cd46ee04e860573f8d0e0bb0cee0daa78c7e769f68d9bb80dddfabe78b87f9d4594cae10ab60c870117fb5641b5289083e0155aa9d4555bf1fc222c3815096a5ace6ab54d42ffd283d70ccea36a49cfa98da7565dd899b4938900ce00d3945ea31f528fb9445cdd3021893dead2b3f9ac00fc0aab6a8583f36ebdbb4247d68f2fcb7e6540258fa459128d2d798b1176622ce669e5079c7cad2bc93a1a8a94902e5515dcd6f78b71420e617046483a4456ff9a99255e64b6c68602de9cdcd2a7d02c70f5f23156dd2ee744cbff8dcccce5e4d793768e4c5f0bed48909ca995a5e3fc822b967f8130c30322d476aea73757e49a496789647d45b4eb92172f5c0b9b8cc4291c15263a1d22345169f53c35a0c136ac0b90bd334aef0c0847d90becbf5f0c4d56619e4abff228bf77d2cf44ba5f00ddfad865216a48377d4969188adc6f76385f5b857b96963dfc39773040fd603a50484ab8f33160ef4b5fad7e6d75b59fce767ab2e31c06dda16b0856048bbc6a34a807f747fe25a226edcad8c54798f0025fc154b82056b9d0c426909c239fe2672fb6d878389dcbbce14f4767731c1d1afe0bc4e76324c28757fd3f485cd2ab6cdb687215316fa48b074997a46e46795c8f1f3b8f9bed78a0b7b4af0b1d72b5db1915f98874cb2573f7427348a3007a3dfec183e2794907d66eaa18250649dac9badc3bd3bde6157a5c50dd1bd73c7a3a3ae7f43cb183d039370e0a79abb91677b124c2dc1e755a3d100807f5d11642185a28b8c8b00dc598217ca79702ae0d2070748aa702cc5e02f25adab40da16b2e2a6ba670fc2af7a3a94f16bd043b9ffb8cf8ddd6712df8059d44eceaf2826e3b199e3b6e58d22dc2deda0b25bbcb0178ea970accf4f34e2a897f1d22241d94a29cc547463a044c0025772aa6183c8248b62a5c1738f9ebc8640f667216a6a4a5451707cdfc9005e36ffe7b1340f9def3fecabff972c8afd51b8524d314c84cfb0711a5ade2c5a8f81263bf21b6dfc54dfb92a818d3fb083dba7ec777629d5f628f5999c6e74a15964a20edd18688ec52e611ed19fb579afd4c6cc6d8d79c941423e9db76ae7683c6c11e48448b88ea623fb97dd6f19007b0ecc22faa8609946ca7cb6591fffa3e6ed574501e2ecc6db7a73255ca0dc04bf66a0636e53a6bd59fe2e19de8576927f0c69645512f061e4a97d11136bb09bccc96a0203d5e2087674f81da9659d20453e6afb7543663d710b3758a330f178e2e0bea56d6c2670bbbf7429a6e07df46c7bbce97c00b021b8d71c717d3cd704f2583021a3c236e67454e218b7c92a0d961fff93dd23df91c717e4d733355faf4fc5e088de2e70ed19b8535178a1700af323f2b1af16cd45133cb1d209c6777f56a14b6cfb11b061625791aa8bd08ea9e6914d5f91c58a156982c4f24272b1aa1108fb662a2d4e3931cf91dbc7c2a5f967ed468c47cee307880666320accfbc479e61d6aff4f818f96ceb967c2e268e70cc0433462bdb2120adae635ec597e59813875db8c06b3c282f75b866d1d01e31ce4756be9415abdb0b3371138886a30ef07b34d8d4c9114277d09e0d2435c61ce120c68a94e70a49d50d832a13e7a0706dba17f1a3ec373f5df1674c966e7e0008ea19c79bc5335f0adb75035542265a6e8d9b1420e5876fdf93986ed603a422a5cb4eb9f246c41e19c4dbc9d0c87998e08fe30563fd93803bc5dfe26ed1cc6576fe23e26e00e7a0564652f23440fd7ff062642d2c4022537bea04230b32d1da7af4f7b9ba9a825fb0bb9ceddbc76a46b9c9b6edae5f861354099e56669a3a0417b4fef44197d83a1438c0f9e91ec9970d6330f19a707654b32303f53206497d390c4684918b8961ee1357b9ca892a7c223d537f4ef97ac6ac3d569e94d08e6f991b38cdabd0e0f9d0ea666321a3b7411c1acbfb36d863be080df3363f7e4c8ccfafc4f23cf58141c115f139d769d977ad5763511b71e1aef7c7872ad342f0be31d7d2447f004eb76cbc803cbd301456813dd2167d8cc5bf8c4a267bdda22a3004e823b1a6cab2bdfe2e5355401f298189a182a53860cb22c8232cd99a8cb3610aa7fca396f39ff9d7b1fb0bc86ea726b74ceca972301fc4f58580f8a3e860e88e18304465b88e29cd262daf35d317d73fe6f10d90f373ba3e17b9d9895dce8dc4805b404ffa32ba4aa4861c8640bb01ab880e89c81d8988a6eaf2a5cad5ce8669ffd63e94a2b080be3cad62a6b684538adff95f4096423e0734ec015df30e088eb6dc9e34994381f500c66d9583b6c970c18d5bcafe942827ec806f8764ff8f06365148156a99676d7d167ea109aea94379713748e650d18bbdabd6ea7f23f7b20bbfa8cb0539e34194f3b26ca8954012086d73f64ff84dccb35020d629f1e7829a3d9995a29afb140b7dd2395e98c1f0f6ffcaab3aa1020bf2282cb1849f44bd942ff02e7714d783fbeb8ce36f0ae8494a8448a6fdcaf91285490aabb188f846cdb75f081558eaea0b4df19248f1424050b889f5e2e56b08f21673d78b21cac80f46f41ebc62326720edb278085666d005f2c135a68b8face74040bb49ae0c02ef9c0b1d03487f4818b86236670e121b1c2a2261f4ef6041e9ac0bd8d7dd57398f1c6f493c04c2a86151a2ec23b5c927dbca38329d96248d905d07184c66d3f7f14018af7ddcc2ca656dec6bcc234596b3147a02583538185a07154ac85656332e1d3e107b4a4b16bf3349f7579eecab48bbbdc6de3f18e31dc6fb708acff98ea202e7becf555b7b0397f5ff151fc764c8126bdcc6c91faaaa9a36d076fa4a07bb0a29c48851386cac5e728f583521c78d5f1bfe09683c4a826dd66c19991c5c788b100a8bb8b0f5b7b5ebc8dc14e118d93c70554a9008dd5bd739132c7430d5c1bd760fe8e75171063aa80da84624b1562163a69f37cefabad49b88b799956bb64f2f15df6466fab0503985caaccbecf183a90dab64035eb62056ecbbdc9cf8e5a2d48b0c647726ae555555492da2b63d52ce8e929e4af334d61b6fc755fc341797452c9dcf112988d3e3a84db0018db264b792620776742fb8a5dc5eae1e653422d5ea1ee524fa2e23f422b8a1d9c00418d63d35901f0dc7c3806cf3da172dff3afad8bf9f31acabfba06ee9df3f427547963ce3318263a1fce12d5f476590f25476933893481b2a7745534a48b4b790b4dc8b95daca672bb57516ddc22690667112cea55adab6031ffa01f2a87eb1510c8ed58a99adacfb47472702851f1ac518f53285274baa413885ad490b0794db9bcca7abf490314344403dfc693219f6590b20351b41b593d1f3aa179315909b23db5c508f6d6795c1f4ac0dd851c9f43c3d507200b22a33f5e0a8f1f477898d567ce8241159a2f38e5ed048ed55c96a8664b7cd26648b6c0ea2c3c87ed861d6dc7e066e195a0795b322dffa88c2b89cd3c9a779326c9070ce47b2b3f648840a5ec3aef13021da0e041bf0503f042d7b220f15594b87ea81aac14255dcb46487746fc59643ba954936d3f8b392c1c0b2080aa6ffc058545c26b5bdca0d1d1c0ae638cce0b45ae5366ecc53e2bf407c2b61a760cbe4db2d9cba03faa9faaff7817ea428a63ba904f835b101ece0f7eed1f9b9661921f11e584a40e6505a3e9f84dfde5cbf2ffa6a0d4f1788ab3d0466225cf78e9a11cfe2d118c31ea08f99404e304235e3d0694df7080864e900b9d26c7af9e8a6cf44f89149edad68c889253fe48c4f14a649a9e853c400b7e48faaba7b5d6f11dafe76bfa40f7beda124ae059c3f19526d2fbccdec391c9fe7c0126df13b9c84f29b62f1ad379843e477e468a0a22bee3c78ace420b8866e6d9d33ee4820ed42b1ac1d29f29eef71d0a7f130f3cf635d647109c66556de22e223a049ece663e8adb682f27ad4507d620183cec40308ea84c5054dc807a26a316e6e4906e0c669627fc4f467290c6638d5c16efac6b357c2bc9484e3be2cb8964ac96815a9a83012752d367615636f8c7d7c125f94e2255f885730b8329eaee1ad8d0a1daec36998a901537585cab0066040a40940d8e47810ce573017080e5d1230681a96cc1387ef7e7ca97d5bebc7d1dbb6bf5791b86e007572e406023cc3349e9df9e738af00974b49d55ff3933f8c82ff72e1e3df125a06479b2c007f471f543c6daa217be26c85497c374287e2fed21875412c7e8d527023d3c759bef846bfac7561f95b0c2021620e76556e4af1feb958da10bd573c905194a833eeb9bd89fdda7d508481d288604666c3ecb2d93b4997a33435b2230e3cfbf5439a75bd1328c7d7d06984782768b975e6c63df70cd99d5021cfedaaf48ceb93015d0af101b7f8f4d51f443ca6a16f3dc624a189c2e3c1fddaf69cf63a0f08250cba2ec485268d1b4ba2ca6b082dae719781cfe1b577bbad982f2f12b80df76d51e6140afdeaf7048590bb45990f04a6fbd140fd9c703af9d86691e37d347da6a1bc50353478533c91e03f74c95c22bf1545bdf1f36dff6c951189255cef9eb84a4acbff5df0d1ab77d572085e11af2fbdc883c70dc90a246c897e7810cb41556d4eeafe2eb10c27409dce93d8bdd49a3036190a448626c9e009256e17c90459161bd8832fd15bcdc10d4770888f19c59be471a86cad442c75072a4090c403e4afa4c8f94c307e66b3f42871f7595dcecd49b1e1a26c28a14a5282a0b8e9800194b162878b4f5edc8628ca25f63f8d05b082cf0159314e6554549629fbeb6e08bc221c4fad387c4570bf53dbdef3a9dbbf43f4944ff87cf1dc25207fa6c3b1a76477115d16af339f9fa52369446063151ce0ac3826c68f7ee4c4cb2a4d30aa16453b83d2629d91ca177200bc25920f9845b9996627b7948a8f3510e994fcdbf7085380f1a09d15932a331ceca61b96d6a39a70895e502a9596392d1d7869f28694d950c942dee5738b7e6e4c2181fcaf894c4e79732508521fb7b76ddb5514f74c12841c297f8a7f2b7c24880111ac8cfff83c5459001d401943142ad7c91ad7a1b66b325beba65ec94155545ae9e2e5e0f80fd81aefaf961cf4204531e1446d166abd2dd0748e3b44ee6049c62ab3a355543200d8b913fa608b145db9494ac676d215aed553d90011556e576a391a7fac30ec77a033981b22521bf57041c67117ad19b190e05e670789adb5e98cf0039862f7c98706882b812aa51f370978c3b4a3c5f267dd3cb6973fa06948bae27adf7ad6f5ab7d347b7cd7041f0ee5530fbf46c7997fc46e06ef12c1fd041a3bb687bfc7892f37e0e83c8373a7ccd4437eaee7f938562edefd95a31e98f1b90427d612061a013fd83e62b09569a1429508f802fb7fab007083603d9ca0fafbb5edb676b88801ac816b866fc82b13e28b478e376434d862b238b82d1769843b1ed37d29534e0c38401fb5491470a4fde29bc500b02001fb63f120016a1ee13d4b112aaa1edce20e5a152a624d90df105c1ced51293cbba757b170e6234c4f5399780224358b9e72035734d39896ca1c8bc97d6ddc70d11fc2e63e1310f458e6529d4e3a16efa7632fc5d476cfa151f4184e22717afb8d593f5fbbe3803d8b176c6e4ecc0ef9c3e93f762a74825ecd36aa3ad0c49de36ef891cc367cc058a861f65a72f7d7983c034f5186a8487cd3d5d9ce3dcaa387d96be984cb30f24da7db18e996b9e2aeb5b96411f16f2319faa0c1371fb6c6f436831b0a7a2adeed3fbe2ff08b1075d62096b1c7d133ec5c0c68a5e5ebb033eb1845f8737909efa4c8abcbd7693e452282e0c24f7355ce22c2c402e0e3b245f3c864852ed534d950768306ec72b3ce58f66ac5b73be855b85acfc1d5a287df3adb440787ef8d3614df689ec528cc8524b35dbbbb2d123e8f64863a789bf5b724c7c90acff80ecea78eb0cd9f21b43cf33eda6c40946c44d7ea000835e8f4b695bdca12e1c8d990c35aebef1d125d08e3c975f2cdfc6bdda28cdeb01d68489a8ca2d048d32ae0177362365d33135a5a12452cac81cd2673c0ba3e5e9b308ea629c3f864b3e08a8040c5ac7641f74221c8d7c05c04cf0843d60877a05509c04864e07802eb97ec86b6e8666b27f1e1aab7fd9640c697c70d93b01e9f05174f5eb3d725e7b321b8e10ae2af2004133836a5dc0c9a9bf1c8b637a98f7749b9fc616fcf7661f57ae12c9fdf0c2c4be6eb841c6be3a7d6b6f1c26a158f1131cfc353bcab5a8f2aecb15fd273ba6ee646535b8db9f478ed98e5cab8dff753e695cbc638caa3ffa147b18d183e479a96887d7328f5adb6582d2f2eaa984d5e5163c67cb0ede5b018762b48299ff32fcc7437fe789910cfcb278fe555f2690113086140b3c51537b917b5ea9abadc6d869763b78625770b58a1442c13beb36bf3bd61480677ab063165d3ebadfda59ab0d111cfe14c3b1919472ae7814a602350c66431d2902dbeee82781e7636dc9bd16e876d934c2467988cf096bcda854c0b6cc55257c048330e13956aba195436abab321e38feccd3c82ae3276ef92e28ee6f8d510660e09a5b6a8fe8a6dee96d8dc0a0a5c7dcdbe5252845e04542b06e037e7679c8a9220cdcf9fa8aeea48227341314e70a817d3bcfcd4e9bcd1c99ae78913e8476afc18947b87be539e681a0435d76427e213c342f1c3c86664be2913173288dd8586e589f53401afaf41bc06f867cbac90c0ea250df38369b53ce500e43cce27a7dbd7fb36766c5c8508acfd0b4e89822cbf75deda3e52e775091473be3c2dd60a17cfa8e0e26fcdb68320bf5c4ef0b730593fd0aebc9f4370533f66e043b0e7c930e17526b45f772a6b028656a079d52e3430007220cbc4ff851206c06bc4a1556599c17140d326f01c10ee9c441b70f504a84b9fc0b186360144ca79e88a9d9b721206fadbfb020b36ff325152599312ad22784e67d3775499bbb86ad3d01ed38aaf76933f5f92fe5d5a60f63dd9b8c915710fab0a1e5be282ed25e6d7be2d0adb35a3abc71267bc948b0f8b16d23571ae0c884f38d338472c31218ff15dbbf5ecb1e6f922efa4144701defc09105f402bdd5903671960f07336fea520fa489f91211da87e0e13a406285fcffa82f4c1d1a0b9fcf49c50283a830bdedbe41edd44b957bbd73f190d37aa0dcfed7a517ff5aba30659d00af5312688436c3476167ccf7de9264b064577f5f95e7d96afc36fed3a942076eefecd58d84b805e1e3ffd8e3cb072df178a7db6733a363247adcb34974f10edcba9335911bb5eb4b99479c465cef58647207c86d66e3b525b0fd1fb7b27386bed3a6a8cf6bc21e7deb34becd16bbcbeaaf0a98336c25516636f844ec8821d019e95f418f1e1e353e60dcc2bfb4f6aff38a3c98567e4b57ba601a2cc9517d002d9cc29e0a290bf8f7654012763cae32a652d1673fffd7f67ddecced25c64017ed2e01885080b22da1a13f9736a953f18ce1821ec68e33e47016a0e6035054f71ae4e83771c583d6b300c27773f4efce6154ba121dd35dd3994d940d565e35406033c698f29cd98fbf15231a25d243535465f543f85b943b81f4508d4aef748e3fd2a2da53c3cb0b7cf2bdd1a8042a66b3a62e1664c9e06d226aaee8baa6329a832189e6044fc2d2f48493feb96a2ad3218839d26f0dc6271d534a0b3bec904e0b87e89188c06ff3115d4b2c46720ab8610d6a2b680e34722f9f4175821a989a7adeee6ac0e2a1497a14e0a10d7e77fb7a6bffe4578ace8cfd9849eb3e5430aa4fc6664c7b5588f4d4c6d01c711c3c81d381044b7013ffc73826ba7e6b987d6f37b4fe88d8a29a3ef8d468b8ca213ad53ab1df32cec2720a833426b0c9beab6be58bda987ed460543620426ec36f489aff641dbe60041335b5627b5b145bcb4601dc18459c851ab18615fdc831cf9f2559a830bbb1a72ee404f5382fb1f86ccb08a9df896276084357ddd748d035d5884e27e064a43d1ba6898aeaac60378c49c68f64475f20170003ce1411aa1be0e2c00aacd776f28d9f910614a04541a26d80def70c3baa21db5e999709804d2dd20ade2b14944adfb69cb91419e6e80cb1e2501c09dee6c186919cddbabc9391b19f4b67ce7854ce46d78a36e3d98a5723c93719e72678de6a4a69bf96920116fac01a3321910814e40004ca3b9c0e0de74dc29294d03c8d67bdf9365271b175d91b126ac632dc850f8a98c930137be7e6cfaf1ceaa749a06e1dcfa446c176c03a99db7c1d587a785a3e6612e1e65d15edd72c8326a5f568f2685410413b4eff48913b94bcae75505413b1959703fd29d6dfe7de89388585ad50fbe807777bd43004657561787e9b073bf8abcba9adc0f1e99ab99d8f325801a535806df22744158fef2564538cf5793a0d7fec972664e5ff76a4945ae435a4b94fe0f61334a38060f81e99a91c352944f7dd381a2e243d7c982cf86d39fb28b2defd64c348563bd23870d048d2200fc55dde8babd1e4dde377ca25deb20c9f5bd69078ba1e13a0fc06fe1c25fc03b09478b0f42372160e6384a847fc1d5508806c25411a016e759e8de5a839e9aa5b9a0501fbe6f1d4d2039c7ad33f7d326930c0cc2b6cd4196b90296172dcb52c970c4fe3cd6f35405556747b6900db6b656fd17a7e3f44cc4b5d626a0a1d574daeb1e2578258e6f18a67b53d8b3e46d348f0b858a8ea970a4bdb0aceb6d453277406989952ae4a9f519c90004b585983fc4d5f2e31c5c94d37ba7f9114a706863f69fc893ff909a974eea0baeb63787bc583a4146dae555406707a8dfe44d4b07be2eac6c18e29253cdc861f91abadd6a9870de1e065aad04804cd13a91bfc19aab4492e2e650316b829e59e96dd02fce3f736dc60e411988ee03728a56cdc04c580ca8212bbbcdbb6bb66e12278ef755f40d3a6a3413400b37167ff90adc0bdf08471229b54eefce8302842d9fc15df90fa44783b9fab562331fbf1165fd43f11bae278a4a91ed98971bed8c5727565951d490dc3854fdf91d9b73bee72022f95c7d7e15f391033764cb0442b76243a21d761dccb6e510d3698666eba822818a4dce7f33804101ddb896905c6607e2aa2d46c75f120d120bd","title":"35. 搜索插入位置","link":"https://leetcode-cn.com/problems/search-insert-position","question_id":35,"issue_number":30},"28":{"day":28,"pres":["队列","滑动窗口"],"tags":["双指针","滑动窗口"],"whys":null,"difficulty":"- 困难","description":"```\n给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。\n\n返回滑动窗口中的最大值。\n\n \n\n进阶:\n\n你能在线性时间复杂度内解决此题吗?\n\n \n\n示例:\n\n输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3\n输出: [3,3,5,5,6,7]\n解释:\n\n 滑动窗口的位置 最大值\n--------------- -----\n[1 3 -1] -3 5 3 6 7 3\n 1 [3 -1 -3] 5 3 6 7 3\n 1 3 [-1 -3 5] 3 6 7 5\n 1 3 -1 [-3 5 3] 6 7 5\n 1 3 -1 -3 [5 3 6] 7 6\n 1 3 -1 -3 5 [3 6 7] 7\n \n\n提示:\n\n1 <= nums.length <= 10^5\n-10^4 <= nums[i] <= 10^4\n1 <= k <= nums.length\n\n```","content":"096221cf5b628be1e73e8bcfe626c73477842a8a04fb1e840a6471276d2b030313fe984226cabd5c185021d103e7bd46ab345588da2612d4a92ff52ab5a7fe2fbe3d6568d4c4d3fc0b2fc7a89ad24e733ee0748893ec1b973abd2ad9aaaead95502fda042edff16d6a71829a6f582854f926a2aecf9b99aa2fa9f20e9c059c4c91da30453b7529336bcc29ab289b2adf294254e8684b4c6aa4a41f0cad88bd5c500476202da5eb4a22707af992711c5e3aa7ccee78121863ab25eb6f76f4103e528b7efe7346cb47ee9174148e431c70a92acf5c592dbeb70b768ec60c249d201868715fd0c030aaa481a83d21a3eef94e6356a2fbc9c1af8227931e33270caafa7c84b3ae75d40f80e71871d73e077d743521a8fd13aa4ba7c52aa82e4ecdf71619acf142c38ec848996afba910aca607cb2d269dfd7fcc9d72e8c0508a53aa12518153c0fdd9b5d0f7679ab1e903d0cfa18cf6c9ac971385418e8b6a785213a5ea94099cde26f0313773681a5ae5ff39c7f21aa1681f300558bb418ca6a7057bb613445372d8e44a51ce6029dd5c63ab6755cafae06fd9ef556286580e2c5ebfef2478146aa064bcc17a738db18d44a8dce3b8c565b6786d6174c30f61eee0ab62fcc8ab4fa40e1f845ecda241777557de23d987818af1f351eb957a1f2eb654bc1d005bf2ca42c1a18e2936424082cfca9173d4ef67c9c04b84719b99769a9c484303462580a107f61bedcb8bc96f60ac8f92d3490fda314fdb83e2c2d89c5cd596f9d5efbf99386c6c231398a393f423602c5af33ec1d41d909046f34950414653cfb79c94e138093a1e5ccb205366f45df54f3c9221c9f64f4a99ce5d159fd7280281f6af96caea9813abe246b347f3f94728bdfc866c2abdaea7d6784e314d23a013b45f467eb3d0fe48ed566602c2b4fb7ccc71fa2686166dc4146975c5495202d4d686ae6f174c0c6e435a61f508ad038d4263771ca37b830112fb5430899d1b003e98382d4dbafc6b20b989d778053714e7041ada9f6f5c8fd412cc9b6153cfd29cab4551cd95a2ee8500de2a1bcc51c67d4c127cf4eab77d6cae1ae4dcbe321b9934ad1da11b36d944beb84147102f9203e9ea6a0f4631f4d90c86cb3bbcb3df8a20da4ebe04ef789e59e8812e480c82869a47075e15b6ce82a5e8f5a6a2df93000e5dbffdb23b6f4f8b0d9c9d93f5846924e3358be5188e7b81666c487069265575b94f8d34511a29d31e4829349ab4380aa851e920f6608ce478d7613b8d28bdb07227c937371693acd33e221c4edacb8761662675694f76234c69b3697be3956ac94581b57d0ca25f09568d4ab3eb1a2351563aa74abfa21aed60da8301ee5f49ddf1f2752b6a012461492a5cc78f6c297d1109d1489e9674e1327e2766d7603a504803e9d9dbae902cca7987d7f1314d529811cab5594ec9a17e771b5785f02f7abd16eb12b076a27ee69ecdef4a89bd564b23898e3d56a5c0dd20b99b5e33373661b8852d08ceb5e5fa79077c12bedd46c92180b8ebf3610daf11bd86923d298a5d96e83538468e8a35605077e0455e4381250d622a44b1dc90cef0258072b5db1939de8469d7277ded4161694cb0ff24fe004966f2ef9bd649a7df65241fa4fad3729b15c8e14e2854c5f712b8f3d2adfb575815bf83d12e2c03087dabb91677b2e2bee8661776981021c06e4f147a2f56219c27177488bc4a03b1ff5bb94d6c4c00fdbd618e5375aa6d91fc11cd00096d109f11b40299fba72e66ad787284aae1febbb950688318cf06dc8995ab097825d5645d31ae2cbe94f86f79b9418fcd8be81daba0de2746a8265f1243768bd0ffce1b3b327e343b77352dff773ced2d92a2b06033b08ef618524e20498ed5fc794374d3b6e43fb239c53b4a649d82f1b388b88d04c3e08928fa66de539b67985d32c2eccc80fce1420aac53e8e4b010dbdef405a2be3b7bcc6ca82e4ade0259d5309591b87f5ec9504776518989f250e824e227d7579de84272d8d8d185941117e2dd6a47fc61ac44d2b9a8736160bceb35bd01395cf138211ca3506ec469982d22cd552f64fb9563b0c8fda735be250ec0d7268812d721d3809c21a6975c6d4c2d4805c6c8d43f47297f60e9e7af92115d9bff4c9d29391776c7ad8eaa4eff89536d4b9779919c21297ef48cab47b877a050adcaf839f8d869842142aae6312c8c0bcf4fa35996d7c7cfa70e496ab523931589b77c24789c9692dffefbf2201124e422bac5897b914fa2a97582a4d1a619e0f7842567460e4fc4b9ae06105164a1805e829f34e487809511a012b09244f3d00a88cd3fe1de363d60704f52283305e3ae41fd836e3b9ae8534aec5e8b396723106a1fac0f84fc50afd3f39319fe50e6743d1ac2389d31e736a72241c514036fe5b5af7f9371bfb8e6dd35836cfc8d702817e409846f5c6c71976c2aa480787dd8d4fa910edd1f91a17e177b551369bc1853eac25cbba4094fc60a16d492b2a0144f5ba9159cfd32085cf0bdc72c4b003b39f106b91bdf8aafe32b4fdb16c01d45fab5c0db509d784d6bf8d6df3dacea6ea9dbaac839f2292a57dccbf117c394f3e4df9be7307a85ab7c10b4171675a55efc7697241739bcb9f90bd655e4b8d297ee0a1319696fc4b852597c9d0b2634866465f39e2cf517cacc369a716f77c33106876cb5397738324d0b257bef385b1100eae175ffde8b8ab8957aa787e2fbdbe35a2bfef387c5bb67f9005d0eb00d2a91521759b5acea0f88e0294049b4e0c722fc940e6336c0cf0a1a0eb927459d7607193e751714e0c1a0ba34fb2e2fd8c4f86f1d331f637009c10795f0546ed5d3b9eb1e933613ddbbb9e8ddcdce0b443481c7651d2eefcc34cc25ee5225e54d6b2e3b9ddeec8ebd27cab262de228902c575a134a3146d631421bc7913000ed706c53a5dbf291ef6bdc2c169d71378c231d285c54fdf5cafcee4a2cdc6266fd555608afcb5b87a1c6e203b5f06a990cbcef0c6027159fa8e6253db1f96052ba4d6d7c9646eb6f89e9a506029a7e1cc25de66b97ea94ef0e55b3355efef8f8dd8fbc65ecf8d26326928dfe91ad1040d916ce621bd27e9d3269aba069f615585ead034c78dc392672e4ed405fd00c89e00c507df60a1ab3fe8d53f85c8ffcda8c9dba8b1cd3492ae4e81869686a45e824dbfb29d57deab817e4ee7462c55478b2c2e821c11ddb88aa37db55fb9ba5ed4779bb695f654e1a77e91ddb02a3dcba067c200fbb3580b393d0b09ed693a1b4c7ee479f7c010103f0b41cc4c988b9484b8f06f0494ff62f2dada6c728d4593c0fe678fdf5d1e1a1e37f83fb61edd8a7d02900ddddcd1be1886a680a3c2042040ed2644a5cca6d7cc81a9049f38549b350abc95853aeda819de320602e4da81c0bfee1e55b042088a21e2fbcdd514881209bdc5c69915e29c745f7767f8f9646088da25e855116c98f3e0c4811652d82b429ce221968a452ec564fe15543e28da9834503e79f513a8972ea49aeef4db447e986d896558cfb9325d740115123fe50c60770634060d2a6e59cfcf337bc59452cbd5e41400b9014e4c1f73b9d526758bf41aa5ca26d0e3642895b03b96d3600421634ad2a8ce482bfc3fcfabc74f62867ff7695f959523275d72261001732c2315f6777b2d4e7e11505a532441be1e7bf441b3c3a858d3d8dead5b1af827bb9a2af9abf4909c32fda0ec726d2845f49fac5468d228b949348fcfda6bfec5c3459a49e57308841e44e59c326f25e839049b1c501dd49c381fa71b5f5903eb37bb3674c075495e940110ca86eb96a4e6e6c6f655c352a6490f3f3bcc37f43ad03b173c6f4f85a9af634499aa053f6f70e744c1061baf222d49bda00ae3a19ed8a9d6ba81aa748e574a51b0660fbbdf354ec4a7c2b99ee5c3f76ed2291a07cc4720b584d0a1bbdea5ba9130403b2e834f12362f440d7ad3da197a1316847ae507afb5354dae487e1ab7bef4c87cb77d134847b02df76017b2421aba93494e50f5053f8910f1e498ec3765db248b70eb74826f93def98f7460ec7373c27c4e69034de20003a4f0289b212f0376e0f1d287a53681a16c213327ff7164a3317c107215fe809cc53e24dbbb3651d1c9ead8d38b96f7a774326f537179480019aaae6bd9c30722916186f1f93c18951c32ead949843926935c132e9fd0f9235b524487b8f5f378b5e737cd26d33eee8a2496d52842afdfc0486c7b5b367d3023d3becb8bce509ed385208ca1d3e1949f703d263936cf47be3b619d3cbbd7359fea61045879d25caa1f46eef4d49ae521fff222140f7147a7efe41e15bd679a8b537850b8ec0b62aa23d54fa33a00e0c65eacaa611177a129ef2a24e388bfb887f01d1bf34c10581e47505c0877d5c7b90fb71ced527a6a9d4da5a93e3a2dfcb60ad3d1b62bd7accb6bd0f7de9a91b9230857263ebce91349ee65a1f00a42cb545ef0fc14754824432f69ddfd5b460393681fa744486ccdc4cddf1dbb1e0912bf3489e60fc00b7ceda0dfe97aaf4d3628fc7e5c8f384b5d70242a8e68b858de048e0f41831546103af4b6656aa6bed42c8eb6b609fefd8ef14a63327eaa538a1488a181d85d70e180ade3ec273232f52a3227f16bfc50354997e3e584bb3f3db68f3780f6a247c0415eaae9858612068a5a4aad4344a54177cfbf1b1fd0d751f02100f03dcd302916354880d78ce0502c890319dff7316c8a7edc4bd5c5d793e7e68562efda185a2e81b00f95005a7a70b84d69dc14ab00d81eb5187ad251c48f0e2ab325508be24788439cf171987d08e3d1547018f61a4161d302971248147556f01c46894adb54e9e3001ced1f591e583df439bdfaa0f00e29009ecd0d5203ffc346ef008092f2a3868b156ac59799661dc496eaacb4232fca061728af191e5740414fdc357db257acdb1844d173317877120cfe9d45f5b5f21dd075d5b826c6fe0d92030507751af8ed83db5293d42b6642ac9491791e20e0795388df6369f775003bd3f8946f5d473e95d33da5cf0c43884640ccde96aa89b46398bd6e04682cea2e1f03f329b9f981e269867bc06f428872f5ab25f4c3f45bd3d2e34b7d0063da741f73007d720f4fa7380aab5fd60b6f5e0be8ab94d21c122f286a993b3e579e9c5ab6d33080b26645e76c7a06006e5b7a4b2d1e85e8c011e804c473138279ced96782cad780e3c94149b8c2ca835f132bd8aebdb0216f848f774fa47343528c9308f33cea5a6a8ace9256a65f3963d149c7d32fce08c895605beff394bbeb94f4481e43a648ce8f9ac55e616ceee508719066eae3f5f2dececfd99ecb38510672019623ce9e51d7301c9fd64e0f44fe179380ffadc65c919e910174548f50fb213cbf2c52aba9be6d93f9f25b86282c8da2ff53fd80590cd69e75a7d129094fe1f5c67420383a6a138aa30448d65117ef187586ebff7ca82c961cb41519839e9d5d60fdc30ce5e9e02cf67a0a5532ee7381d8d4eb16ae4a472ed96c1258a025303a23e5e63bdc700f57a5adbb81cea0ff785f346b0de80cd7fd6e207c10f727491d6e83fe6e9c3cdabd4f0c1adaf509abcda616b1358d48633412365b89da2199efc8b68e16194052e6bc5f338828109a8338a3f8f12e3bc8133bc8eff1d19c299c8667a0992a73e0983acd57b37ccc188985a1620961360f30168471ada82761aa4b0808bc5526373dc61eb6979fcab1fe34cdbe59817ff0df2f7b1bfc9a88ce2d1858345cc054fa8ac844524909220b55bad65e2fcec449a88ca349297186780a7fe6bc34dff6d34e1b4af36cd61dd047b8ad46228ff9a1db0860d6c8daf9c4571fec96edf5728a735a56a3ef5f849ef3de4ad6173c49ff86405573773595f0809d35bb0a9de169bb4701143690e7c682254d56775c367219a5ac7fc1443fc51800dc342032eb7040125cfa5b50dbfeb3896802584206601e785d099e967da1f0f77b5b1482ba69d2570b5421c0d3f7b581149b4adfb6c95d8d36377d9056744528ae44991bc7524fd15653d53ac7c70f6f3e04c48c309a378f382fbc36368a2c9305c483109472003c25393c7b7d66f559f47dbd0f9020786e39dc6c74cb036ec454d7daf9136b55b3f1edd196b61fb46de5eeac00df69fd43ac3661306887be95c9cc27a702809206974a49b7b51c940bc4ecbc7a611278f9150611ed6002be45d79468fa591aae2de7db095429ed9e84f3f5751ab9d13a822a87ceeb2867bc94b33e5138b0b1d6fc7686f6a91d2a8a351b30526fbf2737cae31be901cf41e03dc215e07a08e9047f8eb9e2ebe1ffdd35f5cc58d6f920cf03ed0e0ba18f0bd708297fc056920be9170c6afd790dba34461a2746420d66a16e3576e0c5a584c938f31a04ec4e933a77727df92a615b088a299fe2441e49610b04c796543b05e766027e97b670e172d33958546a9a6c305b01e8ed0874267dbffbfc9923b3f13166b957c95df7be293d1fb35a935380484b4ae9a35c45a6821f81cb07b75324700b6a95db1b1003a3da9b7c8a3b774b0ff417d892cc7a1774539a65c70eae5e85fbf39c50bcf4a2603ea741f108bc153bc9c5a4612b0570a4d57c6e91c188e963f8d0f899378ef2df749124b1b25184ced4b8cbefd44835f953117dffa4f73f1c8ffeb029f0456b3345978475cc5a9eed6165ed09acf6d1c819e45e1b22cb9ab68844e33b3ccf35394afdde85d186ad2244640e85dcdd7b2356e7299dab3ac2eff526f0ad0dab29cb33a03d06ae22dd6b898032ab0d8cc2628151a309f1caf1b1b2f51ac1693692c39d315fdd56a0ff51a5c25e834f9db1191a46b666be2e53c8cea76cd6a16982a003d693898cfbb4768211d320f14d59b57d5388b365736ee6d890d6e2e52ed1c8fba7e347c5d52e0c5b20ecbc2d8ae9e54bfd9fd3f8b3553a44ac86a9b212e17089283c355b720314337f170440fbe8a5350c9fed51699329b0a862dfe217c7b3ad886d95835041f25510e5c9e77b34a8344bcb173d98120dfc627cf55c22d3da86fda8eb51164ab991de90bdb577d886ed0f97a02dcf6b6d2617a8db0baab372e78768ecc64771471e2eea9d01b7a1a2f1d26dfaf6082cbc911e1ad24a48ed66c123b88b360025b1d6fb50358ea6b7fa9ab1031697520ed1d061a18b5aff1aa9c42cbb65d323e75a113098e18501aa808ca3dd999330c8eca2a27390cfb5db11deba262879a199df1d5b24fece95433a3d129c835b676a20b60dd98b97c76a266f2f678ed329d93946d951cd2ce59460f1c794639588c6d4e2b66800acaf30a01e760a1e18f72a52cb1140b9cdc48a42d583d53428b97d48b1c1ffd86e8386ad5d7969645c2d361492232b23445f124d31091ac9a7a3f1ec13df4913ea3e4f448ddfe3942d011e9ce5629040b88064978d1f7239bb41572d8459d419a9153037c249cb720277abc87d5a31efede2a26aa36d2ff24502ad7ee6285560c190436a89efe9d1a765bceafdbeedcccee7434b0ceac98849a8ed99f2b10d24e3e4490218d4ecc7e6b7d4ea14e75f08b6ad0931900856ec1149a011f00b5cdee689810fed2c8e72446da89bc3aeeef6e920635d1dc97c4fadcb677a3caed50aec8550c8b98e3261ad2cf824b9204f160ea63f9e3d6b9f35a1155943144fdfae07dc7adfd90060e7a0ac59447e02cb207aa0407758e2e5a7668def224b1d9921fb74488c881f52f5f69358025784b5e54d7df13a0c78d686c800ab82a00e2ab541110f66456be22878afe6ac94289143e1c6a9a7816ab03ea1ece79a0d8cf1a2db539bd7ad99f5f13782205b8b03cb1508bfb8b20d1c71bc84e86f190b6f4a02e280cd8795fa65b06761c4faaa4bea00e6e26f25f5eab0cb4e533d0c8c9e5cb46c65e8f66a5ce6644e6382db1839041a98e16b1f3f2055c4ad68f1abc3593c111a9f9f1fb6b2fb0ae812f829ebc4ddf7190e7b2545a46bf634d09a11b1021ab359c7bc2fec07c090d4d4096856bf50c739525faadd5fad84f7f64297f440070cc4d67d23680ddd87fb052874132546d982a65a69e403be2a6dc5346f469a6c4f9516db29e82c6e51907b18784f62e23ed147ceef53df1be3cd488ef563e5a9f875317122a334fe91d7ee033901fb33e7392a68c284e42b745ff64115b029735c114324e8af4fbe27731a3beb6a5a008fa9467bb64788f29432cb0da8e844945896015ed2417c671f80513485b020a4947a99847ca7bdd8a1bda800d10a78f368c0d31ea780f0a40c997f6903517a27e55ea99872c20de4571b8b155037f3833c477c1b307b1a1ce36ecbf5f30e99a6a7e5498bd18ac06a553eb503313040c387a6e7aa7ddb298c66bf9032443481160c29ae31a59a42b0c61ed06f18a53153d21dc43f9e1d70684ab21e0e9e72a3ff2f38bd95a05edc5848f2a50c091b60c7359af215004cf5c97ca2de5fa72751c035979d92bba7effa61023537666a23b9ebbaca5b8da8c5ca32c21f821dc27f718478c864e646ee3c2708844831e2fc23446f138ce2c61f63e1f2a27f11e0fbae26305320ca4700981a32b9f551290205633a77f1d53caf36fe7cffc208ce8c968983832e1ca5c00f360f677ce736be868ff1aae6c437eef8c7e7b8fbb4acc515ab980ad27b5cde517c9c046c5389b690164db0dcb261fcaf280cd67a5857455a00ab15103ea34009ebfb94e724304c3119e4bf88c3254e11908edaa83849dda96e83f92ff6a6cd697f48392127913d5ff5565281fc55f0587f90b9c2b7b151b7ff61546c07e1087c4a18d841dbddbed9b3807480d67a3fe2e020cbcadfb612cd9495eadc358fe403f8c35442dc684d9d3018bc185bf9df0ff9091926c304c10ef6a84f1ce112f73f1e4fffddd3c3a9371ed800a93b53918a1fe858e6af736b160819a6e35ade2070f7e7fbafeec2c3798dca2eff680b78e53651b04a029f956950b151457ddb2c1668b5fe3ab01db4164fa660cfe8558d33d98235fd11162fb914dc5d68ca3c6696bce35e3802060941071f615d3f135bd3c70ae0de0be97b4dbd6c5d7bace67c80d716a8ee48d880f62dd654af933e58b1f59c14cfae09809f35ab7bd5b120b3434017088e02fb5f36b7bf956fc743ddaeca03b65b40af165f7394d5ce77f4495beb92c38c48b09d78178360cc06a92c14e0a772503c1cfb8dc2650d999d0c247b8e3a6226b269969581df80884ae0549e377b3af59fc8bf741106c504810e7a095059b8483915be636cc0f0d6fe1a156b75a5e09b10d3d32439446c3a52367235710b2af7ff9b62bf37fa5db98cf4656e9efd970779b6a6a1b96323e3e2157c8a400fb549bc205fca084cfedb5ff0749b954566c3baa0c3231db4d6d2457e2dd96c64f1e67dc6644e2d838d010d0c827d325bbb35ff80669a4a0b270f2119289f4eed2932ea54cd3458eb1cd8935f208c03acab39d8672ac73b09d9e58283ee505a8408fec2ea52fcb1f284bbffb32602a56fad6b26897bc0c97c3f6b6ade4ace77ce74336c24720925c6f334b2a51f8382d14170b623c4c06652a5f7ca88f3b58eed5cec412568d1e4c4908056e598ffd9cfb4fa880b5b6b9702dc0c284ce834b7379c8373933701d020780fddf06dce54101bcf8bb1a30f5dcf1dc649c05266da46cfb96070b98cebb2780cb0db2199798500a01be6956c74dd3ecf6ff94d355543d4bec34a473cb4a936df9def84bf221fd8215cc507144d2027f08ac45a5fd71d471b134d30df7d01e9687285ba60cd13b438830471d49debccaed31dcf6e595332926d2650ac15d85bd43039a01d0262f721cc47274353fc720c59601ae8248ade29cbef8f4f574df399c909efa0401564334b617e8fab10973c6e57f580f54173de013404c2809e7139fc222ddcfe0b4fd40238b8f07aa68f0e171bd15da4e133dd9c5a457d52beb019958eb4c631b8312e6e05491f443a49127a0540d505080a5f206b8b5b660eeeb9c2c073e2801141b69d61a0f0af4c364c59d7e32b22a135756a005ba786431bf225ecb1637216f041cffae573a41ae44c933073276e76ef034d4041aef7cdd33be279a52fa2032c7ecc94274c76f9f3a357c45a6c343400a24875ee9e4a14f2341521f4d686c50b4c8826c4f42e4d259eda07288076eff2a9dec810fdab5a74e1aace3a7b15162ed021b041a2fdc4e59ead290be11f4060cf8cac3aff0ec4842dc333fa5553c5ab9a90636e17f17628af95241adda31202fcf7ac977123f43aafbcda3506e43cb5b232b38ffe28db158cb32170ff20aab2525f32bb847c953b17d39429a844029ce864118984cfb39a0ba7a283e41223faa78d53e0dde26938be526d9a4c4b6c1676be5b0b08aa02d723fe36ef3bc3c37b685338795829a99ebd3365b4673644481f0ddb227b74db913ef281df81b6151337b94da3b3460a2fbdca8f2c7580d61b210f25f9bf5bb2741ebff571328526279e8ede50012f028c12500dff43f25c7855311336c41870caf0e255074a6166a36491607dd6a5b49f9c4c8c0bb05a81a3dccd521ca56a3adaeb7bd017157b7fc4df5e397594de36a38a5f8de63206562d15b2b33bf84a183816dfb165f95af926b52e37b20662fc29995ca6f3a68365cb00b6d51a1f5664cf35cbf37de43039266fbf4cbaa54710160433ccb193e75040773a389b3166ab7863f440be457106b8c6afb678c0bb19bf9bdc576fee31175207a19667beaadeaab6c5bedaae0139bac2a43284eeb4291b151ae7697dfca9c5236833c6d5f67a3a20fde004ed066dfbabf8a4ebfbde6a167d265a16cfbf3be820518dd41c691cb3736fa7d1a038c940ad4aba2ad12d75e6ce053d57f386c6f220dccf9445b420a0305af81b63655c847444462da2775add1fdfe31ee1e46eb233523fb84441821c88f47633c21f4c5068260361701cc29b6f1c461f55b5a2adfae8b7f2d0c94e28cb4a18950546a36ce79b137257123f863a256be8973716a77e6f6ccd6e8cd7b822baf39ad2006fba6092122d0d0286195b7202caa38593e69c0851989cbf27ed7f99c749f869395064e753ad959acf0ca7f33c5bc921c0f6e2499f41184a2752530275acfe64ea72f26a56834679f041af2463dd53a84a61e57d8357e2fbd642dcb1b72ab558edf9638e0ff7fa8285a3a82a7595ce0628617f8fb4465fb3f006ac25a4ecc8e5dae7c2f09c0efe0a3c6d208c5fa48f0d348900aeefd786beb0c3cb8ba1647d1e3411e9ded7442ba5f9bc792b67a4a543996c9aff447470246ebc5b635e7a6859bb5aaea06ed856912b2b478857863eb57b1425ccc026875a1a3c32155987cb08ebd46b40490064d7be63b56c91f6081a60d612069e8b40021b7d66827d24581e65ccd31d33a2f6d506e36ad4f6da2b12c762a4350dafb405e77eeb35dbb23caa98225a2bb7a61355e5071d6c57eaeb2c322eb7d9d8dd678ea461971f79a07ad771d2cd15f4734560d01ac7643bf96a4f6702f74f1c1cb02dc66771b67f6188c19866dc718256531d567d28d59fa016a66e5407d25ea54351922c0c8a2def66ec9efcdb20aa709354192d49274e60bffc08f80c587b70d9345ef138de2ee8fd4d512d94bdabc473fdf6d083654412b8d33eb23bf0c20b1a4e6881842913e1b965eef19201f2424f824aa4c9b019df3ebaf47070f21b194f0b5b50b9afd8b48234fcbc6c5934d7fc3dc0ea5806d35ea05751b59252ec07a248c75ee6af6f9e21e28cb6aa225d639071d2bca96a8786c741546f8d3f41d76f497c655ee4680606970636458ba558391f92b846e7affbd8f518d23e6e820e1fd3d62f277f92e0b22f53c745ac4857fb35fdf597b9d36039129190f13f96b18ef1e0825c6070a003dea6b08fd4adb090e7c556c1f58b7029fa8f5d6dd2aeec5219dd146e405b64ec77ff7a8757ebda4e06eed44e7b052076f51f1898a6253ab2b6fdb58d71661254ece514e0889efbe2220829e2f8f866cbd1aa745aca113ebb8315a1fbf1d6c28ecfa41723c971f0dce61348f832002a8d0738f511519a720fa6a18a65d7147e7cc7c72faab46321d17d85443c8f8e261ca95045daac6c853f2719d17da026da13fbd6a8112f201e1ad947523bcb84d1fbe5b3c24c70bd62e5e359f86ab4922471c7d05c35cea2d87a199bf7eda12876c4a1235830658358f78acccfede92a5cbf4b1adbc37bc398fce80db2f173ea9333badaef67d5316b59085e656ca665552f83c4bd3946965cce75a9e8482617a6572ef21501b1531879cc8ddba73185969ab036b61760b602b42549188ca1ebff58fb9e47d68a35928927aa329fb4a95d82962b9c220db97b1e9b405d34ba36d51d1b6689cd71fc3fcdfb091344de8e27ec24f8fd41d406206fb66413c87b649b3429e5ef1979a5b3b640fe6b34b0b615ec174cd8229e738222d26210418e8d06c473f75e9baa1080c1475b31ecdc9495ebfa261d1619be8872dd96980176ec85111f7a7aa91af218a26d5e70fbc0d85b1dd5e5f9596935f541229c9f9ebff0a933e0ae824f99622ea8c340123d4e058af189aa1fb449262ca39ec2fa638e988dadfa7cec137a490d8457cb4c7474836835c0de18c4ef5b6ff3da7e26f594ebba87066b42d2fe77fff4036143c0616ce5476fe91f451fa94da8a3ecb210a83d1c7fc9b79fa7e0cd5cf38d630d7c17e2548052a155f901db0a32cbf761af50b4403d76591d6e6bac9c513bf893b730a85185a4d5e2733ee33c846bc1c4e2880dd636ab59da13f07974fcfab8fdaeebace6836d25c680e6d154394a79db3fcb2e038c80e0d1162d8276d2ba147218045129dfcea9b0d55f9c9f35d399ce6eb61e0038678ea39d559c2ffb3a60ceb04dc61a8123134da37d49ad7768c0c6f8b5e55736e85eeda9fc7f3a6e6823a6fd20c50d02505be87fbed6ccd574b933e412fce7ee3cd861376088791c1083eda4e2c591ff46929bf88335f6a0024c01b6697d0155fc2e67fd1d8941b019c88c7965ae187493ebedd0a31d65ccd4b604bfe9bb9eaa59c6ea635a425bc2dd006418d0418b825b9f3c28bbd7bc8897a48d196874463d83885992b3a4a9bd8a1fea53e61956e4ecc3b6d9070cc130c4e78cc75d5b47d3ee04956afaa00b342f8274b8235a37db7d8da22683e0d0bffcaaee4e751b7bc22298bb5d7dba0d0123891ffe110430b7a29ebf1b4712ee283b62b19d48d797375604fc42e04df31b9cf5054cd44fc72d5b0fa7528236cb00d1c696387ca6455279677b340484341b25148c4a99826cc38de8df666a86614d3c2a2b670ba8d918f4ba24bdfe961e52a8fa47e88ae0d8ce605d2d701eb93eab2204e6ca775c09db93979e78d80c14d8bf9174184e580713e2b04043b20c6210ba1a16d1ce167e3321e444f95348de086040f4a8ab73db8b2519f5262714f1e5908c3729ffea115578193a6536a2bd197dcfc117e724902b404686e3919d04bb1a0ee3170991b852b65a09ddce059698ac6f520d3776b41828df8bc65124f96b6cc59adb5928761904c945163d218904621a6ed09e2a6469583e6b0a5079f584ae2b88a14ad6042777f46a0362cf3746f9ff0a80e736b321af54c073f1cc53960a6334422ec21e9c9f70c7aacb6ef6a6d19c9102336397e98d4bca5451f1c7b414d61ef122b3b589788ca3e5b7b4f54a1427fc58afb4328aaa9e7fa36d95f539aaaacdec8095bc36f773eeb36f87fd113b455f8f6589389b4ed161f462dcfed4a44992ac968307e91be21e4297940db16c287d8a84156d7242c6393c8eeca7df85d56d304764fd533f62bfe0382ad13385b856a32e028b474a84c29679f703bd6fd81147c4034cccdcc5b453da22c094040db7887a7ac7eb3f804fbce91013ff640c02d5fe24b2eee20a847e2505e62d8fa6f0824aec1ef4a1ecfd1fe08d5d646d1d311ed64f8fdb310a450e651951131d0c73079fcb459d5abb6909c8aa82282ee1b9d85ee38c350c20e9a8ed9979e2bc57d4c34779e4ac813c2f2a4482308910741169d90ded6cb82a40fae99f6ee958512f55e4d8379d0001211d045c60e20cdb87e3113b0909b87ac2c6ce593fef8e8f8116554f30889882c930e7c80b2455f9e8c7c923c927a74a78e810d2114239181e36baeb0909f4b8d8a4dcedf341cd124ea83d84fc4f14708e5b8eddf14adf8536943b9033e91fe07b72a08ad253e175724c7715406e86910a8018a0943ad83d12d6cf2e6c5f6e618ddc9e09efcc542fc09facf97ec1f412e4ac4668d3c49776b090d36f02d6e8d1177e33c69b1300e76528a3c6345e2fa5e1191f6851baa1910605183e108aa5cde7888f804b80f62d9dca1bd01c064ff38f30b357f9d51d8b7e3bbd2f0e691cec98da58bfd94636b17c927399dbc21d86787c750fbdd4ec130f359f1d301440d638c155b287e74d7641ba6c898762fc257f7408458a3ab4be139b655e700f3fed9ebc6cfa158ed8fb93dc4be874bdf79ea752768f1a85863943af956c0bf319089b3ad58db6ebdbd568c9b5daf29966c3a70ac839ced3d055ee4aa18684b8e7990513665357051b7413dadcf5a319e79556ef44968c0db41021573a1a2de4005bfc7ea308f808173e53a5bb24392cd7a6e57b19a7b4a4e528edf82fda92a20dfdd3dd5178f383986c9d23245613216d647802e65cd7e379be1525e9475ea5fa91bb9c2ca00c533e979ca080d6c0593b55ad2721d86fba3605c9e894357f7064f9029df684911149fbf1dbb82179e9459a550b7e79c2297779ff7126676adee16d1fb0bfd7ef7f9901580c43b85423efb1eda8f27e9ebde99a494301934fa6754b6e27529c46395e9939568510d2be463c93323bc9a8e308ecedf443426007f836a50289166ca0b881908a165310d0e67018d5313c277d31bf8a44f59c7806880e45f5a218a106baf7f25edc953302965b8544ffbd08107743ea03140c2be545142cf1f8c61ebd836423fecdc35003b0984fff0691b02b15a8d7f6336739194dc9f4681142d97adb2b268b34ac950a888cd006665d31f2f35a264f5d7b92f949d20781331621b99a507ba7e0133b2b867df4f334b026ee981d508d030c7fefa498c4794015c3453e78e3017857c074f3671f5254951344961d80ff4f44ff6e7608eacabc8a9108b4f976bcc2f88f0ff85f0d0f0de86db3040cb633a2e70b246484bbecd8f61c8355f1f53db7fab72eaf7d3734b29ec55282b15d5bcd2631d86be95e2e7257f4ef0973e9cb2cdb41af1a9b6070a0792a43cbbd877eac8d6fbffbab7d4b919cccc2605347122d58a0798e2055af0836896d3f1702375465217b99a9b8dfdef4fd03c5832eb0490a4e8362f97284e74851a6b32a3982314463b44ee6e7b07d6184cb24d2a350e698f3c58e1114fea56580e0e541d4b41d8371390d23f6337563280516c497b205d6169214f5dcc87ddb465b526f36da3aa0c3fea23a742b5682217fab008b0de8717f7a851823bbe30fb5968e8d3e82e2487dac505952948c533512702a296817f751015e83001958382b2d4ca0c63efb808d10bf059552367a8649e67e9d2ac8b8f74a34414a73149611c049063ea2d7ddedd923c3daa1e4503e6c4d0d1db6226d32de152657386fc69fb67802e3deae9afdfc460f10f05895f58d2bf6581a580ad7ee31d3217521900c24d29255db1a21759884e847396ddc0f76e0334d50050f7492d78b695c8a6fa3eeccaf50ff41b94763467a97c5f53cbf91ccda3613ed767a60206a733a9f7c13cc93b703076513dc8f53cc7ff8de5f7a27a19e9195db178d551b58268f860fef0138cec1fc7472182814d02773d8ab03df13948251381288dcfb4a1c28f958129023d9218673d7c81d93fa61edea50f9d3ef81ab134e5e2c48a1a9944e2a049b6d09c53ca0c18d41a319f9671b4d2bd08b24c2c6385a9e96ea48e9c0070b71b04f779c6fcf9f514b48e2fe78fde432d8715b60d2cab602358c675352e4031c499498e9176a6b8ed91a601c780f441012214b65f3ef9e1e0128ecfddf47e696ae0ebf8279e430612c40d609520d90f5fbd3f22a5853f76b8ab06cf6c48eea46e5ea60698a0a05506ee8b127d0f7745803a547cd67fc70d12e3b3d5282b3b9719dc9d442fe9293cbc56088abf519acbfdacda20d75f86f2f87c6d7ebe5e492483cc3c8c417c3463b888fc9397105a52402f1bfb86bd6506fc788a8a53bb76e473caa98a71a6359bdbd4ac5dc9e534a9a575a79a58b63c18c2241d30a2cbac157ce9c460aa7a66e3e154022dd6261b79d0636278c4716282ad4e2b801902de31b22b3a17dcfa44f320394985736c8d57d7d90739d7852d5754dedc105cd5e980034b0a1b2ee323d34107d52104202aaba8fc1d094d8e52c097c3661862f4e8e19e13f36a5c47bdf9b30691f697e6a5639a15348676024bc752cac3f354053bdb8fb27bf4d36e307485052bdf40c01e8104e","title":"239. 滑动窗口最大值","link":"https://leetcode-cn.com/problems/sliding-window-maximum/","question_id":239,"issue_number":31},"29":{"day":29,"pres":["图"],"tags":["图"],"whys":null,"difficulty":"- 简单","description":"```\n在一个小镇里,按从 1 到 n 为 n 个人进行编号。传言称,这些人中有一个是小镇上的秘密法官。\n\n如果小镇的法官真的存在,那么:\n\n小镇的法官不相信任何人。\n每个人(除了小镇法官外)都信任小镇的法官。\n只有一个人同时满足条件 1 和条件 2 。\n\n给定数组 trust,该数组由信任对 trust[i] = [a, b] 组成,表示编号为 a 的人信任编号为 b 的人。\n\n如果小镇存在秘密法官并且可以确定他的身份,请返回该法官的编号。否则,返回 -1。\n\n \n\n示例 1:\n\n输入:n = 2, trust = [[1,2]]\n输出:2\n\n\n示例 2:\n\n输入:n = 3, trust = [[1,3],[2,3]]\n输出:3\n\n\n示例 3:\n\n输入:n = 3, trust = [[1,3],[2,3],[3,1]]\n输出:-1\n\n\n示例 4:\n\n输入:n = 3, trust = [[1,2],[2,3]]\n输出:-1\n\n\n示例 5:\n\n输入:n = 4, trust = [[1,3],[1,4],[2,3],[2,4],[4,3]]\n输出:3\n\n \n\n提示:\n\n1 <= n <= 1000\n0 <= trust.length <= 104\ntrust[i].length == 2\ntrust[i] 互不相同\ntrust[i][0] != trust[i][1]\n1 <= trust[i][0], trust[i][1] <= n\n```","content":"096221cf5b628be1e73e8bcfe626c7347c8e248a04fb2cab0a66692577330f1937ff9e4625dd8f5c367421d103e7bd46ab345588da2612d4a92ff52ab5a7fe2fbe3d6568d4c4d3fc0b2fc7a89ad25b7639e030929ca4418a3bae2b83edb6a88a5c6da56322f6dba7ebc9808464572752f6099443514af3c014624e43f731fa24ae99477d52003c5112c541fc14f06bde47175483d6f18333a0f284f368e6ad01dafdb34b36ec8f727f0c7486c05e740115d88bf9285e1f05f303ac3c79934c340dd84e970059b40ef0e22f37dd202838ff07a3374b4bcfbb45289680680718c3aeccb501faa04d83fd2c3af5aec087c63d0a7fd38ac14988a8248e0d303338a8e06488a98a9844a84574640ec7435a47e1d8960cfd258247a1d3cf1e81846fbd5038c38550bf0b4d4596551836f72b5c89ca252a9dfd7dcc9d7febe3428879bb1151be97131d507c85a86bfe278648e7abfd9eb896b2df4abd27f3973400749dd7c59a069fde2ef43113436a145befcc13caca29a3420e330567b96b87a9ae02799b31465e40daed6957c44ac6b0632fd84b3b95c68711e5a32d58d9322d44068fba4241513fb632d5f63e1899e316d06fa5fad1ab48f2007e31ef60ca08c6850bfffefc914f8c111e8b6a0a720715319b06b03f438b9beaf87ecc95543e2c8778bc23265ac2c840d5958d2a2e87bb5a5f2974cd3201a0535bf56ff55f43abbc81221b0722a71aa604ee16d7fd8ad644629ab190f6690eed288b020ee2c2d89e7aef97e2d3ee849e3c5078cc96ede72144ebbd9754f10ccad23d791a2044e35d647950cd839e9ed1371c1a1d66e52c587af65ee04c0e9622c0c54f6284c343009ee90f01a3fda28ff7e8a92aa1f0435df6a7bed7a6b2e2976c2f8b7b1150785f15401991cc0fafdbbc651670fd53c9d2d6741d2dec77a759a449a5c317a8f8cd61f0582cd41e521ab7ace126abcc2a04f0b89de1767b45a3942cb308a604e68cd1197fb64b698c5792e25f60d1a8222512c081f0ca0294e60d58c8f83032ae0714922ee51a021880f6575a3e54972af400dc8e77a2266395ab9bea275a4b6b895a1416bad90883ee10b11625d544eaea1414442f8f0392917b035841f5af13a0a357c19904149312f859cb7ed18d73d7abe9df96460e31470391890ce4a86d765549074b5ce7a713bfeda3286342cc22c9dbc7f58a695f8e2487e1658200936a7f356f38354864c421a787c2b8ec748994b58e82d8123382967bba32e927e46c18fd81a7175f2ed0e26ca1f88a24f3d3582f1c42da8ad534260f75624f0d4f5d65a11477988773f038ed9fb581119aa3dd42d604f50b726e7cfd30d07b2acced62151fbbc4758143541dd0bfa59d8d2f493a4dd383616e2f444f853390960f8c23722366db1b2b5c5c7ef2882b22a97b00ad251c61d68eb53637f3d924781c3f83e7f19e4420d027d0684192864164c046275c5f8804170275d0098e3d56a5958c6ec2c333c1a7006cb88820768ecda1a93114301c121a0e9c21d2f0a6b17f55c00ba8878943788360d88e5a7502da079cd08aea7ca8b5941cf9ff334934b1d1b2c3f1159a9f03431a12c36b970db5a40eff87971d8a8127ffd8ecbe651550a818e3a2d78dfd474c7f448b15541685b38e319462c324163f3e998c6ae1d76feae6b0b3a2818f0874fc0e443ce397e7b1392206c4e215471c590996c5b21b202e80b8fa815b3ba2ead2c78b9b0ece5d241ceb5b7274b3339681ae19d9f22cc2aeac6ef408b0fdd8e2e8a5d0a5da843cb20849cec9f388653b12b63346653f9c761a841741e4cf6408e1e77ed79faa5972e9636d623d57c789f5a27c235308205c06396c875265b22df50c0e83ae3d44746532677323984113e4d274d19be513a6d545bc8dfcfbe6d4f1d9ac16ebafc0ff66d62fb47fdb3faf1e78fd8c85919b866068c77da3b8bb71b5cca94b8ef75061a119bf7f09e3633dd674fc99e61574993776c7bde49a8d07fa55bc0886289e9c3e57b680f6dccc25448fc214f47ee4579a5c720ff28e8a381de53ae8b3c81ae2b1d87bd99843e25dcfb874f2a0f57609f3140c2472b84dd3c60d2bb308981eed20523499634182f7d1a9c1ec240c05a55023a9ea4b6b1410c8c5586fa44be2efd4f71c510002f53a65d2a8981abd0435be9be4f4c2ab45b766edd46c3572d200548a57aa9f5b60e3c005f4794dbc7896e7fec8983a4b4aa0e512bd45c55647249a0f1f2a1182d823003fe732abc4a5769176926ca604a9e68edf9fecc34761369480011d1888795e08ffb61ed8947eaeb2edce38ec6788fe0df3b0559dae5ac79f7c2939dced9480828c284085277ff3ca61f1539373920efa956d21269e69ce0d3fbd23262918d67bd80f90aa8e62b72cb06aad02eb8b5ac88bf6e5f4afe87eb278692549df122febdfdad3eb2bae07aaec809309f5b77d78e48d1510317c9b4bb10a3ca89193cefd349e5511d3af3398e6767b9174215150d7a6593370ea57a6a3aff399730311821ed9e0bc31db32cf0906712ca190365f9e53006a4fa7bc50c023400cbbf1b75c9d853a9bb1d6f44d9d1c5814c6a7a22bbc5258efdcb6e503504172f01faf001751b85df952972404ff4910f83be69310391d0c0bc355350a08fd24d6f027f03c7573ac0302ee19aa4f74b3c8520cf2ea8732b3cb34e57cdbfdcef8c6dc8df023e4f4e8e5600080720b4035777af8414e2d0f2a68b1a8f4aa162373f66f86dcd86e0464ca751748367512ca6024b4dad27075346caad74aedd83d138283cd5fca3db7b6d4e5a3d2f2d255703775f96de2991d0b70b780e99693e3ce04805a61f4f2787e7c65a41aeee21b10204000364999a5b0745cede1fd790ce375b163dac13881ea82ff0519c6c0bd788ff73743f0258a23b77f8478fab5b9541b967801150dee13c0277a52bf72bc92af9752b449777cdf4406c767c35a88c70b24780c90f0d4546589e48e921ed83219581b3febe0dc829ad25d2a7834fd276dfd0f9b0d37f2b9fd66a5c2d5f88f8be0b8d6ca99c92051b0469157a9674d9dba8c14644253541004ec1c45a7cf92ed6573991ecc8a5aa46fce32e03b2aad4602c352ca55978eaf70c185df84765555ec56359c4022f944e45ef62046f4e8947307265b410d511e222c09e508b21acfb7878eb0028b5ba28e80621d0623f0f071cbbfd34ec577c01a86d5476e0942ed3996477eda6bff4a7f3a00a86855a41c0b7a9ace212da903cf177fd3eda5fee2a7c72d3ad6e2b029fa7606ad95f9d99d59ef461745747708b491065d8f487e871220d84482946e9052189cc08c9e87609f02f73b7df4f55580083c175be81a54421500f7a0900aa4887245583c5d3f7e944ec49c03fc54f786d1f2726c9301a0061bce1200043d3e84dd4a84cc0fac292e2a57c5669de0651a7737dc2545e1fde62bfcada181180ea42dc6f2a7ccaae04a3bae9421ccc33753a0031846245dee5cd0efbea31644f1cb9cd20afbe0d863215d677e15922da1eb68c591207baecdc72b5412a575a8a582d9a5c9d96465149f58b4fddabed531310b9bf525cf80035a71a33cac97e1b94a3a22ce5a1de0a2785cad6b75130223495adea0d21744fcfa7d07834571d24df2746b8b99226ed59ccf9ce7a7a5ef9c6da4a46b0b30204152476c04972c61dd3a3e15662591d898b74a9c2adf7703b123332cd98033d296e66357602aa7ccd71d15d2ec219a729f841dcc470271c655870cefc26295ff2024b5fce047b6c73bbe95c9330986be61f2a3b5bf42ff248fb240e2c8ab62c6e053073a22331c1681be4c4bf2096334303880b71fa157dad4a8c4dfb5a9a26381090ccc88e1b965fc07fec334bdeddd757f811c371c055d17435a2ea54dcdd7d074b595764e86912d390e032b5d6f7b8148afdfb56082872f130f73c4a6e8b9c3b18892a943ae1236284e0071f3d42c7810388d79e100a6973f37fd361c9162293b1ad01095f98e916fae29c8b474ddbc6f5126685d9f82de5ed9253f192db08916df1aa22220916b9f99f3ca644a8d3a37a82117fac298659dbd2238c40ecf8db5a32abe86ca85708a82680b1924fc35e46597359da0e95170704bc3934d56cd3df70f3c4a147b52666c8af2c8fbb6c3ecc89e2968f82549e0cb129e5b7d3e84c22ee9ea11788515938f29f313509eb4f0ecc7fe811e2e3124992503f04dc404b22932fe2d20ff850b1375d0c4d6defec09acc682a0e0f7495337905d751690448526ae6b3d29dad01be28d4fb71b13f119d2e2efa889de6779562caf1350a5b490ca018089ab8b2afe714efce1d16be675c2beeb0c737c66ef16ffe57b445ade53972837d6dc395b218882992ab26161a7e16149bf14cc0b8a695e1a7d8c8a9556010c61dfa2ae3debe28cd4910b1feb55779967f1602a312652b645d25191b7156b8f5ad98df762fb6db2a93013a8dfe0e8d887c7bfae7a6ffc1dcb74939b6feea4c422872dbe1bf40680870927f858cd730ad4f7dbe05a1f4786f3c79876288e4983bf5f74ba0eb99e8fcaa5eba2f8671cd07bf6b8855c180b43814112abafb9123f4f3bf8c30a5ab94367d43158017d730f1eaaa953e42b2d5b78a9a105950ef496c39bb14f60e6b7edcbbd1e1c42773e88e40ededee1bc63e1da4ac261213008e595b8f415b844075e9be3139d3c55bfa272af33dd8311b0cf39d311f3768501c9a0114c5f121608679c549cdd8d489f82814248ae87b3100c0ea20d84c582f18a02f1cc57ceb1ab37ab14d22e6378fb84260877017b6803bb92bc5d51ae7746691c13c3208926279228f3c18d2bfbcff9920b0f529a351e8c30cd5d67dcdb895cb9b50cc5d7a1f4de0f4f31b3bf1bdce2a4d8910c65b6c7a6d5e06c69e1a0111a285775f2c5135acce4bd7e88a7bf1919dced59136bbff20f127588fb6260a4f726e3b0c3a06c632355337b9fe1b75b54642cb5d9cbeabded56c39e99104c3d1713f16e4dbdf7574538c1c6bc9c02e69de3a0d301c307c10245364ff997cf38e2613dd040c859d968894b36c95aa6e2a3c3d9e605a6cb46cebe781af28de128e180b8579efb2229d81c0158cb49e5a19552ed674563d547d670947e2780ab93bd6592e104cada385975a7c276d3fc53239609ed20ffa9f30dcee660bb2213d0c4563537b4d7978d195d00ca958aa2057d82dd4ef7a82dad7dcbfc90f1cf5cc86c611547fc2ebf5e52068de83544fff5943528c9308a179be0f38c4cecd02d84a2b6dfb2de1f45faf39d5907c2d8c8a80e7b5dfad031e00ea099ddc9ab6117013baac473f903dc0b3c1e2c0c6d5affd986c4d6f751b8764cd850193080c88c447530dad43dd8ba4adf14b808b873f21519e0fb16667b84f1cffb7a06b93ada07e87356adfb0810a8cd51c5993821ca0c36c465ee1be95712e6077740284ab7d1a991845e84c31eabeab20ed768001bb025b83ecc93a30bc914db1a6b222f171134224f864abceefe305f65f077ba7601211ee712e3a60ecfc2788636c19f1adf281d3a0ef25102f6b19a917d6ff666c6b1bfc32554f2184f57f9568d3c21c5813f0f509abcda616b1359f24633c433808c0806491e6c8abd0591f475cd8e71a24e37c59d5cd43b3858c2e30d51336d9f4db80927bd9cb28f6dc223db5d502cb02f028e403968c9d3f5b047874216bf971a6b52770b1615522bc5526373dc6439c979fcab1af3a8cfa54c765a5dc1b4d2df59ca2c33c0372345cc054fa8ac8445d405b2a4a14f19f117a87d55af881b958633e881c5e76ccbc34dff6d34e1b4aa846d61dd015fdfe136edbf7e09f052e87cec1ead11244a0dcb991368a6e4756aba1529597fade59b3687749e2860b03232459dca2d3c92e910a9da827ef3c7c142ae8b5c69f250313205c2d79198bac74921c628a3c53956e6567c850401276ba1b10f1d4d9fa2e2e45064b337a061d00dec12e9be4fd38710888e84cd14315416293c1e3a5c45fc518cbbd8c7e8d671d1dc017260465ae1fd74e8a104bd17f55e73a9ada5b6f2e04c5ea649e70aa3e62a16a7fee2cc84b91ce52d120003c253333512b27a759e071a71ea83b3c7b398f2438d94d0a87009e95ea39235bffdb93f39ab103f223bea7e344d93c993ab876622f64e3a9d9959f3ae226cfbf0191425ff1e1369f0bd5e5f6796e5e79b05d7c468e244bb64df2dd2efd5903f52aa2d20b1f6ca3848fa0bb2723a3d667f938e39a962467b4c1fd244b6ce1b1c6e233aef8bf3241be60654d4845bf647884b04fe95887419b05ac52a50119941f558ef8acb8bfcbf551a1b701abf22bd429ab4159a18544cb087d56d965d843fa7605708a530dba720948274e0e4832a16f702ab085b0ccc579bf5751f11d9b79703379b724060873c354daed4d1f202e5e4a93ed1d4605bb354c7098e62da42d9e310e36118a114b4b7cb3825c217433bfb2e7b365fca33172931e87008fff67281fef44cd51c50b521f96b31466efd875abe16df60565706825d19e01726ca2ca8a38832877311ced05c3c984055035489b61db3be778a3b2fa957aeca1e02c77e441b846e8157dd7c3a9473b417f9acd485bd4bcdaac6efa95bdf860f58fdf20c371e2e6588495feb8cbefd40070b803093de39acb6f0f8ffbf635f9726b7d00c0843c820ee5a3616eac5682e3ba9849a1105f2ac397b8bc069e4865fc684b1dfd9bc196c3ad3844621984dadb3c234c837ab7817a82afdf0c9ade0dc82fc122ba4f2cf362d8659def46b17abde8688131f348a38bbcb1e9bb4fc56527c0e1e0715fd647aae900b4b545c91fdce3585746ed28eb63118d97f12fd2de27dcdb3af9cdf7d9a9fa76d95f866db3080bce0d03e1fc3a3210cbc1bfcd85a476a284b2e3aa09df8867421f6fbbbc308ae9ff57bec3d3f9a9557b0ae4cbeba512e37995735835503e575b3377525c49e6b3f44817b5ed512adc67e3fc628fda51dabba0826fdbba6a50ff0744b79be02f60d970079e091fc3125dae2b33a715768ac086f5e1af094d0ff0da8c90e8b13f89cfa957eaa070c670472617e4c375aaff72fa8778f7ec1a5b01517cea954df2f5f0e68625a8a81321ff8a281a9c1f05e342d04cb68c226214bb8e35df9148403f3f0037c6ee409af52f8b3ecef4db6ccca091067ffd49e51b8cd6a36e282e836f510a6d7d2ab01a9ec66415e5597821119a733fd4c4ef7453558fad6fd6ce8b3b304350fd1680bcfa9f2bc1460c517ac8e3f5a9ff5a2061f331008024e940a9dbe8284b54ef680c041a604cad00cb6ad612d884a3dbb060e3d073d7ef04065f527089cbc82e78bd2e09fac2edb73ac0c9e918743934021b71049f273c68585515086f664e8ae8e7b4e10dbd0c52be3150108dd3adc932181880a4638b00bfbe79b6cf187433fc15978300d932d423e4c1a517f013f8a05d810dd7e1bb4d653e32ce66fd806bf3bb69bf58c7faef574e92441e047a567abe616811d8cfc4daf339321cef0340a12b0478786fceec080c81ffe793e9b8c3350a6358fc1c8568729d8b090051e410638612ea1ab3647a4ddb02bc69b5221949c3eae8c59cf8a98ef59cda51f4ab534b96d7fd2e50cc8bad0fb48844ddcfc471c042e4100c9c9f64e819b0de17d93db19df97527cfee5edc3ba2c0600dde134204462b6ac9493b8e283073a5ad8404c4f3603033f074c93032b4fb4544a7aea733486dc3ecfc1c2fff68614dbcf5cc6ae6b8e992821ce1eec0deec6aef1a799ff1a3a400967ff9c49f82816abb3ea3ecefba0a8fe2add845a3dcad98fbf31283397e8b39f4d39f657579b3d0e6f4fbe3285a132c1139bee9d8237951d774dd03642b2799314983638fb3f9e6b6cc557c3f3f8e9f5d8b656bd37ba1ad7fb6cfa9002494cfc4885058edfff1eab23b26c14c7a73e1efb5a64c35f034632f8a07f4bdecaec6b94962734370249615a40392c60415d3af7b9e0068a831b3c08cffde1448548173c7334354afce53a088f7f46f97f87e0822ced76f366a12da85ca09297835eae38ad9ab350ae37ec42a2ba8172837b82817a278be2da1745f14fa417f27520e9e24a02fd89d1cdb6b9ff4f543b74f8eebef09734a51c4124e7dbafa54641eb76bdd725a7cb1d9eb78297f3642118624497f1d4916e2b15dbd0d51a29918f9bad81a2becb2489e1b0155b77cd3201fef1d8d57dacf6590fbcac23bf8f34e76ac726ff37d7cbb727e587f1e20d8149aa515a12832926d4c704de40fcbba8498b6bc36bc2a3c8a50e60ddabc6d97e58cf2b30947631e3353391dfe6acae0c4c30cccd3eb34c3c8e4ad7201579591d8547f4f6a130d13ef3dba52812925be8deb2099d0e1288f4216bd2c40d10dbaf46bf8a3269c7a83","title":"997. 找到小镇的法官","link":"https://leetcode-cn.com/problems/find-the-town-judge/","question_id":1039,"issue_number":32},"30":{"day":30,"pres":["图的遍历","DFS"],"tags":["图"],"whys":null,"difficulty":"- 中等","description":"```\n给定一组 N 人(编号为 1, 2, ..., N), 我们想把每个人分进任意大小的两组。\n\n每个人都可能不喜欢其他人,那么他们不应该属于同一组。\n\n形式上,如果 dislikes[i] = [a, b],表示不允许将编号为 a 和 b 的人归入同一组。\n\n当可以用这种方法将每个人分进两组时,返回 true;否则返回 false。\n\n \n\n示例 1:\n\n输入:N = 4, dislikes = [[1,2],[1,3],[2,4]]\n输出:true\n解释:group1 [1,4], group2 [2,3]\n示例 2:\n\n输入:N = 3, dislikes = [[1,2],[1,3],[2,3]]\n输出:false\n示例 3:\n\n输入:N = 5, dislikes = [[1,2],[2,3],[3,4],[4,5],[1,5]]\n输出:false\n \n\n提示:\n\n1 <= N <= 2000\n0 <= dislikes.length <= 10000\ndislikes[i].length == 2\n1 <= dislikes[i][j] <= N\ndislikes[i][0] < dislikes[i][1]\n对于dislikes[i] == dislikes[j] 不存在 i != j\n\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f2b9c123385f0604131437a5b7c0854a288274be8fc0a0d03b4520385a146af371c9dda651bd4b838f921b4efb022fe70696a969bd1e10621cea0848e126f38f76e8f96ad09d336b035cff5b7a599502dc1460bdfd86d69b8c5872d2a063b9139ccf6eb2099c07ee7d80ca8109f6e8cd71a4d3a522d145b0c0fb34cc637bd727b08b160252c61ccfa1e5fe833399bc8bfb381a06847e88b0b7794c743742409a8e6e77b063361940cea5e5bf5041c598f58ff525cc862cc917416837f2b739d14cf77542e9b8c08548acb35137091bfa8d13b7a4d31a8956f1abae5fcdb9c2b5234c4c6a9483f4679a56a403142e1f20ee48ae9c448c8197d1e57e5323f789a86846ca31efe19919f982fe8d779f61b24aedb72c1bbc945b656151bf02b7d89cf163d725900958717b0f71ed44cf54966e0d52c6e2a5a1f2f820f41098c0d3c1e5d010c3510ad54e24a518d554ef48febdb74bc8279d959585e0e5863b8952aa5ae28d11820605a64e6fb6960de171221d7800a4fbba74b0ea1755eb06920db473e95c68712e68d2a62e1ddb72d5d8be92b55146ca566a7c37743bbb2916ca9d6d1bbfe40b654436160dd0e53ece3bb4ffccf8e429d101ca67e0a72073106599b79c0dfdbb3838b4f4907b3fbaed340c052071898e13d8691fc600c39ef4e4b3673f3b8dc0264716caed375c652c4c57b2ba3f5c036d3b26816c8c688f75b6a9abd3b59e3ca61be8b074776343511a526536052516414f7deb305426b2faaa3e784859f5fd573626f240947c953577e61c2216a1e24b6792a747f4192755eb563960dd990309f427c9e9130069dc41524ebd60c09741861520263e0e43d07c6116ba29ec05236602aa57128797f4c38e6863809a71d1377a983af01dd023911d3b9910bd06ee44e867e70de0b0304b25b9ba305abe766eca49a813c12751e14d3fb50b37ba8e08a72e93d0d1738dff7897f541d44fa37b2a80c4605e63f3807de8db4d7038dfc121d86f85649c47017e341b2dee7b94942b099d9fd8914a326601ee173c5c4eea85863e00d4b6b895a1414a5d90883e651e04573f3a63e926b81bf9f55877325f6b56116e8d41db1b044bcafd18a32c74fd32ef26b8244fdc5670840cbdbdf141e1250f889d6ede8fa91a2df836b0d4d95b4ea68230bd335cff3da88992561bb72dfba18936681744659635f3b4431f00fc106174e7aa85a26527ef2c92404a83fd564bf24c0ad33923240c440eca01e27d524735fcdf19a0e6a5c3593a3fc700871b0f0d6b2aee22dfa3a37aade3ab03ed9c87d02bf5f400ede06f7b35f0b3f1c47b48e2719a260cf1f3f89ee1649dcfad83f1040417721630d4ec48fa493d0d6815ff43213bc7894541a16d7a581ce8fb95a3a98837fa8aafc3a1011cdf1e40838e3a49fd27366bdbc7c2e86bcaf8f64688911af6b6bd5682542436db2a0289b598455adffc1bf9370c21786547e8ad57f249bb16e0eded0681ab8c3f098f272e47573693cc38576e5324d63d39b6ad47771d6b9fd4bdf0d081355aa1847ec63a9a848c5ec3dd087e91fa73a587e617d64d8c1e975e3f45a426e57ae0d730dd40d7353f1f88c38fb0a1b341645d6c3b8e232dcb7ca196262897dbd70b3e8f6985e16a00b44930e527c2c16032bd1ec12ecacf06505427abc830acce21774345b0d8dcb9410c285217f859e0a8d24214e7e898216cf6835f37ac8b50bac68391c658d56f836fe6bff4a5de62455d6cde5a5d3b637149b798731a4d096ec517c6a96553448bc72e3ba86336be6f16c04ecf07ed79fa9577ce64c5b621d6aceabfda87c23967e072f7a2f09ff4f38e60a914f200d4185d9b12d2f2e1404c6dda02c4e1dad81ac6d8464a9110b3b82cfa081dbe68e6da0cad564e326b951dc3894399747e2e0adf2e7640b9869e6e0b81cd6faf7178fbf0e5ecc63a52f53e5014fd031a69db24c79ce6b669bfbefcee239b40d8d5ddf3fc7e01035d09bab8ecf4e39a58872f6108f69c327634b8da1ed5f1dbb46defd9510b2ccc72e85920b9c55a4e96c90d2d13d42cb7f54122ce340b4832a57c900cb4ffa6a033ce4106dd5b3cee0abc656503dfbc2a3a0e7456b0008c8c5756e9944e3edfffd36450026c13b5ae8a99a16b52238bca0db312a3e872bdb28aa75653bce7c0e940bd78a1b18ffad73ed0a33873ef3dfb0a7a8553852ff55b372f49c254178fe38594d0c213b5c1c6cae07ddbbb83dcc79d111b346fdc3f08cadab92793c7a94cf732661d1730869f2dc47f6d3078aed8de165b376ea8d1a8ec057f3d75ea0e26d5e5cf86578e093e56f78f9796db291400995ff5dd751edc9d7c7e2cc4481512fe059147e64db338725fdf6bb04c91ef600a66a8aba0bb58da6472e698353e50e617a36e84eb22b1a81c68071be6bd4dcf7d613aad05010b6a35f68081cdb67fd6b01fbc0aab88d10d43527b1c9382c0b0a77e60835d79da68bdce7eaa412b6fe2b275de4b1c7394384eed56cd94bae1f412436cd4ce50cc21041e8f5463ab111e0affa361b485798873a9bb1104cfc90136a17db94ab2587d5e48287ad935f70d9f4687aeb3e6c13ae1a816cf196a379b5f96cfa6c55adb8d997a50ad4e49feb346c94ede223d7ac8f3acea01919ad00e1092594f9152f65c23512e8228e7e49467b02452536ae6032193cf4a870ba908efdb8953eac99b9f9c7e54c74e48ad384e933f5001840f4042aca3f4518a9a1c54ec5ac715129cfafae61bacc3d2a7f99c50a1a0eff68179d7e4b5c6a755e53af80a3a60eeb7a39d89c85085c765c277a7488119ee87e75bf9393c11fa53e069ce1fc8bccd7c178013d8d9b7b1b79b3b82dbf60be5627b312395434dbc4d3dda56181ac67cb65a365419d16d849a8e88cdbcf0d3a7c05424cc242d49035d4e532e3c1b22fdb700be3658e9da60af327cace4688a0c5e1f79b0a79d7bbae365ad2300b5a183ccbe2e7ad99c158e7e95f61c22346d3648dd01b395830d3f47b7f4566587b3e4a453ba30d992ecc5fc70a69d3dd865a1c7501382747ba330cfed1fb93422fd1008ce674e132e3789e3a43db64729e4e6816918c9f66d70d116df68b8a54d843d8477cb8449918da4322d16414f17859500fa89389f7ff9d2e9274e8150d73633ef06ccb5157e335dfddc87814a04a290e00cc0a0cca48458da7d5f872a604a2ea0a97348ca7acb772e4f87cca85f91724c2ed02bfce1d57d1c3b9faf68d22bc803a6638ed72dd089198f8dd9e95480e624d091815fdcd39ee42d8d787577245965e532fafcbd5caf3efc28601248d3e91f53e41c955925a507b9e5a55c4da4be5c2ce38c533fe88e8b2b197e7954bc09e32c69a6642168265ed4755a7aa4801462d81eb7582b439baa453b942543b1c5dd694c148cf2305b9b6d3e0e7f0ee062da0b112018d0ac5cbb208745a483d829605c8ce247fad3527858b338841a590a6c55c5b908a84b072f0765cc35c077607468698268c52acf7043deee2abb3b5d5f96bc3fc898bffea9bfce4d23901edf12178ae22506ba8b478d8c29bf1a7385bc4a84771e5445af60568e1ed1c75de014bb38cf692db0b7645fd8e38a44a6c389ee228b772a8941d47e26302facdf58797cf740d6aae9b7a8de2f31717c8a1f815d08565aa6b4a74881a461b7ec1c871d0345ebf476c3a4007c62a2c35b4d392cddeb569f1ff16b50ac7fc384249c32c596975b016a0eefc7b95ea382797c0e17099c0039694d50b00a4ae62f09fbb8c5ef0208fb05bc3cb8a4ac9dd7107243a330f0e4628f94bf20981818af227de7f9d11aac1eaa3ee394434c74488659993abe958816edb9a67a9a9b14b22df03a9c1566d723d777ae167848ce019e8aa2318b7cf55076b7110210359e81481abc357cbe52547505d48454e1704eeb7117fcd25121d5e0785bf3959aa8898cb7fb705f53d5bd65dab6d04d0656abdc57225acd981b674a12f979909978f671c494e50f50a29b21ce8d695f72367fe0c8a70f7a60ce339781b48c4c463e0ed27ede26b1a6ae33822a6ef3c99073b0277ea2e7a250f91166decbdddbc5cb63a8758ef782b2b99e38ab04203b3d62ef43f94d783bc89c996921b545414327528503eeef35ca39b334aff60c1a7cf41649092bc2d34dc5058418b3fa8d55236602a7b5e44ae80f8c851b7ee35ce3fff31c5ac2685cb294f8bdfe66d6f7e7337743e21d28ec994d0539bc887038facd5d59ab7523f2723f907b92ec522fb13153b548cad333f132ff52dec3e2ab4ea8fd2fd6ba6f66f7c231c2283670a80a37bcfd8ed583d05977ae53c9644bc7ec66425b9a164c9c8654d1d8f67ad246fbeb6dde5b290741e89383a20475edfb387955925408d589a7aa699d2299f3744e1adaf5876c6715f52ea51223b2d44642b4c2406b9a1e6a9c64c2681ecef73bffe344aca546cf7e719745a3141027cdeeb6142389e8581e7dbb2ea26275a2392b70b1c12ad188be718c00952edb1cce84aad4e0c3df4695b8e2f725d7200298540b950d1048e1f85528f442c3c38021c2b89d19221eff1918d31b09497174f4a27a916e43efdffa7950b56b1f4a5899e2c9cb43ac0b9ed2f61ce67355290e3e48cba282eb48e2881c48a44d27c5f9ff04a0a767c942326a82237a4282bf5dd470db6a659b57a379265ca59460f6517a9a6e2f3216eb04e73f29e4678ea22e61589d6aeeef5674a09e9bf46515cdd857de224222373318110d477e622b079937321e5338e926463bc431582ae3c861ac7f538eb736193de35febfff3b4f6deb07538f8fde99a572e7de4bd87e8e718b6020a6416c5e1d33954abc92c0c84c7137edaf30374afda818e37beb839412208b1253c7abb06a04ff98ec8eb63c19c421232fb20ffcf286c6942aa4d9239feefd4d20ebd4517bbc9084fd825cf7a8e0f2531c88836e81d347e32b436f4c5fa0cd7355987eb693be9e235f45b3d4c80ec9a30f3cb2aa3498443a5a37e9ffd3c2d46a51df6e4bb6821bbc83431d0f0d7668618e9d68056ff531cc0c14f53ca3222909e17bbf4983af09aa16a824b38e75940f6e1ad1f6faa112efd3f8fcdbeedab9a47046a3301e8ae7998f726f0c369fbda8a2a451f4bfe65b77983e02831875e5cc3280bccde4e487adc4ada25d444ad214faee691cd87f818935d089ac96c2c91201f5dc86875f107fdee1f5b02163928c700bb90a4b15ded258bb30ea1925c6819240fe0a2121d10a938425af19d5987665aaa0aeaedfdcbd131e69a54bce4a3f569788c82947915bba6bea270e0c492730706c0646406ffaea60ac225e8944d773c183c7e0da24ad790033376085681a7ac1f4a676894b8f1fa90611e4e5f13fc0f9349e44a6f87bc181098fd5d8c210459c48af468a91302c4684e691b5e2fa7c6ce8a0ef4711ee03623822164a9d540ac9423a664c617e7a71ead0679bd6eb76ec70121003f272ab90ba8404e6031e6cd92f5e19f37630496ceffc3d95370803dbadf281d3e4aa255f392d42e011c7fc26603919e232514e62cab62ad973d3c4430c53d6f54ae481e944bd35aa077916433808c0806491e68be4df59185a73eac85f75a26b5fd6cc6a89f8f12e3bc8133bc8a9bed29231d98266f68e6373f29049ea5ea4569f51d3c0dc6b124b360f30168771e9e1742de3001022f914657f729256f3c5b5cab1af3a8cfa1d8931a592547b20f5c6f08f7d50237d21bb1e878ad5591b1e13004255a4cb5e7c879e0ca881a3582071dd1b4c7fa5f37890a480355137f371cb1d935ab1b14174f1f7e09f4c6887c68abc811c17e59ff6df728a735a04e6bb0ad6d0f3b856b0447963ff864055732a1f95f0809d35bb0a9da86ea93c3f5b3b8de795e46f7e133d417f2c4d9fb07e925f3cc51600d0222334a64b08301ba81a0093f2b3ca610145105d2550665140939a7dbbebb47d1747d0e42cef0b5d2a2f939aadf0891d804a96bdc2548d6d1d7d905674176dfa11cb55c7344fcf576db647c7da0f3d7b57919221c025982227816d78e506b905c48310d0371b1675766f283424b91cc471b91b903a316835c07730cc5d088258d7b4be39625ba7d7c7e586b11bb268a0def944f63a843d971a683365d6b497dce209ae71c2c053814c49b5b51c940bc4ecf83f271272ea0c2515a4394b8b79b0a026b41623a638edc54f1129ea85c9f2ae3b31b58a00f01ee39a962467f78eb3775c23f5fe89b176f7bf81592cc3714f236245bf2737cae31be947c80e9b01e415a27a41a7043bc7abe0f1b7c1f305dfcc58d6f920cf03ab4159a1c64ccc077965fa59d543e14d780b957900ba253b1a3a46532766a1267037b094abcc8c79a30d03fe56d309397a7db76e517332c35993ba30177e611a2ec796543b05a628513699b420ed3cde7f554e50c4560e4312e8dd2274267dbffbfc9965fca3312ff058871eeab3282809c058e21fd81b4314bcaf4108afd67ad5cb54f21f627e4f2cc6d35c0a07b2c2c67281317a540df24890d388760e751da1218e5fe72389b2fa957abcf4a2603ea741f108ee506fcbdfa32d0844748c802b1580bc94a06eb3dbbbc649dba09174e576e4f77bae8e94f8e1c5b77000b8600f37f2fb9c450c80eefb31a945287f04c4d775bf15d2b8352ce309ffa3ba9849a110096f80c3b1a148c8056fe673627cb490d1cf98ad455f1c4bd1898f636654fd35e59d33ccfbc10ce59d428429dd25a13d7cbb20d16899b017a107a6c22ace7ebf48f3c4efe2a0f903c9493a90f9b23816c74aa2e273ec860ae351d0e30e1205b967b97f47c8dfae23cf9720c6f47d9ad0dd9de0a93a9014c33eba220bce000ef9996f7c44b099c2d6afc376bf84e4a6e95dcdf07b145a2ceff36296e6fe51a0d592f9f44e180af9cbfabe12aa79cf3c4435537d090e606a591615b2a7d84853b5f7516e9534afb529cac01ef0b3e3cd3a95ee1119d92d59aa9bae2f6dd9610e9e5235a46919d53b4ea718769bbd88a5b4fc416008e5cc95d6ac8335decfa457fba96bec70472617e49e5faaff72fa871f8ca83c607c5171ea8430fca5f7f09a0fb8a75067e6d5790ae11f08be79847ddccc62483eb184f05b61a4fd9dfa9ab10346e62308d0cd7bb68d1fea48f69a45ef2a813fe7524526c2af971cbac297aed2879a2089c66430f2594d091cb74cf5697730ee1325a0d1c309015fb0fcc0cff1d10437292879bb71673f77a295d2e79954b0659c394e8920c36af1947ca5c7d42384c4ca99baf82c1bb0e67cb51e633b1e51fc215be11140b6c2c4c40d81839c7a28a77206fdf1ebbd22ccd4fe2630146411413840d7747866105e5c17226a16c9b6aaf8c64ef54913ea3e4f44cc91b09a7d544dd4bf699158b9b534a0c2157333ee3f5f248a1c985ce4502c26eb1582160223f99d384157e4e6f98837896d2faf6f40e26c80021126c0dd5e718fa1aac5bb3aa789eef1c7cfc1eb26330fca0c0ce46e0b11372b8be14b428fbcd79da9a183211c1557fc0db12e2acfc74f83821ac3d63fd46a8d76f4eb8901f729e531afcfbd05133b547f6c753a04223194607eeba62c733884d80a2b0c912b0e1af7e500ea45867cbac90c47e4509e0921d453c44409389fa73232ea7fae7a6686871cc5d497cae8ca6b8cbf09edbee560221dc24977a6dedf60bc2eb98e597c9aa22d2921f5c4ef0b7352dbb446aec9fc320675aa115b694261881a2448271df8258cad35657a079b54e3424441714dbc5ea04865280be205155c4dc11e350d3a3d488646bdc44cb743150cd0b0fc565d252e6c02a7d8c9e58af23a0a6fadbff966b367a7396d62dc652acc27cab362215a5180b1fbf06f0f822380f76933f5a405b8ce8c4f239db1a6b76156cdfff8a0e94b4092152d20aad0eefc1469e87176349a1bf9baa028045219e49a99fcd9729f7d91485da37bcbbf54d70070a028f656307900aaeaca2ff402f190c43636c44e577b6ff75226e3c0bf274395c6f4a010406485fcedff21015c4a0397c649d81c83c93fefe9ab1aa1dd0ed374ba2775681cf9547d26621e9c318d2dd18413df469cfcd243ad676d6167ccf79ddd28ff36047f42c7c3df6def21f6f0e00d1c55e6e293c4c8f40decf2f6c3c9bc2d2dfe77a799327aef7a0e0494f64921bf4a95e88433910ba3a50c87438a5a6dc558223d55954f7886bb36a4d771dd8e35e5b5deb0feac0ac70d34a13cbe9b57e9cbfeb80a9a385f0864250ed71ebcc072de44e36704bb584b1f362e898fabeab7abfaa33fa6130a3602c03549288441065c15d38db4172946def76540513920b421ee4297293fac82b36d85d2a46bc25b13a27101844bbabb2debf7768059a95bbdc9e4995295c160cd7a04bacf0a4d0f9e55a8a76529a0cd85e700c97165b0abc82e07e94e51d843d39909d25f584b3c4421489bd3a0f0cba5e43f231a669d0d004923b802ff509431a5e6679657bb148e709af289259f82493ebebbe3ff617835c8e83f0419c1b0397b2ea1e280a82cc6c673d1af4c1dd893e0829af9f57171f62e887a9d214bd82b0a5232453ba1d90a4f82eb8aaa8320bf5e52181244791bc52856773e254a613665dc37358a098e922886ee2792e6ab513c46bbf50d6f7ef27a39f6f5448c8091bb944cfc3f035faa44c6770a7b5588f4d4c9950d681d3781dcf9510e6b39ffc73774d71c3f98262028fdb280d1b39a7af8d87382d12173d57b9bb12993e37943d8713ba39bf8e868ec82dcd02fc0067e6b7d1f44e40e11c8b12b52fa45185f39a34841125d1bc95a7fca064acf905b8e9a1cb3b65280d16d36fc65e9ffe33ff051e36644bea00ee206bab0f15c3f0d471bf8940cdb7ab2f11467cc67b63f21c58492d6f33363be54cd9f64141027590f20ce190faa33fce49b79c09e25a691f6df521de71d13ac3cfddeb05e7afa69c026998a09cc65228a58e22813d80d97e481935757b2ad4bf4b04e1c1dd9e3c29182faeba7ee9a8bcbca092b873b548c0998c673a2dac3436c876458e9616fb52c153ac7c2db555fb58e127a6fc5087aa1464dca3aaa200dd704c2a6c78168c676afa2714c0fab5fd91b126ac6329bd74edad0c92d1335a2e38a9a1beaa810816e0ab1df28ca67bd21b3db7c1d587a311c3e6e08feb52e11eac751ca3ab8a138bb2f5844470c4e915391309ff5a75f505413b1959703b129cbdfaad09f79decdc73386e81a77359167040427333962bb1d2db689c2b287eaf1e99ab99d8f325847ea678037bb741023bbab602d14d8c5797e442ca0de6d21e4b322aaec14e4798ef90fa0dc3957d3f027c9108da47d5a4743f2e66b3703003f749d77ee290df11ff6f7bd30a7480d11826d329c01913a25c51a8ccab2d7cb98f475ce0c8c8718df49d78624f70c11a6d359d109779857ae9278fea16e21472400cafc47a85c074fc57b630d0e796e689ec3a0ff3981a24686680cabf3f8dff403ce7ace3f3367242581cd623ed85f368b4d043699b531971d54e3d4683849104a61370707c6603c289e6511366ecc4b5d626a0a1d574daef8ac4ac415a7b4c935f93ed93b059454a4f411aab0f35d09f94481f2915a277200989816e850d11fdb9a100a0b32c7bc23222e2cd8c91976e838d440ae06d47a3dfb9e25ac16ae30b3cbdcb8266351c583a4146dae55541d732ed0e25f99b752fae699968e352568c0fe72d4ffa4d6b5d252ade46fee920c4b904dc255fc5dece7416760310358f728ecc1d3be4ca8e3b43fdc3bce11988ee03728a56cc742d888c4841af4e3d5e4ef02b56331a12634058af3c7247045ba784dff90ad92f8a4d1236c9b18f584ad647d10cad60b8bf6f5563656f0f554a8fa1272a2fd0cb8973c51f46217aed3835b941c1db93964c7d781c2513891574e38728e32be838395eddae1998e86fac19e3a9286b8d0d6b04da98382703e4228967168c8c84d51e1666743f1b384d85f24afb864a5e4acf1926812f8759e779f822e734ea4529c9eea6dfd1d871cda737d712726e05955170efda1c39939e024da57ef00693f445ce190dc58d989935fd9abb4c7834292e10c3fd1da1d1b7dc4687af69c022eed28977b98cb2ff76ff38946a10c61727227d2286d878bafe52b8c0490baab14d7fa64886e371b9e8568963af5cc8c0d0673d773fb1e0fe24ee940b7c129710b6b80e88960ffc746009d8a51119c9a765586fe336d61d9392728f2c37d9108728b5c1578a408e11853b0f020dfffb448567df4d749991117aacc78ed0191704ddbf03a577a085fa12da2020becec2d0b48f35ddd65befe37b5ae24a0b3a56a552e9eb7c6e5149178b2b723b64241edaefc90b1b8bb710642f7f019b09fc0c8a0a6149d93967203f16e695f6b6396cbf6719259249688a64a1e1aeb9c385bbac38dae6111d575c4b7746d176fb862428ae5917e52441912d4dfe4748978939689a2a9db0c9be945695093aaf1a4ab19bd158aef2b507e4b79c447de37dd2d2f6c469d917a868d4c22cc0097c083fc2c3895f3a6030ea4eddb7dd6eb701e563215bfb3fc718294dc8c4a609b77ef1fa67efdbd7bf96cc131951ce0b4bd6dfe48c736309bd39ce62ef8013a9364d4f6e88f6fc65657c7a88ecbe4607f2876ebc4e8d7b101a5fb3fbdb51cd256b5fa9c6c4764375299cf3be3a6821f3872addfdff658d3518bda85442d463a154196f0775053ee0f261aa0dfc38d72f5ef7432038dedaf0f1462ced2ae3507c24ebaec324a6e04413d53b3fbdebc93f10e29f74db0ad631886b4f22be96fa3fde7009171a4002cc7200742f89a3d2d50b585c1a1b05c6653c515e4368092a11f18104de03c4f11459ff9c846ba161ea1e3da5eb012583fb76f41962f87e96633ff36a9ccc4ee9c8ffccd0417d89ac1c8a0216c5a683e5d39180bc5e109c4a51dc0d972aa532b8693b93115de1325ac530ff2b37ae295b10abc7bad9a26a1a28dca1561e78f3a96ebbbc117cea4b9fa39357605cdd50c0cd7e6ec3dbf5af48e1dbf337b979f17db2640052485775c9a69dc3986a8a4438e0c1a48241f16561de0b126e573f66d0288413bf313fd667bd057a84b3ab43bd9059bf691109da8b927ff5fe8f562a156debf91d5faa1561e1f7c92b6cfc54636fe97347ccc0362ffce848af8bfb1e3589b933545102a1c60a9831f03ce4d2c5fb8cc88e280d0e5ff5315423a7cb0fe19d5e5416229f3e298629e03872798bccea9eea1ac5d8dd4d2a4ccf366c1066aac23d46bf8a09b6d93dd147873c29787a215e32732694f2a3f3f60d82863fc8eae9df8becd41d90a9361e77755814938d3e3764b706efb47d2b39db4de442fd3a5062558e525f1405304ab9802c81faf932772c0689252a55148f06528bfc6bb136e9cd87fcae9f19a1c2ed6c5af63545d168c1c7fcc2293dc6fe6269e1671912c87a9f6098617abbd10d690f6b67f88df8375d54881945a96870f3b60a01a870a9e879c9695f75714659311e286ce1d8f48d2a966a3fd6ba600866c520057d70009","title":"886. 可能的二分法","link":"https://leetcode-cn.com/problems/possible-bipartition/","question_id":922,"issue_number":33},"31":{"day":31,"pres":["图论","拓扑排序","BFS & DFS"],"tags":["图"],"whys":null,"difficulty":"- 困难","description":"```\n\n公司共有 n 个项目和  m 个小组,每个项目要不无人接手,要不就由 m 个小组之一负责。\n\ngroup[i] 表示第 i 个项目所属的小组,如果这个项目目前无人接手,那么 group[i] 就等于 -1。(项目和小组都是从零开始编号的)小组可能存在没有接手任何项目的情况。\n\n请你帮忙按要求安排这些项目的进度,并返回排序后的项目列表:\n\n同一小组的项目,排序后在列表中彼此相邻。\n项目之间存在一定的依赖关系,我们用一个列表 beforeItems 来表示,其中 beforeItems[i] 表示在进行第 i 个项目前(位于第 i 个项目左侧)应该完成的所有项目。\n如果存在多个解决方案,只需要返回其中任意一个即可。如果没有合适的解决方案,就请返回一个 空列表 。\n\n \n\n示例 1:\n```\n\n![](https://p.ipic.vip/nrmqt5.jpg)\n\n```\n输入:n = 8, m = 2, group = [-1,-1,1,0,0,1,0,-1], beforeItems = [[],[6],[5],[6],[3,6],[],[],[]]\n输出:[6,3,4,1,5,2,0,7]\n示例 2:\n\n输入:n = 8, m = 2, group = [-1,-1,1,0,0,1,0,-1], beforeItems = [[],[6],[5],[6],[3],[],[4],[]]\n输出:[]\n解释:与示例 1 大致相同,但是在排序后的列表中,4 必须放在 6 的前面。\n \n\n提示:\n\n1 <= m <= n <= 3 * 104\ngroup.length == beforeItems.length == n\n-1 <= group[i] <= m - 1\n0 <= beforeItems[i].length <= n - 1\n0 <= beforeItems[i][j] <= n - 1\ni != beforeItems[i][j]\nbeforeItems[i] 不含重复元素\n\n```","content":"096221cf5b628be1e73e8bcfe626c734748523970a3d4cb45609426e2012476b209e2dc8c9066ecde89f32f426e3ac57af2400c3906714dff32ff523fffaef2ef2326f68889bd2fc1b378fac9d98506c7ae664cb93b3038b24aa68dce2b0bc885a36c60766f89f2b3934097bafdfcbb47bc50b435109b080f7254a0c88279c4f99db1d7dd7e3c9b69b48c7f62dd068dd76166abc105c2a14882c663dacbabf525b2a743420a3f944e5266b70ea5f1c5e03abdef978061b68ab33ea7b5ef7133954964bfc7348c54ccb9d730081533071a321cc5d562da288007282c72b367392b6aee10897d3662777ab46a8aba3d1fa4f5455afd0ca2f3a22299c103e1907aed0696b366a0db159d39c98b649331c73999bb66fb424d80254b98046b5c704bf0d66d0c40aac81a211b83d6b27957c49ea971250c4df008ea71492e412d35ffe4d40ecd2176f2f68d8d04599a4ed01ffefa18ee6ca869510bc45858f5c5370db83f3fb51b85fef0ea1cd80e6edede5c02bc4e41da34721151ef16d3888c2d43916e814190a4e91a66338a17843b25701d7540f97e6a811e6872079d532014805bf87434666328f36d4f11b139edcd351c0a7d3d9a85afc0c463a2aff720edaafe747b8a19423c4055df853662d386c7552e12ced8e83bcc8f74bed95420b2eba49b83715b477810bd9cad525721f61cd95c3e61ad2b426ef9d1f8c3cd1a810f0b32d1f1a209511a019db19edfb8ae87a6d99bc90c37805e91e4eda98ede7c89f5bcb95d3e0ef85aa3e7c60ce83deea38472c441956e31fc6c92f75263844e35d527752eb9f9e9ed13932191f51f920656bf662d6461d9c22fdc24f7693c36a389fcd3301a4c5ae95faebb029a1e3655fe095bed69ab3da876b14b49e447d2917390642bca27da687f66d6826f41e83f2b10b3750b77bc632ad37cdf464dddb9b0eda0c7fe47a0b06c3d3c4aa61696160ca32739b7c94c7d3d837ff964f41b10c1fe63cc8c6ba6c70b7a12d79a367aaff9648426c329564239dc0581acb0bfa4d49bd16a686d9e6162a84e8406e4d8156ed9f9028da30000a029cf731b7ed2ff5699851bfd20cb3699135d18d578117158edbb8eb0fae2d70c4c8c7b0f99de32c74b2367a4d13e76cd1069364af00de321d879e96365815c2d5d0b97066326252424a0b6e55c7b4943e696480e18138d2b64d155751d79830b83337a406be05dca8d0e98ba1c7b01fcf4bf9c5cda87bdcc785f12043f1a5089979813ee83821c369a49e1bf90f3da7bc52e293b95a257381b7858b774d42cefa98d5dd8af0968ad70fafe96253c34a80201db4bf0098bee345cd3d3dbccb82e0a372cb177bfb41b24a12c961c88142531dce84ae9997a5d1ad4d0006fbffd5a6d450bb8d55d4551854d29bfd4afdd4d2c76058393f759ab6fc77503581a8cf5946e8ec0d0684f22a2d595485f53a7db94cf55bfc64ec3dbbb18cd049d2fd6f56eb23d26016c15d0ec00777a61e2b9032b8893d6ed69fb9fa781a6e555c1a089b749eedbba0144cfb53f7c3d6060fda11c6ce0e375582428db09bea2cc7a7891befc21c4504e21535714ef64a54c3cda2ae1454be539be12788b5f96a8c812b85b8e0914a4c78811e8017322f45cac7b0c42c6e1648c3ecce46cc13ad38793f2ec1c942984490395f55093d0181dae8080e2eb43d0e0817bfed5fd701d2c79286ba13403da00a1681b878688a44d8e9ccc73616b805ddab3ad05a62bd18a1ada7bd16d42aeb506b74ad986defb876380d2d2e10edae44ca7580105a4724b7e9df1c8fe48919cd68674ed09c2f3ad0b04029c41011a77c5fe5464f6a1a63736873a35b025f1f22542e0b6ea27967aa17f41631a9953e82f0275f4c224bbbf3fc597e7df795e7398039d7304b40b580c78b8bb99304d9c68918e966d9679c7abc5f25e0e5dcad204f1050a62cafe4c761ef938f07156d943fb074cd4263907a7b8a559a289f50fb20364aecbcca9d8a0ac1bb0e83438f1d5bc9f362036f5d5095902d52d067d630fc10b2add07a617ef1f339bc086d47be696948a85a66837588092584183763b78b07f79cf6e866f07140b89f648813ca5ae9c9f974f6aa5a424c391940dfc8903f4b037f7bf5b3afcc491b9af844a773301f6bfbb0bba40fba8c0f394a9c6e859c340373f49d8158b76bf011b7e6f005e6d444992a488ed43615b816b28805e05333780a0482a59b3ae41fb70d47aaacb17dff88cffefb89adf4d26ac43e4058bf1b8152c068c72c2a4d505a63c2785636be8d0d1503885b6009c0bb1dd194910b6b65108b01de2f3b46e0d90ba9e33ddadc3b125a70655f28f6f23832cf24d631561d1be09145a20ccfbca8f9897ce546a8dd54e69bb7b8288534993a6d1604f136f623a8860807ccca92f1cf9fac2ed6eb0b767614fba105a4dfd8d2df24a8304576325897a9dd641d8d8651640e13e9571fe6863e9e81e1fc35945809daa011bee6767b92773092d8aac4677825f03ff9862a7516d8cb86241cfbc0be02dc31c122054518a092039012f5cf3463c7e3469f6f546be6c6d21fa0e94fa3dbbbef3af123247eedcbf718ce95f9e2f9a9e238696b1af3d42e4d7559e737dae679b189ff4f1bfa14c67f87bbda9763aa696b5a254e0e5d76549d09143aa57d69d6aa22cd0bcdf43977d58ff22ece960d88e0beb6d4bcb9cbec8c1ea885f0b73c0ef52e3908657b139e4b17482c4132a5e251021b244af76fa6dde562c0b17cb195e1316e3dcb5c0ab4f0fa7b7102a9156c8784f25d4f96de9573aeb720b6dcd3acd9c4d0656c3a5acc6ec090171154b780d099a9f9c1179c5943f0f066457d73b318efee1b23034a0035429fa7b36140eeeeda782fd675b348d7fb0483ffa3f21f3b0e093eb62f441da66f8a4c84e51abd399cb4e7ccab96b2bb744cee4e9e321ff91b70bc9fafaf54bd7c7c905bfbc39860b103b046e44d415ce1f5bf0848febabd2396764766667068f38882a0eda35661263f72aab8078f43d5a20374fdc1711dd57268739f98f5fecb48fd1aeb6df939b93b208addcb21260e4e127027ba4563c05714ec5f769b30c24ea743da6f78871e42f06773a351adcf580448ae84d28d06898ad90df6389a632ae176eb4de12158c42c46e804014a403669132d1c02e13b7dcf2d0d536d32f558c1536e0c8e7b691d9d9179b2efcbf844ebad4bbca11b794a32d776cf4e3f8a6c851f464b77bb012ba34e5667fbb12061ed0f8e7a7abd9cab808a905be68f808b8e63ad4169d5b7909caa0442d9115b607535989023588d557542eee28d07d65031930e43a393c691db1d8a5aa61a1a86c400da2f5a44459d4469014c2288f4af66c4a529276751233622d576ace83da5fe5f0f4e8f2a6afa5f9abc9f5d6f45145773a2b8399ca953bc7055371b5d90120ead8aa9dd156266b698e48f7231c8ec3347e1239b9790432f5a2944afd758ff80437ac5582ec3e63dd33a8dce3e75545c9889a7ab71d7715dfb48067a004baca82a9c4ba6c42e30cddea88f83d6fa62c8fc9f85dcfa99e9f5d1101defff177db229bfe4faeb639286a29efc19d526758bf41aa5b46e9fad4e2f9cb76891836c1822644a93b4c51e47f03f86ffc647778a32ff7f689c9b352b563951170a7e243c5fea60646258545f0517003e41d25779a027faceb369939dd6e3121cf820bcde62b6feddd1b41b8fc3a22610326ff49fac15268128a40009f2aeda76e3c5d35f9a1be6680fd61910dbac18266be87050de510355bbcf3802a760227303eb37bb363d8675415e92010b848be0d1a4e2edfafa09cd1fd65334333b8072ba329e6e5a6f66469f83af631597eb556f2a3ea34c88001bb1254619ede544a7a9d399a696bd98a227a41f605cb02d0fb0df245496a7c9b9cccd98fe59d278145783176cf090c1fde7a6ebbac37513116ec30f381c250f86ad705df48893c246b70ef43b02af6da46254de2c3af4867c73e589c8bd72ea22819740959d6f47632d13f58dcd569e0e32123ac9d825d31c977744826bfcd6b78f7e60a77a77e8714eae8a9e65f3d22626c018e7c383a521a390cc984390a5750b080efc71a1239773d4eead3b25340c869b1e5ac77bb54006465d614476788cbe97aaf886a58fd66b27aa111db58f57d909387b84df2e92fa6c788f159be129f8131099dfa0bc82b0c5166074228b393efb5a8a7cdd6c32e32d5beff80b4b308cff849bfe90ddb5426a4e4f5ebff7e4dc5fb7e14520345be63f33123dc86ebf1b4f9e0aa1d6278aea61135b42d851b32449d3d6d9bcd320ccfb28241577589f0154b3d029f699b168745b8f03840cf220be34ac5966ffa90495c60e303dcc12af54178fd1b4f1d5f27666ca2b7e51672749304972bcada973d50b9e2d651121ac1edf2d5270d1db50c1aac43193ead1cddbf7ca9a9ca82d0b7c25388eea3b602aad4063c5efc65372fdc00b775f1340367fd8dc51413eae8581e71d7c21acde91b601ca4c3077f82bee7de84cf2bd7e6f2c2c1399186a299f3657e98ac15d732d288a4eb254cbea3cd5018845d880ddb2fdf3bd21041af61e62594cba2404538de985ff40964cdb691b781fc9937f1c74036eb09cbe21c9bbec66ae1b85a8fc13772f612cbdb71c5dd5112746c919a2e04c24dbf1a9b32a92fd00e8b752d1942635d7e80c48c13fbdac36aa56f5d1d3a0d32c125d15bda63ec6b65c3281c218af2fc6190a55266aecf4b13278d7f5d1106bf501a0edbfdf3b8bd57cd16ec357ff6a92a82a975620b3dd4fe0966276f45a874803b77daa8f130099bde175eab0ad34aebd16271c3919b7774fc925b74aad60f687608cedf1d89b3383193f0567cab4b35b22ee97db2f5f9317836c587f450a5294d011313ba285775f681473ac880299ace02eb5d68a83d28128b3f346de670b9ece73591b7b74110c3a06c632351a71fae70768a8121a8f5dc5beabc9c86445f3b004d2d85b3f16e4dbdf757453ca5339c9db673dc1680a7e68367b005d077ed5997cf38e2613dd040cd3d4c5828fa366ba985a572130924a4b46b46cebe781af28de128e5e449436f0fc3fa8cbfc51cde8dd0e7d01559f094c17547d214615e2310af075d60b6f5e0be8e2d29b145d73667b92682b0097c825fa9f30dcee660bb221744a45201c2e032d0398e88254e00d966e5abe7d82963fa8f0d7dcbfc90f1cf5cc86c6115429d9fde8e43762a583034fe25951788c9308f33cea5a6a8acec013a04f38239057d2c161eb52d3dd1337a6a0c0a7f59cfd533443a61a8bdbcf97103c32bcb04d5b9066eae394a08c8fd0fa85982f183d30558336cecc069962099ec651416ee317ddc5a8ada70ec3dfc86d7c43910da66c7bf07d11fefbc363d2a9a26e9a256b8fb9ee03a6d51c5993821ce9852a0158b3a2c66c6e256865189ae67c53cb5b08f54536ddbeba29ed24c555ee501583fd9b5630f2de19b1e2f471ac76550a4abd36ee8a90ae44a6434e35f36c1258a077756e76f1e769a7056c19f1adf281d3a0ef311a293e43a642d0f53346791ef0592bc1d55230c006f5032f88b7941569b381e7ab16ca27d51e6d3c8bb7960708cf596740abfa7f370140f7e10f3bb8271fd6c67df7bbbe6a7ec55075c6acbecd9d2b8b846aba996f6eba960ed105ed3992029088992f47077302795f8b7887a5271ab85b422cbc9da9a9fa4eb57e1617b7b9e76ed8aa4e933eaade117732b6cee68b205b163a1f8f19f5da9a0b59434c67115ae7840b2ed4db01fbc2eb1d642491170576cc9637dcf5d386bbe934ce4fd94ab9fdf313ab5d552402f9af06484f323bdb8c41584c7bb614ce92c3152afa17596045d860a816633604f892c8a4db0d7d481b947d9b3f67bb55f5fd8db0793b0f1ebfc6898f9ae4bd85486d3098d4c33dd2cb35abf5952596ffffe65e92d142390807e1d1a684a09b95b6f2852e25b80d63329aecc00360e8198f829db355172937328549e80d725ef848f48bb908e2b2dea966d20a1b851748cc566df51382975c3771943162ac0bc90fe2993c868864b439c15c23d40cf8998c89fea7efbbcd469f0f892ff470abe293b538b7f11da08764f6125c06ff95a93740626554479f5b802d34528d1bea10d262b2b9cdf90d5e11312eb137de0845f70c9faa300db550926c2a40b0e38a957fd6e19a1e808d5bb166749778b8ff63e40d58d3f4ed3e6d0f1860bcf76945d577aa753a5ea2c6321e1cb084c87c3f7724de5a7066e5945aed8bd5fc831796f3516fd255a14fda3a85678c25eaa72e9fdb4a611370633f689e590af6643cba60c00be3738b00842a83af8f4e846f2f2ec0a91218e5a1d93482828e82da87af20bfb78c3e5b3760ee7966f8fdbf659bbbd8e7b429c2e49dc507ce3dab2cd4c3c3212ec6ed29334df27c0123cce92ff432de611c5f1fdc581b443fb08210643e73f5abbb904fd66bae947d86279b287aaef8e27caa11d85ebf86a326ee6d4c6619ac46708972c29ab491c495991b9dd64d4d51d60de29a785f68c5095d3ff8dae8a30bb23a75a4234c225552e1183b3ecc5fa78870917baeb5581f6cebd2acfc455fc7bb057b1a21ad137920219e4a6b77b23a97771be041547b7d6460109bf57ebbcf73d5e1bb714ca3aeb57ff90e6bf5ed214cd5695afded6c7bac25fff58e982862b0fd00e95363559226cfe9349ef6de411707694116ac83adf2142e1535411760fb2e46c10c6a4eb25e44a3c8248fb32ab8eb75c652bd76c93d68863f05d30ff441e4a3eabc7868228837a5b6510624f6f19340ed69eb0a0fc547dc7c4191f5c529b143a5ba3e5a53dd5811c682aaa62b5c157a34f07c1fe7096dd10806d0006da2be717c257f056e1e301db00b2974782bc114316d48dadf1778a82a6a20aa79503e7047f1fb8b600c4130dd36d54fdda4f0c19183f09dfbe5df854e5f16c99f7175dcef41fb2571e648288f131178c730564eb333a8cfc6135d16a0a862e1ca06c8358112983e84f43cb1b0324f426b5c679ca98e3e21de9de83db40c0832f32d1ad405d0e5ee885d58e72536f04240c3792bdcc8c6ebd8232ffd374529674df13c479ce3723dc68231daa611a10cff3177ec819c324270ccfb35695b541fb14103a01319dae860a1934cf78d304ec120dc17be2ed88b9e057d37d5166b44287c4c07b05b612867e401091962d87041aac688c4ff5f95b5af216d0089aaa6c147fb232b33ed03a2071d3f0febaea8abaa0120c15a81c140a15aad0c5504a8cf54f6610c2a0b6062a3c60d2eb42896eaa484d176b395709f870c66005ab049162abf8d7df3956ea4a5f2a9190465f4ebaefe939a85d11ff3f6a19580d3c5b3e4a14762115d2bd5518d8a41f7f8d00b2b145ee3e985415be9609e2c68afcc8e59e7ed6addf6b64d86079a59d1b8db308951c1c5cc250ce4f1b453723e32ce67f39267fab468865fc5c6fbb9ffd1ac53674d3f2ead3808093700161161d4e0c278a1ca5ce199b98fec306f8cd936790f44215768bcd3c2dc09f30a96b80638a0074be91e548e10f101be53614cd029bc5186202959c6fddc26016d14476b1126956250f883232336cd884368029c485e15bfbf10ba0dcf72f0994b07887a51c2dd5db73bd1c1dc194bf8af34f776cfc00156ed421328254d59ac1f24ce571a23e0bad85deabe061752aa58ba4f0115371377caf4b5490077abb7ca517dc7370e47f585c70ea6879fcab65080de9fa5fe229f3614ecfbd7cf08e42cdfa8c2a4e734a544d9e490c31dc2968fb601abbfc5bc9c8c1eeb7874e070f9b1cb4b143ab99db4f5928a0f2e82a3162b8de9cd2e7b60ce7bf81ea0dfe618fda00bbc6e76a0f5c8af5739470df9c47af03f41ac96663ebc7e1606ada746184b5db399320a96cfb3212a820c4740bfb5ffb30a68f9716f35c918e2bdbf16364906ef8d8ee1f021fa3391555da8150239b258ed802fdb3cc1a1d4d8044656bf50c5267155b8dd50a7b7f4d54e9dc1410713c5d55e2f6537c784f701297c08e8d7b9df9b0e0aec52c43f01a923153a871e11a740bc26bc9ac2943ff495a5cae20be542b930788601af5a485f847191083437b7a78cdd2ef527030245eda28d3fae78fe9ee0051c817f431216207da072246c43262db307f178a7db6733a33e490293e6190bb84098ff8622800b9ce2199a578a691797172e3744c13a46c9fe78f0c635dec1b55e6551552220e4079ba727a020139373657f41f80cd9958ab187b630bfc69521964ca71c15c616027a637ef6c1a9f1b1b3f097298e79301943c5306130de400031669bc6ce52675ffc9a370f472615b727a14c94396bcc8bbb2dd04826fb4489ea28b3ae5ed00e7597522de866bb3ced786c34118d41b933b63951adfe591515f71ae4e837328acd85e40046bfae771805a4ec29ddc20dde3c076c945f1f197d146933db86fc83cc8fff5563304ccd5f4553657eb233d65ac6300e921c9762ae34d587adcc6ec1d00a51eabde1e0e1b6ca760bf499e5586a9fe8e958090879c3075397515e8a880508656374809a6972fa21409971a8af0da6d1af18483b676e8a8b513742367fa76792c7f1cdc3a0d67f93c5afa58783ed83a65e93f37ee91206d9f490ee140722a3cfd20c0bcae5d33efecf7411b711523d354ab969deb7b01bd701caf794f01e326c1415e2a38be10c4d0e818eea953b5ff0a646a0f822c4a8d8647550382e209c3c5bec5463bffe4dc75f47b85473d6cf79d7bb40363506b465620140f42b5154b2f8a2836eb2d7782eedc00bc5f3d8b53fee9984eddf01a4ed28d4c0554cdf466d9e183abf3a75f7ec13f83a1d24f714c109eaa17f17e10dcc321c7af1e5e2c3b33d1ee015a7036291a92fe96ce5a477671a0f2aa4fb60d22667f5d9f2aee3f00a875d0f6fff3d7375af634bda341e1757a2f768c7f876df0adebe483b6eb97bc91730cd54a5ab79d94ddec858dd4071163cfb945e2db03925eab85edfeb4e633b1775362a00255e31f4a172d19374e2d7cd64acc193136a9037d9078eef6cf183c31a96e9111afa8d17225c91cdaf2d808900a879ecb2318843401b09ba08f76705715a256ec379de95c103ab4a4caf3a5c51badbdc6d71084549a9e98f50a29c6b1a816fe60fa63513f39b90fd90d8a5ab802c14e5f806b97b8241d8a961f47b4117411e41af46d86bddffa02319041cfcd2c055e071c595fad0c412a44304d43c519ab3e172f49fe0b1f9d2f377f7b940180435010659585e22114a9dd2c8199548b953ffe1f00324bcaec83917e681c5fe4053bec47136a3376da722d03f3fa11219a3f81c6ccc5cf54b29b6b1c68b2e54fad3b9b5f0f846c463ece672cf544c1d9a4be6bfd418c2f731925495aa06fd7ca1c89cb3dd74a908b01d5b4ffbcc0841eb32e99057278f00a1a32eeddecb2cb6ee203230245a93a80fe71214805982066b016b2e25c7a7a6e478bab015bd4a01aeafb88b9019e47ace3f336424a5652ca49f20d7cc39c6d1ddf6b52c970c0ba6dc27285c6f0533653d14952e7b20dd211d6b0181185162234459120afcbde90f825beafccd32f73ed9664fc130f0b558e4e3981850a00ad3b6971c6b3843dbcd1be14d8a5fd09b04534e2ab5c800082e2cd8c91976e838950efd06c97a46d4f171f944e030f58a90ad2c2a7b8cd7e1596de71b5406623fc8e30bb3e300afa382bc8e3525689dd41192ffea99b18759afe969a9820641a741d75eb164b09e492e2e650316b86ca9cdd3f702fce3f767d221b441ddc0a43f61f129c30df28087cb56bbb1dba7f704a86e3def24456ad3fb896b3400b37167ff90add1adf6d13e6cca16a599b87c6d04d0de41eebaba043811b5a15ce6b55637eab342abd62f1a9b2c53a690d6099d3674f6752b95d9d1970530df180a3b31dc71f9dde0f8a598aecb8ecfb4c1963089c1f8dbd7b61e9c859e38431f50d72120b3860215a41b6e69f1b384d85f6de1fc21e2b6e9fdaf265fb0769066d89e163a4fb9118dcaea7cf414ad1cda737d712726e059551747bba18dd63fa539c141e4477d3b4d74eacebf1f91cbdc0da4b19e95c616c7b3423f8588485e66ee687af69c5f04c739d97ae2b160b3ee7f6ac555e9ecaabbb073a481393ba5ef01a6c13f6e2bc434a85c88eacbe4b4ca685392534d61c0c2b802e414e99f3f8e7df24043c7aec2d9623a17b07629eec6650096e35c0ddaf7eb867138f774af82d635528275809b54958fae39d108c5e74d7de925849b4e4966ddcd7c84116abed175e3013b90b34b17c9d1b1ce802ea8a2464dbf23b1a7cd12a9a261a3fd2db78216adceb8ae84be5b0b4ee550d72bb235f4698a93342709663a4529fcd0f66129fa31684c4f1d1cf822205edb913ef2c59ad0e3500f34b75aa4af5b521ab8d5931d79be8b7d0b1238a49860a85e11b0f5b7a934e38d164954e7c48081a6550204e5418904665f2f563c9078709cf0a2144e2e267dec2dc15161dfdcbad3d902cb5ff84181ead7c65b1cfe40779bb304d3000b7b6aeed314692bda962fc7f512de9d7b7b5f363fe2e174b25d1e3f67c6aa72f415ef26a17b6fe70023fd248417fbb3f2e736c544f3d71e1b4f75de3986f43de43839270bea01e9de0e101b043f9ef5c6a6520022547ddc3e09ee782cb157a45b7343a9d7b5e21cceae77d09ed14370e9753a5402fc9a7cafa3af80b6c5fd95e0526db8c5a82c8effe818001d00a9216499fb96237567cdd3e938332afafd4bbe552deaa3edfe94b78a73751472520ad3bf27e95c10c1dd1c3236b37328f5ddba26e55ae84da82fc0623ab59a507447b286c3e43793acdb0be72eeb7a1c7dd192f9976cf1a5dea746aaca4f9b165ba12460fa779b85a44faed46dd2131b8eb326e43550752640797419cb9d3b5d47044be89da6e9e4b1b0c8c8492ccb0a54d15603d746d19b45331b1b3fdd106324ba976744a661677c973e8ac9b079e097dd970821ee50b8122d0d4cd354087c529ff0cddce2921108fce6ed68fa10f0931a8c216bd68908ed79531022d32d1ffe0cc760c3eeee418f411e592411161a0ba5d44eea3eb73e56cd1334a341b22471da48fb147fe92e9e02c8ab84078f83a178f25cfdf7648805a0fa9f98bea87c34d9c706734b7f8fb44616f5ff4efea26e057a1224650554d7403bc3d0e5db4c77bc94042ac44a3d226b64302a07532164e0d0d889b32c445181b1113133fceedfee5ae415fe323a247726736dd42553efbdd4e67ed41065e066913fbbefdf28931eb4da73427e4632ec31abebbfcdf6c27a31b60431e08fbfb4a829378d5fe96536b0b2fb0f8fba7126d3c7b4f24c827d24581e6582865060aca59d4fe26c93aa917e5c822be32065e0e60bb613b97ac3a31ff2c3677c7cb9e74305f20c0d3142f6a42d2a1cb485dbde71998b0ce32e53a07a8a5b8fe755b4336f4aa043932c31fb2a105702b70f5c4ce9798e283f9c3c2dc992cb66af3ece030454d0b2ab38242ed303b9d6d249d65f8508de6548c363a811a5d0b89477a223d6185f2149694b7fa3ac4dd711746645d43f4dde719b1ea2af4b553cdee9dbda788cbf92fd1e0d5cecae24983bf0c20b1a4e6881d5290ee1fa7af0f29d07e55f7f825ce3cabd0ac529e1862021b7a0ab82939f9d327b412268f473549ac5ad5e1f857f2ff0b1f95ea0161fe6924fec3d9131c743e6d412b421e28fb66f87f5a659a7472744a251730f92b9e761c98f329bc1da99ce3394250f8d2c36458ba5587e4ddded1698fef9d5e91197233fd10a1dd1d835224d92d4b10056ad71d10e04b435faa093a4a87b0546d684f72298b9f9bfb2ce09f7947d817b7a792226376f66711a98a5b1ce377bbfca516d95fca3071eea13674c1c7dae79e36d8e34c1d74e5795c4337b1b7430be495d87a03227adafe88c882c2a4712e5229266416a3e7fd9debd18056dbc215224de70ca113ebb8315a1fbf1d6c2dcdbfe0321d734c5e5c47041d232002a8d0738b35e039a355da0b2da539e4e6335c2c765f8ea2c71ef62830f289ac44952ed580b8fe13ffe6e5c09ac03a9c9558a3e4607d6b48488c700d5bad10244066f747d4a93e15f803955f228e35966ea9d2c15a6c3a5ec9f364b92edc78b683684e2235a556c8a5af0a69de9e7f03a08eb04079ed4179d99eedb17beb90de2d461f5d9fa5bd12c760f04536521dd704233cdbec27002eb068b66afe8507f1dbc7c79bc1c05ae72117584c4c5b209869d9dab1ef0046cb21eb9380702cbdfdff958b5cb0a858635dbc773aa30d0b4be32cc9e7bce6d47fc380ea1405d34f33a9249047bd89a34bd388a6ce9ead32a51bc1bd17816a248e1cbf874898615bae75c99f57760dce416761fed39e1837519962aabec4fe34de370f015a3c9ac1a0fc358c638c2376d8b1407ac91a45f7a4d0807b26993cce72c5b824d7e788ccc654cb1adbfdd06d56ee62e81b4e731545fadc1391919dcc7983aeb7b32185802526ca9666b2aaf108e9eaa80246cf99c8197bc9974ad5149742c2863296cc556154f7237ce69d489e6ce13ce56d3e4b131c4fc4148df66769dda6c16de4041032036c074411ba0fa14bdec551b7aa13e4f891c416db5e7d26ce32d284d26f31d821e5ee4bab0be0f49f13530c1c8e6912dc83a56c152b4c74382ba665c518552b1493c677211594dafb96238e199b4399d5f8e9bd4cb6239e82d8561d8c5debb0ff1072635f0518066195e5a7761022d045745d18c0037395ee3a5828b48be1ac4934d282d49b0ed3dba150bbffca3b196b56b1309431da25a15ff3d5649d07082bffd2799d9cd67f946c16e3cc7f4889d4bbc694d4bdb024cccdfb3401f0c132e87b55d07a8ab90b1f7eeb6c8a5e827c20f1bdbaf1ee8677b0675b039d23382246fb33853d9e0f558c6c19c343c0945152f47ce4f536968fa744bab491db4ac13171284050d822edd33bbb6c297460eae4b20d2b9ed15169ba66c767380387d3b58219006699e9ac8944f11beddde43c94d2aea58868c7e72301b435a04f3ffbfe7c64867af044e7e641e0adc46d36becb0720f0c0f4499d474dd5532747b82e2c301188702da421496f3ae0ebd32ab9fb34fbe2d0026829bade6baaef54e5943358e399efb1634f90c5d6a1d88018de5af304f0033e1aade53","title":"1203. 项目管理","link":"https://leetcode-cn.com/problems/sort-items-by-groups-respecting-dependencies/","question_id":1309,"issue_number":34},"32":{"day":32,"pres":["模拟"],"tags":["模拟"],"whys":null,"difficulty":"- 简单","description":"```\n在二维平面上,有一个机器人从原点 (0, 0) 开始。给出它的移动顺序,判断这个机器人在完成移动后是否在 (0, 0) 处结束。\n\n移动顺序由字符串表示。字符 move[i] 表示其第 i 次移动。机器人的有效动作有 R(右),L(左),U(上)和 D(下)。如果机器人在完成所有动作后返回原点,则返回 true。否则,返回 false。\n\n注意:机器人“面朝”的方向无关紧要。 “R” 将始终使机器人向右移动一次,“L” 将始终向左移动等。此外,假设每次移动机器人的移动幅度相同。\n\n \n\n示例 1:\n\n输入: \"UD\"\n输出: true\n解释:机器人向上移动一次,然后向下移动一次。所有动作都具有相同的幅度,因此它最终回到它开始的原点。因此,我们返回 true。\n\n示例 2:\n\n输入: \"LL\"\n输出: false\n解释:机器人向左移动两次。它最终位于原点的左侧,距原点有两次 “移动” 的距离。我们返回 false,因为它在移动结束时没有返回原点。\n```","content":"096221cf5b628be1e73e8bcfe626c7347382248a04fb39af0a7771247d060e0f0dfd94642bd18e5c0372ed5596684b8bf24d65cf813e07c2e763b522b5efe922ff3a6f2898da8ff0062e8db59b925f7332e96ec986ae0e9120f437cbf3b6be831436c0446ea79229203f4815c0928bfdf714bcaec084752f916f6d5b19831aa076394751750d135a1cf979f611cf64cf6c175787197c2f30b4cb4025c8e6ad111c0f294a17ee8f727f007093cd7167012bf74e5eaf91bfb73e9fe96851f60c185eb770fc537fc86df09c650e805e1472be20cf595b228ab90a7481c0313b72a29fadc71498f84ee3a221448cbba3f8dd4c556baef5e92e2c2e27a01f310a1fa8da4384ac839946834657570ef5737f7b560f20a828a13a4799ffc7199e8b70815701c960e6c2a6fc45ac721802ca297c82cb020e9dfe72cf8954e8c0488467b2124ebf902e0a516ba8ac47da0d0d881e2a1e5d010ce0915ed26ad0d6550c15d4cb6a1ab3fe943c8673063e05182e80f27cbff371de554b6d043bc65feedcb2630b89502a453182df1728cd0a6c070339b6323dc291bb7cb2b545ae8c6b352d57bee318731f6b8cd4dcd717189adfd95dc6a5fad16d91bc584d6377d90557cfe48177fce18a4cbc171e826008502b332b559159e4d2caab8098418ffa416857b519d11f7303e18c34e0c6d711723c51cda4c5e714e2b33ce29e269731c0b513e5bfe5d4f1b14a69c93a876ed0b0e5eb1139aacfcaed3b71cbb2cd0242763dbffa425f79bbc1a2d9a1540352b3ffc6b97c67633b0d098908b2811a387c3ed30b385f1c2cd7f9ed97bb4e187b6f6b984c7735a55e900f20f344f170484c80741836e7717e54aab7e1bfb5b48060f9e13f25f7d4c0e5c6e0e2d91805d31b1e3b374b47220ee19114d79fb22f4c4f8a36fb06d36e04eab551c433b421c2fa7addceb90cde1177ff4d0804fad0d28f657d4b62df167287409ef3c8d517d05e839a31cce265d91d4470a4579def5640f1239bb0d648173724f40632c29d7f708ed01ace9c6994744a591be9926d3788c46780f400dc8e77a2266395a84e5cb7b8ff10d24c54a93f14e15da23a6488851ce324a24113427ad729216de9c6ec963648bb6a0cb0790a444eba4d9a73b526f3349e7a1aebf18446083a819cdfda2a6245017e233c0c0b23cad9c5143724a0aae810b40428557916aa8457f32252de32d244cce48cfeffefe7e87cf91a89e0a2ee688b9e999848739cdc31f43aba70b81048bd6ce1fd00b9523ec0e17584f08d367868fbeaa7de1f5024a4e9fbb0f8e4b18ee8ac1dd6bc410cbc43e7550efdd92fdbcbdb218c1649dec3c89ea5008f040a67b9258fc6c24efd63f7205ceffef4aa3773530d670f11d2ffd89406d131e1fa76ddfae083de70fa20500e42b2a07c0472818f1f90baba3738089ea1251dd1964e3bf592e7c11c3aadb36187099a68f326a97a611b65e55d238b997da955bbfe2f083db7587ce67f08edde215387d21f08723efb9db3c5f095cd69e460526102f68756f63e4a5ed18f4b1d1462a3fcc2158a3645554ad382267ced623cf5c7cf2ad688d3f325869c2357173ddb8478e1e0b11bc89dafa90650e245452872ad858d5fa616576b1b1ba8f7f79f0da6c6f96f266ddc1b8d39f2d79af6526afa093dd10d240c00464233b75ef264445689beceb2ff8b6eaad25c1d2d1b7e9cab179707044b30befc6eaea2c3d2c44ddd29ae1737a8eb7c7fb1ce253d6d06a5f311955f6bff5240e7277b35464560ba9e506b920422a6684f3aed69796bb05d3544b371cf8b6881ec2387786d8bdc19a896da255684246e3b4f5bb0d2e2e5131d3a712839770102fd6328e830b54d060941bad35e8a94e8b649a5e7fc464a98413423629c5da9080ed617456a3988838109fee764888421c917ef75f21409a5b4e3c68fdb1361862ab2d3c77dc092a803ddfd353dab6acf516a9d5c5c8d6e9dc4c55f149a562cdec389bccb50d43eec0dd3549fc04c7ccfdaf78994120eeac171a87bb229ab17292297f1836c79fc6b89948177f6cc8f5191e7579e0adad5cb5fa3ea600be338013f72be77de04985de924c95fdb683009e6214ad695c4e6a4e254401cf9f196a8c14d663029cbd57e6e9943e0eec6fe2a7d0337f03a6be5a99f31b50512bdb9da31311b8e37d0228d59662fdc7139a90bd9881b13dfaf58f40b15b43acef3bfbda0563262fc65a571f78d295365fc0e468abbb8fef480a9e51487c7b2769773b58316816279f282a4a48641d1d903060c3d2385576d0ad1971ce9b574bd915509f5639262284cd5d8a6753bbbaac55ff78f95d3fe4b43398cd031e782741995a35334a3578f7b2447236616b81f9ef368a8b7f4900fa54db34a215a9725d87ee02c86220acc0f6d2aa3b5e5789265f48bfadc3ec76aa18c582509e112e3200a74088d6c2bb586242f9bcaa896128979d6a13e573b7f39af129dcf72749a5f21d1df47e6ae5b5a1203dcf6ea2adc6c39e2f2cf3b0349ccdb0d392eec3ced4293c3ebaa6508ac5f8e590aadbc457bbf16b6a5ae63431a9f7629ef07451057e15883c8d05f0e6db70613582b433721d18d417dbf816b88cdc8229f2ecb49bcd139f8a43cb26c55adb8d997a50ad4a3cdaa646dd2f0af17faf9f227d9a0706cec55b3506c9fad5b3e1d837b55ad2ae077346c7b02456c70ae2d7d0936a6b52cb697a8faebdb67e8ddf7b59f842327fea0d384e933f5525d14a15664ca201744e4e9ae0f84ef35400db4f0b36caaf7006a22b3fe4a5b58be6874d23a0e46405f1e54bd8bb2b83483397899deab736e391d723f40c7429ea27e35ffd3b9bb4b9c3b029ea6fbcad3d5c3444775939a6f0f26dffe2ff265ab1717e916394a7c9dce89d8f82686e66ca66c894f842dba1efe776377545396a2bba1c64cd3039ad8688e9f32256904e77bd5cd10ba1b0e41873fcd0f2181de8bdf25225e98a61e7240dd3390b4f19d8df52e7d4c01556796c7e390fd6e23824bde4a65b7fcb4e51f239ae19fdf82e1938ab98b6c9e77c054ff0fa2e516720d9ca3c6c991b58129dec869661428c2e95c844a4ec525a96fbd72a7c3279af3069d2e5d938f867184df90c134421b9856a637c8e57dde2ddf60e7e46de8dd73c09cffdca5d9c092aacd7d92b25381c8c3cbf7509308b4b99a5adeefc73d18a859625e53967703f71b18ddafe5f77df60aebba43d43adaeefcb827adee63d398ec777485e4289508b5e61558353d1f05a86c69554c7cab6a908f46553f44199f45acd9cecceb993a569de448f2da8746728d17d694ab3598d2024063051da5249c349bdf3341c444cfb8d1f359decfced08e104e09a36133ec82e298c9ccb304802558c36643e0c7c136ebeb57c33b1b44ceca9aa6faba1e18ac3055bd61afd2a9b937b55b3eab9aa9833f8e93661f357897fb257b888d70ff46155d85baa3c1c40a4f9d2353c9a13cd4ce022e9603b143116d6c9b9b1e4d3e58f113e0c963f8c29daa82093d9e3fde6958c4b738546767504662860c7d25537b5316647214c3d87e14cbb05ecedb896a38fb554f085a69a3a42635cbb44ab5d86e97e0013d9ca2138cae1356702b1e9992825b01ac44dfd68301398623ad1b2cd9dc6727553559140061262766ec4f37765f635f0773023741822c38dd3af790fc34c4f295b75b53ff35b2926aa8fddd8ab42ffbe9bf3b0d326d989da55438a939c4007f9284cb6dc9c5d35f9a52e627559b1f12dbb2632658e82419861c523d93c63852dc715f7308f637aa2d5ec075523bc601108f9bf0c4b8a7f8faa320884fb6541e233b8674ba62e57f276f7b5b8283bf786ec4b12f7f2f30cd6ea2242efc4f235da8ff6e8de993d9b28ea4fea46bb456195cc36243e58b6d1bd8a79293dfcd88b20d91333007cc4720f799dab9eec6befe843070583c80437d14761a9ab7305ba49599da47ec44a132218547a46254de2c3abdc82873bd8993f230e66c9dde1acdc40a1563645df5c3881f9f09225d60d9ec28d51aea2e26c339fc9bf8d93b60bd7a3aa7270bfd83d7709d976174855d9c8dc6ec66ebd2ca8c3e98e5275d5c24e16ca124e574ddeef61125340c869b1e13817bfb0f5246142f006b34d5e0f8d1b6c3ecc89e2968f86c079fd27dd909387b84df2e92fa6c788f5cdde121b55c17d29eedf1c7f9ed19273130e6717cb4088356f76c32e32d5beff80b192dd5a7cdfffed193e6682a0e0f749533791eb2036945445228e6fa9c9df953a23d80e916fe69549d3333fa8fe8e17e9570ae8e714f1c1b49e5634ae7b8b9b2e705c597161da54d5c2beeb0c737c621a43b8113ac28ffa07c09c2006dc888b209a260d4ab2e5b55285352c9be4c8edce8d2e1aeb386ee106801ca1d942ae8deaf21d76310e8f3b84c53967f1602a3122c6d64146b66021e11eab0e8e3960b2ff6ec2afd01378def0ecc947d2fe0e0bc80dd84ed0b7cf583a3685f287fc0dba56a68082db8229ea69770ed6557b40f647087ecd58e10b60e681a9d3349fbaae1b3c26a748eef33c8b5588c50cc7fd20d2c5a662ea0a36e2110e94bf1aaa73d8bb196176f461ba7fa668239a29cc65270e38ab5e2ee013e32ef0a3923c6aa3dc3b2f9170d7024b82e2db9a31280d88746f7545e9fec40106ebe4597f20980d42b9befa9f6075c94da09b83e6b823b568e463c48159891e3c0006fbc7e70f3804559d89b74c7191b41756de380ed0a3d89b6d7006bb502dae3f8966fc3803edf66c812f26c92b23dd80f65c5e57aa591792beb71c64350e460a794000cdebab864e2aef405c5c3532e1cf1be3db2e505a745f52f8e154c8927ddf11d318845b0bcc2dd6e7123f4af342e49fa981fec49ecb8b343cfea1a1693a3d70a340a57204027fcdb1896a3ac6bf0829b89c29177bebd2edc6415d4b17c1f5e7638444f734083603a5af8661d86a45880df5ce31c526f486fa3db655e9c721eeca9df534f19c1e29662c3ff6138e5d330ffeef6dac48f80c28120ffb3b8680be28b77c19c145b2e441d5aae07678090869446c5c38f17e42e41246aa647d614bec866947f78f123452bd0083058c6b793927fb0cb8893c18a808657fe965cb35a89a7c1a52f302d5df2a3e0d3861cb38385027ec9522ef66047a0bc24e8c3de8c8381ea9f97c700481489149e7ba59d64970b7ec44557631f1f6bc9a76109027cd6dac8563d1475f791165df18a50d687c9095b866cf55dd4ac227f07a9560a07689453e1cb6bea5a535681ff2123043c465967e0fbdf1c009adbca96443349a9ac5c39c524e4a0dbed83ceccf9c4817b5477294dc67284800a92361a83c7475b8743b5dd02132362a76e1a5ffffa9c744cf1395ea45506eafbbea8267f318b76a4e7582e259c484ca39c3c0dd87200a9eb9975784ee38894fd9ef21806f8de03a98009dbef57147f8356e26cd62bfa95465752d3901754d537622fa2618affd4f816f1603d563df16edcf7f04edbd5d92cecbab2e6273daa7cda6c333408614740282ac6d3b9f7a62ded1575cad7fff733b6ab86ab6075aa0990443dc5c9b06132bd230b3eb3778c54c9d8a8848195073ac0596945631bb68296b0661be0a025abd9183bfe034539b9b4078f970d7667440acf1f77813358a5f4127a843fc976fb1c9e4f6c1ac2b98d9ca5f6bf2fb71811e3fc2a83da8479fdadf2b871d6211850561d66b1343ca821f40d059db0de362100e407192349548800aeda9b5e140059240b05ed88502acece03bdcbe5123328d3185a38ef96","title":"657. 机器人能否返回原点","link":"https://leetcode-cn.com/problems/robot-return-to-origin/","question_id":657,"issue_number":35},"33":{"day":33,"pres":["模拟","堆"],"tags":["模拟","堆"],"whys":null,"difficulty":"- 中等","description":"```\n给你一个二维数组 tasks ,用于表示 n​​​​​​ 项从 0 到 n - 1 编号的任务。其中 tasks[i] = [enqueueTimei, processingTimei] 意味着第 i​​​​​​​​​​ 项任务将会于 enqueueTimei 时进入任务队列,需要 processingTimei 的时长完成执行。\n\n现有一个单线程 CPU ,同一时间只能执行 最多一项 任务,该 CPU 将会按照下述方式运行:\n\n如果 CPU 空闲,且任务队列中没有需要执行的任务,则 CPU 保持空闲状态。\n如果 CPU 空闲,但任务队列中有需要执行的任务,则 CPU 将会选择 执行时间最短 的任务开始执行。如果多个任务具有同样的最短执行时间,则选择下标最小的任务开始执行。\n一旦某项任务开始执行,CPU 在 执行完整个任务 前都不会停止。\nCPU 可以在完成一项任务后,立即开始执行一项新任务。\n\n返回 CPU 处理任务的顺序。\n\n \n\n示例 1:\n\n输入:tasks = [[1,2],[2,4],[3,2],[4,1]]\n输出:[0,2,3,1]\n解释:事件按下述流程运行:\n- time = 1 ,任务 0 进入任务队列,可执行任务项 = {0}\n- 同样在 time = 1 ,空闲状态的 CPU 开始执行任务 0 ,可执行任务项 = {}\n- time = 2 ,任务 1 进入任务队列,可执行任务项 = {1}\n- time = 3 ,任务 2 进入任务队列,可执行任务项 = {1, 2}\n- 同样在 time = 3 ,CPU 完成任务 0 并开始执行队列中用时最短的任务 2 ,可执行任务项 = {1}\n- time = 4 ,任务 3 进入任务队列,可执行任务项 = {1, 3}\n- time = 5 ,CPU 完成任务 2 并开始执行队列中用时最短的任务 3 ,可执行任务项 = {1}\n- time = 6 ,CPU 完成任务 3 并开始执行任务 1 ,可执行任务项 = {}\n- time = 10 ,CPU 完成任务 1 并进入空闲状态\n\n\n示例 2:\n\n输入:tasks = [[7,10],[7,12],[7,5],[7,4],[7,2]]\n输出:[4,3,2,0,1]\n解释:事件按下述流程运行:\n- time = 7 ,所有任务同时进入任务队列,可执行任务项 = {0,1,2,3,4}\n- 同样在 time = 7 ,空闲状态的 CPU 开始执行任务 4 ,可执行任务项 = {0,1,2,3}\n- time = 9 ,CPU 完成任务 4 并开始执行任务 3 ,可执行任务项 = {0,1,2}\n- time = 13 ,CPU 完成任务 3 并开始执行任务 2 ,可执行任务项 = {0,1}\n- time = 18 ,CPU 完成任务 2 并开始执行任务 0 ,可执行任务项 = {1}\n- time = 28 ,CPU 完成任务 0 并开始执行任务 1 ,可执行任务项 = {}\n- time = 40 ,CPU 完成任务 1 并进入空闲状态\n\n \n\n提示:\n\ntasks.length == n\n1 <= n <= 105\n1 <= enqueueTimei, processingTimei <= 109\n```","content":"096221cf5b628be1e73e8bcfe626c734748f20900a3d40987a09637f20146dacf34851ebc96472cdec9c7be126a0a557be330cc8912f5ad2b362f921bda5ed33ff3c666096c78ee0002dc5a98cd0497725e17c8291a5419d24ac6aa48de0efcdd0e0378e9a7b1dc1c6b9d8afc0bbc8bd7ebcc3f2c2ce2e00fa3f520fab239e7a9ad419793b7c193140c6ed67c90fe621ee1c538111540b3292cc4c3ce0e5b101dafd712f05a4eb43276440ffa8741a6622aceefdbf543e3ef30482f4e1334e1b0d179c3bc5c61ccaadc55d68e873770f9d7f916816418ae06f4cebaa3b532f871b3f30ca1b348c6e47ab9f305a230f04dd8aa42e3d28a6e7cbed08ffa4c2c728239808526a2bb741c6aeaccb8f5f323eef8ceb15986fb60e1d12c222868f6d955601c0886caee3c72bc45a7a41f047248da7743ff3b165a3051badc11ed77dff7f4be0c3286c085cdbf1655c480e961d2a3051084565559f1528fd853805699de2ef9728a3dd17c03d25446a385aefcc16cad514af5b2ef7ceae33b86d3348ecf066e1c980b05663162ec02e5be3051081321cfd988f65bb806e0ac25b5e48621206437440319c08d7d31f189affd36cdaa7d2e2aa7dd8c486d79a720557cae29179fdff884cb53d11896e0846293f1252924cebdfc5ab46f64de99665142f847cb2162e9e99d21f8ba4c96a2b2b27878f7a43c60e7c65defd4ab24399ad7f99a462443b4fc735f95ef44793e9e29a4115ce86f99662705f984ec5ace3c6c05a8305267d95a385cc4c5e019595bebb0d1a70645239ca61b6f762120d46f6445e705a50cf9692b2de362f1c1e42da21655ef663fc4d1aab21f9f1457090c3722f5a12cbb10cb6f9a9b4838963ede4302effd6d3fbc4dad9df08163c710b5e766e3e88e5557cb4d69aa9296771870aebae8c687d71eb04c877fa32baa47aafba90448f2b19b16a6d66f4b6998f21156808952813c76dcaaace9179eb3ac8ac4e432ed3209c46679956abdd595cc22089b11214247756d16d73eece1c4fdf8f03abc150decf15260f81ca5650086f409c7eef9ca12bcf3f00141597d63fb5e701d1576d76bbac50a12ad4378df373c57b1dd681ac8657b3452cea988c865d12bd0c77953175650de856f305b374a229cd321d829ea43b593aeed6f59c7256296368414a1e6e56ebb29a055467a0f48732f15914333010c2e25cb24373b44ddb234ca8d0c38591c2b306ec44cec5cfb248d6f1a8f11369fd9e039756a73ef6202be47b024bf83d520ceb270f8db0de1f1116cb83c9fb4e1a1febb1c0eebae5f73489c01ea0d87e51e74e810c0fb8be1e9989c54eea1cd279283156ff1bc57b2fe228cb52468f4299e16d2340d5f3eb98f3fad2e2e7464ad194b28db016b82653d964f7e290de50cbfcf9cfcb7f5ffdb61acf8d4ff1a6e56f1955e7916167f9f0fe8bf8bde2c130026a578a37a3d728cf65df5024435e82322cefe565c013ba93713a53d360f809333700567f10a7b24434f4ebaa86c6737695c467e46b68693cd515ab0cb181da0a03b166c7ce0d4649f55d90d9eae61591edd434a6d05c0c58cc6802b9ab3ef2ff221443181451cf4dece45695b3c0ae1d7fee596f23768d849957a731496a3029a9c5d4900985c6d1712752e1158008fcea9ff1516415bf8340ead68ea2c2818215bb2e88c0e7387867333a32c3a5d0691f371b728896f8178bcd3507fa9272de14451468c2dd008e183b9a05cde974a22c752a341ac43bcd4c361ce5dee70d51d9ecdfa5c198f0fa76fc4d8c764c2b2803600ed77d683da224bcb0d46d4182867e694c31c9183baa7e4ce5667e632f5ec094f5af471a5312099ba2b165a67b658102f6211d61059283ef3b5241374581f239f4d2e936132ea472b622fa8ee13d5469f6d28ff85af2ade4234db27118cb40f13e38a9b1dbc49ece1c77bc2086c8ce49dd939c00d3d213308b7ccc70559c6d788074a10260d08a1badcf517b1a4e08d37b8c2481435c9cf74068e5dbc592509b8de5de6ba873a4289f032f28b4fd96407ad44580a5a37bdbfb8e4398e84d8b09fbea04ffe5a47a5749adc8e5f977ed6353b89f754dbf7b9c2e0c739d2ed147760160045d92db9df0c6850c0b9cae6a00a09b7d1ac555bcb0f8b980e9c66fda6907d4cdc71bd95e35fdcbff584513f772df5ad56d2e71fe3c579a5ba9b97d68c0e504e66b4c826696d7f9071693404e9620ad3889ab6b2b62945247117602732d083020a414590ca47ede17fd75cf24792b193363c97c5737959d01182f4dcccd04faa31fe0917fbab0e0fa20e26593fe2bfebb5098a855ea9f5a1a34dbe396b3a88c0c7b883f4f3c4bdbeb425bec00974b036d376f1bad46d7bb32e6522b702d866bb3fce0ba04d921f535ad69888bcc1d29aa7c236ab176e736437527fa43ae0516a5d68a45a56af7d1f6ef1faacf7712918f516b2513e762f15710fbfdba7f2aafdd013bb7c615c0884b17d6606ac0c1d7a95d3f6bf5932339f4acc4540e00d6920d3378b46fe1685c5f47c9157dac9a00f5cc0545c7e0699c4a61ae6d5edf0192eb69a7d897f73af1152a51f3caf62cc3b9d92b5237ee0467849f7f11870f18548e5cd957961608f074203cbe460ef092d497f14399e6cdb7643584f02dc400df824fc465f9b52de703cdf70f75f1ae37927b9034bc28e88fa9de8782acac67d7a098d9306e9117bae6d7365fa42c4e41b59c61959dd48a1b1a5af65085d7dc4e506b99334459e4e9c574d2ad605029b896b960abcf3d26198ed8356702847f1b890347277d794c6980eb3b70c66cddae17114208097a422b790598008f847efd7850704cb411ebf1193c1241070f40a9a0b14164e3d7f37a22dc76a145d7fb0d8cf1a8f40139ec83bd21c6ab728c71895884e226b238978de5e8a25224207460cd4fb32b1ecf037dad9eaca162bf4e56935fc8cfba70bb37b8a352240b6aaaa9b8492bccd0d009cb1d5f22355e3e6f2459080777c1fcef82f17d2f9616f44765724c516597f9100b52dfcbb5dec8cb9165892c25c853c82b7fdfc59f5b09500f3114469322c3010d4b280775fc41cde5038c2ea73c83631df00c1c87d47c55115c7cf12b4d4b68b4e69d3d9266860d4ffc17ac4660fae436f8d162cc8ef397f5fed6b8fe8430d7b24e81d1c3046bfcad7884f50c9172602985917c94e2f4cf8b630447858718686f32fa5dcc423d8b55961e75677d8d2cee29d85c6bf1b12a6bee3c8f7d67b99caea687af6ce9bb894c28ed39cdcc011c2d042e92429c978a89b0ae3a478ee4876e76e436078dd258386d9d711b94c08caf9ca5379cf10249f6dd64811539175ade164e621415d6a1a3226121ec4d7e345e2668977bec901aca9a665c149c6c24d6033b1b5995ca8d9da7901318a55345d221f292928b5d09c7f187ae9999d02a7fe0f7cfef2636a18309c737bbc4c9a80974404806a19434e2ce064eac061a89841f4eee159ba2c95e6fbb8b97937cc64c5df87e074c3b4788b4e339f43249dfd267543b62585762d20c723d43afcff3071e618e52a6fd5e16a24f0e55fbda6155160394f9353a90950e33e13a37e9572ce2af426aad6f52135a6df98237222fddc755b8072a2fcebf1df71cb0e558456773136e0c734237373d50e0322a6b566e5fca8bac5d31a757ed2e963c254ce14443501dda53a7737703b12f34231c6ae3416038efa7a0a85e096af4c9f8025b8058a54275c62441499006a18a0d0997030fcdef542a6baf6d4c9b014d4fdfe52902bb7d223d03f72abb2764d55f1e11da1c428f81f4c3b3f2edf5fa10cd1ba7494e6174c337e961d7201d1b2f0bdacaaf7f5999bb15264530a704eb7e5dff2ca9b04022d9296e6c1c395152fecd2af5c3c2dd7686b09ad224911601e3938c9bca38c475ee9799e66d2db5101d7428275490ce75d691c8e9253b1f25877260bb8622f2fc81027bd52cae862c6d8e6157dee99f714fdcda22392835947b46eed3071465bed0f9e29455614c875489ecf1ad2a0fa031d822ccda47c174122d29bbd009b3ca6ab6f40a4e4f987e15d9b725f7590d602fc640f8a9c93d906dcd87dc8b645b8b2e97b56e4c6b8ca51e2685981ed521c63398dd6c3eea8faafb44551a4e0f0a4d7b57abd037f0ab5834c31fa7bdbd0c5ee83945a9d51cd0346eea58b1871f1f3647783b118fe889e40bcae872a606905bc5f546aa926d40cca2fb1e05791d61415640d1ee958cb31592bcd309cbe8e987f28accd05b13599646ce4669da7794ae54ac963d330920d910ed0c0fb7e4a3ded974abcb4b77251ee7c15d43da9b17a1d4aa281b78fe4499619338da51b83a38e4c07ea0a54e29759211ec2203e3b38cba8de4131cc94137491c436c5a264cd5e7980e873ae27767668064aa92093808d2b119ebd99e0f12e9fdf5ddd7c697b2b02f346f26189de83075ef4da93787e5cb4c603271b5744f0540175cddd443460393681fa6594962d1e6c0ff06b92d3d13ab2186c11ecd2755ec86c1eb70ab4c3629fe5f768c1a4f5c4d062aba41b449eb058c3a844cb1461a383a273b2b8bf69a26e7f3899530a69a9c1153af9108d089099ba295ec5e5ac48a98e2ee2e1d31c9253032ff6bee433974b7e0cd82bb3c2cb5be0783ebbc4fd65a5cbefe4922517fae3b24b0223da127c5627b4613b4a47f837831856fff58451b70168d9ae3ec33618e6072c7a94468cf29e0234d8ab99fb27c2964eaee1b4106818b3d9611767a75ba426dc3148730de1e8b1262da50fb860d289e26789de06d8e42b1e373b44505cfde545e34f91f5c61e13351bdb8d8a28272ddce42fc5d82498a6324b6416c401d31b244a39bc1f977721ed5ae38064bde83d04902b3b8f3928b4583d0c791b56432e196df80ba1917c526212fb219137d514249c93b4ea557a4cc1e74e29fa3f4b08db4ffa36ef49eccf3612a8b916080e85def395c6c6b58a3ed4d59a470f271f9967d1d72fbb0cb609a844b4e98cd5295ebb683f4e1d9dbc1d6645de77f4b899c199f894032270c7576e75b65efd8b9f526c88ec92d6cbfa6d2e42818be27dfae41f3265cb361607ba2116029dffbca951ef5fafbfacfe4dcba2191a837c147cff5f0cd46195101f5d6bbdcf854afe6f73117a145598c7529dcaf7ba0ee8fdf8fd3b2afe5a3342152a973e34ae7e07cf45171bf39641164300fa1ae30562903b8f9b82a0a6624f0e3427fb1d3539cf8d24a1e8c3592589ff0250b70bd3691c6ea75914b388f67dc3b13a2a3600a44615b2e38c99b860fe509353e02cabe837250cbd1324cc0263b26490b20714c03a9e7eef5ed6ca1237b8b4fef9f432cc4d7c52ab44000071b61b955167ff9fbbb7b8b5aa4fa38aa9a341078c2233e76b112c9d21b7027ce114adbed1b479c4f43d1cbcf3e5302bebbe090a59f651cb1b228d1d90a89b561790ea129bf5e9044d1d3346b1ba5af7930f7753e2822ef7a05dffc11fe71335616cb63f8cef16bf6d7d806e299a3e60b22a07cda83a9596876251410496955b8c1992ee22376decdfcfe2c790bcfd9443ce72dff21358a8ab81c4bb56f550bd335bf03a8dcfae191cd4026a008590e3912d3ef9acf302e90f40eeeb82b47a32f3d4180f27591ff5455390e00b35e48e76a70e7bb1713ff389010ec5aed5b057dd1d6d39bca978c42cc2867bbcd6fcfd2e732c3e2ae8203b13953044f7407aa4a4d8b4c911c57ef8cae6a26674ab9dee5b19966f93f2b728c84b6c08bf19c26739ddc25b4266123209cb9d918d4a8bb7b09f36b7e17d5988d73cd109551d35641d7f6713f7f0f84f72001021744ad952a0349f5584cdbeb923863983016f38a5eb1523c817e0e87d1e9ef8226352930f201ae5b1fb1268be8dbeb6ee18fd26003d7bbf27f2c4d1b629a5796d85e8aff52daed3ab24208389474cb95464b75219f8991cecbadf4ebede65b23ed765153320f49d1a37f42a2e5cfb33b5d19614d872e8c3e0c06cf01a582c658d7d881b2088237a902c8a14c988459fc471c82b97b07de936450eb646c37f5fab100e914ae0107b453c2fbd9b995f9e6cea371fd61884f9f4cc2be95dc49859158a2e0c4009689ef6ae4895f1d4f200949e83cb8564b5efb55ef7e43c6b384f7f5304e1f351abc28e50042e9e92917f7aff312a9025244fbbc89f012ccbce51be1e347c4325ce002bf893de5673dce97b50f026b232becde3739fa3fcd4c5f068267a3c7fe321fa9263a137dcd2f176a8dc968bfd7ed8cdd35e3ac5126b168c63df85edc48d067d1ce5e92b6396cac77602868804c0ad8413c8f40c730c49c0669ce0ef7ef9a17d162da24d8a8b66adbc820b285ba856c50036664b6d637e4dde6898cbd3ae19416ab5eeedbbff71cb896acb758cf5601ccd2c6e9c2a74f53febbc003ad94d84622bb3ff93db09ca4ae4fb9fc8fe46c0894d8eefc373c7803ad631af5b502da1cc66055e6b3f926d43090019dc6cc3e65cac80b5f85270f9d119084d221799bdbdfc3e8261151b768ffffa3e064ec275e1cfbdad6ab0a8f0eb17f834d2a7053cd2a3d15f4f81be136b731d2813a457296a684941a41a5d2301a5700cc7c47414b82373467fb58a60975ea0a0652190d7e76c7ca1cccdcda9df5b86f8567037de5546f7a33489797750be10a28c9f5ac09ff3c08128d3a8b9a80425e5d6e9c1ccbe93698f7d05b1b0b7d4022978796e9fba38c3623d20ce97e35f4450d4626b0d30d0de6295c90142feea606a21d2a9c8b2dabc2a00ebc3bc0034d083e2f17ee43b7c9b0e1b42410dd102230d7cfbb917fb3b6a20e16897184881361a7b68a35c9c326c6b363e799999cb3d05c991fc63dea5c43814e2488f0233d17e399b199e3f122ebcbfcf9800982a267065a29bbfb75dec0e241fb9992e4b8197406f99fbbed59f963891f5f660f452a09606a221e0eb295a34117b8f351469534b7872bc1c76ac099e3cd3a95ee1119825318f9d0fd2f70d91a06ca136688694dd32733ee1976de81d5be9abe74164ae2c08cdea1f424f78efa1ceae93ec63509735aa1cc1efeba7aaec62bbcbf4e0c2b517cea954df2f5a2f79323b1b51d7fa1c35612953505be688d66f6cc620a7ff2cfbc147b8ee09d81e79b0346e65c4b9f8134b09752b248bddf169165d323ae1c1138caa0d54faad68cd5a0a29a3093c6a2a273909ffa871ec3f9794c2aeed59a13176bb9808a6034165db49f0972727bf457d88b97c76a266f2f30c69a659c3907cf208d25e3db6ce48cd6219f8399b3a7f83c00b0af7ca91e2d201e18f72a529f580df3c2d9c440c0db942e61a3710af5dae9a125d0fdfd122a141f1c21317ad7727e66111a1a442a231ac9f0ebb8a00bf5195cb93e534480d4fe9229151e9fbe25c54ca5bf34b2c20a6b258e451077f7678821e44c6363eb099d1d185dabc87d5a7de4e6f9886aa36d2faf6f02e5668d52046edb90566f8bf4bad8e174e683ebe988cb82a7613547b3475f9f3e1f684a50999c4742dbfdfb95b5969c3c1c136fb822c5271dcf8400cfcd48d8fc3fd46a8d76f4eb8917f728e532fb81f82f5d7e0c2b6c6f3a635972c13247ee8c66732584904f6a5c9b0f465fb6b550a5158e3efb8a4742ed179f5c629b1f8b165a43d1e26a66972bfa2a23c5c34d8ac2b4e0e8ca6b8cbf09edbee560225c8c1a79e7dcca71a738ffc41617d6f168320bf5c4ef5936068ee608ae88b2286a5fe22e580c2444a9493c492600b672a6f068252054b75de9492a072845924bb94e286506fa040c5e5d8d4564704140158612fc9707e4691506d0d0ae414c2429704cfcd0dde49bf2735b12f095f96cbc4de42b093188656d8973a5e174215c04cfffbdf173199371e5b9693ba1b87cae86af0f38f79b8c9e5d18fde4bcb4a6243f9755706ab7bffab33773f2017432861af9acb51c335e1ce0c0c4aea73bd067d00616f815dabf44df0077ba6dfe44697115e0abc24ef802f49bd473299f0f1a2d6fe20977edceb1465889c3e8f0726a6f85ede4d17b0d4f4e119f9b089649f8b810b182f212a8d4569a36f03db096d56cbfa7f2b7a973aa17b44221cf6ed25a1d03d77d904932289ea3d69a25bc6415765fdabc8d7da02baadfb2521c49efaddbded0f957b5eae4f2e3966e62bf2bf3db267df0694b02dcae490f8c15f6bac13c801ae7f1029847da0f47d5434e7207c20f7285b065f883748e8a20ebbdd2adf5b10982403db167c8c757e89aecaf1e8f7e6d1f7a7823fe49e49c2896178d1c15c6515f3a36e731302910413f2a42bc5498b8d7a054f8aea61e84bbf0c11e0d05d2839a3c7ef885b8f6ab42f027be6ebf97064d2782173b3cad2f91977ab0c906ec6c05bb3f5ee2f173a95bbd80e1d6168bc676e37c5fa1e16f1d5f8943ece137348ccdd1a653c46d4ce4e2d82a1ab45614d85cd3d146995f0e6473473d728ad2f293c2f1f658661366c627000065b80abc4b9133b2b501d85bae3ac522fcbbc87bc5d14174fbb6ebe7662a6bb3b71a5e3795ec763235c8adcce77e92ec0b94fb194f999ca606661b79d2ce3c893ffd4ae2c83ee28ca39d80942e1fa3c8032c26665bf436bb8161690a214fef60022666254f24773091643a820a93dd3296ba3592b5ed1d283ebb8b0d7e77fb332db3a9459f9ddaaeae54ee295326a408833910051d88f9d48aad576e1b38d3dcab18567047b68a2f66fd6d1598606f7afdbacc94a4d57dab9173c68b7271d57a9b8b73c0a32104813e22ed92eb8127a0cd8e8354897b2f23255701e75a5f9fe26e06fb0b1f1623e444514f1548d0117fd61941cfdc1ad3d949b88c6880da3f27e963f0bfaa25e641fe7475c9bb24a246fa9a86363b17555e9b80629e6098db54278c2db53b25ae8cc5bda06063cd1b81971a5d5f69590920e4190faa52a1b9dae60550be73215b0a9d9d0ad96bb24780deb44375f975db5799cf458945269410916613dc1999b6d0932319b7bd49e4a75e581bc7fac896dcd8c8bcc49a8b9b9f1f2e833d54c55bd7de77b0dfcd476a99720a812d2ad7650435c6c1d75318aa95497b29c54947e6484dca2a94057fb12e86efc9e70b8d33aeee254277e55f9855413d8360c7af5291b289705351cddecbad08b88a06a96243cf8e0681368a7bcf9a565e143b624f3e5b08e0e07211ebdd51d810a5a129a07f440617580dff01df6fefc1ae3215007ce3d1d251b960858bd1eab6458ed1fd29b0bb0e7720fe3004657561783bd71d30b68185a9b0c0a5a8c9f2ce817e1d4fe261c824d83a4458c6ab256953d4912d41707fadd97564aaba6cb49114ad37da8241ddc71357d3f0609b51ddec4f51577fcae6064a3b562a44982ce03e4aa964a9cfe32bc406596acc10498f7c8a1025c55dde8be29fb09bff60833ed3ae6598088ec23ca9481fe3b449e21b6cfb5ca59b78a58b6e211a0e2acafc47a85c074f8060783500782526e5c498d32994e308ce4c56d1fbf1c4de03ce7ace3f3367242696cb1677c25a31f04a3609cdc82c8a0c1ba2c96c2f77592b07271407ec6b3766d121543f44cc4b5d622f5249230cfdb3ff78cb68d4a7f77aa871df741590498bfc259ff2e5037af10aceb6d45327745bb29952ae03d95194de3454596397e60771617e8cc15c2ebc4c9513e555d87a35e8d733f049fe718e9bedeb6e7839be92d91d768455544f367a85b011e9b149e0f1cbe8d744702dc891449db1f0ad989910b1fc2cf3d00d418b08f349b556f8fd1d775f304643fd70e083878c7fe2ebff77d060a6189883fe3769de7ef304c59d87892da9ccdbb8a00d9a3205ef785f02a8ebf46b2e00f20a758290a092badfc35e658032f5d6e830284284d6018aeeba50715cf0a141e6a54d1dabfd11a5977f4ade2b59fad3c21294015ee66e0195d9d1970530df1843332a8e25fe98b4bffdc1cb998e86fac1d875c0d1f8d0d4a145a68fcb763e4b73d77a0ab3860215a41b6e69f1b384d8086ce6f421adb0e5b8c86854f937de24d2943f4e03f75acf9bbe35896fbc61da6f6071736fad1c5c1755d7a1c3996ba5708f05a1002f7e080fa48ba609d7c6d5199cf9bcd09e42b3f21174d6f31c176de51573edb67504c768d73bb2e125fdaa7724dd36aea4e8f4e27a8eab393ba5ef48e0c96f6d60d9329f5fd8ffdcbf97e96808b853092486c2eb4db64080cb7ac32efa1352c2a58bd9312052a16c09a3956349edfe5b24ade6d1cf146da76eafee9f6606f93ccecf29998ffe28db158bae6f61ff6ad5f7071a32a68432d06c17b7d125d70157d9e01f6c809fe5b39a04e1ec1236c223f3e2d307979472f1af78b7ac51b981e9e2c19d40214ee550d72bb273bb3b8ac366290d70025060be958b3375b434681755724f86593023c0bb3ef2c59ad0e3504672b71df6b4474f24e88cc1577eb88c546d4671df870ca95e11b0f5b7a934e38d4b6354e7c48081a6125019f545a7067a10245d2cdf2f7081f0ef083c0c4b6fe338bb044beb86bab096468e5fe26babaa9786184cae6a7996aa28c752376176c4ce19266ec7cd14bd8d5b88dc2f3e451c3fb2b33bad4b14255f8f945fd852a063b43a3bb55f25ff3ccd54e6b4e9b77ee100b6915f1b5068d437c5cc59ad6b6d626ea446e992415e5c1f52e6eac6b461002f0a129b6c4cab2e74f240a445234fa4d7e2ad15d8f45cc79cd54434eb74304319a6cf64bee9d1cfe4d9b4dbb44c73ee97b32798f7ef6e4e0363ee6926d6a9c523682ec0c8a53a7674aee045a34d70a0b5e2e584f3d72c1657265a469aec73e02055828953602afa3d3bb992a638de5dee41bc6fcc2473cc9a4d7404fdca8fa13d88b1d54dfd6eeb761979d7d0ef9662fbbfdee203f9d708f55f18e4776ebf39dfcaff0cfb941b996b54c4f665b0665068754c646c5dc7902b5d4b0f4be89ba6e8ecaaf495800026d14651db4004d029b5df4d3a171b44db6d2d22a6c3375fe52b6b71973e898eb0708bd99ad2006fe74a92122d0d4c81115c2900d1f099dae3961723cacbc437cd55afc71db63572caa712eb52112273bc6e4b8371c92193bef606d063640b6b5b53595facfe32af7de37104d15a7af75fb26579c601d1442dac2ed74cc8fbd94ddc3c6d9278b3107d884ada224db598bea87c34d9c706231936c0e60f0bea8058f9a86e101d321f497454801878d0cdf8926c6585d84760c65b2c1e250b6236773a487afed08992992c445181b1113133f3e2dfed7ddd1bd202392977cbe0f6119ecdc5bdd48a12d4442cad239122bbffc402931eb4da73052c0968b34e24106b4f2a34fbec678ac2021f41693fc1dc01b60df8f96598f0128fab5b26d3c7fdbc18822d700a1e7882964b4a86a59d4fa53edcffc1475d9562ac2169fbb411cd49eb258df32da28d224f1ab7ad181cbe42121305a4eb787a67e4d7949434dad07eeac1d502bc34e74975d4728fc68f0fcc57b7f171d0d285a91bc8e6e82de215ed951df3b1655570f269904bc698dfd1ac89d59fa016a62a1141d213e41b22972348cb32a654e880eccd7fab2ad643752149691b2dece60894450b2f0b907a0ad87d9320f2e0045238c5b5f2933ed4b383df726155b8ef77d3688b8b455e072bc486525eb5a857dfc6c73faf102acc19aa8df5488a7bb2fd7073aff7a5c3c3cfd87c3f49723abb391ed69161e49343d68f360d509b30f8952f3c9561ef288169855142db03b52424256d98f9a74da5451661ac7a5602b690e556c28c3e82cecc94ce018c250f8d2c36458ba558391f92b811afe6e0d5bc5cc76a6d825351d9d667743295dab01f0dad719f0c02a570e0db8abefa54397381bcff73c4e1d2b1adc455a7b01ec572077522616520332165d1ebf58b7078f4ca103d9eefaf1746c11c714e084ea578f577c45bb8ac1e03c7b94e000a407abe4c568de13630b181e8a78b0466097dec22937b41277f27a699ef57503dc3681d35a424980a14bb8315a1fbf1d6c28e9eaa562eb334be98ee5a41d232002a8d0737fa11983adbc9446e4fa873cdd3da4a70b46312ede72c9313dad21864c79676c3ce256015fe6e5c09ac00a90cda13fbd6e9447b6f4a598d6950278486dafb9cff824514d344cdee598625a1d9787cced83577a5ec9f364b92edc78b683684e227415763cf12b9d99ceeede63a5ba51f7edb985193cdbea444f1eb59ead27de982fa71d236460700537a7aef795439c0e7a61346960a8b36fda71a3a5ee80361fc080fb9285d2ba2c495e046ccd8deff3c946b25f556fb775551c2a7b0ad0de7850ac4c866c0ed73aa7996e9d82a99bc6bdc62279371501b95a5b71bdd5ed383a37070b74d80c7348c9547ce85ee1a9bf9cd6cdd2f1c6da0781fdf6c66bb162cfdc2f6ce1b76d95aaf2834e1dc12876d51bf638330ed22afdcdb8e54438c1f8831c61d608bd38e771640cbb4d4a5915d841c1322b7b8691c542587ef4b669bb3bf1b8b51a736d31d6636b8e08fe3e9d6f3e25a4431f549297f3726795f1bf77b38ff019e647af0d91449324b40d2a5dafe5bb8446a7ce38cc6fd258893d9a1bd7abb56761645c213d56b373cc62961cfc14c85ad463cb3992bb62266633b52869a825b2f857c48936e7fee6163ce474fd61c472faf488f4c6ee773ab447054b9c9a3ef5a62986f34a791e8d24ddb44c92b213c62db4467e79ed31eea3d86adbdb487ccdb6678a3bb09733fe06d95717e1c1b98bb7bd44cab1f000d408b23f8a5cf4e9ffa437d1e65013b2e7c697612a9b97c47231b90a9ebee62ec4fc9c3133c7f14b8bb44976370ae9ddda5d9fe7f716c545d47e4fabf1c1403ff1cd49aa964969e9c54b02ff80d60f898c3a70ac2440326cc6033e6461b9ffc9bd0c30674da0ba4859db9edeca0ffa6ce3dc90e145447e17ea7d4c6e65bb60af91ff9cf37eca710091ed3606143a584d3c1acffe033ccaa94ed02a6c71c1e74b5311030268534008321ef329f9c053ff8a015a6b31e5f2e7001dbde581132be7836020876bc7c2986dd9b800f7b948a835589051d9228b2ee13667b657bedad192d282423c988140b6545693309dd77e06dd6a8780b30838d4d4192649ea598f5581d50d0a30cd22e88e87b783c9b63a13b4f2fce6b82ee63c6b493a1b6bfa1ddaafb3a46d21e77efd07f9599e4d62853c3a2d6724d5a38e3ed12cc283c5c949e43e49a1e4a05f26ce072d318bdd4065cd74dcf0b541fa9509025ca3dd0c7a20f7fa77b9dd9041f397aea0d5c7815c81793c637e9e0a2f3280991241f184c6b7867d5f36987b957c2f7e77c65daaa57a0dfd098896f0c46507a3dbdad2735e9f8585c04c791849d75d01114e595924d344c482310fda04a41a90e7d23b80d0dd9e6327e1724e566c1515ce6085252faaab07efcb1290def28101cf0d3b58d1018f3cf065a601b375a0eae8117b85c58f955905697e9830264583aab7ea1c125c0df0d6c8132b2e1506ce6592a2da9e7b4f3eb34d0a7794e6edaa83adcac1b150ad884f492b10fe1b7f8891ecde0a2a27f3cc5e1e2ebc5c2858e9a607837e10376810ffb6ef653b94a79c0b0a637a5401d63cb26c925bb","title":"1834. 单线程 CPU","link":"https://leetcode-cn.com/problems/single-threaded-cpu/","question_id":1962,"issue_number":36},"34":{"day":34,"pres":["模拟"],"tags":["模拟"],"whys":null,"difficulty":"- 中等","description":"```\n一款新的在线电子游戏在近期发布,在该电子游戏中,以 刻钟 为周期规划若干时长为 15 分钟 的游戏对局。这意味着,在 HH:00、HH:15、HH:30 和 HH:45 ,将会开始一个新的对局,其中 HH 用一个从 00 到 23 的整数表示。游戏中使用 24 小时制的时钟 ,所以一天中最早的时间是 00:00 ,最晚的时间是 23:59 。\n\n给你两个字符串 startTime 和 finishTime ,均符合 \"HH:MM\" 格式,分别表示你 进入 和 退出 游戏的确切时间,请计算在整个游戏会话期间,你完成的 完整对局的对局数 。\n\n例如,如果 startTime = \"05:20\" 且 finishTime = \"05:59\" ,这意味着你仅仅完成从 05:30 到 05:45 这一个完整对局。而你没有完成从 05:15 到 05:30 的完整对局,因为你是在对局开始后进入的游戏;同时,你也没有完成从 05:45 到 06:00 的完整对局,因为你是在对局结束前退出的游戏。\n\n如果 finishTime 早于 startTime ,这表示你玩了个通宵(也就是从 startTime 到午夜,再从午夜到 finishTime)。\n\n假设你是从 startTime 进入游戏,并在 finishTime 退出游戏,请计算并返回你完成的 完整对局的对局数 。\n\n \n\n示例 1:\n\n输入:startTime = \"12:01\", finishTime = \"12:44\"\n输出:1\n解释:你完成了从 12:15 到 12:30 的一个完整对局。\n你没有完成从 12:00 到 12:15 的完整对局,因为你是在对局开始后的 12:01 进入的游戏。\n你没有完成从 12:30 到 12:45 的完整对局,因为你是在对局结束前的 12:44 退出的游戏。\n\n\n示例 2:\n\n输入:startTime = \"20:00\", finishTime = \"06:00\"\n输出:40\n解释:你完成了从 20:00 到 00:00 的 16 个完整的对局,以及从 00:00 到 06:00 的 24 个完整的对局。\n16 + 24 = 40\n\n\n示例 3:\n\n输入:startTime = \"00:00\", finishTime = \"23:59\"\n输出:95\n解释:除最后一个小时你只完成了 3 个完整对局外,其余每个小时均完成了 4 场完整对局。\n\n\n \n\n提示:\n\nstartTime 和 finishTime 的格式为 HH:MM\n00 <= HH <= 23\n00 <= MM <= 59\nstartTime 和 finishTime 不相等\n```","content":"096221cf5b628be1e73e8bcfe626c734748e23900a3d41a84f0b774c2134766b2a9ce16c4f888f0d7d43b13eb80f2fa76b6e65ad9d3e03c1ae76b561bceff835f3316e60d6d7cfbd0a2ccfea998f527d3be17095dbb5049b79b730c3e5a6bec05624820f74b997633b3e1271aec285a471c309213a5cf68d6eebb39276ed55ca1c1081ed344b313160ec2b9c279432e2c4f98f6d96ca476ea8a40823ae94a55c6017763326a1d17722707ef8856f1e5e11a8e6f97a21376fa82eea484ef62402588f71f4546ac876e291642880502570b40bcc6b4b2da38c0b76a3c0313b73919e6bb431cbae45983a6f1aaae4d7c993347039eceda443104a4a8d6a6f1f42dae602f483e9c7640c92f2d10ee15d5449e11feb129c6ea21adbf3af47a2d408af3462cbe8049a98a124a93f6010975146e2901a5ae4fbc5606dc83c4819ec4752bdd034464d08358e7771d84c0d8575e46f0d7c66183d101989428f83565e4ee282f6f376bfb379d954596325565bb09700a7ac3bfe181e575160d03e8df6df3d3321fde8cd32abeb150cc42c74ff083eb0f782415ee27ded29fbd14330274c068db8426f403fa129d4cf251fa2d7d059f7a6e0d2a96dfe00783828c642cb74332110a9c8ee3d946e70a83d774d65402706e65a6cd8d8ab8099518dc8646a73bc19ff1e7306d08f38eec8ff2c703d4bcebdece901efba18c15b9e3ee34f1134dece792c6558af6cd0228564f2b3fac4171292c1edd6fed866a89e5a0ee6d8de70cab2c8c496b79fc163480a91b3bfae0e196779530bd9a85d1ce6e8eef62784dde21e24df3f1d4730b7faf5aca210ace43dad759d3426f768d5b53a443c04b2fe401cd6c60cb4e688b7b3876bf8d23c31cbd4d1e6cafbf0db2c2ed2290dfc784f394d23a00971a3bf332970438d31dd6ad756212cd86ea54c974d84ef17b0d9ce7edf5e07ec195102ba98c8ee285c2e2ae5570b8b30e4fba0883cb10e95c25fec893fef540c4af92e88ae2768a47a8efc8f52487e329669059ee271f88ec713cdb37b96404b593ae596773167611cc54f8addbf7d667b6837937eb203dba425b5264d1ffa9036ff1eacac45629816eacc080a552f8f03ebfa7f15592cfbd4c534042afafa82c3739f2b8a49a76b8359ff913b41199b929a888cf2dd2977440147233d31092edbd9c03f34389eabd93db51224555d27adbf5b359be7029d6b81a3c4d86353335e61ac5c45d0e5cfb173d7c3a3f10165feac3c9470b933e62c27d875a99b21f90a30a5b548e28bbf5b337f8387bf8a417087716041646a4fb39cdc69a37c61f0857f24ff3470f3b364ea908202d37b69ba97d8faff0fca7b2cfd29ea5a45b9619af5552257ecfffba1f2fde9e2ca6c4ad194b58ea714960851ce53f4e6a8dd7fcff5ccf3c64e5fff992cc9907af38df56f1b71e4a96162e5fb112f9ce4feb44f27c434ea57b906b96b67c766e0c8d35d88bd28987bad57aefa2d2004b64d4be64017e5e0145186f61e076e3ef89abae1d398e65ce441746331cf8671ec3c6f65d2aa67d47662da9cdf49f5380b0f72a82a4e05e9088162c5cf13d396cd35cb7e16f18897d6260c865f2640d340544466c9a866ac9198a37a050333ff0617332548ecd5b8dc0cd19dc4174e538e47b97cace1fa9e771bb1274c880b5f521d1a1102d3cc3de09fd2a3ee99f36876b7240297da573626d6a095788eb8422493ff63bc4c727f02e0b36c8d6c7f9e515634f846e4efe3d953947e59c0c2f5487c089738becb80eee3d46d2ef9098748f0e2d8a89fa8e342a086bd58f37bd2dd102486c40255d49411c2f4f34e29b97710190e3b8853102595d2deccc1d6f7b1639a77658917f610026f2c9188e80c5f6421448eeafe676577f2afeb3b923ad4014a61bd83e795888b8c06d3cc4e67c30fb765c03ebb0278fc8a87bb908a5a56c6748eb9b4457195932d3f51767820facf6f549d595249e4f79ec7fafbc26e5699decbc8d92c28c565c017e74916c1f3631e6d0242939d3c43dc6d9068a24dcba2f67c796bffa27cf05e2b15aa607662228193098057afed7b444ea57c4d8017627174c129ec8e571cd94ea7679e343d72ba08d1022d5634114057600d3f4b3b7568f9ae6834a8994d0ac556adb0dc94464c526fcc6607d9cdc13cd0b258e783b8660d6df41eb263bd330b068e2f3f2ddc7d1fcdbf7fad6bcccf990be7426878c0be374a5c9623b7238a8d75267298594026761372201133e42494c4a576916f9f6cb31ba4e896dcbbc3c3675036bea803080a4dcedfd67509da8d8b00e48ea0971b8f1bb4a345e1db0f94cfd0a1c4735b6edb89ee81f6c70a3ce90e12a7f8dba1414dff03caa4a6fd633744f252dfbbe05c397252e230ab27fce18f07e031fe329a69998a0897b3ab7835699559e70d607601e44ebe091886da8950ad6bc6f1f6e1336c69f3ce393b961d08749861af0b319a91a3e7ff07bd5e37d043b02ce648459352055b48dd9f66dcc0a40d8dfc0a3856e2b953d69a12220ce022b2688ec3e9b87512bc4f8c550aebbc4d32a11194a9e33b5e0798063ee31d0d005ed6900c5115f894a22bbc0748018bb0a2516cebff6c6dea155010ac348464e378139f312292a35445b7a8c99760a244a3ddba7e3484f025e208bce32cc464ef932ec11fcfd90077e18bf20ce2903c8a2feb98a8e087808a9c6afb9c5f63b6b221a690095561db2efecafaa58e69b383feb2c7842dab7fc596ec32b1be0dc2b39c76707b9e6562d1e27ea5fbae67bacf542a7f99c0303024d5af9307bad5f76a66918847ebd926eb1abf915d4264c94e2210753f7dc141dbf94935fdc3a9f10ece7547dde0f0cbd5cace7140389ccf364861aea467a430ec35ac23f7b5a3a1521f7c97a85f4761b445cb2380189773a77af8918391bb387b23110ed400c61777be2223f6b8e9c148f11043fa33e1b6c655d89f1c6c0a104400abc3d77b7788f38d57c17830274a103bc3e1e19e98fa742b6c3f39f6a947db718cd221394004d2e07971726f5b66358ddf8ca022b62fda53c91771d3fd945932660a3117ab03ac21e25714ee6d599b00d081599f8345ee7be6d43fbdff4b9168906c6cd072cd8cc4927b5a55dc13fdda7241bb5eb11afc4820f572dd1ba88692e982c4cbb8b6d07dfada539dd5c3d9e47ade18f1e9d41fb3cb812948e71a3e741ddf3656d6685890b1cf32cf5a0aadf30d9d69929ab5f562ad2aa275544cc5b3084d02d548f5cc3f5b363d87ac40e7a79e8b8a68aa52663a3a3259c217c30e7578e69ab039565b64ef3557196c588017101c2af36a6025714a061d6c9e02f10159196bc944560a5c34d477e5e4d38d4da1ac26a8934545523e5c3d767bf866585deedf3b6c6eff6f55912692c3ec4b133b123d00bad76da5c12dbf2a02125ae7589ee16c1a771ad22472e0ffd1ef2405a18f31048519c9cf870549534403b2970df4c1336aac072788b63e8a669f9294c55e57b389a38b71d9575df86605661b4baf942bb163afe5073fe4f4aa86a0daec57c9e49f80c0f1754e6d178e528ddd5d118aa1bfc33eb65af7c0b4d14a89fc0f350d14f73409e1b58788c36835f34916bcc4a9ad9b5e7726979d5cfa480045bdb24f8522f49e751bfcddd588ee9ff8a1aac38960979fa3ddc59784bbc4a6e114dba968bd5e4550861a742372dff771c31455bb4b63076009e6112c0da9d4a9ea31380391f863ed1184b4390919d641eff99a3f8c64baee10edc1566e8ca0b944ffac2ad8cbc35460b7c63ce5e7fc9a2eab1bf3f36bb3b8870fb6d60d7501535e016e34239517e963c8b2f6bd22b622995beafea8d6e0501f15496e94aac0b9cdb659f804c8fe39abc7df5a738d103d1423551b5c72219265c0f6d4b0251fbcce315d96635012462f5e31d87ee0b88408de8870791a3175092c376ab18886aa59a1fda0ad4ed9eb7ed90c7e1310a27aca0aa69729821fe29253a8ff5b09b8e8604c1e54e576cc0159ac1b68b6dcd4f09a4e574eb15c81edd3ac023966975beaa5ce2eaf647b7313c4a53aebb25bdc89233e11aa1f54c1d6af509c4a5777a2774e4676ae5534c8ce9e8f3ac637ea20e71152253b2d25198a880e1a44d474cbc9c3d3b28ef7a744fbc1c175634ee2932966f6622db546eb79c1beda424ca6545ec3bf35b15d59a63d9cd853045eeccfea94122e277bc571bb298647ce6d6c22e3eae14b3094beb25001194952182f46a0acafcae433f6e9ec5eb4ff8ddbe9ec7b575f3d5b79c1bc1b529d0c80d72ab8e74d1c597fc853930b49e0d4d887d522d9ee282415767fa80068b0de2bdf94b47e7f5b9b03a523fe0f8536be5464e78a0580cc0d2521cc0da6510b843c30b8b8d7103be74f056a147d595f2e5fd4f38d029315ed666968ba64a5ad0e3802c1b021ebd3b00fd7b0cda193c0a0e8a2d85d242c7a3dc2983f019059c49f2b26bc7303aff5b5e1a2c1cb566cb7b47d0464bff5353c8bb0eb6aaea3f554c32c49538a68dfcc7b8b0d32829aaf96712c99b8b276bcb94b65460a2d0160c573d10ce87fd305d00ead0e62116a790f61e5ecd07dffbe1050a47f60534b5c1172bc544c9e2c64eefd0802d8c0f2ef8a96b6f4768c331aef67e6453b528a0d57297f6227d6d11ae599ad2b8c410dccdd1b496616ed0450c63941c73279a6cc179f1caa469b7500956ffe65899c355396d781ce5111a80f01c818abc14de6b814ce8891875dc682a187f7503d10e4e80cdd4c411e10a731a5258567c853ad03fd9627c3036f86b532839f6961ee0fad410df77fb2951c0adfde9f1ae4afe51ad7976568506c4dfe3801974af14ae926e1ca6f85b98e95d976d1767977289ffaf70863fbd2c12000da10926971624c4302ccca007845f0897719215a3affc076d0e1a534b5858c948fd477e3f369d17f42f1e473591b7b74110c694eca32661e37e7b1037ab14e16857280c3f8809436039dd34997d6086f5aad8fd7776e51c35a13c9892269943a447e592c2245324a7ec89931b2de2e5a93500085dbdf8592b56ab5986a123263d32c0212bc6ef1e588a602de128e180bc636bab876fbcbad3f87a99e4b33552ed63d103d0735214c15f4210afb7585466f400bade394915a04376634d47e6e509e960ff18230cdc4660bb221744a45205568033d0384e8835cb444d9204bcd26e4c57a82dad7dcbfc90f1cf5ccd58b11497f81bb8bb07226deca7e4fff1c0f1bca9319e63cf65a39c7cedc0ef2197b37fb0782842faf5a9ad43937a6a093eaf581fd402469a648ce8f9ac55e3c03a2ac4e718376eaff94f3c18f8aa8d78c7957453c55d3648bcc4fd76259cc83511644fe17c9d082ada70ec3dfc86d3d429705a32921b1064eabfaf36d8fe4f23dc47b49dfebab0a8cd51c5993821ce9d6214e17b3fbec2520253a2456dda3741a9f1e16ee4c27eabeab03ed24c555ee501583b4941020bc8d50b1e3ff22b83f4d057a9736ee8a90ae44a6434e35f36c5715a038302a09a3a969dc784619f1e8bec895a0fe765f617611ad0f82ac607f29449a7301066ecaf565953c81974f4957dae809bad88c16b135c40e633c437d4489c66482f6c8b78e160f4408bfb54b7db802109a8338a3f8f12e3bc8133b8da2f19d9268c9e128f6dc223db5d541c11bf73a9f45c6c0c076120e7b0f2c169261b7822761aa4b5522bc5526373dc65bfb9782caa5ba108cfa1d8931a592546132f59ca29d651852344ad054f18a9b09310f092a4255a4cb5e39d39e11a8c4eb582a71cb420a74e6f979f5f6d34e1b4af36cd6549615b9fe0e73dbe6fa9f093c87cd97bc930817ef9fe0cf588a735a56a3ef5f84ccb68a42ae593c04bede48457f2a17d0a4809035e85e94a127e0337c0562e89fecdf6543390a5675f9c973388730d4e917d3fb33a8db8ae807711251fa9de74d37041debc9a784b38b95b6db8f023179dee3e63b5f228fe8eb08988eb7bb561e003634bf45d010725eee8902156c99525e6f36ae82149f0ed0b64b83ab5bf356da74f8d1ec5769e751d85da5a54df98212e80893b98b58c0260d453f3633373823a11ae97cac57923e767b35db716ddd160d8b5b9b9fe16d685ab79ecae287a716af2cfad9a20687209825b922682f7fa0a99cc5cf38e6258ad7530ba48c3c05be53bf7b2a508fe4b2979267b0f71fe2e273c51a79e32eb9893ac7660bdb9d862c0f522594b0d36344fd71a5612beb2c2fa3dae3240563b6fd9ea722a9f0be0c5c8035410e0708b072388ca616a554c415dd05ba1ae9b59445cce0373e2c2f391431db69769f5a75e457a36df6cf68719f58f2bfe8298813e6509bbfd412d3857c94e7df92c01c274c65bdf5f3283e6e5c1dbf1bc597038a5dc4dcbdca13ba8980ba60dc560de8d2edf8cf9e6155f499c022af94fe4023af3dfa1ab593a0b84e8cfe8cc04a019bc1e9e1133d701bad630df6b400d82fec624adeb2d21bde03b303aef2c20047c9fb3951821502a42a97b8cacff2351f83f8805d0f0dce69bb8da5982cf0533a26b0a4edd84b9253fb50e51a073f10cd74632da59128856a8d749ba4573a63ebc6b4ff65610179c5f9c0c321f79ee94a9f363a58f755bf0277cb3701480283bb805023a20c4f34feb5fe3a0eceedf72cf62e317f568e936cd44f86f8776ae002baacd3d70de4109c8a61973948da5be98177aba2a7667185c596c62217620a83894a80a5d409d87205fd472149c80361c867e94bed3fd2897da40ea91c028c66bd0207cd0df56fff66242b7249118a2690b5693b25c6df56a96d6fdb0e0dc665db41639de2e529b040a49f3a5a69d95514d04d1dd4435751102372b35dcb45cd1122210ba59d6420e7b9e13c5d5e616a0be1672e0925038a4708e787b5ef74209c4f053ac014705d037593aaaf3f726a79a93ebe30eed18ffff6c9cdfbb6f99fdf5e2d70f7df326e98a864a14341aa181cd8461f2654ac5176a5df3eae9c2e1c6788c21cda9056d5b60c8ef168829861bfdc4c692d335416cd82ca6c00781b4073e1267861c0656fec6ab9cc9ed151369a0268bb783fbb574e6d5b002a01e2dd19a6a5f1b9dd7faae85a7ca7d20c4cd54f0aef23c229b9996c026ef68dda","title":"1904. 你完成的完整对局数","link":"https://leetcode-cn.com/problems/the-number-of-full-rounds-you-have-played/","question_id":2033,"issue_number":37},"35":{"day":35,"pres":["计数","枚举"],"tags":["枚举"],"whys":null,"difficulty":"- 中等","description":"```\n给你两个字符串 a 和 b ,二者均由小写字母组成。一步操作中,你可以将 a 或 b 中的 任一字符 改变为 任一小写字母 。\n\n操作的最终目标是满足下列三个条件 之一 :\n\na 中的 每个字母 在字母表中 严格小于 b 中的 每个字母 。\nb 中的 每个字母 在字母表中 严格小于 a 中的 每个字母 。\na 和 b 都 由 同一个 字母组成。\n返回达成目标所需的 最少 操作数。\n\n \n\n示例 1:\n\n输入:a = \"aba\", b = \"caa\"\n输出:2\n解释:满足每个条件的最佳方案分别是:\n1) 将 b 变为 \"ccc\",2 次操作,满足 a 中的每个字母都小于 b 中的每个字母;\n2) 将 a 变为 \"bbb\" 并将 b 变为 \"aaa\",3 次操作,满足 b 中的每个字母都小于 a 中的每个字母;\n3) 将 a 变为 \"aaa\" 并将 b 变为 \"aaa\",2 次操作,满足 a 和 b 由同一个字母组成。\n最佳的方案只需要 2 次操作(满足条件 1 或者条件 3)。\n示例 2:\n\n输入:a = \"dabadd\", b = \"cda\"\n输出:3\n解释:满足条件 1 的最佳方案是将 b 变为 \"eee\" 。\n \n\n提示:\n\n1 <= a.length, b.length <= 105\na 和 b 只由小写字母组成\n```","content":"096221cf5b628be1e73e8bcfe626c734748020930a3d43ae4e066f7323046f6a2db9e079758aa3327c548832950f2fa662a2e03f12d0f35741cc7ffe416f30d677f2ace36e048899632bd6b1998e073078e8788380a2039a31f426c0a9a0a3801632dd0663b99e233a7e0477abdfcfb833db4d273247e6cd33e4ba8a61e819b47341d1e0a98684a59a36a460ce05a03da096c26290edd7be5a27c1b02b6d7bdf93e7fac0e03544c2cfc7e83dc15d600132e088f9105520371db56cb4b1194c2824d34fbb0c5e890ef2d32e20f0233c33fd2398f392ebce9163ee6c0f620b1bce81c7b939f5a24a80fd1f13f5b1c984f3310a7cdc8fee46651945ce07464e24cfb453e1daa0da38bf2e234c778d631034c2b3e835b86d950dd9c08547bdebcd7f9467c3fccc4721a3188b3d6b2750287db6c82e3f9dfe72cf89542c9e6ed523956d0ebdc98e6c0f7ddbf36b999def02eed6a099cbcaa7bdd6d64ee839da5c61f583f7ef7482bc7bfd545a60075756ae963aa4af0ce81b1476566aef3fb0cbde0d09e50d29096d95a56c15a0737a75083cb5330af15ee849c703c38343330565078288841c5f58e439998e326bc4fabbc1aadcc0b8e042b54b486f6efa0e53eb27e54dbca1a816c73b77fa6063e9e1f77557d922d6b344c1c99f35d1d924235cda53d697743eff63c64ecad028703d4b08ccf58f72e3f665c3ec48a1545fc46ad6c46837656ba262e8108646db7589ca5b63869b90c9510eef1c8b020ee1e0f19d5ad153bbdd85db9d710943befff58eb91d4b5dbdd24b6dbce4a7f8ba4bcd5498256f0773faeba2ba66097940615d2c6945f756f54e1a9422fbc0494c9e2c1209eeb4007ac4ecf8d2da9fef1feab8793eabb8d9a4bedabfa60cb4d0082d392061824e3588cd29add586701343eabc6d8891e4932df45ba668988a14ae4ea2542201d72475dd530232c8565f3ba6dfa8e61390bb03b451726412f536d70f2e3fddfe66f2064c6b85801daf177fa24188f78e684b6b1f9857269fd77a3cd3c379b6872bc85915260f83ed6d513f7d43b647ec9aa228ce1e0d3d3292ce12bffd193df8d8b3fa863239e21069b98e1ddc24b84304536c90cc7546780f8db07812b20174b7007c5026e64cde0b92716bdf593919a39cb6265615e8d4c69f73433563674b45015356ebb299255ea3796f8600fd5b32373318c6e06dbf4e7faf48f42ca9f0f349512f44b029fa8d0e5cce866bd7c3b3348d8b7a5baa513ab960b21c42789561fe22855328f927cb6576579c724fe93c0f88565f41d2d89fe8c380ea988af232a1ed70953de3810838baa506998be849d2343d97ef82d9977de92271f742b3402d01af5f8d456a1fcf9eac8e98a5d1ad884a38a7b5d0de806a199e9f7432a2d8305ad7a595e88c9b64f33b6ffb470ed6f289e36e12682279e061f6ea1039aa225445cafd68fb66eeb1126ae723a9454d1c58fb573184995a885ab6c5ebd490b6707e2393b7edc829518dda1e07543efd90b9d4eb9bd579e655496008df824afdd01466b7c7578e1178bbfdf317891d655245e44b5d66812c0a4812497799a9b78620f3c50414430aa9da429776649c394f2efd0cfc36fe03445cffe0a63ade2b1b370a807e92e3f155b5a26e1764408e43b4b826a4af84e7f4f72c30d1061e043e65c0930874b060453ee2f989b03622816d52d2d8d1daf71127f523b9c12a22f0a67f02a221564484bc03c64c00f05ad7ba279b6b012a69814f3b875cac8c4c189e1d3982ff8ed6e4d67106f9098749fbea3a6acc390da8306a6e15b43e5f07a9e1e0e166e7aed29347fdc0522ba47b1a393cf322045977c181d7b6c4defcf6fe72dba06c837ccdd4eed0764768bd97faa6992a2a392c601e6b7b23618975a80b1f39ade9ac9ff7e6b176afe7e365d607b778e4d174dbfd47004302348a7c62c478a0b8be50b9d995a53f7694308451ce5e5e73caf98f4b82c6e54efb20f3e65cbdcea0821be5bb0e9f4355bee1406be034451053894497df15f7500bc609982e1ab8f3a3569556f14c39ca1bf1bde843d8906ae079f15beb5864a9636e8d28427b76d328d496572cde4fb5739c261a708a191891878b9e8a6ab8cb9e3f9f8ce3be463685a4015d1310a30890f5781283fac66ce3420adfe228b6b60035be9bf432312a8c2ce12989786c2ae6be9be864c2c1452bbbf0499a7209dd66c5b8dd91c11d3114826ac62fefc46c74248232d6807c345e213229e4218ec79b5b926dab6da102a5e58cddbdc5c3456d37968b002a0e89474703f9b413e7977fb883e1cd21ee72a6f23fe9bc4a95a86ac359929d39e8e3524a338d3c7e871354f8cb7677ced929835ba4a1e2a7bdd320c1497e807c58185a8b72a877a1ced25afb55ab08f50c8020e6caa6f6212f01e87f8f7570374ae501e9145ed9f2d92baf2ba7d3a5940bc0be4965e9b41a11075b995db00a358493a3e1ff06b25b2bdbac3589e96f42946c0c9fc197c561772ef705faa10fbdd91f03c41a5687ccdca9a978c7575b616fe8bf6ad02359cf117dc6f6459f6f4d66ffd6de00892e319f98d6dc609d024d14c5a06dd506d7c0a6848d85980dce9f344fa44d5d62e417ef8c537811a331279760e6f76b1068533e861c256c6fc59e534a469d3c2d34824b66c9a32fd72dcfc53476e786f22cf49d0eb727cd906c1a02829f9268dc929af7216dbc01564350f11e8c44d088b54914ade14200161446f678b7decf59cbb662bdb2cf3d71330fa4a1b6faf072510ea93e5a85a7d55f5b8dde9142a0983cbad3d9acf5c2d16d6e3774dba918341f375cb5a1d694a3eccc05bb5876f9fa637a7677b21beedd15283842122e40b6a4b14473edfdf3732bd177954edad41381dfb2fd2123031e12b02f7af221ff4ce00bee1abcd414e9b8d7cc161e7f29608316af4170c9512ebeecd5a42ffd7408f35d8e9dbd07f01e0f0dce4d7c69250d110959e9b99925975473665b4560c1b48284dda1787d270f7ca8820d8442e6a12f5138259fab7d111f7714341d1d0f14ff9e6fa501b15be7b769130d59116ac9d2fad467d28630025ceb624b9a2acf8a5d8e6fd238e03b2aad6107c24fe4904e51159b0b061644f5879b59d751db487db8418e18da4322d35219eb5e555f1f604a6a7c306bbe321079ab0e435332cf6dcc6a760e9f7fbcab1f15a74f77071ac3384aa81c11ddf4cff77df609eb7cfd6efe4270fcd9276a549e1e2f5798f00221a522ce3a4b3f58353d4205ed203a560367ed2bdd895e106d184ad807c0cfcbcca2a5334cb7e448f2da8746728d17d694ab61c1c20f4b63051da5249c349bdf3341c4449192b0f39d46420b540989fea764ec9a28184c98d28920eb76adf13ba0e254025c812a61d153989b90727a490a5b7281a3399ba453b94f540f129b75f6997962c69915a4d3265f7f2bbdad6429ce8877bb4b507782e8b2cccf4d17952c0a87f07e949b662e9e4efe15543e659bc0344d3e14b447b49968f8c2a5f5db4779a6768b0823c88540546f2b151262cf0c60254360505f066ed0161aedc1377a882595873eb75af1c0aaf1a61f56c9b87c73c67a57cd0264f2cb1177c90d4ca883ec9ada034746de803a8c626f1eb60e8632b6312cd9dc676e1335511f0065633e1dec7c3739033018401f49375bf85728a03afa8dfc25dfd895b75b53b673e69a2cfaabdb969a28d2acf05972492589b5ac5468d228b900728f84da76e0c515e120df38b99a6cf4823741ded38c2e9aa15ebac58b0942fdad11a69ed3c67b987c8cd0ea750f11c60142cacfa596f6a7e9cfe05d9552e600503b7ace21b632ca67702f2606b5a967c3e85c259cfbf5de20c84d90c655e8f4932b58c5633245566d72317c5ee17ab182c213ea81101a89e1593b657f27290e65c8178690ce70e7e833775065488c8aba06c7bf110cc3c98c85e1d6523bceb0604076489a35882cdecd0aea6bfef81bb5ac3c08fdb46b3e4b55ba2cdf691a9a61199585acf8f1306c3ed965e6b5cdc75f03fa43e379a8c10da85c747127cfa43cf6b247fe860d1713b43951d5ed43f52c4a7c48a366654545935430c8cebcb539de2be52bdad4fcbb3be2b3a1433491db22e63493fe83afafc6bebb1940461718462a7624edf066a9aa0c4af856ca98d9aef5e81262a9e72cd10062ee78b25bbdb4b0ac87aed834687e39cc387cfd468304b62275a62549f9f1113375d8aad6d5bf9fc0e6752a43463a9d723710940325000a5a49effa979db516a573e2e85bbc3f52d27b60aecdcf9916ee62f98e7c4f5f541cab370fb5c7dbc9ae78cce45d56fe4d7628edb0029255e810b546b16828d5ad7ccd5f9faa7c00769102ed0a21efa385bb8cd4103bd689aaf9db264f3d405b80af9a6ed51aab2e6b3fe54fced42a5b73f7fe5edc8bc42ca6e9deccd1f3ca97b5992f35752c0aa7ea3250ee65b5f23167c6537ff1dc19766903421951dfe57540058886a9d51d4a31ade6a8b53fcaafa6d433ad8be63dc221550000652c1da305653a9b3343c46647382732557ab629803e8e05bf6bb84cd5e2d1b0afa08d6e3310a0611c5043b46e7707c5a6cb91469c0ddc6a64581fd79223067e0132969cf7758cb2fa3aae1f82b2935b662f653cf3f222478e161966c646f6fa1f6adcd886b62afdf900d7aa538cef626583dc5836db15bdac36aa56f58396b09c645c722dc5d95fc6ab5c4991bf4eec7c9d5b65112677ec8fa14f789ebacd0a7afd00f58fbfc23bf0c501d125870fa803d7e67e974b20c8a674af822d65f46cc9012cad05ebc1544591f4b530a7e3a449c7d84369487c4bc81634c232b542a82fa58229caa59fd09c72841042056cd7b4a2716ba8978d660cda43806771367a0a06c7d062313ba285775f681473ac880299aca361e0988c83d4ab1886bc72db231ad2e47e59542930190b7b01cf4f35582afaa0643be1465fcb268cc3ea9a86644ae9d6419cd03a3616efdb93303a5ba85a13c9892269943a447e5a2b7c453e07379b992eb2c06156d5161a8c87bccbdbe622c1d127573c3083600a08e76cf6e7cce666d653c04b07c67affb27e87c2bd1e87e5db053b3727d679567e1b286f1250b04e6b8b3cab0b625e48a7fedacf1f405804449d462a609ed20ffa9f30dcee2044e0213d4a0c6e1c7c426344dde0c11db44ad22940f23ccec57a82dad7dcbfc90f1ca1cc9bc6017e7f90aea1b07226deca7e4fff1f0c008cd908ba72ea082bc489851bbb066b3fc70e98ae2faf5a9ad43937a6a0c0a7f59cfd533417a643d38fd98a0b7212abb77710eb2c97c994a08c8f96b5d7986c4d6f3c139c368b864f9e2c599ec24c1c01eb5ed4df82ada70ec3dfc86d3d07db4ce52935a40606aba2a36dd0b6a765802431a089d040f1ff1c5993821ce9856c4e0ab3eb876b732527241b94ed7c5bd14d49a61825ddbeba29ed24c555ee165ad1fd9b1079f2911ff0e8f567ac2e501072ab3ff4a090ae44a6434e35f36c1258a071302723b38369dc784619f1adf281d3a0ef25102f6b5be80bccb0322d7719f57b480a6ed8e36c8f1681974f0c1adaf509abcda616b135c40e373c48250883cf31dfb28df9ec7431437589b55f68a228109a8338a3f8f168749a1371c8a6bf80c03a978c6dfe952b279fd5418457be7c9f51d3c0dc6b124b360f64168f6cadeb6834e41f1070c3345d7d40ec1eb6979fcab1af3a8cfa1d8970ebc1542f66b8c8ecc66c560b385c945dd08ac8441b0f092a4207e19f0b2ec99e4de6d289720a319d1220552014851b6d5f8a82f536c359d94b90386eb5a8685a2402f0ad1767423f24dabf555a5142b43fe39ce03a2bc11b594378df7b94ffe95d43e5c3b7b2925a6c3ab71fb60adafa62ae6839460881fa95cb2d421f201e763c855f76fd168b73d016970de3a1a267cbdba4997edc944150b3cb2e8ab0e6c895f0e9cdef5838d075764bf4ee9841488eab0f47457ec6dbe18fca52d31e9efcce54cf641db511deb3c1b26bd43f1b8652cb31a828de470f4783f8d7e15558fe51c066a8bf55faa017eb1f830339b452cefdd3b596fac8d0a268e5608d799962cc52160cd66d70d05657c437989ee123013fb39b87f196c814b762b6dee337d53f823da5396f7a1badfdd988db31e17182971da04b47abee75c04e96bff06c625e73b44d1447a4771fa20ea0bf3cbe4519f477a29a515860ed9fd38aef7576f0826ef9638adb963967b4c1ff3b5a2fedf894ac25e4dcb51c1f973e1d45294c952737cae31be901871fd940f515a33544a5413cdab1e3f6af8ac350a0820c93ab28ad0a814159a1c60b9e46292e815b944e25c488b44ffccb3aa8839ea082d8a366e26470f00a306d702cbc33e5970cab5fefc7bcc527552c0873c35493ab4d5326270b4395d3156f40f457123f85b228e77d9b31165e18903b4b4b7ce1c70874267dbffbfcd82bafa32c2fff52c81cf1f7653314fd139635c5064304bcee0f4caf983581c80771ed9eb493f495985a58827a070dc866b88abb9a31eb553a185c1f791dcf289475e72389b2fad335eef4eb6077e941a349f2527e969ce12d7c1331c5ef011580bc94a06eb3dbe9831d8ef2df74d26be4fc0584d3d4a8e1efd40070b8034073b7e1b66f4cc0aeb862f9aafb9545d4c57508c21328f1ca68dd513e2c388c31bf9a8a5f5044579d3ddde42d87f8e1511a1d714021a38285e61514331f2317a97ab7817a82afdf0c9ade0dc866c939e81766ee2bd32188eb73e642ae8b619b1bf348a38bbcb1e9bb4f8c2b73c0b8e06c5f9303edef34f0860ae314c1e31b163dae60b96b089a9cf16cd78214a2a06384d6ddd9a9fa76d95f866db3080bcd00cb32156f3f06b05d5a5b6a20f1661e1c2427a04638c984a3cf7e2c9f4f0f2cc2046f5314609dadb1314a567a8a0abf05f2d086f6fadbfcfca2f191d36e2e7ae7df2a54988d70a05958a5023ad275242c5193bfee1119820759aa9bae2f6dd9610e9e52738c405de42b7ae91524cb8ec1b0e9e6051f58b286c4f4e8f824a3cfa957eaa070c670472617e49e5faaff31b5d236a3ec4c6c01123e91d605a0fdbbb4d27bfaac1a51c491021a9c1f05be688d66f6cc62483eb1c5be083c93fdd0b3d4b94208b5504bdcce61aa8a16dd48a0df06bb65d323ae1c113898a4cf49f8858cef93dbb01a93c6a2a27390cfb5905b98f92c377faf99e5505838edce867338691ebfd8130c3328bf04c2a197c76a266f2f7188c965813908c56f823ebfd967eb899f64fac48399a7f83c00b0af7ca91e6b6f4c18be2a1b851112f78c8381059395956002ee3406f58ea8f26e8386ad5d7969640c1d7603d76f7e2b58541205647016c9ebe6bfe42ffc4918ea720a0ac4f3b99a70540e95966f8d5fe3e223e68859697f88155224c95ee31fac02767aa840db584b7ed6c1575a7de4e6f9886aa36d2faf6f50e87799501b60d29b4415f1a1e990e936a7c0a0f782d8dbf527614ba94204a33c157a636ed99e080ddce8a09da7e1cc300d6718a9189e6b769bc152b08e078ba83797288176b7aa804bb83eb46ca7cd9646122d58232f2e36631a30c83b29c8cc6c3312aed200ee8867c7b3b8327f862fed20ba04790604887a52ede69b5287161443144acca33ff477fffc037dc04d1d3ae089caae3e13cf582e22fb861da049b01c28538176b96d08dc9d74db423f0b337379c2c4c61e30eb68745ebedaf36df2a2226126974954062c4ca87281b0efecf0ce2ac626c7adc19fe737817ed3f59202ce424b0516cc3d35cb81a98d02fc7446f47fc496c97f3f389f9db9f5a18510104e0168709b846fc1fabc32d028e32147ab5edde24ba40e2883a194b71d6341ec690e976bb0f86674bcad67b097a84c2c9094cd875e45b7a7a5fde6797fc45a212fbcaeeefc1e7fbcb286d9c98f0b7629c4cbdede370f561a8d2fc058910609ea47c77aa518909c4b4999c09ceadb276254a078c621625599e653a5bcf5c66997f76d0b1bc6de5b2b6802f485c53e2a500ae9d4b8dcb20f08f251c53a35aa070c3a9d251c8a73b32a9f756c2bf7735f2a481d9f0aaa21dca71bd87e9fd0d440ae7781ddce0973595bc31fa1ece197402142a302be573526acb682464713383d7c98612b707e263ea6e874cf6f4ce8fc3f92c7db6475fcdc34a64b7343c806ee458f61d479a71a0f910c34211d9a486bc7bc35b9943b8b8823eaa2ceaaffa4078c146de66ebe","title":"1737. 满足三条件之一需改变的最少字符数","link":"https://leetcode-cn.com/problems/change-minimum-characters-to-satisfy-one-of-three-conditions/","question_id":1859,"issue_number":38},"36":{"day":36,"pres":["数组","排序"],"tags":["排序"],"whys":null,"difficulty":"- 中等","description":"```\n给你一个整数数组 nums,请你将该数组升序排列。\n\n \n\n示例 1:\n\n输入:nums = [5,2,3,1]\n输出:[1,2,3,5]\n示例 2:\n\n输入:nums = [5,1,1,2,0,0]\n输出:[0,0,1,1,2,5]\n \n\n提示:\n\n1 <= nums.length <= 50000\n-50000 <= nums[i] <= 50000\n\n```","content":"096221cf5b628be1e73e8bcfe626c7347c86218a04fb2b870a545626520c013734310ec8ab1a6ec9ebd627f465eaac46b8280bc2d829199fbe23f761a0f8f223fc3b6776d4c7cee11d6ec3abc49c4f6d36fd32ecfee24fdebd7bdd491c6d2a62b6aa10d90bdf9b2e295b80a45355157dfa0ea4ade3807535aa61475bf51cca27adb7606db39cc4a514fe41fb07cb69ef6e165f8b1e6f0630bdf24326cce7983c1f291c4900d48e4052074b9f22f53a46a34489d22559210c378ee3684b19a17b03a4179e4d099170240ca6fe47f9b0ce2cb718ffc0e71a5ee526b0bc68302dc587d10a885c75fb3436beff1ae6e2db911664f17986fd5188a829961c332801a2ec710f49600cfe11839cc4c758f78cf74c133ca428d5104a83e8c525b7825184efb1675ac0142d768c14f6c4fe7a0e6607267030e8b44192ca4e9672f05de626c8ca6b06c3fb9aaa5a258c084540db556f70046c1c383adb00fe5a03e09ace45472406fe6b63f43cf481e6af85fd3040aa2943f4279da5dd9dff7c3e81cddc3830e62a05057ab949fb99642e59e50b3ebadd9f51988967b8b346e869f49ee806b88b43574edd0aac138d116ec7efb9eb45634b7da44fed017f21c558c7cba2bfac12b4ce02a001a8d8fb5f4820035e767ff222d8866e2d4b3035d1c9271b7bd844d65233249af32089b5dc63190227a8a9bfaf09bdd2128bc121e943fbc854e6c65e0e89ce0ca9695de75293dad578f4a806ceedc6376dd9988643c99ce6b9c0665f5e7d97a7a8cd516ee4233a79237f7e5637001c6182c6d71e7c020daa513826431cb6a1f3cbee4f613a792ce74d2349a51ff60c49904796ff35acfaa86853c0defb03b6d6af96cae8932aa7de5b99a8b4efa999ccb19e1073ad3a496410182a044f869472a99cf55a6726f81d07acbf7c7c70df81ad6a9f429ad81bb9cdc14bf15218c111430eb7baeae1346a2f1ec65d2baf31eafba2be33bf1884c06ac38b0de7591958fc32954d5565fd22ba8cda4d34393fe30837e19f6e768cf31bc2bc719655545a13ca11a0d0e6a7d04d9ee587a6eda1347c5d19f1b039cfa924be2f6d1af8b40dfd38bd69b9b91fe40370cfc9d38f3029c32cc2be8fa77511a404769739747021e955e704bf6cac24fd34389e9ea4145627c6d4c58379522e6d775f49075856f5a39803786a9bc68433f95b06243304dce34f91436dbf49f32aa2f4c5a5fba98dd214940bee9bb18d10b3f929f33362fdb1389960993fd63f2dfa6fa68129fb2026a68770ebabba5b39548d8bbe8b4a4f4ed6ff9cdbef8ad1ae88f315accb4752f84e833e07b8850d988af04bd90b3786f46e9ea50d8e260ba063c01c3b8e2ac7e9197f52b0bec7c5aee109e1e3754afb95ba9fab17a038d6b34d96b88c8113fc8095f8843d539b0490cf8e6ef0abfb6c386aeb825061f1c4121cb1e6cd924d04e5f246eb678a28af3ae5397c7402cb1469b0ff07b11de5f3485204f3064aa91702bab82039f5e07f576b5d650b6c1293c1f61cbe77293e2aabd9479874651f938409bd74c2da94c34bcb2a090f4aaa1a6b00f1256dfd908e2ab1ece9b84a8dfc7e547066f7e10ade793ff6270b51f2535fba387d63aa3a5513b7236f773cdc957d163f970abdc5e875256ac118883ef1c4a0fb6144f60517db3f3208027dab54a9df778c94b43c04041596ed5fc18a6d4054223ad5a58c789a954b168df37c954c737701fa8d60be447fb26c90cf13cd373a6f3580d9549e121524e11998193a91db8ef3c8d3500c159b168cade48bee5e7d64ac5d3a7ba070cc8c8b1c75e6c5690bf1f07cf7bd6f8de46e9fc7ac861eb2b191ec5f47050d47071e742ebd122eb8489f075e3201f6c8c1640f4b7214aba4a545150ec0ff9b2be267c2793673f9dad3393a4f5902c9ca6488880af814cc50f32119a8bad1c78cc010709921b4d1c75ac59ead2cd2c130b8449c47ac80190077fe33abb7b24c7dce6b6099d4e4c2fa0cbf0b8a55ea0ac5d53e35c39fab88c64e378941bf6598282b8a2f2c1180f78e5d955635fba8cb24dab1d179d9975ae253c8b451e4a3d9730be120887666fa2bc49e543cc74d95781a69161f21c9d95d368b9fa0863c7a58a5f5eee1cc2f3d1a4190f11132a10891ec9b85023f7e2584765881da9659f6355ac7a1bb6e0a6fd01ab1559e303b2e83133ee251c3c07229bbf0639a7911d040d1bbc088c136191abc44c426edc459732595181426106d49704d318d7fac8dd867fc16932efa2bccb1b7b5e8ffaa24635ec9a2527632f7195846ad8c43808a13e4af9f9728b1149baf40e9d6e6f0f05ca3e17c5563e386f39bfacb1e3ce90f1098e91337fa92439c0efa8ba5ec939270e60e238c253d15dc8b4a967ba6d7df65dd5ead02f00493cd7887edf5437137a911a51c2e0517bb189a6643b1add74dd529c29a89d4d7a4f6601298bf507a1a11c7697503179293a3dffe28bf5b2ffd295f99aa057fe80a00e99f88ac9c3057e95bb9ba6a1b0abda3a2821ec4f1bd27f933f12c064425a193299a1ee4c22240c4cf7a9c486b69c4fad21f87e866b2dbadd934df112776cccdcd152c395b284037e91f4887a34513b628d0d82250cc4d950919ff5b0bf939e97f877e6e016cbd40664907a299363578deacd3fa74cd67fe8322f827cce83976e68df219fd55c222ad7e34217bc6ddbff01bf0f5c4d76230bc7330503a4b7ffb47662f151266a5843b1b474b759f30bc90886bbde36bcbdedb412c2e9e0319fe0041a4fdbe7cbad740386292d4315acd5fca3db7b8e3edaeeed2d1524b3a52d561fc951d2a5eb699d195bfcbcd1086584cc4f264777c44a81bd7d7150a1a40270d41bfadb36c5feec5d4732bd1768d78dad4138dd1a9fe332502161dbc2e4bf810c04cdf22eb35b13aa68de7cc81531a18765ecc4cb7191dd0057dad9cad9c6dbd605d916eedc38d56bb05bba853250958abaa815f26c8e1d008f617690fd61913f1e3feac94e069284b293bd6acc28c4ac8a02b49393b8da860271f52283b29290e2cf951b04602be43f7a0d2ea9759045c0e3f2546932205eefcf89d52a99f24e864efed36d67baf3042f369708a55a1f473057e924b5e21079b9fd80ada3a86772df35fe878fa237ecb2e74d30620564312701d0d3a08f02577f41b0f6d5b30ea6acc6c580e8250633399936b8ee1ebde48d7a682dab96c30547bb850a72d07c610a27a287039ee0c43ff763538c1d840748e50ad232e8bebf09ad8c045b0ffbddff042ed1e60b23a15587fcc0d9a8aca8dfebe7b04cfa511ffcbfa4e3ad94386c7b13ace8f0112194c5eab72d564948770579517c09c9ba31ed7e5e4d38d4e64c124e2f57f3726023789ea5117f4d352c6e13b6963f377427db0fe99d2077a3e4a5408db825edfba3be47220460acb00f5ef21444350b639159ed0ba831b6bd0a64e67987da2c3f8716d28123ac2d331a3a83527f23246f68a59c049d3c78baa076c3488a78270df545df9490a461f47aab02a994aacc01a3efff5a7aab9d1c26d0ca5bac8a9f3e0a2c0a64b0d8796221ad40b0d0ba1d327f79fc6ede86765a2fc6b1d8c5717a602398bce7a36fc4510b3e9471cd8144846de803a977e6f1886e116947084bc1e47c3abbb9397f1fff3fbf0d406baf2c3e4b1c3a9d3989e8871dfed089c3c3573e3506c95e71205f9277d068f2f360c1c6ac5417d22e98c9baa70186beecc1db415c5dd094042d62a665b9a32bd669fd212c8e9586eac6f75a16f4bcf1c95cb160882a664c08073c543867fadf804eda2d7708c8b6d6260125b6f373877c5029a34eed9bb904fee161859d5ceaaced6563421aac6216dbf9ba7f7438249d59960a5a9894222fe036c5c0234466c1b7b8f30a8d9991fa7c90c76e0cc366351334a3d6939d052eea0a30ae4857070003a7225281a615f39d4f148c996aee2f46c38fe846147754ba026881de1cf1fe961e4f61ab18f3d26d5b54e00466fb42fc96719935d10bcb9a7fcfd3d6b04d779eab8d5c8553fca4fee43abc50ba36142722adda733fab154d88a362310ac1a50ecc242e819425a564cc1df830c8b006ff3afdf985cb436a55fed4d29179fe091af410f9e398c7b3dbac2818f8bc68f9f1b544119285a2b723aeccd5bab931fa55ad9cf8deb43448a5662e1b138815c5b8d3db6e2500a70235b5647b69ff8cc6bb6c83ccf39f231d4bd2bb2e2287fa6d6e9746f52523b5f0523c7a5ca94f150a3c48b17b6adddef97806d3d263936cf42518de19d04afd6068ae740275b5aed51b32447f0d6d9beea22f7cacd92b8c9b44a979a1057f06a1d79bcf19e3ad45cac73d547a151e5af7359cc493d81cbbc5feb799dfe60065c345f5c9ef30b8092c5d3244e074147b7aebc4fd533a0274215219f3744e1adaf5876c128410ce457692637522434187154a1e3e6acc44c20fa9363be4a3adea05c98c931519facf2453e0737b2db371d2ef6f891a7466560cfcbcfe412b93d03118c0d8acd10cc1c76ed90cce9708f4f3932f4695b8300475f471e2b9454ba72d5089116875ba04712113a242d2796e3901fe8f184833ba2829b125042199c19f02ff1e28a96084fb1eb9e80b410586ad34a4e30b431eb0e6566d7bfd0e1e23672c3b941f5fae207c9353ba740a58fd7baef3a70c93070c62776a7fc0053a8d2eb15b0acf004e4301939345d86d4b5ddbdab3e0025d4f4256d8764c448f6c1d69cd32536118ad04b3325c5ea23c44e7611179b271cdc78e92c947b997f2fde358c9a6c61bc5716be91de0f84024d73b46806d4e4bbde7dbe262511d94239a4e28696d62bcd65a7a46ac92ea604499d0a31777954af39195544318bc7f00922f8c3a74c4c9a038c7b093932006589da004b41e3d73612684f3df9c540dcfe9b53e8d69693cb8750fdf920ff791d8fb121171b203a444178439449480e1dfabb4111b7070dcb75c391ffb5873616b09a19d29e0e7155b092903b745b8406749a802232be3a443d532a7d1177443180d728a08e3b13bc565ec4c49edecbf632d1d12d572e3088605a4fba2aa2abcda738d709a4180b8579f4af22e699f84687b49e304e4e04d6741072067d29055aac625ef03b83466f114de8e5c1d6091b27257081757719e5c71fea8f20dce56645e76c094a4e3d1c3f18070398ae9f43b45088650ed875ce8c3482999889f19d5c15f597acc611547fc7e6e8fc3726d689311ab10d1029c5ee05fe35ea01408acec013f20a39688209d2d17ce752d3d43437b3b0d0b7e595e6793443a64893a59ac5031646eeb74d25c534a4e3c6e5df94bce8ccb22c0d2f167f16fb0005ef68a4f77e4698f48b7fadf7ef6c3624c9437e0ed9b2c177ed2ab58fa46c13fde8cd2ec1b0a27ffe4b239fabe159a6934917d0d655a6cb6c1d5df2bbce6b75686928569caf7458961e1e8c4c2cb4f1f47ab9249110a300159efd9c457defea0cccbd9822a471095d33c677938a8dae0af30e1d4eb1110972a0257e6f6ef0d22ba1785b19a5e8bfd1c88ab249753b3e5fab16cbff2e6c711bfc2344546684a028c63081c41b4d488ef909ee83e21fb16eee0e637505380093d425c3b2c8b58e160f474caab50d2df67d42d49812a3f8b261759b473b98a6a7cfc612978f6daedc3f3de68100d603be779f59db85922f1246365c6457d625a4a8397fb44b442ba77f26377e8950e5c39f9af8f975d8fa00897ff0df074936bcd7ed9a44561c7104bd4fd08ac8085e5b09634248a4980a3dd5ca178281a3146525dd180a62e6f97a9bedf94e1b1dbb259a58d01db4fe0f73dbbde99f174287c68abcd6545ea9daf6d73cdf3e092dea925f989ea39741b3433549b68d4b4e592a1f95f0d7d57cf74f9da069ba712f6f3dbfb5d89f754a456f08763c07d3f321b8117391161ad36e6d73e211463816f35b0bf1feb3892e4d0a11596800241315d3d871b1a2fb32110199c22c810247002fda91a6eba31d804a96bdc21e80600657905674457584449946ed520ecb4164cc0295d2416836049dc037c03198382bf57524bb0693058cc65cc4370f1e6b6c71287166bc55a67da71ecb75526156a53632953244ce54b78ae56b6a58f38089f482a012a95898d0e30acf3e8443ec7c210063e8a98cdad174fc3f9a931186517d84f21c9401cbc6ae7e751266f71f213cf6760aa902bddd60eb580ef237edd94f5067f6869aa9ef2e5cf08226bc2f99dfc42c29a2c3e07b1f7cb5b195b73bb9b1b60c1f842f074d4545ae2e2ce0e31bbb44d309c90ee85bb5375bf22e2295d2ecf8bcae8a1cf6cc9e7f70e55eb6816b54a102961e8091a244a8538b4ed3c1eb52beb932f1e38ce3ddf4cbd038e3ec98763a190916d664c4e679952ebafcf9b511ece394cce959936fd097a6ce84c05c1390a69a619cd9b5664ae624ab508bf1db9f3dd7d8feb96e5ec1c7b8b53e733406de34229de917ac42c70a3bfed29527ae50836dc3c783796099890017f11a4ec003dbe1dab0ac3c581b1857f692c4b46cccf381f068f70e5205fe5f79d550935cf44bea031e321adb794724afa20e6bdb0bbf15fd370428bcdbcc807a0d8e8eaa9699a015c28ea0c056fdbd8d209129b1f514c18587fe84bd934535f3503d7bffb5e23f1fdaa1b736ae38657400d2cf268a15ccaa2420e714f1b7c2df46f0451669889aadbc06ca4f2598","title":"912. 排序数组","link":"https://leetcode-cn.com/problems/sort-an-array/","question_id":948,"issue_number":39},"37":{"day":37,"pres":["二分法"],"tags":["二分"],"whys":null,"difficulty":"- 简单","description":"```\n实现 int sqrt(int x) 函数。\n\n计算并返回 x 的平方根,其中 x 是非负整数。\n\n由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。\n\n示例 1:\n\n输入: 4\n输出: 2\n示例 2:\n\n输入: 8\n输出: 2\n说明: 8 的平方根是 2.82842...,\n 由于返回类型是整数,小数部分将被舍去\n```","content":"096221cf5b628be1e73e8bcfe626c734738e3d845c3d428f6b0b6073212a5f6a10a12dc8c9066ecde89f32f426e3ac57af2400c3906714dff32ff523fffaef2ef2326f68889bd2e21b37dacfe3de1e3fb201b80f74488b6ed23ed11f8dc9fdc319a433e9e44a41a8d5fd80854e551251fb3ea2aeea91763e95686e67fb27c824afba4450780c2f4f1dde44f63bda6ed24c1a6dae12792b3e97db4205e7e786111e2b134829cb8e59670b778208165a7e41e9cd9f18317a169d57a35d379b3a762d90f811cbc50d0ceafe2c20d9ce9ab8397f905f1643ad09e5ed2d0f642d29cf81ed5bb35d6730a99a6e2f850b4c4256880673d38eda65642d4ec03066a7ae2d308b6bd9a3e139a213e798851dfbceaa0c4b24e176fc3ada145bc525b08b78ae5701c960e6cdafe647884d141ac6247999c90d21582bc5cfbf76e9c1498a50a3134abc9c1204514389af53d10d18c78ed7eaddc1b2e08469d35bded5450a11f8e54079748c8979db5a55641b55569e972b98ac0acc1b37785849e83d9df0d43912e60e330b4ba3a67e1ea07751b2791cd8420697ebb712c78d2061cb32354e0fa480414a7f319531dae83719aad3d351c9a8caf6a55dde014b3c2cd268e14ce0a54ffdf9838a13b1f21432535a665234d554f146dfdab483976b5353f3842c9846bf091c9e4f53ae64c6d61672226a120a620a7ee5cf65e9c1942eeb75c959cac75d2eb9e417aaae22e61bcfe68be44763869e93e171ca67bc935116316a7254ee79797d52edab943f5660c1a6cee602602c6e0c56f503c8f0287c0f16a87c082d473ab6aff4c8cb6e601e502ef54f21629711da0249984996de11c67c469abc7072b8c4c9dbcbd3efa1ef1be1b6763f473b746dc6e0d4d90012d02738d69ad381884085b47c869c19ca166ecc5fc5d2d45e282cc84ea45e82428bf31681d7ce66f95218e811770a09d2d0bd60747762ee3272ac6599f1fdd70cd35096853fd5de65e81d476ca9558dc3555cf79b2a361cdd83fe911c84f60d0d87bd441df05b4fac5edfc392e60158cd52184a40af66ed9ca72ec61ae2bf7cfbce5af7cc64ad4d1611a6d328b1648a02d08a558d3c0085dfbde92a8c2e71d3cac5863d4ca16828a07a0f654fba7899769425f03a9c4f2d2e0f4dd0d7df13d3feb772562f6d77414a0a7f57e09198107a6a87cf8a1ed15810333235f0e357ac4d588546ea00a3c1dba6eca98ce8229a30d19496a516bfededac150f90a86cca73e561e54b5bfd10db9f448a1979e19f06b89bde01061be583cbd3451933e9b3d3f4b9f2e9fccbea76cfe82035ddc96f573bddda0feac2ed10822f79dec0e492a21f85231829b83a8983c75bcf8e46431de5abacb9b861323741d68373366e1d08dd3d839878af4f7e645a85277f0448c66e62ff96350654d6f0aad16e1b5de48d7962d9cb170192e6cd81423ed2f341cc64a8086bba6f32784201d93362b4f307a123e4cd67959a7907778b152f87b41837f5cf6b586f49a3a4c09cf3d79e4b9c09581f66dad52cea6a1560b3ca6995136ab9314f48f33c082744ab244c03d90c6ed8af8f0485e1d2bd489ffe7d754464c1e806f27332f50b0d4ac4786bef617c28739f86be79a4167463002c7f5171569819124ac8f2c25ecc13aa3a732126d9cc33bc8d1aad9b020142472b9ab33ea2c1cc0b7a7716f98261aafb431e08307fafadf53babcc120cfa817bd51044145fcbde39a6160fa606ecd67e940175092ede419653ccfaf05051ea2249dad7f660771a36129f749f0aa3d2a3ef7658648b753a628670c69b863077e4fb6008ecceb3673bab7b44ef7d6a611b7fceadd6a34338513f255c3c066ca96266a139f816396c009381c90258771a49aed4fc525277d7b1e73e8837e13e49728a8ee6b68bb4b20ef5c4882df966f7729d798c5c06e3e3f9b1f1c16f0b99432e6e11d50d5c4f85157681f8ce4b8d2e68fc0043ed3db78db8475fc3537899d4c1c3de13b40d885be110c4c22c35c691aabcdf4d16a8866ac915814e2eb22e1998f38a697be7774f210f7aecee8c74b4ef508bcda6d97091ffe13d6dda784e1f2dc765711f9e80799b03c356bb95b82fa61e8f978ab68c8636675b97ebe1f0c22009034a94f01d0aa2069ec497a82f3f733a87656487f1ab5adb065ae182b6621f6df536b376873219124af5df7e02f3a91932e0ad5debcfc957ae5303781504562768ff609f72dfad28794dff1b754e2906f2fc46358c7d8dbdd869c515af26fa2bffbf9fb9e1dfaf266072c69057b2ef038ccdb2650ada5909bb392be2ea05ed618cfe07ceb16ca8a266c99d6a2239cade9490bc49acf0871748faea7b75fcc4248d53a6b4c9a5bdd720d0597d9a67592c4a894cba7699f21cc8715ead02fe339bc36ba3eed5417312ac12b9272d231fbb33a0a9c30069572eb20c4576f7f326a8e36d1182a0524f2d12f458f3652bf8eb92b9a22eda0b047228d45521b2df45ccb0465a0a031b4c4eaa2f9efc3f125cde9fcf1e7784efc76cff66ae2b4ceba06fce05c148e5aa686285b36cc0275a0ab8c59b5092bd33ba9cd4c76a9f284615ff9267bdc98ff4e3dc8ee83f67868a54119309144eb45dd25d95040639eba43cbb46913410160b1acf4a0b0b12cae22c6e26c001795db5003bf2da4bed7b96d55230cce8b934bcef09e26fcafbf0d7c5c891f02fc8f7cfe26010beb683cc396b7dfd48722529266b8f85381e6f4d6b8b32bb96887a8dec62c9d3c2752c0ebe0139db85fb022b1bf87f4dd1efcd1610bb9fc94be0d228f84b22160a2014325d5ac45faa79341c167bb49dd77b0d1b50dc44d1b79ba945f993ab5e9e2712f7e5f5c4cfca867646398c9b62072da69d7db129ee5b21fb443d5d48ccd19286ee30c3a03b8c34934fcd63ee17fe3333231d45c2a591b1ca4c8a0387d878d4fb61296948eb7b87cd4bf5590a02df729f5746ce88cec5256f11ceb4053558d75094f5bfe1dff5750e44085c67cdede390fd6e238206970e65aafcf5ef1765d5e5d3df90f3939fe18c659e2cea54ff0fa2e5167244daa38b80d5b58b2386d162633e70d8c35c844a4ec525a96fbd2fa7866bc9b606866848de8d997084cf8dd0192e1c9156fd1dc8e57dde2ddf29a1e420a19973ca96ff96a8c8c6b8f2d75792b25381c8c3cbf750ce08f1f5c91fdee7cf6655fa0f6a170aa17704821c11ddf4cff77df60aebba43d476daf3fcf56ee9ee31d882dd5d7485e4289508b5b4500c606f0c05a46e6e180d7bbe6bf780505015736ede1489115b769a997a16ddae09a49bad053ecc448594d87a8d8a5b12064b1dfe0e9c349bdf63148608dbd1d1ba178acf8389fd1c365dab287db882ba919bd2cd51d26b589b665efd8e973eb5f04a8b322c59ceda818cfaba1e18f11a08c564bbc7d1dd5dd74077e4deec9915a4d32616317fbde1216fdcda35a02b503ecce8e08d810a1bd33106d5ab2fd5d5513a885dea054f14659bc0344d3e14b410a8d02fa0caaaffc85d31fe76bd2e10d6f1317e6f2b151262cf0c6025436053162a3a14c3de6c4cd4fb54df9ec66c39a71d520e1d25e5ab053ad9af60fc9e6e9fad4e6bd9f168c5d35a0d657b57dfedcd1b45e267c6f0a90a248632b6312cd9dc676e133551594f652a3355f12f7a2206734e1e3d003e41d25728a03afa8dfc25829dd9e41e53ff35bad76ea3a1d5908b7adee0f90c10326ff49fac5468d228b900728f84da3aa6838742d752e42c4ccd7a449ee1186f25e839049b1c5012d4836b47fc4a227303eb37bb3674c0750f11c60142ca9de0c2a3f5e681fe14cc4981491e333b8072ba329e6e5a6f3b6c9f83af634499aa05624570e744c1545efc2c3e5cb9b016e9a981d0b696a0cfcd27f5054a019a7025f09f647ebcc4c2b2a5b28abe049122112d8f0b61e6859586a1c0beee8a3a5d1135e95f6d5e69078be4541ca4d8d6c54ceb4dec3078d415f06a1d90783aac8f7c28cf898ef220ea6cc4de4e938b205963795de4cf884dd95b7005649aee2fc255c06d6e826bfcd6b78f2928ee3632e03d4eb297d779becc4b74855d9c8dc6ec66ebd283ca73d9ec68161968fc7aa12bc57e98e7a2293e1e0c869b1e13817bfb0f52461466463b67d1b69b95b6ddec85d76d61f82007828f1a904d387084ce35b8fa6c788f159be129f8134197dbbcbf82fec8582e3933c33c35f0089f56ba2576ea2d09efe50b543c9caadbd5efcab9e6682a0e0f749533794398032c09171728b4bfc8c8ab1deb36c9a5409b3f119d2e2efa889dbb5d952b848e714f1c1b1ba0371fb5f6b9e0fc2fc5ce1d16e34d0130c4f08777ec0bae3144975cc44202b99344c5c56e4e0cb9a823b8812b16dcc9809b6337890d15296643300300218cd205a515d865afa1f728d3491db1393ccdb021ebd3860ed491cfa18eeda9c38e1585b8f9ea9221","title":"69. x 的平方根","link":"https://leetcode-cn.com/problems/sqrtx","question_id":69,"issue_number":40},"38":{"day":38,"pres":["二分法"],"tags":["二分"],"whys":null,"difficulty":"- 简单","description":"```\n你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。\n\n假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。\n\n你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。\n\n示例:\n\n给定 n = 5,并且 version = 4 是第一个错误的版本。\n\n调用 isBadVersion(3) -> false\n调用 isBadVersion(5) -> true\n调用 isBadVersion(4) -> true\n\n所以,4 是第一个错误的版本。\n\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f21931c3385f243423d7847585e26598c9d2a6cc1fd231c0b8153ef1365dd67ce65ad9d3e03c1ae76b561bceff835f3316e60d6d7cfbd0a2ccfea998f527d3be17095dba7058c27ad68cce6a7e19b5c30dc006ebbf1446a7247fa4f14415d9751b4cfbcbe22aa14b6fccbf732f72792854455720d11561ffa67f406fc68df5b17558113482535a8c08478cfb8fd0463772b0567e4f32f5e4a2c87ac1960494df6d492253b7729be5aa87334bd1d75378a15bd530fba44a3db536bfb687821b174965f144f9de67f40ea9232500382dedbd950f0c530a98d6d1185e2c6e392066f34c6fca756274a6e9c6a661c42d5ff0dec9ee9c774cb3969144fce3e136d9a869360be09fe1ea7712a812e4d0bbe3366e6d4e62f2c67449c56142bf6c6cc2e0fb656e2ed009283f80655da8b689a10679079a4ab97e6d6e9739bb6ce01e7c0ad8bec2602509655c48e8e705c6ad783f0d4768bb97ada5b5a4b095f718c97018dac1dca1b02745b40f43eb0e6d22718e50d20096d95a66a16ad5053b05005db582397e8b712c78d2d58c4322e4903988e40427d32b939d4f11b1abafad95dc3a4d5fdaa4fd7007f202ac16b0cdc83e76999a19e1ac50270f846412f31767773fd2cccad8c98e1f865c19a46012d9f7cbd021c5dfdeb43fa9f8c3f194160a7cee2aa71d2d466f2d7478d6499b9599bbe7f44394acb33c25deb7391cfe995770dc0bbd99c626ab01d3a84b481b7e0f626dcf3b9c9afd6b142044186fec0877e7743392b1f8f31a58d17147d38ca0f31421d2adaf8f2a6b84225747b769b516b3b85609f3325f344f15aa0299da11218c4b52644cacecf143c2fec3ceeb95031abadf56d796b741cbab816ba83f2bcd0ccf549b9a5708c93f5434325e10882cd8b0b3676b866f632aa21c0d17cded7a80ff53e77d17e0b12fed2f8bc6f695063e836708f7a95f7c4d42efd5fb9bd3fccc264ef38445e97548beb535cc9cc08fc8f52485f11945a3090f86f30d4ee779ba528e747301ce90a1e8195ebbde7419a5c5e58be2ff7869def1124ce392eed1e0b51759193519623d61193f371c0780ecc80b98754bf652fc5984b6abc8652e5ff64bc757405e567d906b86aae33ec38248d9d99295815f2d4c6987369186c5c5f4f026c56f5a39a116067a3cf8600fa592f0e3322f9e248b04d4d9d48d21fa1e0c4a7db8680ed339539f69484a614a9ffee9d270f84956bf15de46bf7497ecc1feebe48ad0a79c4880c8398d30e0c16cab6c7de791933e9753a05164fb18ee8af3fe8bd5605bc43e7ba9fba9b389b9aec9760943f81e181d880b404bfa967f8b8462fc477c98d4553d8237f38527e2e072750c79b61fcc59edb5dbf490ed433aaf4f9af6ea8b5df8fb95a3490867cba801597b25f814a5e81fc542c591b87c371662041d9ef237bb44ab01bac66bc6fb0a1949602b265b8fc06bd1a201fb8f7d137b4977182fe6532b08134945a92eafa3148291c7695ca77e67a65a6e93c23ab1b8c9788444a8553ded616d9c583519c99c5bf2ba8cb00e00a6fd385862db93c71f335b89f34571b3acf855bd52943e34c4165a12058e0576d2a56bb83a35e49809fecdcaa475e7c5853bcad834d6e1df558d73792411933cd1aa51e46bc055d5817f5ab9016747484b9b43432e798ff875ba8f1791d283abc19c9a711cfac2b7db0a103b8162f6d67888c2fc14e23f17bf2b42a89652a386ba758ff0dcaac8c4c1b8221f715a3d4cc7dd55539fb2cbb4bd7e7fc807d3b18b43c7c66d12fd2d9e209e1e7d96408e3d771e286a9644ee64a59601648ceadd6a4403b9cb24d14297703a4111c8e48a70e52371dfbf5d865187070259ead954e173cd1fc8338e145cb7a1972f8eee2fcdeb2fa79e6afcc32880be117d952f00113a885d7c68eeb104ba7229ed9c776d493951ad6db36f200d0cd6d6c9f79458f4db7c7f24b17a36e23e0db8b90c35ee508ed30c05799f34371eedbc783970424e9db7eaa4da62b9f152c36a3f3b2767ad36187a79679c1d88776b7e543bc0bc9ef07e9c4a8545d812e517b78ea2bc9815426e34f935e9f391d7ebf3f16a69383b9ad8f0e645b80dfefc6e52f02084b82e7100a9d0b8fcc94800f3e7d3e85514780f2b659c9265fdaa154de4a03f973ec61d64e3770e43154a87aa98d5c69c2f706f15c4db67290ddda2d2e908cd2fe7e8170cfa3c6c99361c294c5fdbbe8cea3e960f9445b37ba189244fa3cf12e35634d6e2c48fad1f30e06c4f6eb0bdf8b85374b8e2755ff576e7703e864932468c60532c03423f37f73f39dfc5a4f52283305aafa13becb3c47d7b01d7dec13ca610e6d632601a00f86fe27aa9dabc14ea40499396e16c2719131ae36ac220a81466d6ff8b5a761d629b1baba8e72842fbbf51d694fed12ae6f5c315b976c31a7d4647cf495eca218946685c4705f76367da608b79772699a0621ccdf57ccae5b5a1203dcf5eaaa27a8fe3334b37e030082db407678a96ff76893c3ebaa3708b15fc3104eadf8036ad859e0e0ae7e5e1a98042ef507585c0fb942b8e2d05f0e6db70613582b43372198cb417cf0ca2ec59991229342dd79bc8939f5b93ca34607e8ec8cc5eb0a98898dea240ebe939228b696d87a84e03449bb65bc066ce0f81e2f56f31255e4798236701a3e50166c79e0607b0c73e2ed77ffde89b9f19d71bad0b3fadba02328f1a091cba67ff5494b22b5405c8f2a4410b6a7b6468bf5711611e6bee723f4d45b0048da9861495dff1b58d12b1f15253b5e4fd791a6ac39e0392ef28df8731d3f1f736b4fc15ecdad3674bba5fcb94d973805d5eff7d19cd78f05525fd9cf2b482af2e37dfd34ff1336a00a6b2e3b9d83c6d9f53cc3a33fc070941d8d76901efe3e2d23540b96f6f5e5ca01c3479a94739de73f69600bf560ffcd56f5490602cf7ed6496487dbac846119549cb004335a9a1d91b1aaf5848d6f2444085c67cdede390fd6e719f06970e68a6e7d7a3176ed5b7dadf9fa1b98dcb8c659e2cea54ba43f1a03c720d9ca3c6c991b5812986c32e60736186e24d9f604ec525a9329705a7866bc9e443803d0790c09c2fae9fa79c28045cd116d737a2a42b9f37f54aa7a42da29c2581b6afd1ea9892fbaa8e31d3e10081bb8c87a2048747bff58c478ae3cf7106e779620c1dc2384ae1535f89a680bb7dad20ebba43d46a8facb0f164ada7748c93b11426d6b04ad44cc3a3470b7c720c0da46e6e10023ced39f7c010103f59049f42819093ccfcb327568cff62f2da8746728d17d6dde561c18d0f46494b068f249c349bdf3341c413dadb9db659d683cecc934d3600a33a19ec82e2989b89e751d26b589b2f10a9c79c7fa9ed4a9a770652ced289defab71e54f81a168921fe9b98b95dc65b5de4deec9915a4d32616392bb5e4374bc98353fe53037783a6e8c0c84e5b94655dade2689d814c2e9e4efe15543e659bc0341f3e09b40aa9dd63e8d3fd908e092de324f4695882f86a54322b505e318a0c3b0f4360535f646e148e97285198be128b95823e6de0184f47516ba3ee171fcbb44afc9e6e9fad4e6bd9f135efd3134b6d361e9be7dd782bfc3fcfab830a248660f365798b926722081f51594f373e5e408f72772b685435760d2a1401921762f310acccae258c97d9e20f1af93db28727a1fed69a9b2fc9a7a22e59610db5dbda113a8161f64e7b8fdff076e3cad955b01ba02757d63014dfb3592225b3704acf59170ac392384ca7146d2742a737ed7326933c405f952b42cacfaf9696f5edd5e60fc652f00050677ec737e86f9e1a122a6600d6d1fc3744dbeb413f3935b517881b10d62c6c19e7ea6ea7a981dca58ba69ae761a04b0908f96241b0d76a5d96fce3b98f98cab201862956428a1320a8d684eec48cebbac33956456e91467f54714ed5fe30078ef2d68c02bf1ae92047c047ac2e1198783ae89b7c21accec6a629ea37eede07dddf20152f2109f58ec15bd95b703029ceeb68c002a5223c8a63ae9ff0c72a60ac7a3bad371aa78ad82ba59e7a5eaf5d9c8dc6ec66a29483c277c3ca294f6f61ae22e86cd97b99a7e9322c3457ac9b1e13817bfb0f52145d6848673fc3fb9f98f2c3e1c88f3242f86c079f8f5784097d37d79a2ec9d06c788f159be129f85f04d1caf0f1c7b3c85a2e3a6bdd6a56b4088356f76c6fc92d5beff856335fd8aad6d5ac94c7b33a640e4331d36762699803345e6e0f33ccbadcddd379e1714565f67782b358b4a83f203b20c925218ea45b421cddfe73aafd737d3d1f21b8670b879071fbe62f81b88b78814fad3fab1ef1c5763ab5be56c5e9654e0fab67b31464baac1e111e43dda766","title":"278. 第一个错误的版本","link":"https://leetcode-cn.com/problems/first-bad-version","question_id":278,"issue_number":41},"39":{"day":39,"pres":["二分法"],"tags":["二分"],"whys":null,"difficulty":"- 困难","description":"```\n给定一个数组 nums ,如果 i < j 且 nums[i] > 2*nums[j] 我们就将 (i, j) 称作一个重要翻转对。\n\n你需要返回给定数组中的重要翻转对的数量。\n\n示例 1:\n\n输入: [1,3,2,3,1]\n输出: 2\n示例 2:\n\n输入: [2,4,3,5,1]\n输出: 3\n注意:\n\n给定数组的长度不会超过50000。\n输入数组中的所有数字都在32位整数的表示范围内。\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f279d173385f25055317d6b5949355fa48dc8c9066ecde89f32f426e3ac57af2400c3906714dff32ff523fffaef2ef2326f68889bd3f61f26d0b68cd04d7e3ef66eecfee24fdeb15ce047074a2b7dbfa53bd80bdfca6069b8e7852f091039a43ac1c1ddc3101df81f7d0e8c339e7a98d53e443853263341cd289b3f9837de2b7b69e24a4c4a74b0a53f33af99a15d7436741417a2d14e237842f892701d5c26abe6e1773a35609309e96460f4051358ba67f4546ac84cc89f55118e6608728235cc61522c909a0a7ebfc611377f8cbaadd92894fc7bef9d2147a7b0a0fff1416f71a4d5cd233d3b28a91c3f0f3ca8e05a87a4a29c5eaea9cdc3c5493e2f579a879f61ba10fd0dba9cba26ebf27dfa0c01afd246c1b9d44984421922e4294ca5c32a379cef7fcebd5de4c87b8957b81a569a9c1201becc1c68cb9a8de700c5f14f3e710cec8a7ad046ec39da99d1588ed0cd76a29e976bf99d3e1400249ace90296ab767140d4f5947f23d87cfd33a2e0bbfc08db535a44a2da16656b15405da6f1897ebb712e68d0b420da2d0bb22b8e3187615718267adf75d5c4b750ac12582c8b9f5419144abf2a221b1821b273fd52b6d66df4ff8a374872f69655f000bcf69a987d5c2d69613c95ba8a2eb56d599177019cd8d19f2cad005731f65c1add7e830dabb3fd59313a23cd09815fea3cfaa67798f63d5388a58f7bdd2e61b1eb8c0cee03b44cf743ed3c9bedcb8c26db2e9d99b8db2cd7d6d0996a2b2be351b64665029ef6ebbd86e1d1541ce6bb2c81c12e9fbc5a57eefb397f223c35a2157b4c358f2903cf75f6286ff3017a7bc92ef0801abe87c146005ef20feba67326d03634728b2e6af6d1193ae8d87a2dc968495291cb8006e19284e508d31dd7011dd932ce349a4529c902f4b1583c7cd47f35105e811560ab5adfbef13422c3ed4562fae32cdd5ac8613bf09aa11e7535db3963c21ddf70c84a23579ad53b2ff8976496813977b119ff1753ef7e079be962ade781b3f3680ed4586b02a18ad189f8fcc58f67f723171d5fe5af4fb6bbb4a1408abd3329c63b00e3c7699049492424410ea3bae2e77e4c8f4b9315ba7869a27bc775626e57ff905975741b45afe81e8e198473a218183ebda2a664a334d203b34010fd23777bcf3a03ba9e225b80b07b9df51d5a83cb73337aa22be2bddaae1e0435d81dc089a21e85c646f95560929219ec738df1dc138bb52b31469bf6dc5f22d9b522acce246bd4a1ed6e987157c1541d592c22421183a3b0a7b770267f02636ecc52dac07dcf0304cad0c4c128010ebf540100b187db90efab929a47a82d60caa0a00d0ab9b3a7c6552782d1c730488c16e70345052dc77ccd879ae7b737454992737171d4af3b17060fd0b5c977e1d2dfe8f9e7b6fa8eb175f96f83d630c4898a57d2df542a1d705da64c351e0b78301ddff284ad00792e6e37b520bd7064aae160d8eb51832f8ec755a7b6367137c9dc4fd9c54b601710a69ccdc2ce775144bb5ca6abb1358b0feca178826695147ec455b488028138ba0eb9b3feecba1489de37f617b6ae8c205cc5532f50b0a71e35c429d3a5d722c9ee0c540ca6f70235423f09ac5fc965fcfd87c277edc18af16f1f593fb6473f91b1d14ea9b0f3f40440da2b229a5ccea30bdc9fc6f6f901606afda8c9ef846406ec640798db23f28c1de1445176ffcdf3285183c9704f7c876b209793b3cdc61b453cccdf0735fea2b6ed7f3f1a7fabd3613be75931aacf69e2885fc64a56437538f70c69f841748e6e64409d4d87cc0a8aa4d63e341776d1960cf92f4ac5236502b3d5d0527638d4365aa20f635386c1eb883ec3a97efd9844e152be0d671cb9b098e25fc6cbf4a67be81e9986409f85aeaafce038b17fe16f85afb07071d7314497b01c6e52995772b499a3f4533ec5a3fd1e220fa48ab8e099ed30ab979512ed0a245bcb0083201495fbc7b91249207d6465bd6b6285b3d4015f9cc641383658564a04294eae33c2e04ffbf7cf24f390fbe353a1bea0220dc0dcd6071c155646dfb8806e2c8f7e832a3715cd3dc32cd079b1fe093d728afcb393f4c25044092c89d3f5a296f3da6fcafc40c149baa538f69321730c9f2d7a60fba8c400c0b9568b29c7a037ef48cab48b777ed11f5a3b64afdd72dac144ca0af6168a22785f519f7536f620745dddcd231f802a66502ece3e33896dc8ae1eda6b1dbe720f85a5137b914933d833688a4fd9bdf9ac1c37a7d36a6a0020c1e47d5e7e6a1835e455abbe5b3bf9614bb1ab79f4afceb09aeeb39c5fbd9b7f15a89e5befafe323fc5131081f41e2ad59870a9ce0e06231d345fec6cc7bbe06f077e6bda339a1effd3b407eb17fe328ca84d02dd062d45cfb6ac2d12b81d2d1b28bb189a83f51e6a4cedd40ed294a6d4bd46b07e6de48e251d2a6c9b6e840810b293a2c0fc009d590cf7ac35abe47c6e916c1393fab1c07c542fc100f899127539ddcc9c381ecfefbc33c1f726c68eb8aaa190219834fdcc225ac7e352906179ae300b5757988233afacd4c7709e3b7c15f6a3a40a84d6ffb18499b15054e6f74a73eb0c5711b836428206f18945ffb92ea381ef097e6c0766aa7689e76ccc95506b6e9d033336a14168d0932ed822cfd23079fbaff13fd290378525ed9ba9d3b54561f932ccf5fbe563189f732c44fdb5dbfa707a2f14346a938b3b08754749913086ba8469b1ec74dcd2c263e9fa0f0010f38fc80b2830c47d53e0efcf2c1bbcb6cb6ff9d125f18ecccc751041b092f32aed24bfa34a4a63dcd4d7fce2c5af4093393eee913966292e9369b2ee556f1a0d5a2d18c0a1e5d98b2b8cfb3172d022ec4190a71de65a2eff0600010e1cbd0e6ef008f64cdf15eb029131a297097e4bd6ffebe8e0088a1e87a305bff37d776945e7329bcd37ef630602cf7edd463f8bcb9acb6c214281b11974509e5099fc89bc9fe7450e06410f228eb9edd9b33d6cd01fde8cc9103b4707d1d65a73474058481b495120a0368a2cfd61ca0a75d0ddbf5906430e332c4eb52a06fbebfbb8642fe9148ce177e00cea78873740de59719d70accd530f4c98405f1204ad99169b9052af0d40f81b9d71a65274aa7379b75b3138203e1267116f57d298b890216a0b726a976a9e356856d86a2e45aff323958b9be62db8982ed88c42315140bb5f942e12d31295682b593de00f77fd623731eae24c53bc508c1820a8faf0a7c4c175ba3a14233da12d9a8e1914f0c5a85bdf6e187f437707ab92074a8e474a40ddd64aad725302ac077f8894d5a9db0a9659911e1abcdd0ce306556b579f6b5f094b2a84e59066d19d2b05795f212d21e644a2ef0fa3da50016c942877d15ea39c59cab589c2f3bed1845ddfb317e762164533c601e1f922697a50a23016a2f2b9961f68feaf4c5fbfbb053f368296f28485c9f23f4f2cf7bb3cd5ce023d9e2db15111244fb180740d6e4d9e04acd830b6c295f5c25c79aa6bba737282f86a542b6e5312308a5a25771025231e2d3c4786c46d1ddeb212ea9cd41470e05506035160a3bb0c28cbcf37d69e6e9fad4e6bd9f1298b8013566d2634b1e7805201fc3fcfabc545768673b67862d9bd7d44133551594f3763741da532372242635f475e537b0286596ae969bfcea85a8d91d2ff0f5bf27fb2db27edab8ad0e56686e9a22610326ff49fac54299c7bb90b6f8fc89f38eb81da5f971be90d5dd650449ee1186f25e83904d955030ad29b364be9336d2157e373b73635c95f0f11c60142cacfa5c4b3f3fdd3fd5dc91cf86334737bc05890f52aff9ef5c882072966dec65e10a1f8e1c721d77493ed6ae5eeb12859cc63337d5f444e334f43e04fa18cf302e8aa351a94fa5120527c171e0c43c11593bec17bd1e9024256554c49503a05f897d7c672cba390e0e1473ae5996045494bb6378838fac304c660f8f81b83933206cdb5580c4b558f2ffc7516986416839da6ccfb33741ed66ed2bfc1c45e3ef941fa62a8f711a37d577315d2a508d3b168c08b010513b03253fceb40c32b4b695ea34e57457da8591ffccc91b739ff1be62bfbd4eac233697b4bc8921adc1dd78b56060e5b6100f690513f4f4e717764c8ed663aac2943f3c6048d09fec6011aa02c3dc2e8408937e143b94500975b5f63004a091e5a632e891c3de40847cd74aa897ceefb4dd2211a76dbaa124e7d1613474200ca94f752b3d8852c8cafe9e59db45c8ac5c9b11ca568aacb2be86b59d2603dfaebd2a2328f01aece310f4c4263a33105aab8eafdb551808a5e59f0331d62a0f59564c668e96bce41a5028cef2e5d87440181dbe623e165d3f8751669315a0780ea03c7a2c5dbe1f599c2ab5668538f4bd178bb9bdf609e3143b9adf01b3f9a7f770bb9382c6d64146b665f3455eaade890d9597bee8246b4526385e624ccc6387bb5b2f280c4d7a31b61f395891b42356fdbf1a56a684e3fc07fc48c9e7ead2e679405a1f42a2a682cd52c88adb272f5ea4be4e5dba1fdaa49bb029a38875ec14989158baa8cf796a0ee217755ba4b361003f43e6f1ddee98ea6059c09c13120225096c73e65314f28bc9cf7758cf6bf7cae16c5bdb4572f3c2d55a7b7701486455c2ad20fa2ce57248fcd9ae900dfa340aed40b8f2aebd64528b4a75bb97804906ce845899cd9f9f589a268d9a6fa5e2c9a871105d542b53ad28a8ba0b44c2d8b6575dd332fd2e70fc64f691219862910e657e01ba7ba46dfa832d80c6ec1a218edd0eaad6eec30958833822d7cf6800b727aac1de7cb41ca9e120d363a1ab7b2e72ba663d12fb510a50386f4d8d85d933ed1a88a4de0721beaaf331b4bc8891edb6dee9eb3fc91e44e4badedaa3640eec0ae87c868159d5e1868e90f72175a2a12cf55348e38ede34f2df8e1dcc1d0d98bb9c055873513f2521788a97a069c6b848c05036511ffdb2105bf1a59f7fb8e441d53f4b1ce7896a05f4f8cdb51a0ebb180c8ebdce1c2c25d5ce1414bbf85159bab42153d0f436bea4f50e0d98bf923c68edc1baa5e774e338418bf0cdda443fe3541be695fbd554e09388ea9faeb59ed9085dbb8bcf4d07ba7cc5ec71391c099b14c6e3d149e88a0a1965d7be0ea3cf825e49ff55a4ca0b50ee5ece78286a3e8a184c6055a1588229e6a929f42930159d647755818244ccab95d0a3943d5ccd457153975d7b5165fda8949e080f22e93cd759e2ce4d64e5340d4499ead8354c12117e813f15f498bf23f360609475967fcf0d8258f4e2e5559f2f5e46d2191d955f64c242e04481415725739abd6d0f4db5264c8821bd7abfa4446aafd814b97147c2c68379f065a55a9a7a118ec47031f619be06e3028ab3d4b37b17ba4ed612212af484db69d0f38da432faafb9a747062e08883fc8ce6193bf0de0794831ae5e96d11738a65e16df321ccb9455563d4ab3055d51c6334aa63b8ccd5c52bf276105539c263f1e2f05cffddc40ce0ad88e63a3faf72ca83835e6a48251b3f48a4d7d6af8965861e0aa5fc9f9b27f5c4a9fd0e6de15c9f0952e7aadf6a5dcc325b60be01f15caea7a4c9feb46945fe3e21720f5ab5c2cca0057ac3c467a7895e199665775eeaa368d7a3422a660657d44a028b7e198a9b7a49ed42ff0fb804dd16687aaebac0fe81b1d10ac6680db1a80aed90b8139393a7f25ab27133090f0101ff2972d42ab96038d4faf362471f4be888c9f2e44f92523b0cdf97c78f8b84c4060ce4d84e3eaa6d1b0c9e95e11ef2a87f2f1eb71b6f7b8bb3ec36c45dd856b73963a6a84a552818cfad10404f1312d5b46d5a5e79b530d793f6052ac52b58464ed24d95f3d540ac6a9cf59cda30584635847f91116f986af5dda7b25f070306b3c5bd9299e5938a645afc1289b60eb59629e6a1a04cc8eb909963cd9f47527b298288baeacbb0c6e8c5c45a13f777575ef7c1a7445dbc4699e3c6971c5e35504d850a315133629120d8d4ff2891cfcb55a60ccd4f9701148c0b64d902939940793e5ad28e6ad73f876377a7706fec69de56cbce55c635181b76766e2f3822f818f46aa803cd2a3d6f3fdd7068cb510b8a5bde19049b2bd35b6a0f3e762bf057e47e342bd00eb74fc928ee8aa5b52a3b5f2a58fa10b75c6b9c5fb92cd3ef76d45b9dc6d27b625435f508271ae1501cbf0aee886bed0741a630f7da1c4a20b9e1c9a0ef7524b5d16ee463b2e7bc2467f78efa77026cf3b1c6e266c0bffa4951943306010d45f6272bcaaf5ea709c909d613f91ce03b46ad04358ee4acf4b9caa851a0810bc4f03ae503ab4159a1c60b9e0f6f2dcf4d981df0274c0dd7650df4610b495c0c3f174ca1267037b094abcc8c79a34a03fa5595332b2a35f93b2446268e07e8e2301e49610b04c796543b05a62851709fe62bb93c861b551c118a114b4b7ca48b5b313c57bffbfc9965fca3312fb91e870fe0ac693b0aeb54d15bcd481649ef954531a6b23581cb07b75324700b6a95db51584dff8adb58c27e361b08e90ddcdf843f1f651d836dda7da976c4e1eb9c7aa6dea2603ea741f108bc477ecd83ac7d3e40769bcd4f40cdc7dddd6799dbe9831d8ef2df74d824baaf5195e4d4b8cbef834839f4464039b7fdb623098ea6f634b43c7a3a458dae75cc5a9eed6165ac15baab9ed919f155116ecbd9abbe2fd43d25983c3060fdde85d186e7224f2b4bc0a38f352317fb3fe3d428ccaf8d49c9f4278826cf5c90df8c42a435901e31b169810707c93bf649ec661b2d7751348a30a3b7581229d1dd54b94969cb0d0dc775d743449fdfed29b066a48a325474ed542bcf4d3acc42634d1a09585cf34186a92b92cf54a6c8142aabe2db76366d1e3034b93e28744b1bcc1204aec0a7a80032f4122277bf1a04060db4552e0ab3cba9eb51e279dd3b57615b70130d6045102a40f8e8901d5ae6961b57dc1be9fc70400fbb1c077a0b9225ee58199e0713aac8fb6c25d93546df06358d4710fd507ada15688a8ed3b8b2d4436289042d1a47573db4320911d82f30d6c66347e3b7495bf01239da4a43e05729e7dcc2f1deea50cb50331c1f16ed7a21a38a261681de06b9cd21d149fe7c04fdeff9392f3fc7904b5217332611cbc0479ac42b49aa4719a5538e1749c31bdc17ba16d88abdcaf29bd93a5a442f7147069c56633466e82606154fd64048adfe872b7a22d0b7c993ec0aaa9b699b7265cca091ed309d063b3902fda0a0b38abd8baa00955c46bc6f60bdc824af0001c1c4b946363437a0bacba576bb1427ef82b4e257916bb3870253005ea3472b2dbd924af38842483b47a83b096bf1d0aec18b5c430383332c321d1a570d6e5e16c9dceeb8a842f50c5dae434f81600b792de991e572288557ca515ffb7a2f9c9bf63398dbec15a551fb4897c4c7bf0d991c02b333527d49b2784e3c2dfd67f09c6ac08d688c6ecaf5c3574dbcf96d382d0b6af1276165095d43120eaac1a4e0c9a972aac8b6376bc2a184de23fce29ee62b60d486dcbc6cd96ee9a578409d7c04eb50399772a511de317c0f810deb22a2424653a15d6d0ceedec3ffcccab474a2c47928ebc99c84cac5b7a509a1ac1a3e47832edc2e7c7369aacb38ff50c3f25e8f1ad0e2ccd1a2272fd37fbe672fc5c3509bc69e247175ae1c2ecf5531e520311dcf4965a6879a25e961f79c5f3d135cfb72c4696cfcc4effec9bd066b7b507b007db6a1848a1c279a8affa4628009ce491e97a0d18758ee6b879aa9e7c350dd46a0693b0664ceded78566170dc2a6918124c5795de4b75015c9601e35b99ab5e3938b13164f157273bb86a0311331c43ca229de8ec141a0ae4be3501d3076cda470ff343c925a03a10132d99d316595207a1ec9cb6d5410676947612c10f73cfdc6d85f7e60f335311f4e47bcb489e806d40a83fea2fab743afddc7bff03b1faf3990ca2dd3722fd705f7fb53c7b31639bcaf18ea54aa67c4084557add551b5a3337a25cef422521d818a40403625b8ecc642486346b7e6d4a7895875ed03b41a6efe08607c936f5ab514c021e218525288741a707f6dc611df68e7ed79d717f5c6812494e96d21278ca787b827fc25042c5fb4edc16afa31b1d0fa2c1c44efec91c8c2b857a4b5ba8ab0d35d6cb82af4d33476ef78025092e60427eb0eb0f39224be07a9f136dc02d70c478c1630682d95473bc9f565f0d766988d35ebb2d9b7b2f84192743da167949b57e9cbfdaf0dca3d611e58707be445a1c62d961ff35d47925d50787f6a858fa9f6b2f2a8f27bdd02774b0c90601a608c05344068909a9e436c56a4dd784041222fb521e2069c337bb189bb3fdc80d316ab145fed2301994baab22df6e921933ae51ebd80a7ca03dade7af23910a6f60a1a0fc107e4ad797690e785e7008f3e37b0a38b6149ba1a51961bcedf46da0a524a065d1433c49bf2c397e8ec6e69677cb70d000065b80abc1fd87ef7b51cd80fef698e7187bbcc65de8c0e68eebde2f7266433fef51c1919c88724662ee2adcce77ecfc62194fb194f9693a6c3d6e3b0616cf930a239d26f0d9462490618453ba1d90a4fcbe8c6f18575d911004b690a214fb8284b6a232547703663da37349d0a91dc689df47f92aef91d3e5dff8b007e3efb716ba28b11dece91fdd500af7a1875aa44c67757515588f480de9d09330e29d1cde540433e46b2941125803f1598606f7afdbacc94e79a33f8c57392ca213ad567d1df398ee86320d17172e59bf0ab27a0cd8e8303c1323233604b44f5021183fe6f4994034b5770af48511b541b9b1f2b9f54049b935792c718f8cc3dce95373dfd7de8caaa16ab2ea67d6ee3bb24a246fa9adb367e5b061bd2db43836089f154278c2df76960efc7de97a0372b8457c4ca7a5d43745911448a0325aa52aeb6da20acd776f28d9f910658a00c04ff178e9fa75c7ee465d342ccc75ab7421ed36e8b66479d4ad2b68d933e19e6e80cb1e21a1c558baf9ce9b3d0c1a7ee9a8b9b9f4b67ce78128114d7c336aadac341629a7054a3616f996d113ed8c69b080cd0c01a3321910814ad4604846ed15d76aa4ad3a2c7b672d972aeff711c25e222d906123e837f8cfe46f7b2e31a137be7b48afb49b8ad0cab2714a0f60184058f68cdd3324815293d1c6d7c06fee12a58e1dd158a208fa129a02f11445b114eff489172d2bcfd21110647b18b8a03f4678fc5aac5886cdbd7f250fbe807777bd4300465756178769e107eff81c3faf981a3bd9ab29dca7c1c08a52b9e3fe3104458c6ab2569539ddf793a0d32a9c56121c4f570a5ce5ab134ddf50ff388780587fc60d61899e52c1f0304b79d7b4a7e0e7e30d932ee3f0df117a8d8e023c31d40428e6d7fd545913125d451deceacdbb9f7b0328b779dfa65d10893c22cff0d04a4ed41e25521e15baec12cbff33a2d1a43638ef047a819490bcc122c41412b6e759e8da8ed6baea666815719f3b5a4898d0fce6ac23f7f226a6b80ca2f6598116f8b124258dcb52c970c4fe39a753958450432373a598a2d39259f757e7f048c6177a4f982dbf3e26a6006cb1d85683b3dbc26c44e89cedb57b5e71fa190d74a04f1ce563b12fb96b09d145fdd01c555d05d7dc8c39782062bb6e6b68c1c5193b05ea813fa0a06803f70f914ed558c7f89330a072ceae2b272176190c068e8f68aacfc4034965f65a268181a791386e1f233d43698b0e3b82a1bbc2423922769e6c044a245b34ddd31388ca082a0a69e7ee306084c52ca7a4231b973a6689098c3a5656fe01fc1568c804e68cb7e2d7b6f3ef325bad82bedd586656b4ed190cf2fddaf5f3c6b2a776155a4a9158e314f57f98bdf4362c000221ac0a09b7601fe2310c1f3364ed92236bbd275a4a1371718d8539cff33d9b1567973bd2f33dc1b0ab9e50db6373983952941625e0e273c7557b36c277f05229414b38e84242d2f50a77874fbc94c06a478212db4a9aef21f64efe83d8fa7e0f9873b1a8a7e9471c3852474588e119ce0ea38b152ad4e9f253823746390181c455df5f286d52da970c150ec53267e0511a4c2b80cc3a3935fd9abb495c61694f60e798bcb060a66f3686adc9c5f04c768d73bb2a560bbaa3a61d25bebaca6a1af2982ab6a6fe4bd55aac172752a9c61bf5ccca785e3dbad385a8879092486c2eb4db64080cb7ac367f6134c8bf5ce8a786145ad347daf8f6c1a9daa0373d6f7acd43e6da76eafee9f6651b175828a29d08fe276941696a32175f435ffbd07062fa6c17c94763db7d178fd0157d9e01f6c809fe5b39a04e1e44603ea6ee2dcc92ef1c13bf1b236b2b00c9284d8b4e3945b0b4ee550d72bb273bb3b8ac36668432379117df0d3a63d29e426680a451c48876f732592ec37d8c59ad0e3504672b71df6e00e0261e887dc573cfd9600001225b5bf71b27411b0f5b7a934e38d164954e7c4c5cdf5574a61b011f254341065137fc4057081f0ef551651612ff73ddc7e26daa6ea969746c311ad0cd2919dbb5236fe403adaeb7b9452442e3a919a506920c7963eed9512d5807b6a75363fb2b33bf8185d6b188fe435b19b05f120e6ddcd436cb168c154affabda965cb03b659c0f7ca8636b45e23f22dd7a8b2812f8642f40e101b0478ccba93f62d496c4471976c18e1782cb147bf566d52e683b1e4169dab3384f290163cbd31731756f4d332fbfdcdc9fa80fdc1a95271f597aa2f8fbcfd290a581da4693acba9806d2c7da49ca5747669aeb404f00623aee6abbfc1b2983772026b093dcea50ee06a0dc1dd0e323cb33d3aeac19422d069b72eef67822d68e69a4d7404fdca8fa174c7e59445b474e63f512184cf87d325b2f1d6eb0ff99e46b1165ba12460bf3bc887ec2afb8412824154c4f665b066506826033638558ede3c51440c16a597b7afaef9fcd1c5446f92024cd1055cde7dd19b45331b1b3fdd10256be8973716e92b223fc33e97cdb020bcd98bf8006fe74a92122d0d4cd354087f52576f7452177180c300713f8677ce0001f4484c3999dc589629015f68966e4bd439806dd6bee20fd7544e46221f49735facfe64ea3eb73e56cd1334a341b22463d057ab4a6cfc7e92028cf3981791ab8a63c01f92b430f51f8afa9f98bea87c34d9c70673027f84a9464e99ff09aced3b55014276207854811572c8c7aac41c10f1c60e2ec513435f714e302a07532164e0d0d889b32c4405c4fc413f72acbd9a658e439c30dbacfaae9ce9dc119ecdc5bdd4e67ed41065e066913fbba5df238e1ea5f073052c0967bc4ee2a5fb88b1d67026cd0a63e694ef9db9353f8212e67405c5e6b55fdfa2523cf9c7b4f24c827d24581e6582865060aca5d31ae86da7ac9540409362af686ed2b445cd00ae78c6882ddfbb220101b7a61355b742493905f0ae352a69a79bd1d566d2d65bc02e53a07a8a5b8fe755f076294aed06c16b31c436071920f95a111fe579dd7c7ece6821c9d78522a33e9a464a04102918ff9fa016a62a1141d213e41b6b98651b9722fa45a5cea59432ec67cc180d641d3c4963c6e60894450b2f0b907a0a8c34932cb6fd191f71cee9e7882791b48392504955ecb03a982adac20b1a4e6881d5290ee1fa2aeff88505e3784f9e4da2c3a005d977b2ae2432a089a9c38e869c703f1d3777eb303bd991a47435857f2ff0b1f95eed1203f2d721a314b8138916ab871eb46cabc8b6a1224c6fd67bcef8ec6a9a8d8a431c0bca7a499b2a07742b0ba93b0f42c87e710083eb0d744c9eb815b3eefec4b054da777b8e4f51d298257e3295deae0457fc38d1484be635b3a097affa6e017bde93ab6797b4cbabec814cabeb78803c0f3b772c3629332c65c0e7f5f00d20d08f5d6dd2aeec524ec7187650097bec65f472c110a8991a7dd584735131377c7b81b50f15d7b0787c7d5b7fbfd1a25de608b9bfdaa37f69a65d77cd968853af8d9a3dc555d4a43d40b503d1dbdbc248293c9fc40df13a3528e7e317a886e511bd3c9a191fd63d48a1ee8e06da0aa4f5160e953e60fd8c568e748fe75911ffe8e93703c1e83bd44499a317c6008f1da95f1338beebbcf59b1186c5da4401042db436279f9c0489533be8e62db8837863cdca3363c3a9da6208dda982862b788aa13c451573c05fe1d480e9e1ec394da40b5d1404fd5b520762c4662ec97b57af004b26a845e69983f686f8c532f1a4ea5d462dffee27cd3192380d92fcfe49c68574066ac3e4cfb54c5c3f25d65d1e6670a702cde343f13ccdf194677d3c5ad0706daf4008ac1f5dd569d9347176f04718bd59ad947ff6de18ada1b53bca5cf5aea04b63be6f9c0bb224771cfbc675ed5d95e431ae2344229b134ac6350b905653f4a66b72dfc18b249a7c47e9a352b20b288506df09a779a973713da4c84eec059860f1d61fd183571879e8b7c3bd926591111e2bbd8b5cdca0a80168d08506237975b712d4106bb9a4f02b3751a7d71390db242535b325250570040c3f3589a8fad659852a21afcd471275524799b2d6fc10bc13763ff4dc96b178c5c4c1e7be30b247700d42c85753c6d67444d3bb0577b50178c9a8677a7ef67b422d65528285d2d2db57fae131635ce36147d04462d61f4010a873a8a3e1b11f830a1f7fcfb4bd8e0f68d03711d4c8d38021f42a9704e13f6ecb475eef9dd12f5495653c7162104b54ac81453ac59bb72a9f5ea185dac76e33c936846cd6c4cb9d0dee2a233de3bc","title":"493. 翻转对","link":"https://leetcode-cn.com/problems/reverse-pairs","question_id":493,"issue_number":42},"40":{"day":40,"pres":["排序","二分法"],"tags":["二分"],"whys":null,"difficulty":"- 困难","description":"本题和力扣 [475. 供暖器](https://leetcode-cn.com/problems/heaters/) 类似。 **因此大家也可以用 475. 供暖器 来打卡。(因为 binarysearch 现在 down 掉了,可能打不了卡)**\n\n```\nYou are given a list of integers nums representing coordinates of houses on a 1-dimensional line. You have 3 street lights that you can put anywhere on the coordinate line and a light at coordinate x lights up houses in [x - r, x + r], inclusive. Return the smallest r required such that we can place the 3 lights and all the houses are lit up.\n\nConstraints\n\nn ≤ 100,000 where n is the length of nums\nExample 1\nInput\nnums = [3, 4, 5, 6]\nOutput\n0.5\nExplanation\nIf we place the lamps on 3.5, 4.5 and 5.5 then with r = 0.5 we can light up all 4 houses.\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f249d123385588680b0adb2d1c6c0d97f6cb6e33c7bddf1997b34b506c338b3331bd78670589ebf25f42fa2f3ee24f12c696dd5d7cefe4633d0aa8b91587224ab508f9aa8018b39f409c7e0abb8c06b23cb0074a6f1446a7247fa4f14415d9751b4cfbcbe22aa14b6fccbfb0ac7259ca8446e5d0f1c5ddb69edf534fc68e56817558113482531b2c64118f0e78b3013310b4815e861c2e6c7ebfb88781f4b1744645bbf59250bf2378adedb3088b354ad4cfe524027e067592e16d72d0a2b139109f0d322899b0855a0c902387f958b415b5feceb3ea5826e309ce4ccfa93214cf1105d76feac82259614303732a8c9433c14650baa5cd0fddec405bed8af1d5068ed35eb748c5e144d8d7d1f827cd8e42619c34d6426d443a8828c59ec21bc977203c4b065aa05d8269d61cc20b7510fa1d44b26022286d40ef382845ccda8d19c7c183f05d8152ad4a83620649dfee25375859d7be84758562e534d829f26abac0fe719176d9ebe35b5693242f6fb60c7c385f5d8cd4151d860ec3183f250f754fff7e34fdbe6756e8658122063a5ea2d69146f8d6589ed7a7183ba8a68656a62572db533ee9ce8ba728b992327669c6f22668a43ab9477a999e9ecb1b1861ab1295001551530bf1c1eb2aeb9598c29d2e4db131dcd004948e6f8c8bd4c433461e23e2fa0011d8e66b60a52930d01aacea3a50fbb64dc0b93133b1e1b91eb474b5515b78430bc8b3a417078341bb630536e52794b57be899a09753364f18ab8ffc3db0afc0e11e8efbac12f8798b28ec2737e155729b6ecef9deb12a7e4a6799c58cace7fb61739c4ad6843dada133ffec44d3c2214332f64ed2336ad992c45792e4d352a58e1fa57e0c8fce8d0cec1c16d5de7114663e098ac1dc502391187f7ea0b9962fb33d809618a1875089b349bb031988ee227441670e3d3e9d617c6e251b8513b2c55b624db4c48bb061ef755ce83a57ac3622ec2b92fe6716d519a8da4d61195b50e1dd5bb0a07bf5b4aae108ad2c8e30051de95eea7c2488a791b4ba322b889d9f55422d53561eb58bc82f66c16d56be510e05f62d911eeb66b6d7360dc50bdb82b460568aafe2be2b0e81537cc9b30c753d314f26bc911b8d36b5b4282d9c947441650b682c7ebafb2c4a281d57b5308f2a3895e3703d520d0cd93e4bd006aa560dfd856db36d266714818502a4461b55c98435c1d54f97c0e7d64da9d1209a644d545ae27c0a536963572c273bdd925279e613746d2fc90002f5b069fdecb20380b267f0038345f67a6657bf79b6ae304def17d0aac4a0413c50ff0f84d11101e3ae64aa2b477e362dad444ee1c0893e7943c7d2255373419270c8bc3612e7d59538460c8c57add723e7031fd6339508daa5334a4a07db9891eb8b65f818fcee4955261c3fdfeac30e6cca84e14ccf269f78938af68a2ab6c4c1d6de15e3e9d75eb0a9123562d352dbb555d09fb9d00b4272df4d769567642a0aaf79dc5f49c6cae09761f64f2c12ec75a16429dc57f8d1159bb3b0bdb02cf020b46a60c6802d42a6ef48849ca58613f3dc36215ebd2d3ef2e19cb11b5ba098db3eaae365fe24551294c9286b762a43751ac8f80a9c5f59f379acfd87c2655e5198732f3cabcf64b78f80935dc0f380e194b483088b20aab042e6c21617ab4ab07f0cf144b30580ab3c8ad12cdbe29b86df965b3a2c3155ee6dd00a91421b305cedf78a8047a0024df499452c6c536a5976cb5b34a211b697dd74a0afb2ca54bf6c2ff9a6039269730685a15fb3a424ae5b46e12cdcd8be81da9a6c22571ae276d2a436288d1c1f11a13177e3432772e0ff25101ed2d924e151d41b8e5bd003e2e193ac4f19f2c421dafa38da46bb621b7c0a97015603989999805f4c5893fc3a3219f0734a83774cfa984989c867566c64a987f519a22563985d1e3343d846acc73639f484d805591c4d659d147b9ab54351b4a169f7b55b93f840e8e9e016e7414acb3f2a3a7e5de69a477922586202d3891f2ae677ae351889b9676ebcc8e5290e454870be0e606efc0ab5b738e2b5c7860fa28cfa55d0ed94da2449532219c0babd1d4bec2e08afa929a9df8e08dabe3436a3725cbe879659d62efeaebf12755c6f8433878eca99a37b52d30bcbbf1f49cab8c2fdd2aa459650ec5b4dc6c95674b88e22c61c351cfc550b35b332d4a579a4c7298cf0fb78a8d75277996524420773059233c05e420bfcbaa6d9369b36f9522a7c59fdc88ecce4366f356060c2d15855e610adba21edd8a74bd83e1c80cee5ba4ff18e7b15c9ba852f59c771a3ae4f596b0ad863a538e227afad57b76ecd229be60a490c9a7becce81eca7d9f6958075a8b599177a2ebde44d7568a18f00582cc70a6e6f3497d309913990f2f3f02b9138f6d4797ace062d635ea94b7fd50d7ce277d8de92a7d6f6ef9c66dcc4e93c4fed0b66cb23fbd58af098ee7687092643e9df2a3c7477a2cd41cfb85277901dec798081dfcdfbd33c032f23c06431dad9717970ff5cc134fc7e36c967c4c6bc5dedc1580ea6898daa4d438c23e2778f9cbfd26c389ece3ccb2e73b58849860148e2a157aad5cdf53940801fd6f15f90be092171c1f173dcf4b000a08fde1287826c202736e800126d5df55f3b3516c5028f6e7b62fb4c901e342f4f0f5d3c7d58af234ce32077361129570396c3b4d72fb457a2f2b2a67aaba3b3f76434da53198b58875a8e96ada3d733f473bcb5d0ab7fdd173570aa50d5389a8da5c44b1dcb670af8c24bbc5e6aeedfed0654b3643df6ce490d8d537efb1b3f9a3adbf05c93b6f928d7016096ddb71f8835b007e3e2a5f2fa5cfc9700891eca51428b83c992dbfc6976eb89b825826504b33cb4a76a64ad406892c9c7e8572f6a3b190923f7b233c0ce33ac62f48bf2f11382fa1a77abe7f769076e9c09764ba05a3a9662ec4cfeaf3bd084bfcb99a2894415c64467b62c8b982bdcc679da2b0c3b42c6fc74b1bdaf47144726bb4f3101d61191c5c5518604fc53c06c09d79b96740be7807592c5fc9dfe0cc7a860bfdc6f6a96e2ff2368fd46a2fa3a021836f19d20c0a8e11d8fb177d52f018784a75bbebb401955dbfc822d948e86fce237fc32d4af505005f412f7f1d302b0bd62d74e71f0f5e4530f141cb51570cba76633dbd55a95a6a0d359b0a04891c43dd314b53bb42942c27cd10a27a2a6432e00c61f5443f32f8e2404ba75193302e93fef286f405963036105e35e7628fbdd3b09d9eb00e865270c782e5fe69565873da35412880dc3fd253096eaf6e1b95fd8699b16c861ff00277fbde7d800a181652d61b60411415c8ac8f05a6885a474a085c3343977af4912cf29b585114b85328c70bfdbed6ce94d4c1a9bada807cdfb527e76f354603f202c1f32353455d8f0ad3345f0321bdff64ef2167e307a89696532157194e96fe59f8994056e0591be0eb36e838aad1f8cc050599defbbb3b84403ba66a5b2220200963b669a7699d2d6baecae8ecafb6a466aca699eaa7e9fba2c68b4720bc97300fd610190782d028d3a7c4cae7646481f37f2a8d6110a93e2281f77538cf6214a7c3a886b25d671795bb58f9793246968b439f25f483561fc7cc391f99fad2f2c9cfdb2692f1fee9b8df9dd29f9d8549d4ef209b3511460ff598d5f70b0a9c37f7dc27b7e4cb8a8624caacaa62597322b1cbe90661c802b900728fd78e37b191d3429a55f56a0ead4039b4e1186f25ad77409b01501cc58e6a56a76b22374aaa7afe6231925f0f11c60104859da5dff6eee681e11cc615ee41725a5ce806c93b84445a6f66469f83af630dddf205226f32ae1784170a837e255ea5b14ce9fc9ecafddeb19aa32edf054a5cb02d0fb0df6d1296ee8de18f86d7fe2ac8031a07cc4720b5d695f5ee8cebe88621464320c37b6a496064c8fe7e1ca4d8d68c51eb0cf33d0b9847ea37198d5773b0de0159e5898ef220ea6cc49b4999df3d1530301ca7978814d902391c25dff723d464ea6d6e8239b982e2dd3060c13b3bbb3464eeca97019d50d5e541c7324b6e5da2705e4569ad582ec9cdb0ba39d931e50cf21c783efd98b5c81d0dd9a925bd47af97d6bbeaa0aff04257176a3605614c5b86e73fd7935921d21c8c8fbc305724983cd0d84a821d25b354d6e93158786d01431e1424f2cb6e5b56b70b805633f7b124adfac5d2cf82f61f2a77134a5e554ac9e592b504cc67310cd61065452e137ea73500319a239b51aa9102e5775ed33d2e99c7d9a36dbf01c4ce311f45310aa92219b4b8cafdab5091875258a44d5c2beeb083728021f774cd45b40aace5304fce00239dc5e100b80392ab26161a7e16529af601dab6bc94b3a1918fc4106801ca1d942ae8b0af3cd72f55fff6fb0234c5763c02a3122c6d64146b2f19347feaacf5e3851105abc62afd01378def0eccc63829f0e6a7d2cb99e0317cf385a33142356fb798c2021c7b708f7f96a6d730ad4f7dbe05a1f72ae2f7951c8b24692fa43243c367513d2e1660cd54e90def64d909ed0dae016c137a7a1c4ee6ecfd72d482d5b84af792f3456f2472bc548814bc64397a9bc7774f314f28bcd8b2338ca6f02ffd1b89b0b51b63346532e2e335468f5f762a804af69b056a8f8cd4ba2accb741d6aa0198ef212ecec66d72bc15bdac36aa56f58396f3d331126326d3a623c6e50873d3964eed7ccb040e5c6323a9dd8b4f78ddf598442eb8528aedbf9974d9d535d166c91dec6899a13b9f2749afce4693d9370ef42587014db72febc1544591f4b530a7aae011848a1665556a5cf42330df29b602bd2eebda64d6fbdb9dd5778a333f0567cab4b35b6ba8978d660cda43c6616536714e1789ce1d2b7fb8af775f681473ac880299ace02eb5d6d8c686d47afda165cb7e0a95e4070b4e3e5e110c3a06c632355337fab14e3be1465f9872cd91ffd4c86419bcd757a9911f676bcedbdf757453ca5339c9892269943a447e592a6a456a072d81d82ea78e2d13994d4dc8d8c28e89cc22c1d127573c3083604b46b43eaeb3d4fd66de74cf5458831c90fc76e6cbbd1587a9d24733072ecb7446315433740b46993c1b8d75db0b210b46bbd084e6701227663fd43b234ac99a46b6da3090ee7a16b2736e6045201c2e032d0398e8d011b4158d645ac53cc6897a89da85d5bfc6001ce7e686c611547f90aea1b07226de83384faf161001c5d144b634a7132e83d4ea13f20a6b2dd10782842faf5a9ad43937f4a0dda7b8d5b9533943b762ce8f9ac55e3c46eee508719023a6b0d1baa68f96b5d7986c4d6f3c55d3648bcc4fd72e59d1834f1200e31cddd482ada70ec3dfc86d3d559e18b07b7ba44a52a4a9ac47d3b9b201fe0b2289aaab69c3915943b9a85ca9c5260f5cf2c18569617669242592ef214ed6510ba61706f7beba29bd718719a71315c7b287527cf9911efeeae467ac7612441bc036a0dfddfd4da6186435f36c1258a025305b71f1e8308f761556a3f9facf86edbc6a44576b11e84282b0606c7010e47352523c8fb031f979cfd01b441ac7f547fe80f56dff60895d6d7006764f94c8649ce6d9d6931b4a475deee62478df333a9a8338a3f8f12e3b815d6fc8a3bed79266d9db24f6946b7afdd55c8404ea2eda1487ac9925551f7e0f3f169771a6a8367a804b5522bc5526373d9156ffdbdacab9e375dbfa168920a58e547a2fb2c9abce763258345cc054fa8ac8441b0f09630c01a486173887830ce4cef4582b71d51a4338aebc39dfba9c19124afc6cc406fa15fdfe136edbf7e09f4c68878fccbc89554495d0a58c3bc83f1f5eedba12d792f3935eb81b3c5af68f400e592a1f95f0809d35bb0a9da827ef3c7c143f8bf28e9f38035e691864164ddefe3a921173911653956e383aa741087d5ca17150dbfeb3892e4d0a420e29502c5d409ec732e6ebea321641c6f306810247002f939aadf0891d8017bcbdc2548d6d1d7d900b5e4528ae44991bc75247c50420d514b7955c6e3215dd856cda25873f2bf57362f7209316cd8a10cf585d1625393c7b7d66f559a638bb1f963b2a727cc3766f9f1744d630ccf0a4392b15f3dbc7a192c857fb23e58de3449a21923db9246f6079e4ba91889074b515d4f453c30306a4851c940bc4eca86d6e4474ec08751feb6b07b543eedd6fed6602f52debd5031d21ea859ddb927538a5cf3df56380d4c22423becffe324b29ebbddbab38bebfb600168b2f21180507fa753ecab831e901875c9b40e815a9345ce94836c9b0f8dcb5c5ed5aa1890ad6e420c212b06b59a1c60b9e46292dc856814ea2095722923759d67d01527328174066bc26602c9a94abcc8c79a34a51f949c97273333ee37f65086ec34488ab04177f6145518ac55a7740e86f0538cde669af379e310e36118a114b4b7ce1c70874267df6bdfc912ba9ee6254f0638743a5b32e3d12ef75d65e88431741eee70f1785983581cb07b75324700b6a95db1b5846a1df98208730627716e60cc4f4d13b147206e5289475e72389b2fa957abcf4a2603ea70db84ff4415fd7cca0683a406adfd8015bd5f1c7db27cedbe28359c7b39231c561e3a97b84ced4b8cbefd40070b803402e9de1b66f4cc0aeb861f96f6b330cd1847d8f0fccbf242bf82bb6bfd8cc27f45d5f34c3dbb7b41cca2e79ff7e7532f4dedefb86ad2244364bd1898f352317a97ab78128c7fb8a5ed4de4b892adc33a13d2cee629d21daaa3da107a6c235ab31f348a38bbcb1e9e6658c2b73c0b8e06c5fc146b9f929ebc80ab14a99f8725746ed28b6494ca7dcba2cb7a10af8d063e799999cb3d05c991fc62ee358218c4f41eeb3262f34ffca919fede833aad2f7a0fe46d0be2e0c4b71bdbc7edfe2e309be82d4e3fd187b4ef0cba19412aa79893a58615b6d1201616a594a40a8bd931b6ca5904a00dc67e3fc2bc1c7179ffda7cd2795bd4558d05359a19be36629c24b0e9e5235855d0fae237ae94176c3c09bf5f1b409564ab88fcdc5e8b12fa8c6a90cc0a070c670472617e4d711feff3bb4c33dafec5a71114a56ea954df2f5a2a3d227b2af5f69ee994c4fd14c7ef726c923aeb1625423b1c1be1f358eb4d3bedfe9084dfd764b9f8134e4de1ff701e6df0ef22b9766f61c0f25caafce51f9c5dfe787cd92399ac6f0e727c59dfbd44a8cac2c7d00eed59a13176bb9c69666753b09fdcc09686665ec7f8befd382325b740530c69a659c394e89658d2eb7c62ef69bdc3f84c48899eab1781b9aaf7ca91e700a1e18f72a008e4515e48cc4824ccdd0d96102b31e2cb1c1fdb022c686fe12353f21040a7d13833d2c7a58544e5a2c23549ceaf0f8ec15df4913ea3e0602cc99fecf30074387a4768005e2fb28fb834a2976a7500b71d852984cff7a7e63bf4083175023a38628172eeaa4bccf23ed6526a36f4cf86e9f0c102ed7dd1e36c08be990e936ee8ef4a58b8c93a7797a2ce00c0ce4271e6f37798bfc4b0cdaf1fba5a8b88120413d5df31ac42737c28411b2cd45d8b26a9939f66689f0a347b87be56eaec8a5405d76402b70723a3150729a1803e28c2c733884d8436558ca4c475ef7f800a6458d7cb29b0c03a21c9f766d9b0d903c5a43d1e26a66977ffa2166cd8103fac9cdb3a18827c9b747b8f3b66c22508b0d7eaf8cc11ee97cf78e1f3dd6f168320bf596ef16731f92f046a3c9ed606a75a26e18260e2eda145f432e16e958d79a28656a079d52e34300072245be1be51c246142a141590204e2171f0d3a3d488646e0ee4cb7431551fab0fc0418233e6a19f5d088a19df8746223e8b6b566bc67b57f6d3ff6256a8c0de0b93aa18aa914425961a7dc02900c31d783fff305cf113d8b63939b484588901b207b7e57a8df4d90f7ec3a5a0f997037bcb791ed00ff243d68c0a0a6eb60524b7a1181807cc20614e95982bfd51afefa54c1769fbfbd852eeadd4ab34c72493cf2e90dcaa0aea95fc298696377fbb3021d2b6ce6da6f81a1abc527217c6206f2a627cc064008cf780d64d6305902be1acd27767704f86f7827523f9f16b72ccfaf11e44e95d5eee95fad47a5ff56316b02a32bc091c3ff023222fa0ee43d3e42cfa5c0296151491d13c0655530444f5eb29539e71c13e69f67a4a89672018cee5ec14016c1b57ece2128cf13b54cdbf0519de0dfc128e5fe5373a07450f24747b55d7e97e7dded0fce117aef679f9b1ba68cf7ea41ca3c6b0b175812d21d81fc4f9f45a3dfb5647b5d35f1a713465b2c337f1f1ec67fc7edcdc30cdadfcf3ac0dbdfac403858b99bde6e72a2fab6b1e77dbc599217ec9779220c04fa4502d047bddc2a99a55cdb0576b14f2dea4fb606d4795222addb7f00f525b1974003775847894eb4bb2d3d8581c0a254cc7173f5aec82f47f9551c994e88df0399134a5a34522c61d78f3d116e6d20ace59af1589d91c4f902cd30931ce65773ab4ec658fd48c5112a21b8482afeff045c6919a6ecc61263d2d63aeb87e0fdab26356622ee5e00991b3da5c3502501046c0e75cff9308200fc74cac81afb8d9cbe869b031c8ec80e231c674ff6359c848dd5a3e5d20deff7c1e5b6f2bfaacf1cbbb606d0735dfd677c83236251a4bb9c1b4491d2b153cbad0f08d76958584a41c90ce7dce910805ed793c9f54e4b515c6cf2f8f4c746051fc7ebd2d54453afeb47f1b12fa6fccf383f7b5c7015f6574ab7094fe9b44aae2c51f43b59b5b075711ea0dea4c868e4888e4ad631b3f9f5a499f72c85a2012b911bea571b046aa04716520053ce5d25dc1b49c097408eda40bf856095c92a65a77cfef4b728ed40e37dad43192465fd745f729bbbcc94dc0074488a70f3db0773cd7ff7acd569047e3565e4e40895170ea9e29ac6d690914bdcaa39943d3e1c881d10cc56483a1dc2c4179dee2584207432a6806c8858c9330acc6688a07aef4efec159d752733830fa814d2f820624c3a9960916487e2e17402b2710035e1bdfa46eda7e","title":"796. Minimum Light Radius","link":"https://binarysearch.com/problems/Minimum-Light-Radius","question_id":401,"issue_number":43},"41":{"day":41,"pres":["排序","二分法"],"tags":["二分"],"whys":null,"difficulty":"- 困难","description":"本题和 [719. 找出第 K 小的数对距离](https://leetcode.cn/problems/find-k-th-smallest-pair-distance/) 类似。 **因此大家也可以用 719. 找出第 K 小的数对距离 来打卡。(因为 binarysearch 现在 down 掉了,可能打不了卡)**\n\n```\nGiven a list of integers nums and an integer k, return the k-th (0-indexed) smallest abs(x - y) for every pair of elements (x, y) in nums. Note that (x, y) and (y, x) are considered the same pair.\n\nConstraints\n\nn ≤ 100,000 where n is the length of nums\nExample 1\nInput\nnums = [1, 5, 3, 2]\nk = 3\nOutput\n2\nExplanation\nHere are all the pair distances:\n\nabs(1 - 5) = 4\nabs(1 - 3) = 2\nabs(1 - 2) = 1\nabs(5 - 3) = 2\nabs(5 - 2) = 3\nabs(3 - 2) = 1\nSorted in ascending order we have [1, 1, 2, 2, 3, 4].\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f2b961633855e9b86f490a6d594a1f47177b6a20079dc775081d103e7bd46ab345588da281edfbc3ee33db5ebef22f870696a969bd1e10621cea0848e125423ec30b695a81ed310b036dae6adaf8833488c4a21307eeba0d1eef85a374f49afbc2e78750a7b23a3625870f52afa26a3b84677510c2150f170e3334dee01b74b450bb660241b45c1e03c7bd48bfd3a6e76190761fae32d564e2fa5821b407540ecf6930e1f703b8850b05ddb1988b09dd1529c0f4b93e04054eb69dd48751d9f9120f0d0ebc299512bb48987bdba0aded0e150eaf9dd0d39a882f9a3de86ee06095ec481fe7b88a827b4233f0f3ca8c26741673a4ee702832178558c5c073cd2932cc3386daa2ddae1a44498dd08b10d69fcf70b83ba1a884eae85d303f6e92240f3da0c308a4c40dc6f16d51cb4759786601edda7d2af512fc61700148f453c285530406d438218be0b5aa2979611143e12fd7b5db248f45a6a345471bc931aa169be6d1834775871f83eace7de2b28e50c3f085a90a74a11a35c6475dbb407f99297f7b910dab32e4ecff7f6e805a883436074319531d6c4261495c8d147f4608ec0e833da77200a6eb16a69a9bb891082e7ec1298ab9a77b48cbbfaa4f48e06a6241783a9d6f54dc153a5e1bc52dcbd391e5ac7ef4bd2a28d0a384f4c95ccd39372e3d164d4fd4b8378909d7f540bcfaae3a44f800ed1149b18750c5292ec55535516b8ca3cfcdf0649602a2f5aae201e2e526b5141fb8d8009703477fc99aead97d847a85c0df3efe8cc6e9dd0a7dbdd7e6b130e76eea4f496af18b1a1b638d90bc4c07ca81623deec7d44899e0271b6c4557b66523d7d28e1323babc06d413824507a375aa8f15af1c0b9fe84d1888e7d05b4481a33a99ee306c30a391fced7a5248462a27bcb5161da407208904097f13692cda62b1b5f7eafdda8f61792f44cb802262055e432d20d50bf064df014d1c6f76fd37e359ed641856d764186dfb1d71e95e673729bf889e03b0b17ff43c3c28cbb450685d0f0ab854ede63480ab92efdc8d9fc1a31c93861ec51e99fe67245be5cf851e1467a9c44af922809407ac629a7bf275c4b21f9af10a0b03fb0b3df8620c522e94fe2769e4ad7ee7b0f5cd7c4b0553a3b4de682c3eba9b2c5ed80b913580ffaf0e2692a42d93cd088c7bdd26974b47cd9f25cc728d527220b26103c6e5ff81ede474d0b24d3065229298fdd1258ea02f731f67a8cf771d77c3b9f17d6f2302fd8243a168cb4d3582f1e649b9cd469605b787f5c7f345169a1433aa1c677f6459db56f16a2420454a70bfcab124b445b3aa643bfa967fc5da9cc53ba1a0dddae96757b3942722f0d6e03808f2e6839544ed164c8963cb6643b3060c66c3a414403ecff393cb6061fda370408a5a88e627bca8e5a51d464998f9199057bd5b132cd05388666a2a958521d5fe8b2a0289b5ba55788f02d062559e8d120d172aada770895be4c3a324df3d5e0f0767759d722ce2b061da7d66575d0175ab1c654b51f62bdfef5268a3645514acf4470648f140a8da0d572b58ab79d3cf2e4301e5f04a8fb679b78449306762efe1738be410d637ef3daa533ff061b310347d9d5bae30cd08efe15607c8f72907ea5c9f4b241de74b24690245c7106192925ddd417e388f0a3f6cd77aa8d04d7eb146f025d16b1c5a204c3a53e71bd8203a9072f40658a9725099bbaf351f9b50bac6a2716689540fe36c0aea1661d821f3985c28ed8f2d55f21fa21ae4ac2ecfc9465390483317c4ed016e7dfd5252489c9026ded9713edfeca672988711021011089839ceb7a450e3547071e7433ac133f934b9c295f2922f9fdd065136c731cafafa173d2f96bfdbb09e350d77c2e5ef5d9d0ffceb4f941cfa1cf348a19d515c46af22332aaa6cc017f4f105fac2294dbc64ecc93bc16d0db083d9d5ecd5e489a675b63dffda7eb155fb4347ce3bee1888222f354b43d8a12969e0455ba81d2d6dd314b84e116d17fe656a05f713ff0bbb73a1fe037d8b7c022d8b3ec7cda9062e251f9b466cf6426fb08c531072244bd51d1cb223cb110af11d62f5e2ab8637689f8f681c1d0030e25b09da5e37ba2ae6a1ea39a6f0ec6559ab0dda145595a6fd47107fdebc13cd0b2b6bfacf1322f178f0dd32ba97a6c2ae67009800ae1841932e0af77d40a3b933ad4d0beb19d551c67f3469f71f8822a7056f13666422c0f31442b830aba17011d3dcf50d0299da84bbdad9ae0e3a7264f7cc8aa657d32f7af94982d57945618bb425b557a8b5b847873cc0767cc5722be2043d9b7bc1a0f0271190aeabb12edd64f1997e5071ea35dd04b0e6d632612ad00cae868aacbf2d41db352f5356e77ce71da38b41cac220acc0f296fe5d4a17e9970e5e0baa47d8b2fa9df1d694fa512b36f27393aec2505e1d92d4eed9da5c520ca3585862f5b727639e95dcf973b69d348219e9e198beb534b1e0390b3a464f23730d297997e030082db407630ec2ea7399d8baeeb3541ea0686110387df037bf259e0e0ae7e0952d1486bf5734f4519e67292e2d05f0e6db70613582b43636ec8c74179fcd76488cdd56add039c02b2c17cb4e96cec165de5b1f397a50ad4a3cdaa642494f0e211eabcbc7590a03c03eb1df65d39c6fe5b7b78d35155ad2ae077346c7b02452536e5603f4273b78231b690ccfdf1db3ee8d0eab5c7e8096dfeabd395e92ff54c5d0efc6523d0785f1cb8b9ef018de4301004e1bee664f2d1402203e29e2b0b73ff6517fc05022166751718fd8bf3e575b8733df2cdb833375c32571b09eb43dabc4e1fd593f9ab5d8e276194e8ed85cfd6ca534c7d8f8a681c2ceeab34ff7df01964f3113d57379dca88dabd3e86e66ca66c894f846ef550ad6a2d6a1a5f96f3feffca518a4dd2952b9be67b7f2c0cee60ffcd56f54956508631cd463897f79f90603a54d2aa03281892069db6f7b38dbb266a101650678abfa6d1a92b719e55c04a34acfcf2ac17ab4518135e0939132be1a6659e2cea12b05da2ed5f3c599ceac6d491a59a29cfc37e7d726d8ce951845b55c56ca264b405a7866bc9ed2cd46855dec0d0348484c293332655df02fd57c8f87d972dd460f6ff6da2dd6fc0d0bacab3d491b3a1c45792b25381c8c3cbf70be408f1f5c91fdea6813555e70f76501ede244c8a5d538efc81a230a571a2c743d93a94bbb1eb5ce79333d188dd5d7485e4289508b5bb3f58353d4258c7203a104c7cab62d58b100e3f080acc0b929bcfc5b0be3a4794e41ab78ed2143c8d07cdbeab35c1df5813004958a52cd73485df2348ee449292d1a873decfced08e4d6409f26f63a3d2ea9180a3e751d26b589b665eb6cadc2dc7ed579a3b5b73ceda818cb3f44a18a35f5b973cefc38dc712965354fff4ec9915a481630b2a79f3ad366cdbdc0fe62b107e8cc2ca8e820a9607c9c32f44ae0e3466049d4dfd15929ed85357bb6714dc2bfe2938d02c405e7c3686e846bc31d7f34542ce9ce1aad3a7f20b96cce0ebc690ffc6443e4619a9972d2ed611390b96d625ea9cc5edec666f9df3733b8c6d3ca913214e20d934ec421c8fe3ab9ea8534725958d703f84ab469a8b49ae1ff6967d1ad2fed095f39ceaa1a5f48560ad94ade2c399a684c686ce14feb665926a4964851b401f71eec3b62b7d068b2336071c51d143790de28a9ca8793668cec6d270b9c7c82b426fe62564439a1f86669bf4d61b445a7992ac854a132e851c94d73c079b9f60dc89b6a471f8279ab27cdccabe49c9e157082822302600452bf04edf298d8693ff18f890185be1c3aafcf25a2b3fabdb2063a48ca6f25f827cd19673b8a9897c23fc286f7a07347664107f87319dc09b2b90ca3f46e1f40a625e378fdc83b8021db5b6c351d8e52b61526e5349642306d58fd4f94dcaa8b3e1d46639f3b56042788c46f60be769cc3fe362c3c41ba9a7323ad573ae894a6aaa29cc66f42d154099d2e4c99a64584da17280c8d2ad2a25a329c12dd9e646f150131f29b6e724bfd17bb6f40a4f72b87e23efb139d558176823fa51f8a90fb8326ed6b7dcb453b53b8d50fe7d2a3795257045c0dd1ed43bdf3dbac280b5bfc5b6a218477bd1e6c3285014e6f442462d8e81578909fdeb2b1bb43cfa27b713b95243aa3c8ae952317f246f5344828df5f36cb4d11ec004d530e5a82a9acfc5ea051925d86f52523a4b3de623e592a3b1259fbfc30fc6c6ca8cfa8523663f5961f32ed62a29dc32f89807e7996ea2b720c015e30a14b4c9bedfd450acd64b7e1103239e4907be8b7bc8d3ef75350f9f6be43898458b51c7520abbb366c8ea4b4f3b936b9e066886b4ddf0b69779168a343d2754753a052a2b80f9c772925ca4611813ab10dc9575660390cc3ab9a18265aeb6a8cb9bafffe7f7b148765f635e85b56e4088399c824b47bf0565a5be1a3d361b005158b6b96f2667a9e2f0c2713205c84222b529c1402447f832f6b41fb6687692e5f48010aa2a6b0c873067e46471372f2346ce75d3c8358950d3410faf256d0543792f77e4d7c97fdcb8d6bf5dfbaad449732bbb4ed08817b3abb7fc5265f48ba8e728f8d5b1338c3003d569f052fc3597a0b9bed9682bdcd01ffa99ba118c4e14cde51b497b35ee0466c82c53c4194caaff04518ccc06b21468ac0456b1cad0b5d3f6a882ae3e06f87a1f99921d01ee44b920e08b888db3753067f7f71a640380b2249d16417a7aac4f48cf14ab00d830bf105ad553d0a30f26932560aae75487ad2b8b0b8f2e71fa803e7e70992e273ce2400f92e384b3d000f9860fd83ed6530c8f82294276551d15894b9ebcc2ee507d04cfaf303d49fea71df66a022e36fd8ced4f6ebce39f2342f9e8ad84dc6812ac5e2149ea2f78d882cf923cfd349a3bede47221decaded4fb3b26fd8a4af6adf3f3623b878c6f8fdd73e910796f4c7ea3e2455cbc5dd84b3fd978771bedde947fffff71062224d5624c3049297d4c770a7e98d032fbc36f5dd4c7ac27b7bc0c576ae65b7de3cfb6f934ee82c40ca3775d4400a71a890bdc9659f10e74b349677bb920602ce3f7cd8e10f8d7f4f5d0e4e8b32ab68935d345c8cffcce6c2c5115ccd788e9fb4fbee6f12017905c57a67d28eb8f749dee8ed99ad995bde89c3e2c48b170c06fe5f574fa6262b33072147c1d0caa8b31513503adc4b00c02abbabba0680fdbe73ad6da943903cf68982cf4d84f546f19f8c5f78116a314419f019e074bfe832e656f3433305a9a86eba602ce4a28695ef9d16823a4d659d442e3dd632c2d5333755ed2f16f72009e37f08632d76f5982d64f083faa6add002c2a63946ddf8c247b4114d049ef9d15c2c9276f0afb54657b2b9d61a4647f6ea21cd5520cded167a3f86c430afdbe8b765b6c47244ac0a33053d9588606eee468077eb167e272c32bf0ac4c617ed6980d55d63d6322b36190d3d8ee3cf1603d5509de62d8cbf267eed7c415257a3ae4381aac4ce681a3556a693c162f76a6ffe1ae866687121fa4f697993ddac59cc0cab12cd37a8150f5a8de427fcf1e5d698a1df15c84a589d3fd985146dc1ee682ab9e1603caa80173f7d966b39c5f2cb7676374eaa657d48f40296a3157d1510ca241198dbe737fe141c039b937f7166857a39ccaf18187d02dd16b148ea610ef5568bc929c93f95e9470220f052d03ff156cd819976037c2f5f27a44084ee58dcff2e145916a1b0efc94c8849e84d40c08fedeadb40fab82a39cbbf21ad2ab55cc78af5c3153efddfe7caa7abc1f89478e4a3a93b8ae8c400bf7b686d6c04a56cfb5868626c23c1445a38c10c0dbe9f43dbc577c19a6ac031932794c9583cfd160ef43d2e63dc53c7c147786f0809f764c5f7619776f0892b83692707f915d5a8f44653ae20d5b385cfa3a5e88b1e1dd264420420e29502c5d409ecf38f7ebb47d0e46d69762ce5638477dd6dbf9b5db15c403d0fbcb4ea76d1d7d9056744528ae44991b8e5213834566cf47dada1f177b5791c0649470ca6c27f53f6bef7e934fc4ca5e94201c58627c346a7166b91ce8308853cb74523c7c8f39389f1844c454d7daa4392b15a4938eed8ae2368069988dee44fb089e14ec68212478ebbbc3a29f74a771cfde53c30306f9af36940bc4ecf83f275b35b350754c8e244bf002a0dd26be164da67ea2974f5868ed98c9abf2753cf08f6eb049c99a962467f78eb3771f6cb9e39eb623b8f1fa081f90514f4d4845bf2737caaf17e95387419b50e415810105f8797f83f8cdc3ecf98a1ff5cc58d6f920cf48ab4a44a1d70b9d467368d357d50ca00f4034d77413ba7b085f2704035e23e50c7037b094abcc8c79f40218f3439b3e7b666db72d362273c35493ab4d1763610b04c7db1d7f05bb28593cd6ed20f635973e5a1c03a0114b4b7ce1c70874267dbffbb5df65bfec6461ed61c912f18020281ffa45da4dcd4b0a40b5ee1151afd32fabcb07b75324700b6a95db1b5846e28aca20c263365616e5449d9a955c1f791dcf289475e72389b2fad036efb1b84a3ea741f108bc153b9e8ded2d6e0538df89010880f1dde46eb8dbf8a91d8ef2df749124b1e014d09b86f6cba3fe4030f8296a10c791b60c0384eba24bd32f2b7306c7d45f8e15d1a16135e314acb1d2d40ca9461a6997d8acef1dd01432b43c7e35b08d89d1cfe376447247d1c0c161235ca050ecab7a82afdf4fd5905e9c66c638ee1742ee7f9d6f8fe76eaf54ef982d8938e862a38bbcb1a5f401cb2b308fedae385f8e03fdb77baac75ea05089ad0c92e962e048fed5112632fa3843f62fb21d97c7d1d96f4fd31eeb0e21fc464c0b8db66711e7bacb04515c75682ce5670237c9aa0982a22e0c4b6ff2bc2d8abfbc05f4cb87b7ed4e180af9cbfae95ae335cc731e7c5b22462e336205570ae6f4de261e9fed512adc3cc9fc628f9317dab3e39a72dca254198a4d59b69bc02f6bdf6140cb1f66b85820ae2633e9403bd9bbcf88e1b3141f0ead8f94d5e3e30ea3cfa957eaa070c633087359b09e54b7ff38fa8a78beec4a71104a56ea954df2f5a2a3d239f1ed0806ee91021ac13505be688d34b398371a70b1c7bf0e72dafd83e79afa186cbb4761d6cf60e48d50bb1ee5d750fe26876cfc0058769eff9d1ce49ec1fdd188d37ec7c6e9ab73cbe5b5d41edeba262879bad5d35d436bd7c6d8327a3c10aedf5a6f696db70dd98b97c76a263c6062929227d97e07c7288d3ffa8827a9cfd82394cccdcceaab3509ab857ca91e2d6b1e13ea2a43d01140b6c2c4c4028e839c6a25a77a42b0d6edb66e8e98ad4c74202a4819601593587e66111a530a7e23568ce1f7f1f14ee54513b877080c9891ad9a330100879642c500ebea49e68e596e23b8462434f707b25ce4507e34f7099c1d027fe78d3b0e7df8e6abc12deb3926856f02ad239728556093d5173fdba1a0debd36e095e5f6948c93a7252440b40c07e46602727063dfe14642c3f9ee8aefedc3735d7514a650cc69628ad753d5cd0591b815d46a8d76f4eb8947f13de531b6ceba56143c406e64216f2e0a7ec17556a7df7f7f38cfd103010cca010e1af7e500ea45867ce8804b46f6508b7625ce5ad8454169d1e26a66977fb36723899b15a0869ee0e8ca6b8cbf09edbee52c675b96496aa6cbcf71ba2ff7851f2ccddb68320bf599c50b7352dbe603fa9cae354039e7284c3d2473f0091f46486fc619daf128062543d848c9694047620fb34db936206556ee180d135589415e036f6901ca48b7df669d00594d83e3fc77573d2e6a05e8d088f2f3b721206ffdeabb2afa24a72d0936dc366580718fbb792a5a7fafffb5f17009cb38e3b93d33bef02fbeffa60f63dd9b8cdd1237fce2fdbca06f399d073962b7afe0e053219671267bc948b0f8ec24284f49e48a9ed8c475d02e9145468115c7bf109e533ce92afd5139385fe787d05df41fbd9bc57b22ed41527e3ce41e18a389e50e1cd6faada57e0e3ac8be9f92525737300b9fcf49c50283a83af5e1be57a8dc439128d86efec28822f49da199c818f21ee91002d444d25a49428436c347616785b98a9225f2373a361bc7bf8d37ef3aadf3a9481c4fefad97dee9f95de8e3f0d8f18d072df178a7db6733a33e0e50dcfa0f74f94d93ef8f24ba00a8f13492509f5313800a6c3c52d81437c9b427a3ba7c99c873f9ec97a8bbe51aa85e3da167949b57e9cbb9ea4bca70244c5e7720c759a2953c960de54f788f15503e363f92a5ecb8f6fbb2d87bdd02774b0ccd605f2cdf407d1742da969e17291bf4dd654012766ee775ee47932952f0dabb33d0c1ea38ec5d1bed2e01885080b22df6e976db73a95bbdc9a78b34da9333b63951e8b2577a25dd1ae4e837328acdd7a254da6c79b0e2c93224f3544abc1b879946c97535197d1469638acfa4cc96e0bf596c54219d4e4f552bec75f2508c01b0e759995baa3b8638c9bbf2558ecc1a75edf4acfa607e66e7e735172195c96d2068ebad97cd7ecfc62194fb194fdadce884d6e9ff3f3fad219539c27427be62490618453ba1d943019fadc6a2dd6fe30a2a4b690a214fb8284b2c6c7747787f2d8e3766d35ec69a34c2f47edff6ea51365afcdf456577a97160baa14af4ce91fdd500af7a1875aa44c6201f1819cdf4dcd585146e342bfc88a60405255eacbc2612fd283fcc213d3db8eea8dda1dc3af89e5992ca213ad5679bdf3293e8720ad17172a990fbb00da0cd8e8354897b7e76600244b4353bceb72b53be034b5770af4851581b4ed54b2b9449049dd617c28542829c7880d13f73a830e69be36ba204a67d6ee3e961f613a8d4db75310e484f80f1489e6098867e7aa66db7294ac5cdd45224cda570b94450b698f7cf9feabac4132580963532da6eac13ee684b2a01c1c30491f42d821a5834ac99800bd60c5f3d9f05bff71fc026a0fa3f8f4830420f84de5279c82b4c9883e55e2e2107037607095c5f113450d7cbcebdef4e805a0ef054020aa4b711b3bc6d908812ffc3be1111559b903c78953325fe005ae10943ca67d5777baac30f755d7ab548b7516dccb5e031d91687a8af698419239c4e0267f6bdc9222e253cf31c2ec077eeee7162d069be608db3f17f1e5b7af7bc83e0e70f9f0c55a45bd600fd2c3be017bbd6feffd4ee638d08ad502403bcf3c9d5091a52ad0eef7e4f6d0c69ff342179ed752da7ebb44898402c3327b7a77e9be24e48692a6959592d001558279490a238f0048036a5f990490ae2e4e75b5ed1fdb7dbecd36f22f175be59028f67be0e58cb3851ffeb7335d035994258c3a4bdc30d397b06b192d7301de70ba8c40ea16a327197058c97bf47c38d5ab401fdbe61994606260618122c8d4dd82d3de14bc70f78ea1af99278248d319fab06df6928dc3819e1e7a6aeef5d7a8332f0c2e763fb8ce36b01abdf254b4c2bfe5347d05eaa89674235584ac661f50aa4b61ce1c65d59f1be57b9d3f60b032688e57f8d0340afdf62284f5f12393a2a52c828782bde745b7901c1070821234c580542a73730af4a8a16730aed70e11af1da61dd7c399c7c435eafc638bd5a7060c5e2dc965e31e369b97d943e5693a6aae77b33570804e8434cddee42fd44d168be5bbc81251dc75e835a94302f1822c0f0be6326619af46acff28c96d84034965c6d966a2c1b7a03b1e3d43410c56138187d2314a52e3180285cc1cc43a6448045df02058e9b97ad8bb677f0050b7b46c4404a31814aa95385512d7df3b41fa816a41c18270de93e76670c65f75fe5f55bb6ffe215401daeb0ba74ffd0390318577d1319b4e35eb77a1273b5e0cc1b1fff4a7c12b5ffab11a130a3f00254e4b954a55efdf216e5946a48309e0eaf916acf63c18d81c41f3fd05f432936db33b9dbe6f2e29bbbd59d9fedd8c060d893a696d4a108b385842e7b05b9778320743d8cd00db6abfe63741f775f30bfd364f6b0edead4adaf7ff278865248ecffcc32d5055f2fd37bd036991fd6eeb7b4ae26f1e4d0b459646615af39c74aaa36c38fd4cda51f4d5fdb1c23139a732b77356dd35f3586a2054dfdfda276c3bd782b999772a04882775c923a2bfbed0a946b207c3742d8a4","title":"822. Kth-Pair-Distance","link":"https://binarysearch.com/problems/Kth-Pair-Distance","question_id":52,"issue_number":44},"42":{"day":42,"pres":[],"tags":["二分"],"whys":null,"difficulty":"- 困难","description":"在一个 N x N 的坐标方格  grid 中,每一个方格的值 grid[i][j] 表示在位置 (i,j) 的平台高度。\n\n现在开始下雨了。当时间为  t  时,此时雨水导致水池中任意位置的水位为  t 。你可以从一个平台游向四周相邻的任意一个平台,但是前提是此时水位必须同时淹没这两个平台。假定你可以瞬间移动无限距离,也就是默认在方格内部游动是不耗时的。当然,在你游泳的时候你必须待在坐标方格里面。\n\n你从坐标方格的左上平台 (0,0) 出发。最少耗时多久你才能到达坐标方格的右下平台  (N-1, N-1)?\n\n示例 1:\n\n输入: [[0,2],[1,3]]\n输出: 3\n解释:\n时间为 0 时,你位于坐标方格的位置为 (0, 0)。\n此时你不能游向任意方向,因为四个相邻方向平台的高度都大于当前时间为 0 时的水位。\n\n等时间到达 3 时,你才可以游向平台 (1, 1). 因为此时的水位是 3,坐标方格中的平台没有比水位 3 更高的,所以你可以游向坐标方格中的任意位置\n示例 2:\n\n输入: [[0,1,2,3,4],[24,23,22,21,5],[12,13,14,15,16],[11,17,18,19,20],[10,9,8,7,6]]\n输出: 16\n解释:\n0 1 2 3 4\n24 23 22 21 5\n12 13 14 15 16\n11 17 18 19 20\n10 9 8 7 6\n\n最终的路线用加粗进行了标记。\n我们必须等到时间为 16,此时才能保证平台 (0, 0) 和 (4, 4) 是连通的\n\n提示:\n\n2 <= N <= 50.\ngrid[i][j] 位于区间 [0, ..., N*N - 1] 内。","content":"096221cf5b628be1e73e8bcfe626c7f3f93f24931c3385f35f5a3d7d4a585e065595832559eafc0a2b0ab97bed3764d463ff891446a5cb38d746f23aa4faee7bbf7166609ec0c2fc0d268fa687d35e703aab6d949ba3009b39aa6addf0aaa1c0502c821b68a692202e7c107ebed4dad714950769beaf36499e0e357b956eee711c3993e3fd0033681ef86bf530d3ad3aaf818be24a4c833fa8c0410dc0e794211f1d184733f2884847eef9330817477f4fd6c192273d7b3fbd599a6436892f7707bb17936e0f8f72afe740ad4ae4babf5ddd79f3d8ebcfb9632b86a9a79d7896b7ace00294fb6be0800f4bb299a1fadb4e7358aed7c92e26382e9403300230a8f6698690a15fef1890fed102cb435e5bfcd7b311ff2f974b9fe3c5079a855ab15d02f68f52ade4c42fc9667d4aea7223b78a733aceb64bb6c14b939c42e121b4620fa1d44d0836cc3568c85ccbc0608fe2fb3e560128d44cb92be2b5dab0d15b47a3e92dfd823b6bde90fb6a2b7de9ea242943b764dd4675263bc775eecfb46d21b1bfaa084997a74934a0706675a2a546f7fc51999d71b8945904c3505b5e59feac18da327767f35a0fbf189af8d95dc3a6c7d2a96dd3007d2d29c4530de6bbe66f9da2881602ec8a77beb6a0de8cfbb2542ded9f8383dcf54dc1977c032c81527b9ffe9217408489b4ec602e142aa79ab3ab0ebee6268dfb2c04d398af469bbd6d453f44ca2dc25cda759fcec5964403c5a7f79c6379b3051d8ab9b1bce4c0e097d329b0aa1fc34c5a019595bcae3d185c695e28c36e9edc6235264ac95d5e724f50e2bf9f96f33a32261e4ff22d795ff644d64e3b9422c3e44e7191c2420c5a933b90eef2a5b4d0ebb524a1d1765df694bdf6acbee0bc6c2c9c71146f757f124e1ebdcc04a0d6885b1552c051fcf2d86c222dca65a66da84ca1ce1680decc51c35229eb13623ebd8bf3e23b7b2f1cdd571eae30fedfa2a839b11b89c240d58b33c1581e5afa0d92ae1167ae568efea5444b670796533491c76c3cd3cd7b938c2aca5c17333b86f16f500349408e64ee868a28c9370c0e3c93c811b9d637d06e4a76959e528e20d915a6fe4ef9793eda888c83569a562ffa9e8d84761d9a1478a438767002e661c605847eae38fc3422a69d941a5530cfd6e69a72562f6d48514a155854c1b99e1f5266a6dc853ce653143f302be1e068b54d6a8048e812a1d6eca5f4b081d5009810cf99948c1a92c0ecaa2a0c84916dec4fe676d04a52e111e1a7449a3b79dea50a84953cb4794ec5eb94e01f6337a7f5fcb3c9d6b0b4d0ae09cdbe7413bb7bef552ceeda0dcf044f9d8522540a5144939d2e8f1005a44dd51c3fa12bcff815476fb38dfcc4b3db8dbee80312e1fcd4bcd472ae483ee43face0f5a667a6baf78eb56735b9b27dbca8139883b133290bbba8250bc9523621384c5b1587bc0439eb4b6c8e134188a8727a1c5bec98bc3275ebc10c93934e108a73b9a933dda55770c3853165a7e2de32fba9b9fec6475ac70b066a2569c8ebf0753c654cdeb45ed94e581f2b4548f80a020b46aa1f6102d4076fd2ae8c0ca5eef1924b81c17e5b4365d5e507c24d30c70a0a72fc9af437f2c5fce3f4e0a1d6a5275b6a2b16a9c0ff9c0eb8c8e74d2642d218af09f0f0a8f86971f9041ad1132a043e73442895b02abec1c718795538fd995ba4ed491c240773a3bcf82499c12228f88061d80351145dcbd20a94153eb105ccdc74951e790200dc6ead5febfff2704422adfdd9dbdea7c7b4363eab759521a8ec9802e63b2fb9324562dc01efdfea3b29bddfc4de4c940efbf4f34e28bd61130c2b1ca79a9df059470e204d2b037433a9120fbe8d389996a995374974652c6b72149aadb46d1405fdfe9900e06ffb7b1351fbfee6395deca06dacd5fe64cd04b766cd3db40779f5a787bb908a4c5cc64abeb99354b7ea9a499acf52689e149546ce4ac73ff261f189c5176bae3f79f0bde7a7810dfe55b912863c8f9f1f76b886f7d6e0384890f116ed71e75a9d5e6a1ef1aca33805d836d4a2c91adbb0d547d8bd420d0ae4eb05cbcf6de9d4639a00205bbe48f41492e90e9803c656bc97a52db2ac1f445e31085281c48f2d563b7e77fcd3a3f51d4fd9bb12c236615e2995f5d7bc3ef3b9597c0e8d65948d620f6fed80b958ca7b9600e5afaf46ac9d3ac17978a085b7f67099681203fd426b52cf8310467590ff28a74f13ecf1e32b96c8a0a1bcf2f69aa932ab14100cf941f906bb3c937279270d277213e0eae52417d5b2bf5adfdcd46509c34506ab0b3a3550b82bc52c2c835f5ee6f2d15aa2c25b5a46fe87c5a7f4d3393df5361396d61c22e49f73a802e0a2a9f9809068e10235b7253d15f6885eaf77a2e2d35dd458b035f1218bcf649fefd8737c18b912ba2be8a298b217836f5299aff87bd407c29492c653f3c5295b8cea0f476d7bcdc63ddc873e47327ffc1dbe9d9f66659a1228cc19ef4366c4e4dba3663150c8b914ff000d5efa991aa8f1527664b46f99688fdeebbf75068618dc104ed6bc7e00b824e02433d39a8036c1826fceaa845c87489ee2de510061b76819362b4e3730e5cb849655148e2afaff219b4209fa114ea47b7e83268eda0b92f39aa571b0c5bed76c6cc0a4b20bb6b3fd7d8df43f4ca941f046219bf10163249a6c4cb53ff86222633747007175e124775031eae773b9dd8daea59e6ce784a2fcc0e54069b9f3dce08f40fb4d5c49de092ab1bc8df53c411872cde9251404e7f7a163fd94146237dbda635543f0294dd16d524b736d4b0ce8d7fca230ec2e7797c9bd7c5f3a1e656444c95fcabc063ae6c2b6a95790361984abeac0ddcbc54d07389dc6016260bfb7bb11942688eb976eb49e97582b604802f0494fa949d0014fe75dbada66b3ea99f0cf0e1f7f294089129b4f5fd9502f86e2dd8c21c35a09cc598caea408f32bc9ed664b6e67e0d399067cf4b88c3297496e6a7e6760d4aa8090d1a8514125384caab80e8e40eaa0295c341fb7a653161c4e3d3934170d17e456ba7992428e667e80b5b738657a69543106ec265fa4d588ee7e499914e58b65b96acf1fea2124ad770ace4bd1914660159b32072d5df69cb057eb7cd95373ba648919c85723e64319eb6e594f026c4d70711d59bb09339b175b05775e9554a737554ed0420a479de42394ab9bde1ab2ab0dd88a583d6f4db569ad2e35da128f4e2a6432e22354fe413a32e2cb4d7b935d8919228ff4f095e4c352a5fcb9d2fa71ce1b7d95d696c7c137d20e7676082b3ff3ea3d2cce531d3de2b431b7133437f6617d25718c9bb5639c32f22341fcdd688c0d2b1852ea174d761734e9a38417a7b244445a175f1147954ae19004d899664a168c492ade00f2b1cd01462d4861141e08f1dfa00721a2d3db9b1a941219ed117035d00145e2c7f22bf0ec3c21cf956cff0850f64d6027091b0a15cf2c428726f01046f68a58f25ed0d0b9a03b5cf7ed9c3e9e825b19a5684622222ecdb569e37ac99d2f4dadeecbedb5afaa5883a69dcca4cbffa0f69e4a0fa299170bd12b370bb0ce29eca3c7c9ca6c63a0f04d168c42226ec7ad8af37434c74a1788cea2aab2524503969854fa5f0447908a866ab6f6967d1aceced589f89cefabaad780638ab8afdad39aaa98c4a5c415ed8c6fa65645639c19551671e3dc70cf3e53a55f6c227d08ec272e22b2d59dec373f0e91d748ec23aeb4020015ea4f037bee5e802ce2f25994d90126ace7ed66abc002b594d71c0882a6ad6ae4cfa32ea03df2ee6cb0a7b7cc0b84424e632b696f2f0276fb1b910beb3419ff1cf87ea91da9dace7c6cb5c3ef2314c080417a2970b301920056a4257633ede544a7f992caa2f4a39cae6bb005065cac300fe2c50e5496a7c9f4c6dccae344da651a0ccc1529b5d99af5fca6ebbac3755a576e974a6b482d0381ba721cb4d4d69c0ba567a1690b8547a462548c2c27f4cb3537e5848ee30aea6cc4de42918c650f49645df5c3881fd9463c5d759aee2fc24ee16d7fa839b982e2dd3060eb505da8310e84a01fb40e53f9fe43d51d4b7b73a277684676b65536c0ce9d9e38eb0de63fd5107620ffb8abcb3213ddb323bd74bb97c0b6eaa5abfa6050156b120b6249589cf83dd2ac5b15fb1ca19eb41873eb3762a9c624d22145ec6882872f11386246390fa9eba1c408ebd273852a926dc232bb2d9c555ccda5dc1d2e6c106e605c7ac4edaa99b1259dbfc301c5c4cb83df9c207b345b42c72dcd1027eb0df8851feb8260412a72b43589aea4b7f7b2dcc86ba7d04170260b20a75c0181ba7bced5ef761b0fb167e4058146a955c76f31bab14dc5e3644e1ab9a27dd7f87216dee4b0917401892c2e2a555f3d063f2a88e2c45a8c5292671a378113fb9a77473b9ed92cb8aca6678880aaff80acfbeef29176b0aca5c5c4b30700824cc5ac012b9562c6306bb9a2fb80400550defb58401fb986adcf1f692faef2a4b709eb421166f62dd3b92688674496edfcae1ab0246a09af305fdb665c192e3d5acd74fa0fea4dd03df7008b1f6f366ebca8802c6659d4462719cc6892ebd52f2f3b07c07fc34ba2e1e3ce0502dfdf314746b18dfb1b81e7b6b332fe0d5441d7bcf1ece01372cbaa86110e7fc5856a37c0da09497c03e20057c53f4001e3ae2328c695d3cf52fa1223f50af4300c0f37499dd5bdfc503b8f0036c0f53b664e821afc4d8b898bb04a3067edd11a4f3c819e1497076b7a70b44f4ef916932cd92682114ecf53d28b0d0f9f257694e34e81fcc4dd18ea797a90dd223d3788daebec1dd0c7453d13365efe2307d822ff09a66baace73c9e4c2cf822b96012a136886f1f60f28e7d3c8694e960c84276e776b5e0adbdf546358ecce3e112f477ce5db4ed8e2a420f892d1ecacd779fd37bb1cecd87ace599d80f8b391adfcb249f499f2f8660b3e62b50e1085e9106fc8a4a54e7d99c3509a97153f75ab9f9a6f5e798a137999d0082ad87b172d1c1761092253379ad766d98e2613dd4049c39dc59c92ab4b8fa6660379628b330e0af260eba0d3e66cc412e25158924dd6b525b2b0f45bd3d4e342335830d63d18694e57214615e2310af0759a076f0c0bf5ab84975a5f663e37af76621296844ab996309aa1340be464374a0c6e1c69516447e5e1fa11b458c4205ad83c9d803fccdacadcec8c5b14fce6acc611547f90aea1b0366398ca2a0aac0d4b1fc5d704f364e65a3383d4ea13f20a6b2dd10782842faf5ad392396fa6bec0ebb0d2f514660ae241ce829ad45e7314eebd086d9076eaacc6a0d58f88b59bdd2245286e1c971f9bb146d76f59dd834d0944ba17c1c5b8b78d0ec3dfc86d3d07db4ce52935a40652abfbfb39c6abbc2bb2202f8cae810a8cd51c5993821ce9856c4e43f5eb81776961417c2ba6fa091a811e08ef0836ddbeba29ed24c555ee501583fdd21030bcc308e5f3e06ca4591d5c33f81cee8a90ae44a6434e35f36c1211e62538622fa3f060dc655b19f9e1b7cfdbe7bd2a1b746b1ce8538eb02c297756f721484215da886c95318186461630daf509abcda616b135c40e633c43380892c530c4b486abe7441f4c22a3b55f68a228109a8338a3f8b8683bc04b37c8b6f880db35d9986db3923817b5d5418457be7c9f51d3c0dc6b124b365d7542d123e3a84120e6181008bc5526373dc61eb6979fcab1fc7fc9b413c875e19a5c6a6af5d8abc7071858345cc054fa8ac8441b0f48641155b9cb0a39d4ca04e5c8e7542029dd590a6eeabc6dd6f69c1c1b1eb63f82159d5cb9f21336dbfae08e404287c68abc811c17e59ff6df728a735a56a3ef5f849ef3de17fc173c49ff864055732a1f95f0809d35bb0a9da827ef6575143890b592da76571b6d153b304d86f23acb117891075a9521373ab648086c54b71214d7feeb852e140a4f0e3859065d409e8b7db1ebf7325b0882ba69d557154e2fd2d4feda891d804a96bdc254da255431d556384534b344cb01ed520e8304289c47c7da0f3d7b1ad884648970c22027fe3f7fa92c9c0ac4913a94725d1625393c7b7d66f559ef7ee90e873d2c3431c67d349f0848c444dec08e392b15f3dbc7a1cfe257fb23e58de344c873ca69a13f65603cadecf3889f74a771cfde53c30306f9ea7ac74edec6f83f271235b84d755da4244bf002a0dd6abe0b4deb37e69744583889cbc9a0ef7576f0826ef963c9c9d36129f793b3245a38b1b8f1e276eabffa4951c3290a191d17f1277be0c95ba941ad76f830981583354cac1e55a4b8ecf8bfd4f035b6801985aa20bc4ce7140de889459e1d037dd45a9907a2462f70d7790df87b09562702045e6ee8682437fdddefc08c30ed1e51e70a9b3b352e70ee732c5b369748c3ea04457f284550cb961d7551b836577080af73ed68d275591c47cf521f042efd914d377232ede7b5d731e2bd372ffe4cce19acff3c505abb119f1fc506434dfaee0714af8635c6994ef35d7739512f9dd21b5546f38a962ec22636075fb144ccc6842f1f671d887add319c33f4bca9dc20f9fcab6033a750f154e015629e91ed3d67056a9a915447cebcd2e122e09ef2a91d8ef2df749124b1fb1784c693ea82abaf580dc35a3d73a9e1fb2608c9aeea24ad3a397d45d1c5399f1f85c76165ac47fff8909800e7105772c38ae3f313cc0968bc6f793ab8d68cd18bad3344304dd1d08f283e17ee28fec50192d2d15fd38448c06f8f7bba0625ee30d8758ff873a153f4972d9a1bf348a38bbcb1e9bb06ca2b7b96f1b3250bd647e3ef34f0860aeb4484ef580e1be421eb3154d9c9a8229dcd28c4f3269ffcddd9a9fa76d95f863bfa5b429a454aacfa212f01e2cdca8df7a876fbd9bbf8800982a267421f6fbbfe7fc5e3b057fb989aaafd117459f186b3fa1eaa2189781624573e1f4c3368100409b2ad9a4417f2bf186ed567bfa062cbd544d2feaa893695b61114821655aac2a22f3b903247ca1771cf121afc6277ae152ad6c0c2b3b2a744560ea88f86d2e8a124a8cfb85beaf6399539136353e89e18f8b636f38724abec0337525931a3d141f2adaea38b70f7e60220eec74b49d54b40fa648d21a4852641259b84f05b3c8efd9dfac8f45713b4124bcdc467fff41ff748a0822c9165d323ae555f6ccab2cc55e7a2c2d99cdcdf629b90e7e127df9da9825b9dad263436a79bce0d096db981977b70605da6fb09263328bf04c2a1de893e26232f2dc68a7eb6394e8920c36ab7db67eb9b9d3fd0d983f0c98c436dd9c167831e2d201e18f72a528d5e12b6ca8d8a5981ca9c6728fe2f06bc8eb4f229d1cfe9532a203e4954314bd73b756d181a416e2a231ac9a7a3f1ec4ef54913ac711d44c4d8fece7d1e4dc9ed3cde0da1fb28e6c40b69328e5c222ad955c219ec596563f54bdb510225abd57d173cbceeab846ae43f66eb144bd058867f5c7bb9d5173fdba1e990e96b8dc0a0a5c78c8ea7693243b4105ca52702277e65dfed4b0bc1e8b6c0e6bb8520063a51ed44e62e37cf8400cfcd488fb476982f8d7eb8eb955ab829ec39bdabe9055d7e0c2b6c6f3a635972887c57e2c165373899d8462b07ca095c1afae54ce345897ca8d2260ea2509676629b1f8b165a4398a46a6ed339e06f2b8c8c5c8a9692e0f8c66bdaf65aa4eaa0242e1d851b3ee2859334b256f78e1f3dd6f168320bf5c4ef0b7352dbe646b3c9b1320475af6e093d242eda495f066245ac588cb028386a42d101a6435b2d2245f21bf81c692806a14a59131fc817530d273d05cf02bdcf4ca6583f0cd0b0fc0418717b3e4ca79ed583d9b721206fadbff966b367a7320e3195316f882989ff75255c0cdbe4d1a43d5ac738aaf7696edff92fe5d5a60f63ddc9c9894704e0b0f0fed9616ad2553040a4e187f31a7a965b2c710ccc1d3e51cfa381cf60606b73338bda39bb7f50abd37029d929c7f96dce75b89bbc8732250dbff06db5bbdc7936fb0603fcf34697f87b0a29cb11aa876930e44028d7a4a082ebd490ddb13b09f565c7072fa81d343d8e04d46cd3bf2dbdb085c676b0dc2470019f0a8c2ccfaf11d47d99e9e0ae3bc380e8fd05404a57e01da2eadd9a5d2442a3147c91968e0f188b73401028127c9d6ce391d8270eb72db62aee9f67f4199ac8f04776cdf3349e737961d2ef64e4a64b13ab53d7d670724eb4af2483a04531fc4f129a5205e860350a7c7551c946c49164cf3290358fb8b92df16eb692d5daa9dc6cad6950af3a8a0facda5afd95b1b1eb071928205b3e3450b352b7bfc4b957dcb1af10a457","title":"778. 水位上升的泳池中游泳","link":"https://leetcode-cn.com/problems/swim-in-rising-water","question_id":794,"issue_number":45},"43":{"day":43,"pres":[],"tags":["滑动窗口"],"whys":null,"difficulty":"- 中等","description":"```\n给你字符串 s 和整数 k 。\n\n请返回字符串 s 中长度为 k 的单个子字符串中可能包含的最大元音字母数。\n\n英文中的 元音字母 为(a, e, i, o, u)。\n\n\n\n示例 1:\n\n输入:s = \"abciiidef\", k = 3\n输出:3\n解释:子字符串 \"iii\" 包含 3 个元音字母。\n示例 2:\n\n输入:s = \"aeiou\", k = 2\n输出:2\n解释:任意长度为 2 的子字符串都包含 2 个元音字母。\n示例 3:\n\n输入:s = \"leetcode\", k = 3\n输出:2\n解释:\"lee\"、\"eet\" 和 \"ode\" 都包含 2 个元音字母。\n示例 4:\n\n输入:s = \"rhythms\", k = 4\n输出:0\n解释:字符串 s 中不含任何元音字母。\n示例 5:\n\n输入:s = \"tryhard\", k = 4\n输出:1\n\n\n提示:\n\n1 <= s.length <= 10^5\ns 由小写英文字母组成\n1 <= k <= s.length\n\n```","content":"096221cf5b628be1e73e8bcfe626c734748326920a3d40bb75074c7f2211766808aae07a6e8b9f3a7173bb3c930b2fae5ba2cb0013dfc75646e2b344dae2e935e02d302ad4d8c4f61d20cda18cd05e7179e7728bdbb11e9136b520c3f4eca18c412bc21c6cf8953b2433026de7decef068d9532c3759bec970aab3c660fc18b36241cba3bac4c6b0d625a465cd12a03eab9d88799ecaa9f50b624118edeb95321d0315481af761c2f4caebfb936e1d6c01a9c4e17a323c60bb13e86c51fa2a0054956af4546ac470f49c712b837c1d72b70ccf775424978f074e82cb352371b294a2cc2795ff6fe2a2334ab785a1fbf1414d49acf2ef280220cb22acf58d42edd70ccc820775f30c457c600ee3735a71e9da832b128239811d92ba1ce8d74b14beac6b8e5488e6ea292cd0d28050256495cb0d119edc6ac09a4206729a0ca61012519c971328516ba8ac47dac9d855483c65d1cea0eea542d35bda13bb9a11f8e540797bb78f75de40584011556097973685ad2cf5dddcf75a64f1329dffde3f38e50d1acdbe1fa46b30a14559b1542fdb7a2294d39012f1af2d5ad13305650597a34c794d328c04d6fb341bb8d1d07dcfa5ccfaa850d00d5a342aff7d0de98ae760a9a48828288110956b0b5f04332942935fc81781a2e5f94eda966c192d93717b532f0492d52c0f0248e0bb87a6040a352cb62eb33ce7982e8cd3752bfc99857f443d4f0fbba604f8f47cbdd3e11b0083c8c9e3adca68b289024c66313513a430157f5e2a5405e6ccdd23f1e4907c7971300b295882c6cf24731d28a15522275626b6b2ecc9f2786d254aeb5fa0adbb33d99d2524f554d87099ecf89e5053ffd2727b9fb7eba3b4a08567c4dcd35ee98bbdf3a97a6ad3340e3c9e45620315270d49b9b3e7110e33e291a601d912681dcef2ea6dc170dcfb14b6a47582b194735bbd78ff550409d8d8c39c62467262f63d7eb66994f5e2d42eed961f0430f9e966d82c467a8855bbe15464f92f81a5d77e28352edbc1a7599c4d728eec1cc2b97c9642655a24e8926d378829019a1ab4b00afea92472bf939ce82eb5c426d8756be03f0b943bec55e942759600fbba4d475b2f8f03fac0a291f8f95e4ece300a38967b4b09e970f50c985869d21cb883edfbad80d5df13125ed0046282a7a7a2c9a0ce5ad880981355668be4428a705810193032caed4aa64e7faf48f42ca5ccea4984a2deb127f78d5b939793f93993b7874a6cbdd634ebac20eb778eb6308e3573c06e95bc636cc9393702b4754df6eaa8d415423d715f93f2fc86d19e83f509acf65452f3658108277d4ca29b9cca49d2133daad380cda170d70a71c24ebe6510c463e88f524a1bd59840c6b3fb8db9e6c79aaea6c73b3619ad3e53d172fde28a48d77d3a521c51a7bb787cfe0400d67c1068ab96e4eaa55361fec81b3d8a337c2ea17ac5843dc639dd30d18845e7e0c4d847cba3641a8f4ec66856f7889062d2ac36fbe42abb0c05f8e6755a5243adb1ed9feafa9f599608620b67f4e52cf74af8cb171fd71d9dc2032645dd41d088d9ad3acacbec09eaeb622a4ab215edd8984aaad67f645a6ae0e7e975edf72142555ba33074e074722945b43d0bb437fe8fff868f621a360cde40424a93af97459c45f427722427d5cb27a7951befde8ef69cced7507bf0684b3eacf08ce16e6791621b9a93dcd5ff5d4a6eb25948c4fc7a379258c6ad9e904356ed09d27cad7093d839cf270b6e0299db32bc516bf35b76e72551d7edc04a5713f3aef911b544fcc310020a573dd86b4b308d3cb298fa6f7c9f855c578aee35a9a3dc2b6e982659294241a8dcf8d81a1a277d2213753b1dff7823e916934e33024dbcffb1063a2e0624c9cb9b2d4a1fa3a68460bc59a0232235bffeae82c0e48755a1efec64d506b769c438943997472740c491ec1c709020a3c8c75adc908f26d1e1203c925ac777629d5f638d6f9ecbdc4f14af5d23f4ca8a9cc950db0aec14e256a6e284ba381eaaa6fa89de7a08842e9e2129b132221d8cf3a95270e05e8991be7aeff88d4590e457a20ad4f905cdeea848668c28647669f32bcc8b571fcd4fb2779c180272bf3914a3918bbe89862d4d5b96c4efd7f42c1e294b81e51016890d87d778358030441284444c80eba35ae33a5ad2b2ba6f006de129b24a8b330a168c08382d866fcc6830baf245994238dd65c1b9e08ac13c001a9978c71beac75c682482321a36136d76634c0c8370ab91d874e3159804fa37f1b6aab5eec185265342ca9d487b0fe01a636aa1807a8d8a22e78285961d821499a446d3f208acf7fa2e593427589fc2e2ecabdb6262ec7b46ad9164359af65fd67fe70eafc594562efc5e7e8d5d522b708a6eb477a2edd142d0bb1bee76ec684b9a4e033fb0f7e3649522f8a6e78e30ca77df904a2c03be1add3b0e7815d06c2bedd46461c2d4e3dd5d9d1fe68b3e573b367faf1ace976f749a487480935790f25b091c4f99b8ad38db3630afa199350a2a82db407678a96ff73ad697bef82b08bc44a4730aadf50332bc0de0b2eb2d5e07981435df071d105c8f1dc6feb3174f3ff645471d795d3772dd9f412df0996bdfd0bd63cb0abf16e89527fdb067f86c55adb8d997a50ad4e289ee6c23d5f7eb43edf8b632c3e57010f00ef74d6493f95c262cc23f11a52daf703d773a46012d31fb673b4459a6a831b6cd91e6dbf13ee8d0eaf3c1fc092fb7ee8784a033e800085bf44d2ad6784457b5acf04891e9794954b9ede56cb1dd513162d0df2b130ea4423d9d7e4b5c6a755e148e95a1a73bee7a678dcff86e1d255f743e4bdb58ccb01a72f79ab5eb57de7c4b96afa2af9c9986050975d9cf620637bcf432e467ba1f79bd546b2e119d83c68ebd758fe671c33e8947cd63ee1eb43e3023441096f5bbadca1fdf4189943ddbf2666d610dfc7b9fc65dfc630602cf7e9f0f6cce88cec5252657ceeb1e39409c1397bbf7bd96e93c2c175d1e698ea5a2c29c3a2bc842d7434fb7fcfda3176ed5b7dadf9ffc938dcb8c26d179a400f404b9cf3c720d9ca3c6c991b5d36cd5c37f7d536996a152c90b16cd77ec3cb12fe4c93e87e20fcf4255dec0d069aee88dc1332e4ed402a84f86e52f9b7ec44abace2da89d59ea59612c6f6f4f702d6fb20e1e971c6e0573789661b8356f4ddb421c449ae420a1b75e3ae712044686b712686331d547ce7036874d851e7651719d332b95695459cdb10149ee28aa707c939cada7466ae528541041358662d6c001193f5304f44bcc115b60760f939206448c6b7243daca48bb60521dac074cba9ef887d2399b59910d1abdff00dd2d575f6a9f667c08731d88cc996cfd89c6a8ef985e216e9666e39d32cb99616714844122cb36fea9d30a422c44651dd8b040de931be4463f440ffd03e9f1226b7c5e8e001683fcb8bf3dad2d294d4a9d7cbbf4f87467250031ceca0f651689ec219d46f68a5beb5ddcebada01677f2c293d02ccd262cf32a5e4a7211b0eb63b331cff54b59c791c18dd18ac206adcde0eacd94c3c4aba622519dc15f25b64e055ffbdf6f919d8697f1013aabaf0c2ff93a20d29f6fe8d9d934c168148feba884b25d5119948054f0530345b68d439722f9ba5a19c8e1d7aed491e8bdabf5b160bc89acecee9099be2a334117f2be65b4444b54941b431972d5ff73d63a5cb5666d24700af923212487d59cf432210891f348e026b9b6170e1fdf4e024fff5fa90ce1e84697df3a2e84c3e34088c0009097d40509928663f882b79b61f03181b16ff6ca9541c4d2650b3d0cf6eca84609f94ec91a8e9484fe2de17f9d11a1c6c3a0c9304428f8813322c1a7cfb66bc504fbd138b7e9dc7057833d3a17016b11686ecd27f5084a9b3a9aca1f5ce1c3106042364a04533be348ed82a708dfaa705b2232620a24266bb0bb91a77a8bfe91a0815457541ca4d5d644a93a8809e9c23cc360f8f21b89993d39efb64d30467ca12cd9541bbe55d231daffcc9b4e574ea94980fdd8a7060a4c864ee76da908dc3979344ad1f360f1f82ddbce66156ced0a12a5ec259904070361d12c5e0505a2386eff90dc8e7cb72ca658ef7dc4ad3b2834c42d1ed8841abe518f95fcb0ea8d84f8527d14693906496b5796fb3dc4be5701d61fbca8be3d57258335f0d049ae0f279f68d5cc12516c45edf381d6b188ad4ce6b9249946c840a99a73e9c149f8c9bfc7d86c4d643b7b1b21e29dcba0f75db4fa863e90aff3dd94a94ed0b683f99642d6495cd97685b5548da63f203b22ee2aed2b3eb4e78cdfd343a6e34a7f251222b7690181babea3c1ab26135aff4994638621d55199383bcfcd5aa0a9502377bb0eec3b06e18ababba4fe1318d44c1d7c1c5b5151264dd7ca980ca13def5b546bbb6ca789193129e853bc7c15026789afaae4b5414c9baf922d3049252284e90767e561bb47d4bb468388347bdff3a4c189999a6870f3e6d341681f1f82a5ed25260813dd3bc096fd1aed0f3dee5c8bb7666b3b7fd55fc7e1e76fbcb805bac199e8aeef4eaa3bc83c814ee30e9f50cdf996adf9eca82d7706a04b654451f83e65498da0cbef0cd04191392d650481ed774f314f28bc9cf727c9a5bf61ae42e1fcf013277d247fa7e33559d645412a9060f69b056a8f8cd4ba7cd0b445c8ad0198ef3c3ed79d6d658038b1ab73ad5af2ca91ffd47e152a6fc2a143cf9c5c3281c24ee67c8f0b0043263eecc6ef4f2a9cbbdf0126f35b90c7bfdf3b8bd57cd12f871dbe2985a32d97403dc8f549a9ad2d6dba25d14e1af263b8eb544591f4b530a7e3ed0f84c55374012452ad771dc834a418a726eea52985f7dbd89b33834d7a4837caa9b3092efbbd8d660cda43c628237077584fc0d0496511f0c439182d1c38a0c447d7a4b327bcccf2c686d47afdf3209f2b58dbe4271c562b741a113a0e95497c2e37b3ff4e6dae111a877585c3a6d4dd372ca0974fafd8127116b29488303800c37939c9892269943a447e1c642e1732547ec89931b2d62e4798495c89cfd398d2cc22c1d127573c3083604b46b425ade7d3ea7bde0f935311c664ffa823b485bd5eada99e4b33552ed67404780028730815b07459da35964b457461a9fdd59b395d6323f048810960de924fb0de669dc4365ef06d3d094569527a036042c09e9f46f1149728298c6e878b3d8289dbdcf6875b1cbec5869d3b7e7f90aea1f93426d6997e52e2590d07c0df08af60ea0964c68b8e54a6426324d11b82cf26855a9ad43937a6a0c0f5b0c8a8017a43b653e4a59ac55e3c0fa0b10823d535eafe94b097a596b5d7981f083b20369b25d98d0c83270bd283511e10e30add8bedfaa766828c801e7853c752ed206eff2c52aba9be6d93f9f26a90256bd8aaac039794581d9b8559ee8c770f4ef7e3c16c272c21651299ab735598175ee70868ffb9ef2ee43fef55ee5015dea0c93a1abc914db1a9bd22ed7115444abd36ee8ad6e116a64b077ba76c5b58bd25202123eaa975dc335d19b8a6f988f9a0ef635f7d6b11e80bc4b0683f7c0abe304e483a8bbc2bc634d2990c445b88945da384af1fb81fc40e633c433808c0806491e69aeec01d41122289b55f68a2615ece837bf6aaf1333b9a5668d3c5f180927b9f847af6d46b73e1d508844abe6d84519ac0c06b41457a4a7e51d039a5a1276caa005529bc443d3774cd15bf97c4e09baf3a8cfa1d8931a5db12326ea6c4f6c06e5716601d891aa9829b4a584748782301ac825e71878f05a18889582071dd520a7fe6bc34dff6901b4947fe77fc1dd015fdfe136edbbea69f443bc29284ffce5243a4d6b88c7ad97d191ee2bd3ed096bade1cfc5c3c44ff97495c7a001f95f0809d35bb0a9da827ef7f29467cc9aeecb5250313205c7f3c4d8cbb69920c73fc5707dd60287bba05097d0ff65b138eacba92044d0a420e747a065d409e8b2ff4bfa2601508d0ad7f9a281a2a6fd3da87dae36e8029d9f9874ea7475d3dd01c276f7eef169956860a78cc536dd014c7c70f7b2e19d2942ddb3eca6474f93f66a92cc82fc48353db3c0e42257d75382966e859e87dbe5ab12b2c34078d783a9318468156dbdaa6702919f3d988a3c3e255ae219884f86e9a739b2cb876732565ade0d998845ea771899101c30b4abcfb36dd0bd9ece824275b35a44d3e46a46d40fb0ba0860cbe164da637e497471c60e09fc7e8ae267ea3f927846ac09ac46133fc85a85d1f6ce49bf1e276a6faae490586361f4d5545ed6263d1c91be947c80e9b48a450b47a41e9197fc5f4acf2fc99a00feecc11d6e5209c0de70417e69243854660268a14d504ea570c708c530dba34465361464a492fe2727e7ff1c7a39ff730de4358bf52de3f2b717bac552c0873c31dd5ab45532a225f0a8fd7073356dd622c79dfe674e171c73c58073ba0114b4b7cb3825c743b7dd2baa8d16bb1e26927ed5bca0da9ff353f0eb20ab51fc55b692ebcee5d09fbcd67cfcb55f2073f5a5671bf9b5b186cc8e9ba02c21d795f1abb6ebadac4365c294de502d739a670dab289da36e9a0eb2f70a71adb58e95777d7cef7076e0538df8c4f4180f1d5f818fc8caccf4e86a18b26d86af6b20288ce9df69fef9f0970e3294073b7e1b66f198ee1ea25bc3d2e773ac4c121d019d6ac337bac11b0afd5d41aa10d5f71c4d6f9ff5499052bbe3c3729fad285d6c9aa2e44311ed6d4941f2317a97ab78133ccfbdf4fd48a0dd5669f7aba5662bd628021cab117a107a6c2688178bd1ca3c5bcace9e841df622985b0e977759303edac7ba58e11b11fd4aa160346a428f66301969cb36c818b2793a02a8fddd4d9f2d076d95f866db3080b87460eaafa6f6259b0d2cbd6ecea22a289afe3fc46d5e72b11112cf4e97edea7e37ef7cb97b7b6283b11d3cbfabe12aa798973557b0f3e4d5d3368160005aabbd00b58e0a305228f1caa816b94b917dab3e3cd3a95ee5057d10744aad6ef7765982f5d9252768d4654b50133a715768ac0dbdfe1af091f4aa4dd9b8abdaa6aa38ee704f18a70c670477b3db98575eabf32d0ad72fd29c3dcc7ecde2f0fcb375d04656cc0f0ec3906e391c4ad0ad6b22aad09cb3071c08da4374b6ce138e1f5d3f39e7e9feaa85c8f071bf16969db6fda696a997eff5509a31cd6b150282c886f4f2168602a5faa15093e1877ffc7a4dd1af4","title":"1456. 定长子串中元音的最大数目","link":"https://leetcode-cn.com/problems/maximum-number-of-vowels-in-a-substring-of-given-length","question_id":1567,"issue_number":46},"44":{"day":44,"pres":[],"tags":["二分","滑动窗口"],"whys":null,"difficulty":"- 中等","description":"```\n爱丽丝参与一个大致基于纸牌游戏 “21点” 规则的游戏,描述如下:\n\n爱丽丝以 0 分开始,并在她的得分少于 K 分时抽取数字。 抽取时,她从 [1, W] 的范围中随机获得一个整数作为分数进行累计,其中 W 是整数。 每次抽取都是独立的,其结果具有相同的概率。\n\n当爱丽丝获得不少于 K 分时,她就停止抽取数字。 爱丽丝的分数不超过 N 的概率是多少?\n\n \n\n示例 1:\n\n输入:N = 10, K = 1, W = 10\n输出:1.00000\n说明:爱丽丝得到一张卡,然后停止。\n示例 2:\n\n输入:N = 6, K = 1, W = 10\n输出:0.60000\n说明:爱丽丝得到一张卡,然后停止。\n在 W = 10 的 6 种可能下,她的得分不超过 N = 6 分。\n示例 3:\n\n输入:N = 21, K = 17, W = 10\n输出:0.73278\n \n\n提示:\n\n0 <= K <= N <= 10000\n1 <= W <= 10000\n如果答案与正确答案的误差不超过 10^-5,则该答案将被视为正确答案通过。\n此问题的判断限制时间已经减少。\n```","content":"096221cf5b628be1e73e8bcfe626c7347d84248a04fb33a5cfdce8e0203e5fa5ba126cb6b71e6983b7c364be6cfbaa5dbf2242c49b6414deb063ea3cbfe8f124fd2d256b9ec38ca1586ec5a48498371574a73d037164857edd3ed52860577de73373814965a5db6569b7dc8e2f3b003ab421c1c6f8cd0924f93c410e8301994094db0c64384d0e3355f42a832e942af128487ee87c68447cbfa72b3eae9aba5e5c1177121ba3f94420617df993691e6c29abd9d1773c0b60a404eb4e55f02b119dd34b900d6fa00cc2e82f34f821172ffd21acf31771a7e667482e04add3f1591ba3ee2097e05aef9b1f479aa9a0e1d2414d49acf2ef243e2e299716310a29a4f27386a7a39a7195477d7f0fd47b5876d8dbb528ff17bf4a92fdc51c858b71975139e58f668ce2c7222cd0d280502a668acb3b017259c808c148809d72eacc37d50cbee24b021c2195dc0ef38e6aed4b6c65ddc692ed8a503fc4471334025f9fcac379993b1bbd8876253c141e2b8fff729cf99e4d9dcfb7b43bd46aecf88661269c502f6f3187cd150cc42c74ff0921993f35c59b984fb9b34705d96f5a416cfeb41c1c78582063b3f7adcdc5d78f03cfdd48b5ea51b66c5c6055d60c53fee1897af6fb844cad0410a16a086f013329649b79d63d6ec0eea135d1ce253656d847fe97a79e98e1228b92e860302c2094a6bfb920bec0288bde17e943fbc448e9c44d266674be6ef33642b556b0e5f4181290c1ffc43b65c3743ed3cba8cfbffa427595d7cfefb0b33d7b58c6a5d6e63c472f64399330b90248d0c7ba45d46d504e7853c8ab9f96f33713121e57c7214a65f447ef4d199020cbfa4c59a8c06f069eec070094e8a3bcd4e99d34ace14251ecbdbef98db2f69d6728ba71286a74480f88f125cf0c9ed586741656d855e7c811083645b64de3309917c0ce64d1dd950ff11877d35a0a25d9d0e58269414561f70470984597d1d8d513e050b1ad30f8d566e530444d9b54b1c55752cc25829a38f8486d2d9769249dc0483cd3f477a5912acd7816040680c17c513840856bdeefb3ac2bd12e07091591f304b5f132d2486d75b29452933dd503a0f06cd47b35f684b08d92c4417bae97d6f86169c61614ef14150a3fb013c76ecc74ce56c65a81405bcb38345cc1b299bb11083a2a2d6236675e22b481e295da41bb45685ff4064c0d5e9778eb698fa1d8d010c844c3e987fff9484468b94d9d435c6029ce134a2534f8c92519b941d5e868c44943e218fd819c3387a07337d90eff990a7b6bebe093f41d7616a5edc6b1e7f2b3aafbac1bf9bf7b35ba7fc55518fcd03ef3c3e31b8f0e56dff9f890b736891f164d2af340479f455f5b127b625f10a29f84a4eca2825b350f3a60110add33e69669f72372306cd77d3a415829366d8aeb1d9cc34a8d007bbd92de322bca6cd6c612199eedcabe4c14fbf062df678a11ae3cd833484801df3868b4df04a413efca475234e507628d141696ba3516fed678b53146ed1a0b59415d4bc421095702a079412dd857177598cb6980125ab4f4d9228a19545050ca477f718c020d8c98e479838db9aa2a3736b8c6dfb46f846bf92357f8ae096efc5e628cfed623768d6a2934fd191a09194ff1e711588b151255dce0b14ac01fa923673349cdc33fa3933e6b057867781b5c89cea22a136fb1aad598d8a2e947897d6a551a2cdc91879720148da4223aae1194f4d1a94d07b409c1aa26d14658a008b1a1abda1ac526964d7b26f8ce08787bbdaaf6dcba9d4468be19cc14c58ab7ab0b7d2cd7794632941ebca0e6636eac84534388ca14a5adca2a7387e1c4b5f8d41ddac5c719292f70071e753c1efc5608eb1d964018224cb9e1b0380d2d3b0fc7eab72e5f06adb88b6d8645a720293f9de443ffc3a7f576e7a1cc1a8a19d515fc7ff22d30a493f0c49cd91378952c99ebc442e391a820d0dc3b3d9a61cb4b6c7387b909df12017ed014a35d22c1f589b8c05ef4370eb84e937b9e2e7bb8becedbd72d4885f3ad659e75b854cbf08d3a7367abf729b0417a40f37b3512a60c39db3ed57569d4436b21be8b1df387faad74af3d41d09d38c95c831ffc94e269ef9f58760262574fd691d37e17602c76b9fce0c95e1c98e74880607b1f7c80fb0300cb3962e9a58538b7302e780a54f98cd08e2cc628bb7d643cfd713eaeb0674d89fb2f3bd953c0cf50a91b283a0947dcc2dd7bbf4ea45615f5fbf62083ca85ffedb7b0cae664fc1b4051b616dc5ae86fd6242b394d6f2a48abb2bd4955cbe1e2049b88c1325194015bec2f666150a3ed469dfe29c1b34683a855e65bfab7d6594c52ee93f46e6dce94fcfafe6a74c8db29b378a6b3cda6b8f62def677d875b55177f816ab2748dffd258df57be01f020a3c36ca6efc46c7215891097212d3e39b5278c6c6489a0ec70d416e05c4a4a9b6c0f9c1bb183534d3e10c572f04a29f8e987baa41cd7343ab7c13cc0945c1ad34b6ac1f41268dc337afd57a2836a1c25b88e824d47ecb3c329a97aec99c92d16c5cd1cf14ac1aa6b798271f89f4a7d6bd1e8dd22a0e84291d8b0e539f0342465cfcaf517c39de2edfbb8e4086485aa5ed74588176f8657de6096251ffd6d0dfa09db90020e1e2d01cc61330827d3249ff027c51f795b97031ad3dc43e975bcfc5c36faeab304bfcf03ed6ddef0f6d5022ee6960c4a1897d30a6e9907545771395d9f2e414872340accb76f666b0be33930a8be864194ef4effd3c3572e33a6013bdf403fb42a14c87242f9eef8221283bfcb59fdd305f38fc4c7b0da93395b5dee1ba9bd8e7c4b7ed1dad8f62d61c614a05b54c7f36452717d8dde1c57c0a6e1858084e805cded540891eca53a15ba1f8e2183c878e1e6c0a310839e8e79ed15239f2aaa3cdf478d18da6781e8b3c5cd2e307d20688a11824f4eeb95de2e38695ce767c8a35632f3a2c46fe55b97e6083d5e0083c2d8776789e791922717690f396427abbcdeccc4c70b61625657f3e62dfd18f6ccb78bfd6490c3101855173c615c116749cd38e942df39b72de56d6301ebde09553d71199d4045c0ba908f0754fb43f1d602a800a021836e25f60d2e9cd47955d1b7139426e8a704b58cda2fea3aa940e5398e56961de72cec601af75a5962376d7d767d026bbb2722971952c382f79774ac37566cda783345adfe28938b99e61ab39c1fd88960337553b85eac2d0fd310a277266a1def32493ab69330e7d043628a52a61225b5fafc9fc1c17488203a6675ad228d993a546f224de242d5de9499fdbb7e06e6ad48f9dacd3b72cb588494e13588910f09084b5ae02c8d389ba8334ac4559b9bd1fc59a9e58e90ce674ecc06f7f6623c27080a4f5fde1ae4cc9b220e868eac36f0ed5fde6b7d10c5cbfc8cf1ba5a488a5303855cef99839d53c85b56e49abce25cafa45b567f24bddaabb5240fba02c4c0af0a506f482b82943dc4ce1a6eaf1a1a8a98078976be979ec7b1eaf3f9afd02ee92631d221596a7d34ade57ea833eec3444ef393e780d2a8c6cf48305e0a1d539bfad3dc1b212815c8c55b8b9ece660d2fc9aac6f4f66767813593b48f6d20aa05034e10c8fd1fb81c8fe7a9afa15e771194b973f7403f45a29542a93af8907914e1cfd7aeff9cff99a6eabd609b9aa2e3d39aabb1cfa2ed1ac89166ba6d4b5588177b0873c4ee7efc135dbc546d266508dc222f2fa5d7b3e1323f2b97c8700293c5dd09415ec02c597f9932aa64bcd11fece45667b9aa8d55fc8330d9fcf991b4530ea72d6b3d0b803ccc3b65cc756118bb018a666c602d62620e2474e72c52ef191ef7a31a72abfd02c292f0df80270c69cbf55d3189f8d5d42fda5893eb50ead198297ed268357f5f4d77304e41e27ba68ec73ceab5141aa9ec531b417613340c57e91a8a87c162cfe51f5e527b594a780fc97fd6bbe605af99162f86574eb992131c4e27c711d66ef5a741dc12a6cf52eb805042e1cf223d0637b07ba96771c16550e78edaa0c5550710951cfaf894e32266f7178a72c7a938cf356d3d48cec363e2d72ce9c468245fee1d2caee8299804030346ef2269090d8e336ef3b1d19461b20181bd59115137ffbf9aca0b1fd18f2dbd53be96dd98eaafbcfb457e17770f064b525ab1c331d1855835f31d92bbbc047eed32584652ff4ccfa966b600415305732b475f4e82941b418c313ce451a915bb2d61b02d28a0b45e4d3c97e4ccfffed193e62c6f480f3ad0646b52ff4224004c016daabc909d9749eb32ceb557b1540b9d6760ae849d916d9562cada784f110549a32f05a6eca398e705c5ce1d16be67187beeadc74cd65ca431811b9a02f4a00b00e8006dc888b209a229d4e47416537e5f1cd4f10dc7ffaad38af999edee1b6876c307be2ae8deaf21d76310b1feb55730d07f5f02bf0f2c037e3e6b665f3411eab0e8e3960b2fabc62afd4567f6a673ccdb386a9f98f2808599f01b7cf3c3ec63427c6f92bfa538294637d777ee8cda30bc437db314adf4273b6136ff2c88adb23bf5f74ba0eb99e8eabf71a600c86cc045c00cc051d1d1d7feb7a0a45c7713f519365a03bd702e01cca7c2fe0dc1408f4e6420508ace7e4f3e4f5f969cf7758cf6bf7cae008ea8a541697d602fdca70d3ec6051c00aa40fc5e81c74931767fb01926a82238bf35e56551a99816a476a9741ba26fd258452b5116ab94e9f42da251cedd2b3b85e843e6bb06d786a6b2b2682267f2da186f1e8bb20256e5e5d4d44c82d156fbe9308b779e4323fa3a8d9d6a63a8661695abf421e80926c026ef0ec8e9556f36f502666dcb3c50ada9db83bd7eceff48c8678c54a76114bf85e7dbc48633e819231867a4b4af466bb9879d761c15df6a39232a250a3889cc1d2b00b295674fa788df6916b55c0470e8154d1f7c221cf47c34ae28edd45a22c6c9defff3d696bcc07ebd355726eacf563f2edaf30ea20b07317ad56046f9e413d617c793d35f5b19f8f09756e9f15f2ce4de02f9e4dc364e3045b39fd31321d23437bbd7459ec81e3d525273209a4ed123462c4e94644b8928d32e4d3a69815dd72498ce6cb67f59fa22570ad0283e59f798968e7cb2ebb891cf8d839165f48466bd77a1a7ffa12e03255de29de2e09d10a6968f3645c67827f7664aa9971ae6f8c681b8b5eb9fb4cc044113b11f72eee9fa62f45162b205781253000ca0ad326216098df8b91f01673cf3268d9f334f39f1f296171fcd5c842ff6dc4d7464d6579caea36fc31921eb34ff5c6cb6f231260508665865d7f0dd218f742b5c70cef3da422190fc59d17e242e044a3719714f35a8d1d5f9fa6ba331688c77c091533ac6c3e926874c031022ad04057779a9a68b13c277edac0dc2ca266e04c9556243ee7ee9a4555c6ea50f1181c65436942c39f688b33ce1cce1b98df5b8e9f789b08320dbd5378a94787635bd22b8699346e1d1187117bfba752ded792013eb269b99b5c875b86f4d1e19832cf48b9a70aba8fc6685abff910f66f570bcdfb2341d5c47683429d5cfbae1a62ded0177dac8ffe926b6a1bfa76968a032934439d4cb906d30a62808098575ab43c6fc9b8584b7073ac0575358640fba8fafa5661fdfac3a82d71034fd0c7b34b9bd0c8dbc0d474b480dc01c65b3316686fb00458414c676fd339549661fcbb083a9b6f79129b6231fe1f21f8cef867ae2b0fe8a52db323a5977136aa00a3ca50631a1fd5c4566fe81c9c7293272375fc09061090fc4ba2523eed9d6634bffba3311ca04206cc49a0184064230a8af38df9ca0421b20b23a97d24cb9fd9d631ef1dda0df0c38deecc9f0c04f44e5ecb99327de3a1518b9c55f849ef39a52ba17720ca894513232675a9da3c5d173b70af3b227a672281877a9afc6d66b571f202b653c0490aa33921c6d91501fda2f3120c80d5b385cfa5b50dbfdb34fb5fccfe886eeda9b98ef1d4fe1092e5b8494942a2d971bc7c9bae8192d685f0ad804cd532d6d9015f71d0a9091cee1ee35f55cb14f958434c1871f885b73253d7b5791c06494708e3c27e83f56b051930fc48b7b94795d612c133c7b7d66f559a638be138c112b69318f24388f3244c454d7daa4392b53bc89c7e8cfab19fb71a4c3a4019218db6987762a6046a4e7f3889f74a771cfde53c30306f9e6709442c4f0e53f49081fb84d755da4244bf002a0dd26be164da63af2ec062529becbd88aef7576f0826ef963c99a962430bec0cc244a21b9bac6e232bac4b3347be97b4f4d4845bf27378cac49e9488715d540ba54ae3d4de16f7f83f8bdb4fc89b113f5c149dfe30acf03ab4159a1c60b9e46292dc548ae079c5c1870803043c56713572749427a4ca1267037b094abcc8c79a34a06f648e4212e3770bc622c4c23b81deeab40172731704dc79d544c788c285170d6e620a43cc574014943c4110f1b07f1ba225e663dffd1d6f316fcc07e6bfc04ad77e5bf2730099147de4dc5480653aeff680de2dd359ccb41e21d67244225dbdb13164ae2c1c6728f3f6e6b0bf24d90c1ae761f3a52817bc075a37389affadb3febf4c3326ce618f943bc1e3bd3ccb55d3a5638d4c5131c8efaddec22bbcbe09837a4f2df38d470b1e518ca8a9befb8ba99006db8135b59b7e1f0201ec0a6f424ad6f22335897cf6ecc139ef1612eac4cffb5d1c039f543442a8a9cf5fa54c56a2cb23c3029bbde8d9886b13f447842d1cddf4e6a6aa967b79061a8afdf0c9a89448622c021c94261ee6980219efa46e87abde868816cd962a38bfafebbbb47c06e27c0f1e0715fd803e0ac6abec817e301c1e3484c46a425e66a11d6b6fa6c9d8b2dd8db2af9d6c0d9feb3389d10d11ee6450bc10043e3eb1f2817abb3c2d6afa421ebcaf6acfd7ad7ef674f026fffec4bc3afbb05f38ac2c7a9064f11d3cbfabe12fd30c7375962286b0b4038235913109da1a3533db5ed0c00f667e3ae27dbc64594b3a79d4185930a33df1c73eadbee0547b32058df52568c5618b40119e75536c081d0b4cbec455e19f78fad91a4ad70ea80e757b18a70c670472647b1dc13e3bc72bec82db5a002714f142bf8842ab3b8e7ab9b3eaee67d20eed84c4e9c7409be21c332f6bb6b48659b84f05b3c8efd9dfad3f7034e8d5c56828124e48243f726a0c11bbb0ed328ae6b183898a4cf49f8858cbfc6a29a3093c6a2a273908bfa815c92bc69227a95a89a0e1725fc91c5767b3c1fb19472483323bf15bfad97c71d753a6230db9a7490391ccc73c377b7cb358fcf9d6dd0c48399a7bc6c7ba0d27cb41e3c3b3418f72a52cb1140b6848b960d89cad22e28a7341bf59fb3f227839ab05d17726407577159d7295466111a1a442a231ac9a7a3f1a81e8e006eea234f339fc4fd9a72543acfc72cc50debfb34e683592076f55c192482559840e43b7763c8138515027cb6c8390a06ad9be2882fef3e6aaf3d47fe23c71f5524c3ae5e42c08be990e936a7c0a0a5c78c8ea7202706e8450ce96e273b29368bf14242f8effd93e6e0d1730b3e6fe05fc12e40b29f2acfcd48d8fc3fd46ad05cf4eb8947b87be539b4c4bd500f300c79293c21495972c1325ec8d1065978c49820016fba710e79b8a145f06fac3cfa894f5ef27ad53a23c84c8b65150f84b62329d97fe84d36908a1cc3c584cae8ca6b8cfb46b8fca9252253871e65b7ebdb79ac74bec04b3db8fd687b45a1c48407731b95e046d9c0fc206a75a26e18260e2eda0019066a2eac4591b0386c6a55d806b6114e07334be200d21c692806a14a5913498d544b4268210cc913ff8809a943515cd8dbfc0f1806722566a79e88a9d9b7212029e2edf96efa29f3640e62c16541d72783b32c790e6ad2f9fda4745adb25aa9c6938f58e2fe8d5b71463949087d41256eae0c7ac8e6177d244637ae2d0adb35a3abc71267b8d18cb93ec60660a34a5d5cda4832bd039911814e51da9bf1d9e383ce263a209390e14b4e59172ef28bdd5903671960f077520b85255a480e54658c79aadc37e4d6f97f6e4cb2f52001a1b84cf00c80f8aa829edd3bb6fa8c902972bce6eb0c9942e89dceecaad1dfa6ca04b23d433d2514953f936ce472537b7bede9964a1195e7f50c7d59615ae78fe9ee0061c44bda981d8d6f605a5b384c89e8d072df178a7864d6eb8144e109c99637efbcb581707cd678b7d238e7da41cacf7cf524e580a95818c5f3cd26412b17007ce47340d657d79fb863135ca6ce39253c3c6b92dc250b993d8dab1de6cad4e50bb10833ba611a9593b3e41278da5","title":"837. 新 21 点","link":"https://leetcode-cn.com/problems/new-21-game","question_id":867,"issue_number":47},"45":{"day":45,"pres":["Sliding Window","哈希表"],"tags":["滑动窗口"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。\n\n字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。\n\n说明:\n\n字母异位词指字母相同,但排列不同的字符串。\n不考虑答案输出的顺序。\n示例 1:\n\n输入:\ns: \"cbaebabacd\" p: \"abc\"\n\n输出:\n[0, 6]\n\n解释:\n起始索引等于 0 的子串是 \"cba\", 它是 \"abc\" 的字母异位词。\n起始索引等于 6 的子串是 \"bac\", 它是 \"abc\" 的字母异位词。\n 示例 2:\n\n输入:\ns: \"abab\" p: \"ab\"\n\n输出:\n[0, 1, 2]\n\n解释:\n起始索引等于 0 的子串是 \"ab\", 它是 \"ab\" 的字母异位词。\n起始索引等于 1 的子串是 \"ba\", 它是 \"ab\" 的字母异位词。\n起始索引等于 2 的子串是 \"ab\", 它是 \"ab\" 的字母异位词。\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f27971c3385f366503c4877594b1b57b4a2267bdcfe01350a815bef1340d776d0890878afcb3339f117a67f0772fd1954006d8fc0d1e0536c8da98c98497c38e078cb97af429d3bb46adef5acae815c2fdc4667bc952a64300b73e7d0c6bc79c445242807face33e6ff9867fb13ae711ca8c7feca89337ee72493219b1dd429675e07fcf18df6ccfc397accb4f323557428206bc3d32f5f602da6b91a724e4ee4f993101e703b9b58976c35ac0a770097179a72038366a2c65264e6577937817e90471b648ee64077e8941c521d82dce1c65cffe4309d9e6e0787e9f1ce93346635f1efa57302476fb2684c2943ddd603c69fe9c558cf2345d10de7575b54dfd8932df0279c45a7ffc63e8d8a41b6503ccd8f6191e4e21dc14e5944ea48209b95700cedb65599c36aa3917de123be780382fe4b2c3923b9c602fba08543e5acc5b656262b13d6d36eedd47d04f8724a6a952889dd17c933174c6a3f6e0a7ab900697ddd434a6d18d656f628a4832879ac3caae7f61c631816dc2f57fb0a0ab13f0dc1740d953d69c305d84e58667afcb4241e487de52ca48c335ac6ed84c13c608dcfc131eb64213f65bb7775a1aebb10b4d0ef06846f40acfa9d263f5b7766ca20c487445446f469c495480e2da075bd2f389e0d4943f4aa8d28004160a5cfe68272e6d168c1f649945d9a8c669a99774f3f48c735dd5df9609eeaf496441ec38ae59d6658b2082f8b9bb2bdfbf127e1d1b8ce9fdca559e6e4ccb4cde435582f670556e422cbe4027f0a09ab5937277d2fbb94cac8c8596c306f2dd2442b6e9d1cc11f45a85096fd3d2bb0801e0ec871e8c4c9c0ca14222fef1ec0b74c06a88bffa4a1e7bc84057c8011456317d0909897351977b1b119ca186cdc50ffc4de5203c05a04ef41f505a8a44ebaba956481181dbe7a6a6bffa099a90b1a523c97221bcc6afdabf9b670d924c8ac4087d50e902c2f308536f2ea273be760e6a080112d52b494591891f87630f2f87886b229d2671a021880f65752184a4c8144ef81a52ec61ae2523dceb203db61b20dc3fb7ba1a5519c250a86452cd946fdfa0002526ed042aaae680f1b26f9d640eef328969904149312f8591ec8108e55fd975371264a17198eb7f40f9c0617322d6127655a11be81e8787d0afff5ec98609c4f295152e49431ad1934a0017b83252e09614f2681fb1a9a35c05c096891505929f3356dfd941f97708d33eb2e20e57aa9b420fe371249ef5cb3f291357a47c7ea93fb1d532ea5eff575694fb18ee8ac3ed9bf7b07b95bca90b73f5ee15d084748c41d3ea2d744547bf609bdb4a057d31f0eb628d0e4187b7ab1a7c7c9b8cc8a87efed8fa6bee7d5827a339f8c5eddfae083de72e5207a1b19fef1786cfb440ed6670a75a9c38c2011ca6cc7e11106aa387c7f9bb06a25f642b16f86416ae875297f6f5db265bdc8048e39e7c269500cc6055f8a152d847ca894facc7e5a794aa182ee9fe4d25ad6608cefaaa0aacf4999425dda1542881fd605a59f8003f85a423a2ff220255be46224e5c3e9133fe0e4a248b0f37f4f5d67f3f404d24933c02acefb665d46833b485c2eafd2c544ecaaddeedd82615dbad635d3b8cbd0e29b08df1f7f8ecff6b37a18b01f4688015f560f170e3ed6d4100ecce934784a19fdb641a8d3671d1f377289a33daf0ac3371cfab775d5107b177fc21bab4892b83ac193fc12ce1533abaf5b9b39969bd1922d53957b72b2a9d4c2b98d5d66b01ccb2cc9667a688cd68813f7f231bc1bbc87cc6c5ea6894b6b6678b46d4823aba869af92a5f1904651163cf68c967d3b33772906f2562804a7338b9a6f24838fe32fbdc1a88cc5d9aa2c6021a4a58f629c6baa153535bffea1becde7a35bacf8df66d50eb476ed3fae3d78de828f9d988a6e4fc77db4bab379b7eebb4a91f251479016b4670ac16731ee611228bb6d54cf58439ac5fec3dd36bf098f5ddf3fc9dd3236dbb6a691e84d15a0895ff9108872c1307a826634ea6732ba5befffb317b2ccc7ea4f200b9d69a5fc7693ebc03e52eb74551320f440b6b43657f83fcb4fc861071ae43640dba0f5e0abc55a4720f0c685aaeb786b032bc9ed5e6e9b68e2f3f0fc18520232c73b5ac2a4a531ba1e3dbe9cff322d24872bcdc73bf8a370e32a54855da8895b6acfc00bda6e4e885f94c7dcc289234b4aa82cb7288a986a2a40a5506405b3f8d8e9896dbd0cd09a873cd964d1269147fddbf2848aab894d346fb1c25d0d6bdd4e0b74eade72f4d020adefbdfd648e4ee9a4204924ccfcf243a1c1795964c888e88cfac83c3fdb1119a0fa1e1fd99249800ffeada8ee919067eb0c03a8232d3119e96cd91da9aa8d47b43e9b6b9136e5a45cc893cb23392eeb63b27e741f46e232e82e72d4dec1249016a7dbb29e31ffbe574debae3e103074956eb90a379793a3fbfe28bf520bdead02a6e64b729174219ef29bc4687e2cc221fba3007805e4c6a81412c1ecbd33c038f43f06442ca1900c9809f4cf3d64c5c37d9e54686bcdf6df00a8e6748fdaaaf83aee0b2443eacdcd152c3990b4faf3b8300fd990367db3404154ed04ee0aeb334da1587f842c83e7017e611f608e5d6a6f29a0bc1e3960e069225afd7f38b385778a028ba3080f928db447e2fd649d6ebeb6d4bcb8e1e0933da986d1b63639f70e1f03614bf114e5d02f332c6a9492381e774172a9339ba9877eb300c778d2df5b2d23ba031ae586e2242a04fa7c7de1e5fe3510b9a5cb52fbd21bdc8fc1dfb0d3ac38637bee25a9beac4a4857d9dbcdc5e1dd994f86293cfbb63b4c382dbf515d611414114013004fb287bc5b772b59637929d574a777d9dc0e8beca8fe2603021627b33769fe39f34cd502e801843bb097e7cc9196efbb7670e84c98361dd21d72b892acab64b449619e55e5cfb067bb1096a9482a0a5890aa9c7626eff414c2501c6d3134401eabbccec1ebe9046f5b5f61c2e52afa1ad1e9725372678ceb1d177917264d5439434ae408ea57d1378c072a8adec5031a02511b7300bf4074e0b891a70672d943fec6c537bf6f79b72d43ce6a719254afef7a0665a44359290eaf86d80cea3aa94020d848e851de237dd22e65fc052f5741307813392202e13b76ca3e0d6c4433cb4bcf457d0cac766319999d66870d748729f4c01bb4d775450b6cf13e8d687fe547fc6c773a398f687eab1d0d5f9bcc2b229422cc2f40dac48f176808ede592ad89b246a77176d488b59f9f2e854269edc1b077a2fb5b52c5355d1c83d805df59116e8e5b1a81e18e8faa608b1ffb0773f6d85283261a156bf91a5744d0dc08375da3a49c544b45375d3462995cfb9d06d39b544e15ab5428c93ffeaac0077f2c49770dd99477ddb233e577184526cdec565d21716651930516bbecba82106aee9e4d68a67c8dd6fb7c40280b20ccc33faa9a2b27c50e47e68459c449d0fbbda00c46f2e199dd06ef2401c82342417c1992e849a431c1c84563d992d197dca9c40abcc8e1dbed96f1ffadb42cbd02529bbed6101609bed1ca7fc298d2a7235eca814472e65d51f225c70f3d983ef469b0633ba2aab2ebbed41a4eb22ce581e94b72c732d57e689c13fbd4391f11190f7d22225c8f6262290e371c057b496d15ce3e66f47fbdc8ae3bdf9edcf91f32f832f5c866aaf890aa9b34cfa7e526433e6f87cbfe1d269528e90972d4aef076e3c5d333d348f43b34980401d9a44a7125ba7c579b015001d498386eee2e693647877ee86268de7d060aec0142cacfecd0f6affb81ae40881cfe05523367dc72ea3283735a21330ad383f33f44caa4497a2137b30cc95d5ee02c3c17a1a00ae0fd9b91f8d7ded4e727f5054a5cb07f4ae48a761a96f58cea94b2e0fe44d2295349983c5db595ddf5f38ca5ff94755a5f3ab81d2e613e64c8fe7e1cabd71117bd77c32039cf1dd561efe319a0bc301ef6b55019a4f220ea6c829155ddd7635d22365db6c3921f894824120bd2e234e71cb82c378a62f5fcb78f7e60a77a77e83206d5c9d726b7902073f8569796ecec66ebd28cc5f83a02af81aee153f2678a1eb57c5efdffbda6cb3c3fd7a61ebe61897846142f007a718afb8185f791b8c8832978f46c42d1cb57c4092877848d6bc1ae6c658f4595ad6cb65415df96f9f7edfe811e2e77249e7174af08c618b36c2ee37d55a3bd455e2190a2dfcefe94dda26321070f2fbf33794398036945441160a7a89cc9bc1ebb7b9de108bf7c59dc7c4fae80d8a8339c30ae8e714f1c1b49e56309afc3edf7aa55c5c31d11ff602126e3abed37c621a43b8113f14bb9a0744a8a7b398dc5e209af2995ea216b1a600b52c4aa6689b8efdbe1f59986ee1068019858c77ee5d3b40bd76310b1a39f7d79967f164be512243f21473f66422911fab9c2e3960b2fabc62afd5372dee14f8882306bbca9d8808599f01473361903f4c59eab435163e7edcce832b9080912801c8ad22dc2266fef80e0eb5f9b4d0231f8555561a0eb99e8f9a743a338c8798558d141d415d2a4d2bbf2e7ba697f5cb34b6d3a03f43e2e538de985b40a15db09f1fab2972163b1e4ae8a8f265a4af0486e1fb836d80e6566d59ce9e2c93770da8240e5fd00804af69b056a8f8c97f26bcde354c1b35185f26f288dd65e23935ee9a465fe17a7d79fe8f93112266897a63ec6ff1a328981069d28ca001f112b77ebcea63278c3e898542792528aedbfdf3b8bd57cd12f874ffb7a83ed758c6120c8a632e0d02d24b76dfc5508fa7febcc5442d0f3c83bacf88e49849716271c3919e4230edf34fa41f20ca58f2985f7dbd89b3c8cdc9096af542d74e1cf6e3c12ae9361857bade7ae98ced7031599bdd71911b1e9f8d3d93a4ea23886e02eb5d6d8c686d42eb8be709f365888ea30115a291545047f48823b2e7937fab14e3be1465f886ef797ee9985645ae99d45d5a556320dcedbdf757453ca533980cf2261d7723f2a59297e457a0779949e01f3903b13cd0d26859d96cbdbe622c1d127573c62c6331f4bb977c1e781af28de128e184e8872b1f76dcccbbd1587a99e4b335a21d6b3fcab92dd8083a54af79945b0469aaad3b32d03045cc1a1e1d8831d80858f2e7a25fa9f30dcee660bb268324a4d72597d572d1e85e8c0189e58c4205ad83ccec57a82dad78efa9a015db1888e9545152dc4a7ba9a7226deca2365d55943528cc14da769b8146ad88b9308d857416d9147a8ae4cdf2a9ab77673e3baea8db5dcbd1064138c0b82cec9965e4f09a2b05c38df28eab8bef0d9cddafc9482464d6f3c558521c89800857e1082d71c5b02aa5999a4e6ece05c82929b656e538905ab6e35f70a52f8fdec24ddbef27bdd6138f5ebab0a8cd51c5993d459aad1231c16faa5923b20777f775addeb3549d71657b0402ce7b7b629a565961d941547ccf5c0063cac98569ba6b222a43f5c1060f470e6d99ee201e8041a7dfb651244a0753e7666edee3d94704f10f1ffb7d586f2a1630d38380ac26882b0606c395eb07347493cc2bc2bc13cc897520c0ac1f540abd1a646bf79814024680b3001db802d9aedc1f0b9164a0908a3b55f68a228109acb79f0b08a7e40816e3bc5eff6c19506d2c033dcdc223db5d5418457be7c9f519b818f2369184d464d168971aae9201ca7464e08bc5526373dc61eb6cab5cab1af3a8cfa1d8978e39a1c7335bd81bfd32d50196714ba11a8c5c144494a5a241200f783213ec6dd47a091aa430a5bdd520a7fe6bc34dfb09c1c1303bd38d654d008fdae1d229eb9a7cb04608edd8af5810017b691ba9a3ccd27125eaaf45fcd95f8d74cd6173c49ff864055732a1f95f0c8dc66f371ced36e923c71147083b2bb92281839205c7f3c4ddefe3a921173915e12c6261e6999445b355caa551c9eb0f4dd6645033f0e24502b1c47e38076aac1f7325b0882e82c810247002fdadca5b8c84ec84a8ba0c21ccc3e5507d5043b4c28fc01ca1597075dcb7b6add048cd2463d7657c1ce28d13e8d386ffd362dab2c820cdfa91094725d1625393c26574cf559a638e95ac26e2a7928da6b769f4a01974ffddaa4392b48d986dc8b8fa217d10995d4b70cd53dd7a16bf5e7f38468584e4c02c762d07518c076c48e54698a3dcf5c4c3f9dbed6ad1588c5f16bb8e73690211b9a17d2d039b9161f4f0a6cf09fc96540cdbf572da165cf013a3ae2df784908e3d9c23c747454b1501b3ffaf906e3e385c9cd789d930356842c9b019f3be22db076be906404ba3d506920504c21973276fcd6b26596036df9d6644bbc59caafe21db4830fad09407011c1827dbef1df88c587abc364abc7f03c126e6b16be0dda9733875dc7ebb9d015b7b3b1b543c35636fe1735204751829690a39fa63851b66170ef38905199e4d88a06d6ccd0b55843083f632470675051fa4565b1b87c8334981657a2e2f6739017da4b9f8aa3132a97d6af88fa1d67cf38c7e2c8a5ac3d6adfc3ca242354b76aeef281f965dc305e1cfcdae5bf0bb539bd688e4a1258bf50ccadf62871e952f16bf3517e84a7c76d2e456886ef4259c1efc7a01dfc97bcd754c1bcc55e9124b1b215c188d4fe82a190613ef9441232fab2be3c098ce8b461aa756b6011c588759c409ebe3537a547f2e690f400f24424638dc383e97e9e402cb23c3060fd8ac483c1e876442b4b92c6c3796654fd33f8cf298ccc9059d48a489a6edf7f90172cee629d21daaa7cef54a6df68fa4cd948a38bbcb1e9bb4fca6421c0f1e025119351ace23ce0c012a651d4b0515e5cc728eb63118d9cfa6c9d8b6988e925849fddc7b4fa3a9c118e3dba1221ce000ea2b36f7c44b099c2d6afa476a2d0f3b1ed4cd6d93439566fb6bc7ccfe1b855b7b6e7b7f648321bd3cbfabe12aa79897316355b3e4640333e101140b2a98c0f52e19602519567eefc2ecadd1f8aba9eb03a88f31109982d59aa9bae2f6dd9610e9e5235c3125dae2b33a71532cf8c86a1a0fd4e5a1edfdca597e8f524ef8ae75fbaa90dbb5a472617e49e5faaff72fa8778a3ad1536440507b9ee048f88a2aecf70ebcc132cee91021a9c1f05be688d2fb0cc36096cf6c1a4206ff5b4e0879aac1e46f646619f8134e4de1ff748a0df06bb65d323ae585474cab5da4eed8ed8d58ef3d34deeeca2a27390cfb5d41edef9696663a8d5d6565963ed879775713d54fdcc142623329504c2a197c76a266f2f30c69a659c394ec86e9064f68b7ee081d96599c48e99ebbd7208e0a67ca21e3c293418f72a52cb1140b690819058d3cd9c3b66bd1e46b5ce82d8aa1e0669c4c6accb8398a3d512e2d8a19baddfeba9e68a686f20542ae6458d8b4afad7ce0b002b52e2ef855541ea76a02f66882523fbe8cf68d2fbb24e871b9b64f1baff05866bcccbc23407e1f6b979403f30e566eb8d69d1be69be4cc7c5c6545fa0fa74222e0172f11b6b660d77451516aedab42f90a02dccd3ffae834241d08a110d6c425c2852db88e0b46cf279ed976dae2a0752f1115b9312c23cb05b5b4dd903bf7d99221963052d275863232129639edb69f4bf6e4b96d7328e1d9a8ac449a4c98b6c2d87698315c9b0c3cfae007abc3622db4fd23c190f90b13966f12df63633808613d3e2d7a3bcd0418cbf09a9fba3605d628b073ef2f3e53cba39bbc8133d85f872180bf5c4ef0b735288f10ae8c7b87b5d75e121546a4b6d8e001048314bcf17d9fe7c20380f9478e34300072245f25db74e696b4ee018595a51c84405273a3d488646bdc44cb743155f95fcba0a513f386c09eadbc6fdd1f469613da495d366b367e3210162a3216f805883f54f3e4b569df7a8e1711ccb38e9bf2861fce305e5d5a60f63dd9bc59b1205ebfcfaebb71a299a143f17f9e7b0b34a209671267bc948b0f8ec6d661b0de084cde6c877963dd52e1ee35495c23ab4533ce927f64339304ecbafdc55a05bb586d57a379f152d336fea525dedcee3034592d5e3a8300f3b85bea1ce69425930219fcf498147c5a829f8eba057e5914c8773e662fc84983fb794a298ac438017e94b28d444d2090c0ec238873c222f8da5a39269ad6446555fc7a28d3fae78addbac40123baba999f2cdfe7abba6ad97ebd5656ca3718df16733a37a4b16dcfa0737a34b91ff8f24cd1da2e90dd902995a0697517e580795473bc9f565a392799bcf379eb2dfa2e0984189433db04d949b57e9cbb9ea188f3c6242607136e66fa5d35ecc09f5531d851911673f04a3a5aff4b7a8e1d808924e221f45df2e004a8c057d082d9c96d85e675f95932407403723b47dbd439d3c33b1d1a12e83d4fa67814445ed7055cb42aabf33f6853f8827d212f39ddacc34da9333b63951e8f344030fc01a9f951d188acd85e7008f3e71e2e6da6154ba7c03d34ad2dc08d7067b503e406163d1acd88dc2a5bf15231a20d25f00432df958bc56967ea4ce06944aa161de78faf5a3288e824f38bef8acb32e2a20e1e3365e2084ee762363a7e398ef3d8787739dd1334f9693a6c3d6aaf92c71bf73cd68dc265eeb2704564c1c33a8c3204fcbad8aa2c06ff311004b28447241f9781b2f6d614f603f49f03734ce4fdd9a6698f57992ece4543d14e9ca433932f3362efda941d7c291b1904ea729117cb06ec67757515588f4d49bd0596e1b38d3dca7040e3e57ffda6a3c867f3f9560233fb3b29c9d9a9633abbe3aefe0213ad5679bdf3293e8720a972337b495b9e564f288c3c61add732d22215010e03511ceb72b53be034b5770af0e035e0515df5a68cd11498a984eca8c17ec955280d13f73a830bbb1e36ba24de07d28b1fe75ac0fa9e59e7b2e0f5f1392c1629e6098db54278c2df76960efc7de97e12e30c35ad19a75131b61105407ce554ae45afebfda2bacc67fd8a79f910658a05841e002d48ba5423beb6f8826d9ca49e62269d0810fcb8120e8172c0b5696bf2056bcbbe87a369a0d2b8d9099177b03272f145e05cda356e254808577281cc999c3d59442fea63fe8ae7aa3f8d9500c14ce8a40c4753b6f980c3e874b0443e74b94c13ec1024252708348a97a64edaded12c21ebf84ac6e83181e834e0556f7a7f3232e2c3dfc282ed249e8c54d62ee77be609f5c68d4d8c0d6f99db6e7db0570abe06131d94bb424679c30eb8ec59db0c130d43dff091a68cddf9197365007ac75b1661b362d05ae2b4d23ddfbfa11b8e778f5bfe5b3ecfcfc5eceb755150e2d00064c4b5f231b4baac201a15a882efb3e87f86481","title":"438. 找到字符串中所有字母异位词","link":"https://leetcode-cn.com/problems/find-all-anagrams-in-a-string/","question_id":438,"issue_number":48},"46":{"day":46,"pres":["Sliding Window","哈希表"],"tags":["滑动窗口"],"whys":null,"difficulty":"- 困难","description":"```\n给你一个字符串 S、一个字符串 T 。请你设计一种算法,可以在 O(n) 的时间复杂度内,从字符串 S 里面找出:包含 T 所有字符的最小子串。\n\n\n\n示例:\n\n输入:S = \"ADOBECODEBANC\", T = \"ABC\"\n输出:\"BANC\"\n\n\n提示:\n\n如果 S 中不存这样的子串,则返回空字符串 \"\"。\n如果 S 中存在这样的子串,我们保证它是唯一的答案。\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d84cd871bf055483c4f5f59422b54a2822750c8f505140a957eee1342d547cc891c64affd193ae60dab5f297adb147e626489d0817acbdb474d5918878a77ec7c9490e18962fc3cd60464434ee733618c49e7757ca9e4ef6d15e7914e668f53aee1bc8004459124d8e130aa5a298c8d47777be3a3fbdba756a341e63358c4d0cc2d1f623b31b3ec4101f8e7883bd2a4a581aea0f748205444f58e791f7d3fabc3e67b052dae1db564a0a563d8a992189e7e8d924e852e1ce6ee09eaf3fa74b45aa19ca9476682bd2142e4d9fe474e267cce1929b3686da6d16563351507c181b6416362e8a24b63b0684d0342c2df03de8c0775be4cc3cd1650f03f007b9a878c6ca022ff0faa9c8c04e9d55f3ee762cbeb089d81a3188c3f5c34976060e994249f2c7306a8a71aa3cf1ed166f25b54eddd0f6c0c46d8ec669b83f701dbdaaa88d0c9879f128e6b8faf789abd500963537482bc7bf662544c3b55698d9607a1ac2ee11829525160d03fb3cede2809e61906096d8d63a294ad4f40bc7127d85e0c94f9bd1ae1932c6ee6322d63c04c2c427370319c08d6c6081b8ef3d17bcba6f4dda865dc0168172bea5808c6850bff134def0e986f469535515389dd7951e720c9928b9bfc43f15453e3cf8f73be1ef4d8fa382be5206d4aa9b7f3ef150a7841d4187e8a86c53deb5ec5ce4ae40387e1cd870d8043b28471e6b2c9c81139bc2d7f9c7868b30c37437d25bce4d724edfeb8df92d79a420a4e9efec0877c535b3b0f018434a28d0f03721dda0c235c1c1fe9fad6b9b9722f7940795debe631917b724c079222edcc8a9f3cc2421b9ffc0301b0faae8bcbe9a833a3c45d5ce0a1bdf590b5e4b06e1ca7701670744f3f400984cc3ab2d58b6f1557c752dfcad6741d2dfd75a4779b49a5c3f8583e48e36394b378136403b58ad1e11958212bf4b89d0ef622232d54ff39d10d73be0d09ec02b68ef7fa219fa20850a367aa1238d18ef058f07c7dced7ffd283c624ce88439b40575529fd9e513964560ac56eacdea55ca11658500bf8b334dda53bb72c553af8ac30f022a86badb81ff8177cdbfcd7be09c77576afbec9f36578c4051dee2413090ea910e567cd40e85ac17749a1cfca11255fe89b9b89140a1f082069216d523fbf86f77a742af3f0fb5ce8164f286151c7a13dba1f37b42bbe31ed6c3c63849ce0b310fc4bf3f5cea464d4d7affb1365febd07975f9d33d21a21f669a78302f90f10a5a75ee38db251217f8c8d8c8a427343f9d59df5e888cc9089d53bacc86950ce618a0c0a5735af5fccd8348c3279dde2e091b0038f1037ae58e81f19872bc6df197f75b081f0c4b9db8dbfd7c7fb61fdc7b5d564ac480cf238aed2f59569a983f58f89493696ad7f828b13a7bfb3130dcee09265d0571e91ef77761e044c06ce1ef7426b8d15ad2eee3e7e6b00e0026a92fb07b11de6ea4b5000dc075f93152fb8b32438f9ef655a646ba3a2f390e9c29f4ea708510665ffee2de55e1757a7c7528f195eb3fefe0e8911495142df467a4a812c0a8f9bdd77bfacb5ad2df3c032db92eb218e5ff3246cd94c4f62a3074fe257682b66b185b354ab2c7e6a0d22aae7db9d1ba5c4dc42296fd518853efbf79ff76c79fa1a13d2180f0c1d524629b1bb2e88c1d41a755209f2a36fabf4461c240e75b3af1797c3b6257db0a3018922206c458aa10dc64c16f069e7b62a8468200b689d72fe3efaad885816ac2f3986c58cf8f0d6590ef73f9a4bd1e8fcb37d3b28a7326755d23ed0ddf80f27a3d90152ef9621c4fde26723bc4d10190e1ca0b39fd56c450f134d321f7e369612068345a41c5e3124f7e6d967194b7321b5ac834d162ee1fdb827e17fce701246176c29790e697d97284219ea04ef34d09154a75323f4edf5ad3453d50ab34de8ecb413ccd7f71483b4084220f921e8ce9c686a816ba1c5c87c17a37920c0fb642e6cc132df60dd1456afc84c6de7d9dabf5b98a7046816d642e75a945f4014f3948f3b20fd34eeb625975d77482f88a604b954a7c46d93d0fb3c52c09ae197bf33a43d4b9255f90eca67f2682f20e63a58d582cde19fd65d54271573004652bee7e1ca430a103d8706b9ec958d2cf2d7806ad6eb61abb908b42e0cbda9e8322c0a8c28f62bb07a89f60af4bb070bc3ac1937d5a05dc50832bd3bdbfcbfaeac571772fc688771c287294b45fe286c452f12d8ce84a9e51687ca83609366bbb5f932c9bfa5ace1de87246065c19a7e7413cc1b565aadbf5082b02de793aa50f3629a646f838dec61fcce67adcf565563fd8adf9ff4c5203ed92c1f89c91e2ad57dec13c761cbc2f0e1dd67468bff6329010d19de50db2e8aabbf6fb41c8669ba2ae7a04cca8cea223f18e879a19be8b3837d4d943d19abf94fb842ea2e0874940bd6bd7c67e8863b1102549863b00b01899294fcfe15b6581ac5ae1680e77450927c285b1753579fbeeaa8099839dbbd5ec4a7c50f6c87fafe60d451a70f6fa6eb314be45f4ac3ac685dbabd49cd26563eb9f48c5ea48f3a9bb5d8c34591354e19e3aea531a7d5cba385938e5f71e5f64858e1147c10a43a8472ef79148a301091a30b14f9fb919762b07066401da3a8123575ca6b275dff401fb3834d802fa5a93c099e80bd45c0c16b9c70b287c4be9ae9edb726a4aad2b41c0cf61c060a5d50139e4414721848159de14830d3c9a867b64818887a85ec7fe8d2e0712622a6efa1714d54717324ab145285bde45e5faf1a4aba2452c93b84c0c6b2e59a3a7b5728cd26bfa445445fdcdaead8e0d4844f86293cfbb63a573e2e8e71bfd543631115551b3ec2b2fb1f738b8df31370c715e168bea22ce6bf98815a0f404b0ddd4952a14bf0008939ac7e8568f9978791a23b79140102eb00c4234ebe2d3af7b8dac14ed6105ac432d2a902823fcb4c24ce4c5463251b110959e9babd3296645c66716860e3a28b94f0a0697b262053aabb2f8d68c7a22b753833b8a95f001f701c330f210c0bfe57956e916889656e99b7802b644a4f5215230386c3627d33280452c842fcdec570f92bfc7be249f773739b67adfc730757af4d7b0906898ad91ce13a914e2dd65be863e8e7906d2d50c40710794d13721f202708d52b7ad5200e785f31e65ecf5b630fbf7f691d99935196e2c2e14ec7a84684bb1e546ddd70f6c2652a864a8d12606c7dba182aa278576ff6b23944ef2a85706ba59cadaf878a74e5a0a48bbf5aa77243d7aa9b9c931987674d0160177a88fe5b52d136441883c223d04d1963aa751ab4e58e9eae639a20f73b7d196b02e83b5574749d4665064f1e88e08e6bc6a7292a445e253921c473acd030a3c04a0279a6286bf55ea3ad9d5559460c5b7582a2db300b9422ef5618109a46fa77ce1a771ad22472e0ebf0ed110cabb532ad64ed409fa2608b90fdab2012dd254cc6b429b7d1196cd207bd15276a37d28e734d735dfa30a9d727aa95eec9da5b64ad63f43a54828b3e062665521236c60c3b0f6960535f640355de8b4b19d9ec53c8c18b6c7ce03c48571427e6ad123586f51afc836ed1e8196bb1b03b8dbe521b71281692fcaa7801fc3fcfe2cd5e24c867fb3131d9886922567b160d073f6a6f378f32376b423810571708770f865761a027fa9de72596d889b71506fb68b2d32ceca2b2d9cf6686e9a226107f2ea491fc013cda7cb7433aced6bb22eb8cda539a56e17753911510f1b37c2a63a96c48cf140441d2877950c6342a3a0ae737ab3f74cd751e18dd2b68cacfa596bfe9fc81ff18c652b649777d6fc535ff6090033b171930feefda064899e7446b2c38e759c14452fc7e294a81a002f3a9ce99e1d2f486a274874c0d14e42d12b0cf3f7ebca7c9b98fd184aa449e6c5c53cc5a20a5da95a7a7cba3eec368130175e925381c254e9fb63750e1d8dede4bf805f569178514aa2e11906b6ebc8e757ae5d2a4d820ea6cc4de07dddf635d22365db68b8802d9157e1e20dbf107d246b82429ca3ff5cd9da57e60a77a77e8714ee7ccd723fad6317ac612d2d987a528b8b9c69336d3e06102197fd65ba1239773d4eead3b25340c86d25047812dba43525b146241633199be86d9f58be5c8952979e346079f8f57d909387b84df2e92b32a788743daad29e40e418797daecc7fe811e2e316bcc717cb4088356f72173b76e13e4f3103375d8aad6d5fed193e6682a0e4235c53d2916cc0b2a0d48527ea7b69586d353eb7b80e15bb13f4cb7042efa889de677952bd3c63803591b41a8221ea4f0b9affa058b9b501fbe3c7601eeb0c737c621a43b8113f102b6e67c0190492a80dcb204a265d7ed7216117e0752c8a300ccf6e6dbbadfb386ee106801ca1d942ae8deaf21d76310fdbbfb5764962d5f45eb462c6064582e200b341aeaa1f3c9960b2fabc62afd01378def0eccc6387be7f7a1ecc0dfa41b61f3c9e677162e45dbf1a56a680870927f858cd730ad4f7dec40f286636d2078d53188fffb7cbda3508aeb99e8aeef0aef7dc871c016c86be21581aa9efebca0ee217755ba087e5151f47d2e4e8dba8bf84d911eee6d6c6715dd937e541b4f28bc9cf7758cf6bf7cae5282baf01b6a3c7471e4f83e40c70c1279eb0faf934663868c8f90009fe30084fe0185ef6f7b83951662c13ff4e262aa00b4cf96eed37c537666d0e36acef555328cc25ffd568f4d4f112677ec8fa14f78ddf598442ef1148ae5e99e778bc97cc126ad1dbe29d7e67e974b20c8a632e0d02d24f425870100f67ba88959488adeb530a7e3a449849716271c3919b7774fc021a144b973f1876a89f78d99d73a98333f0567cab4b35b6ba8978d6651f069c6282336380a4f89d0002b11eec0310b631f6886880299ace02eb5d685ecacd47afdf3209f2b5889ad34114f707f0a263a06c63268791dfab14e3bb3030b9e74c2c3e7919b644af49a6d9c8c1e7853b6d5b2140c2cbc3255bcec22769438467e06647d4b24523c86cd2ebac0611b8f415fe9d8d09fd7e6708482551e7b78d7604046a565f0cddc85689e52a43268b646ba9f39a28ea73fade9de0b70057efc371a7c072e21355aae645eb93a980b34745bbde9d8d219080d663fd43b701ecc9b41bd9f7d95a01142fc653b1d4d73487c4a634498bbdc11e70c9669149f3c9acc7ad9f0fddcbfc90f1cf5cc869054172bdffcbdf93c72c0ca2a1dba1a0c00c89b1ae62ae64a6391e4c013f20a6b2dd107d4c16cfb15c8c87079f2bec0f4a7d9be1c6607ae5adb9996d557276cc4e508719066eae394e6c3dd9efc99cc6c046f2145c864c2d04f836c0a85d947534df81794cea3a48d0ec3dfc86d3d07db17cf2935a40652aba9be6d93f9f27f86242090b9ef71d8ae5524ee8917f2af6c4e0ab3ebc6252078100e56dda3741a9f1e45ef0278f7f2ff6fb924d845f57a1583fdd21030bc9104fff2b270ed78144460a026f5a090ae44a6434e35f3255c0ca0667f6f6df7a974cc636c19f1adf281d3a0ef300b2f225faf42d0f53477135eb07301066ecaf52cdb6881c50a587394b14cf3cdbb16d85bb0710e5d3b2322c0806491e6c8ab9341024044e6bd0d21e5604486d036f0b1ab6b33c11a11c8eff180927bd9cb73dcdc223db5d5418457be7c9f519a8e886b5b05724a68169971fed37528ed03015fbc4e0c373dc61eb6979fcab1af3a8ca94fcc72eac010492fbbc5e7965013532f76c054fa8ac8441b0f092a4255ed8d5628d5db4fe7d3e723693f99175202f8bc24dff0d54e4818b62f994f946eb4b0572b838afc82183ac285c5eec5675eabdbb3870f83595a56a3ef5f849ef3de17fc176763ff864055732a1f95f0809d35bb0a9da864a06932407cc9aeec9f250313205c7f3c4ddefe3acf3b59911653956e653ae20d5b385cf5545088b6fac7654d5d0b406d1f7b77409e8b7db1ebf7325b0882e87bc94b0b4527d0d5f8bedd1d9d5796e9cc07c4375875995f5e4528ae44991bc7520e830428c76dc7da0f3d7b5791c0649470ca6c27f53f64e6249b578dc458c07f1153636d376a747aa71cf251a71e873671167c8f39389f1844c454d7daa4392b15f380eda1cfe257fb23e58de3449a73d769ec76216031adaf9cdcf63ae33497de4ec3514fbee7629406c4a0bd79731924a367755da4244bf002a0dd26be164da67ea2974f5829f18e9da0f27525fed13bbb309dc89e6822b1dabf774d29edd895a633b2b6e16351c37b4f4d4845bf2737cae31be9018701b140e815e07a08e9047f8ef8acb8fc84a056bb98589abc669b6ae5051cf9c6169e155261c45e8133e1472f70d7790dba34461a2746420d66a1267064e2d1e883de3dd80614f952f23c3f3f28ca72211359c35493ab4d1763610b04c796543b05a661177885b465e773c5752e5054cc45220538a49f7568722ffab8b3cb2187ef7469ed77c919e0a71a7370bb119f1fc5064304bcee0f4caf983581902db75324700b6a95db1b5846e28aca72c27e361b5fe20bc5d4d07b126237cf289475e72389b2fa957abcf4a2603efa6bf108bc153b9e8ded2d6e0538dfc50115ccf9d2f465b8c0c3831d8ef2df749124b1b2518493feb8cbefd40070b8034073b7e1e4260b88fab36ae2456b3345978475cc5ac3c74b65ac47fff8909849f3550b7f91d9fea111ca5b06b23c3060a0f4d8caaced62041c61a1d0db7d6c59a919f8c53f9885f54cda9e5d914ccc3afb447fee11d26d8ffe74ee49bce8688131f30ce6cdbcfca0f538c565378fefe83f1adf45e1ac28bfc80db74dd0e30c4d46be7cb96a118082fa3fc9d973a2a06384d6ddd9a9fa3ad55fc522e6465f8b5202a2dd637c07e499dfd6bfa876c1cbe7adfe4cd0aa6e4e1f23fef238d9a6bc05dd84cff9a9106002adc2d0be12aa7989731635103e5b402314595740e6e8de4817e7a80526dc26adaf6292935e94f5efcd3897c41119820759aa9bae69228b615c9e1b7bc3401ce06c76af7b7f90ea86f5e1af091f4aa48fdedee8bb6bf681fd12b8db23bd223a5b17ef835fbbd572fa8778f7ec477101517ceadc0bf2a6d9f1af70b3a81378eed04c5e9c5c4aeb26d923a4b731336cccf9f046218ebec981c9ca513b9b46619f8134e4de1ff748a0df06bb65d323ae571133d7e18a36aacb8caedd889a3093c6a2a224d886f9911e95f9747b2aa290d41b543fb0dcef3234695dfdd109263328bf04c2a197c723606f7d30cb9a299c324e9820df6ae59e7abfe59d6dd0c48399a7f83c00b0af7ca91e2d201e18f76b1c98115db691bf8817d3888d0702ee3406f58ea8f26e8386ad5d7969640c0e7d04d76f7e2b585412162a2e1a85a7a8f1fd42f51b56be376544cc91b09a7d544dd4ed2cc50debfb34a5cc0c6e22b0472477f150e521e45d6363ae6ad0580277abc87d5a7de4e6f9886aa36d66e96f51d66fb1021c2e9381177e95e5e9d3a663e994e5f7bcdff5eb141c06fd110ca73a2b684c67f69c46539596a8dee6edcc734f6e14a95fcc2e37cf8400cfcd4893fc32c96a9c5cf4eb8947b87be539e681e9055d7e0c2b206f317e5963eb3203e28c2c7338848a4f7f59984f0e5bb9b62aaa05c65690c306cb26fd50cbc05e850dd3f2e5175cda6c9d55996a66037fc643310a256c67ad311dcc77382afc9819ad4119a6879a5fe0783812b353d635f0a80b86c42b93e19b6e2b83344f33e7ec1ea2aa80bc0e5ada8dc794abf0339d1636024f67075adb798ab793e7c15fdd45beacb2806ed6e31770c0641609f5a1e443e32b00d43a43660c142866046c71beb3fb60120e606211e485cc6a2b79a22bed61d1d748","title":"76. 最小覆盖子串","link":"https://leetcode-cn.com/problems/minimum-window-substring","question_id":76,"issue_number":49},"47":{"day":47,"pres":["二分法","滑动窗口"],"tags":["滑动窗口"],"whys":null,"difficulty":"- 中等","description":"本题和 [1423. 可获得的最大点数](https://leetcode-cn.com/problems/maximum-points-you-can-obtain-from-cards/) 类似。 **因此大家也可以用 1423. 可获得的最大点数。(因为 binarysearch 现在 down 掉了,可能打不了卡)**\n\nYou are given a list of positive integers nums and an integer target. Consider an operation where we remove a number v from either the front or the back of nums and decrement target by v.\n\nReturn the minimum number of operations required to decrement target to zero. If it's not possible, return -1.\n\nConstraints\n\nn ≤ 100,000 where n is the length of nums Example 1 Input nums = [3, 1, 1, 2, 5, 1, 1] target = 7 Output 3 Explanation We can remove 1, 1 and 5 from the back to decrement target to zero.\n\nExample 2 Input nums = [2, 4] target = 7 Output -1 Explanation There's no way to decrement target = 7 to zero.","content":"096221cf5b628be1e73e8bcfe626c7f3f93f5dd1497fc067cf81bfe088cc83fed16c6dadad1d3acdf7cc4cbe6afdac5fbe291b87a12b05d6b838ba3abfaac724e231e5b972beabfb1d37d2b6d3d2127d3eea7c948db2099f26ba2d80e4aca1c24930c00b6db0963d661f1272a8d4daf071d009062b4fe1c16aeebd8560a40eaf3b77c7aeaf8cc4b39536e047c90eea37bade9b62db9ac6a44748aebe6b22f03e5f7a132669d6ed2f5155c11719d1d80e16d787f70c543d1ff21ba63169ab43343cd3489d075aa10ef1dc230ad4202a1bfc11b1357a68ceb35e2892a6690f17ce83e1b608cba36bbbfd1126f381c40901dc9fa271466ea7e7c7b54be0b2c8892e3ec502536050ae5ecca59d8e04a892b61f4765e56de537d252124ed67e409471c1ac280b82086e25d447b39f8e16bea96001f5de0a3796072fc022581fe34bff657be3f333603445d9c16b999ac7ed626c6614ba8c8fd75b8bc4601ef05c49e982c0db74b2af78ee77b7d1ac93ede9ea24c6f3324df782f75a64f13ca5c9318fbd2295494f4dd8d85f52cb4724ea5c8f34312edd97a56db89b45c238e689fad3362c41755f3f8e36d6d5081bb8d1d07dcfa5ccfaaa57ea025037927a829f327772cf366864cf47ff9b71be88e4e0b9bf8c1ba863471648047cb40400eee3aa449536c2fa930d06cd005a1ba8eec8ba05493b6ebb343ef40f12c023bf0d4e9b5342a4d2e7b700a3695fd34592e9d1917e07060d5f9c454ab33f0f868aa2bdf2cc24ececb8fda5db9e7e0b7a81396b37abcde5ff523cc460a0df62240d45d46d5e5e7b53f7b89cace7381c2d1b4bff26785af462d84d19aae41139c4ad6e5f89d31b23f88c0cb5c884b793a0a42031aed76dd7d7c4c6e0ded33418d31b0234134d442135e19119d58995257d62870aee601be493933f9462b761cf05269b4e3b46c90897fc318599ae3d515f76e98ea0f01bc4f203bf1f3b2157f325c50d4aa20e1ea314d2c7f77edc372edea82ea1676a1286cca2d91595bb593b9ab61800fb4e54ef1281d2d3fb00038cc1eba1cb0089625e58a866ef8d95eb113bd22624a356e99fe67254d16ba046ac50649609befd0813586ac003bda22f0f0d6eb69a55acff78bce784cf20951e804fe224d859b3d463080cc3dede47541b56e48bcfe0a6b28cf68fc13c5809bfb2fa3b394cb25aeecdc7a0c52724a17dcef255c735c82b3905630d730937fc0e8d001a0b668356096860c686764aa803ba71a33edea13cd735748d79d2f33162846179429ee99217684a1ada8ac8612f1e273041765d0a69fa3d7cb09531ac1190e5324cf116460bc846beaa5f0c110474b447aeba4dc71495cd52ba0d0894a98c2610404f37a3e0a34dd69f71366d010cd164c5d326b23230305284606e180d03b2b67769ee4e0c9971103bfecf9d225eb8e5140298e43033566dc5ec3f60fa0cf65fff6bbf6f8df3d4c55694ad3953c11b9e2043e795817fc2c35ed1e36b2effd16976c79fe3fa0a4f280909095ac721abb5f6ec2e0fab0bb39d9417748f1d9583513b17cb02d39bd2ea7f8ee1d749ebe50c005cb1537a3e788d6310fddb9de32c0ac30baff71ec18db823d7b969aac5b8ab650746a863fe90acc6c53f127172bc7058059db0960fdd0db85d25636b99de71e7ce47a386cbd9cd8d930109b270452ee4f899b22722d46d20878ec2cbe213002cbd6f5cddf47e748445c1a69fc73953ec5b95bd65c1183db15fece5abf955d97fd31f3973a59b6ce9fd4b2d1a273844f0b33fa608d8244c606d9eb3ac3adef1f71573d2b785366fe4fe4105c3f49347366f26768c247d03404abd3f546b1a1a277d2213753b1dff782304a71aa299aa84faddd8653f4d701fb54113ead1b16bff8319ee68e095a434a2ffa098fdeabe79aed2ea64e90cb770e93d8c147af693849cb48b4d6fc77da4b9b445b6cd974089d750658a15a7610bf6483dd270ff85e619688e3650ccbcd5a3810eff56af1d8429a49d3163bdbecdd5c12b4b91e115fd79e66b9f515306f3b8af390aec3dd395cb23ebb1d65dd8a757ee74e4b67bf1a2d86b0bc4070d0c44bf75eb0ec6d327cf4a83990e399c0b6079a2fbd7a9c1ef1d0c06ba9f86c2be591f692eb1957509ce528bb0fab84940426ff15306d0f702c833cadb3f577e33360f801cf22888676503da711c9a0ae2ac1934e8ac59f20b17a43ae6c4b0ac81561640ff57ae73d798ecb0b6759ebd83b3a5f2b0c8fb67fc4002da43f015a239ff22c3b1a9a0e1e391294c7dc7847c773edc175040a0b46c818c2121212f96308915b38544d2f909b9dd3cd0c93406589ffdfeecabd3a6a914f3de5d5fdbbd5303ad418d245a6da49cf22efa6a729279583a6c88438e74a2ca1cc8b2319366a915e58d61c69ee12c3717e879ad7573364ae014e81d57dbf2fe28b826a8d6869e38efbe5c51e5a815110e479e6697e6a12057fdecb169b63251d8f45297a0096ff90b14ff93a58d157452aa2f97fb0f0151e1bdc7195682d6c56cca64a1274d2e27d2c730f34bc99b686fb7b37ddc26433dbbf68a5daba13da480d4c0469f266a15f79eab2cb7d6f2a384bd965d64c2f46c6feb246616823a8769c478148a3d1aa167def8651b445011821105606ce4bd525d6c912e0435814a64e8982dee3ccccd2e74c183f10ffa9005ae26c1b9afdba06f0ffe31d9f5d8de63079c73207d3b5166f648732c1f2e6b9ea03b3e7b4171ab3d87b98f68a8e36ac2d2c1612f06800215f984ce1a2821f57c52f4edd83d1293b7ca62d4d305d488fcc85f74d272753668d766e68ef2a7f573d8ded1eed28d4d812e30ef93ffb2b92ca47ab2db4c60010a58063bc2bccc1c429b81d81ab71cb1ee54bbac3cc1b9bf9d5e2364a4b0754a4cb749e32f883e897fb153fb9d92919b0779033e02cb09c6087ebb351732e3e6b022fd77cd2de05a1610c17e5aa5ec0b07680da2ecd4414588f1a355dc5e313b6ea2af277010580f7dc2e2afd5b83a60cd0f9b4726f9f2beec5a6185e5959dd3b9dedec4c92bdd7eb304ab02e3ab527f49d9e09490c1e18c7ad2912b33797bcde05c43f0ea0da22aaa3289600bc20d2d911bf4ef1b6578f114648d857a6d48d819b35c9abc7d1b875fa56842aa7362bb4e1d36061913751faa8b2fd3e39c1d64046f61957ea6396a7dda651881621ab54b355e8b37ff04c44e508cf4084dd93f885a7ccf55ff777d3917a86e4e98f29ef799ef2b2cbd02cf177fd0f0a5fad9ad2a82a3d7f69128cd7005a0a1fac99559fa471a5c62772892913f7d8d5a4a4fd3e54ab54f570b970750bb9ecfa71dde48ff449bcd234fc4810d191853e61b6a421414c91901eb3567bcd1f89794c5a214862817df2353be89df75a2a058ca69491b829fccdff5f75b7bb94e729828ef561b3e9840d3997f70eccd54f694630b7fee1a37a186390fba00c9d1920a485d4521a9913dc72c8ae2ab3d238f8e3c8d5eb77e146698c33489a59773c741b3492159657d0ea8eb57ab32c5f94d64d024367f5d5d2cdcc3fc894303232f4e4464d7c3601ed6ad12e8da8a7b6aca7f46431130fad54f798ae719fced21d3f81a2296bf72efd3134b6d725bdde7d31d4daa7ac7f8c646628a32d73d2c8d9d352956615843653763741da532376b0b385f4b58543e20d21666e43ab4c2a8258b99c7f01e07ac73e0df73b2f9d6d9df4c86e9a22610326ff4cbed062f977cb91d72dcd1977e82ccd3529a4fe1751a93046e9ee1186f25e83904da52034f8ccf7447e968437a03e037aa1c74c0750f11c6014283cfb896a2a7b581a377a252ab491e333b8072fc7dcc6e106f2f089fd1ee2d03dca2497a2178864dc84e74fc2c6c19ede544a7a9d399f18af4dffa27947e00219a2d0fb0df245496a7c9b98f989db60d9e6c1a4ecc5b3db59c95b4a0c8ebeec36b13452f91487d483f64c8fe7e1ca4d8d68c02bf4da1690b8547f06259c32c5b8fcf0159e5898ef220ea6cc4de07dddf2015636414f5c8951fc86c705d689aa366864eea6d6e8222bad6e38f637da72e36ba360bfa90d76af9c461698510d5c3cead28b8de83867bdea009021929fc79eb239a739deea63b343d05ac9b1e13817bfb0f5214517b556171def6c3d1ff85ec89d07a68e57107d3ca19d168317b8fdf3f92bf202bca15daaf7ad25301d7b4da8fb78e817d61752ed65b56f448c315a73c18aa630fefab4455239da28090bd85dcb47463405b6a93333716d55065450d1c7ce6aeddcfbe16bf7280ba71b13f119d2121fa4d324ab1398c4d3cd9651c1b49e52a04b3b8d7b2fa058b9b5045b0341571abb8ce2cec21a43b815abf56ffee395eb6413f8fcde609bf29d3e86543572b5a1380e644c7eda288efb7dcc1a75e6008c61dda7fa58da164992718b8f2b5477096721656e2406b28300f41665f3411a3f6e8ebd84e78df8778ba44638df213ccd6317be7f7a6d5d7d7f07567d985a331427c218ff1e63f3a7b25df7f988cc72b874f7dbe05e8ba7e2a256d8d40cde3b226f5e7508aeb99e8aea644bb7d84348642955cc8059aaa9ef1b3a0a2643101a04bf08bb23194a694075e40148615db09f1fab2972e6b7b4f7855287a0746b0267e78f61997647f35bcb4b5bae66002dc46cf02147eaa4af69b052cc0ded4b263d1b700cdfe1c85ff747bca950a62af24bde53da15fdf8396f3d36a38266897a63ec6b65c71d4903db3318f4652116822a1dcda0605c6df98442eb8528aedbf8873c29939d127c448ec5a82ab7e89562086e36594917f63b17187074bb766ebdf4945ddb1f364aee3ab46845299bcda908773efef49f87b8c5fb662358d4045771c03a9cd5c68712698f3f60fac12334bfdbd1fe94eefa981fda5cc4c7c9ae2a636af775f681473ac8802c286e02eb5d6d8c686d47afdf320d66d58d3a7260b682e39111127068877622776a8f60b6fe84650c426495e18127cfa92410ac3687c9d898623617bb0c6ff0ecba387cc751dd568033b48a394e1b19ccf1033f4340491d67287c929075f7c4f2099551892c8fa87156c4b800ff82d51116a8d48db3b87ce5cb090fc76e6cbbd1587a99e4b33552ed674567015254d035be22c0abd348e03221f5384eeda975a5b276b3f987e651e9ed90feb962bf6c4660bb221744a45201c2e032d40cdbaa344f958c93d5a9669839601ce9f9188c2d20f13facc406fa592d139683a01b78c560df4f83af6c0943033cd64ba2ec4ed4d7464d5479a412dd10782842faf5a9ad43937eae586f3fe97e6793443a648ce8f9ac5031646eee5082cba66eae394f2c9dbc3e79998210c3750109d6496d14fc76246cc8e135b5ee379ddc8a8e0e656af9a8676175af10ca5691f8e0c586e2d13ab2e5b37b152a4cb792d15ba86df3673571998e9cb6c8a92292d73b5e7be9eede34266ee9c5cbee78c6621f7780dbf249351906afdd33e5f178ab6730df7b5c9ba6cad3b761d607abf7443273a8122ee888851a988de6fb98a2b09896cc367beef9a36175644430f2bffe6b9f7852ded0d74fbe9429b15e0c795e60c5dd4e834c9c31b5c49c0fa06e788e342f27a804b6e7f0d364b8fcd6bc4e98eee9e5a1f4a41e5f00d67abe78c364ba71a3e71b9fe5882ff5455360c1ebf416bee414aeb8a2113f5129216ec59f9620766cfd7e1bec990b741c42bf60d4b6ed0d0e624ffe3a7ac00a63951234677199d4b40b94c942d5bf7baa353246740b4dcc2929f60f63f0e4f819599cca5db93294f98c02e5a911d461ff3e6e2689d96d32030b617697d8980f335c467da65ac3576b3a1475b2637fdae3b6f4c0b17d5a071565542b616c99ece032bc724584c5bd040bcf9f24141cde1b08abd534b1458b101cd131fe17c89b991c00a22495a8a8cd7bbd9b7b2d21749b454b9c256acf79502207fb66e147c19fa92d26336340aead6b987949a9fb0e708cadf2de2f1f83d1c41d6a079c30c044f629cdbf7bc9a0497538ea8da419b625138d502370a6ceb445abb6552c9388aed35ea024d9dfae0f891d474ff70993866a73fe815aa50a566469413b7d380e1a083bed2e931c223fd4cc904fdf0fad43efe823bdde148904b6d6196bcd65371020b7424fe78e64f0d26ee1ab077c229eea7a4ac2d386c2b5bec0cb641699550b6ce6616f329bc036d74f6ad9af03cd9b6fd060e","title":"Number of Operations to Decrement Target to Zero","link":"https://binarysearch.com/problems/Number-of-Operations-to-Decrement-Target-to-Zero","question_id":198,"issue_number":50},"48":{"day":48,"pres":[],"tags":["回溯"],"whys":null,"difficulty":"- 简单","description":"```\n二进制手表顶部有 4 个 LED 代表 小时(0-11),底部的 6 个 LED 代表 分钟(0-59)。\n\n每个 LED 代表一个 0 或 1,最低位在右侧。\n```\n\n![](https://p.ipic.vip/3jkqhl.jpg)\n\n```\n例如,上面的二进制手表读取 “3:25”。\n\n给定一个非负整数 n 代表当前 LED 亮着的数量,返回所有可能的时间。\n\n\n\n示例:\n\n输入: n = 1\n返回: [\"1:00\", \"2:00\", \"4:00\", \"8:00\", \"0:01\", \"0:02\", \"0:04\", \"0:08\", \"0:16\", \"0:32\"]\n\n\n提示:\n\n输出的顺序没有要求。\n小时不会以零开头,比如 “01:00” 是不允许的,应为 “1:00”。\n分钟必须由两位数组成,可能会以零开头,比如 “10:2” 是无效的,应为 “10:02”。\n超过表示范围(小时 0-11,分钟 0-59)的数据将会被舍弃,也就是说不会出现 \"13:00\", \"0:61\" 等时间。\n\n来源:力扣(LeetCode)\n链接:https://leetcode-cn.com/problems/binary-watch\n著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。\n\n```","content":"096221cf5b628be1e73e8bcfe626c7347187228a04f91f99075142254f0a00053bf0a56aea6410d1ec9878a833a0e65ebe221bc49a2e129cbe22b42dbfe7b231e23168699ed9d2bc0b2acca49b84106836f07e8edbcb66dd77f9a02b222a4c64ded2298e9564f144787f47f95a2d4f69bc518bcebcb01749bc1f3570bd6dc27af98f38ed3872373041eded3e965ccf149ddcab4ba52f1f5e6a04f7bdad90999bbed5c08f6afee62d447e2e91921a706046f2e293041d7b3fad5a936e378f077705bd1a985501b9426a3d8dde47230a11f627a6374a54c38052299a87adf5d179d4f7dd5dcad53e87806c3894eefae85547535daeecc92f392c26860f332031aaca6f84a793996483467b710ece505e5bfc1fe92cbf6db414dbc8884489e20a8a0f64d0d409b6a74daa05f9d145d04b21a0929cb5557300b3bb14b6d7f066e539d5039fcd4b3212cc3566cb9b83e002e5da4f3e7f0f28d954ad29f19d36357d90d8fa79997858fd6b300757670f56e5f82cc5c01faf5c073e1f6ab558a0a6a70cbe359544557f1f0fb4f0642c77f6042496f757c1f1e162ebe6756a53fa8cf90fa4854b467c32ba14dae8371bb8d116d76fa4d0f76d9916a0e56374f1024aee27e47d9fae9a35cd37702ef7d8f06c6b180cf447463d8288e9f469c3538dcb8f1c18e0147f1fd58d1ceecad02fb797efcea2cc20a7b4e00c88e72eea64f1c54bf3c45908664b9c6ef71f817ef45f0d129e8f2c062e24f68221e6db10142a772c54a9251a3e5c7c5655f4df844268326fb794bbb89eb961e84e088d7e2429ab4f3a2d473ab7a7f1c7c37c6e077c2fc7452c6d8a1cf01f47994f9bf10224b39d1f39ec717964b0617c0667ed8819a7de5bb347d6e2d4c7f4c2d83014d22c07350d6e4a1c39e3bc20d7a6a3e09ee38c0dc4a290467c77c304cb5b33e66005d2dce4860ef43777c2720b1be2def8896941456ccd2672b84897c6c4d60ade53a28b3fe0d064ef384540a95b80f3535cc9cc08123815096a5ace6a7ac5e2ffd283d70ccea36a49cf9c9cb64540e75d3d5a40bb60301b71ef77a2d885bb58769f627bb307ebddb33d028e29b012a01634c15eaea8434b102d8219f9fb68034b3ee9ce11beb226bcb1dc9030c35dcf04e07b8449e583225b0e928a8b51125215b4de98b6fae4f188e4b9bdb2ed787439f4f3f8b25a5416203030f3e34f914273824be12ea0fec9a5ff8f8cf3189a1ced9fab8bf9d6cb86f2385ffc810595639a32ec092dc341a4a72df81324acbb65e2b8a25b3b7145edaff2cacf9d716599d5c24fb08cc3ad2bc4be4634b76ddd570fd9d03ef3c1dd398e26621a9ae4ea2bae5aaf76c750b47a212b2bf7ef145567b0a5cfc8b6fa8e93dc0317e5fee0bcda64a34a0dd0319aceff877ba595df80a06337a5947e9d891f8c86b037220ba6af2f38f5945b15f5a4f404491cd625ea58b1d00cd6a2a94e6f1e72c75e1880987bad5dbcfa2e0f24b75a48231317966da88e2d64183f4939c5b85691caf8924b86066c2e67ebdb22f359176183cc56b51352b0fdf2184f8cc086fba11e4d03e10c62fabf49a1183d68fa119e9f027f1917ff876ed12567fc405250ae1877ef56682976948f9f50a73360690c11abe5f0901981c4dc7d2446f018b822f3c5a33ecfcf2ca89304a197cba0cf9b850476b2e389d5650a5b7b8db600cdedf8f0542333d5978d7296be481284fc6c92477579ab085efd6a9ffe730ecadb9bc11e226d039f16a72c143f62b88d38b2f253290d343e5fb4eb32f24682280377279caeed52b8b7b946b939530ceab37a4c938c1811f147f3de5528bd5d1318251c95a790e97a473f3b4f060376318611098e4b8c21590926fbf2d2640f517e118ca3a4741a3dfcf18210e16cf47a0044fbf0f0ffe08bfa7ccaa7d20e841ecf15e15df00307a5b7ccc9a9d21d409423bdf7c76ddf939415d0ff303baa7222c18e1987d363f63b02b8797ccd6d6b9bc4cbcfca3051bb2992841fbb9e2972bb8edbd4d706a72041aba86d9f2a9e17978a7d607aafec66fd407e46ea3c210ae45c6f81288c3a3dd24c7374e3db51a5deb1a43ea8254dddd630874d9b15ec94fb60f585566d43714c09dc83d4711d7a6039a8ede4da5e1c96e10f83637c781283fac66fe67307e7f528b67f9855c29cb753208145b7bf488f3d2d3960b991ea74f1c047295565c399423fd157f157520407934972872d95386528287b43ff2a77433110355f076cb028d2ba923dcc73d331b645edc2f3b4a6a696543c7481cf733c67cf670e6cc732f080b928e6b09c943cab19b49b47d1fe0a81fd3fe8eef3d3a91780ce84338f0e4b841159f8cd5e75c3f129b65ca4a6cba58ee62cde4e72846e581f7a8d56bc769cf8d25afc55a90eff0faacf64a9e6f34d71378013a439203d10b913b5a99ed2f5e62a8917aacc9e9d20fab77d78e880101030749465bd09239890a0c6fc07b4520bdaac0a97e774505782fb165a1f039d3976c5509e9baf7b25dec49b2a1cfad2bf32dc31d62f067b3ba3b0235fcf59c20e68cbfa7a9e647a69c4fadc31a4e849aed880f33aef04256afbc7d611c3a3f0eef19b21d69e0c30fdd76f88167c8250e1519b3d01fe7123fb19e290051e1e2d01c36f05081acce32e5425d417795fbb0130c3de6cc070a9cebe9a9c9bbf47e0d66aaa41bfb5e4bc86dfe0a63fa68ad0bc3a121b9cd08cbda18214ebd02c0b346a91b93b307c425ea5df465712f4452a83361709b6baed4687ed343f1ae1a0ec29e8d5092378b3d4201a0efc68d20dd18debfcb2df9a384f492aef0fb5a8744850d5d8e6c0e1d3868842cbb45438ff9a93eb1ede770d92f4b9c79cd0c805593a8a9c620a2ff9c833e464ac5a36b50a25493b90838f82bd01ddb3728576a34f842dba1efe3e2d621a5898fefff5c21fde518f997195be32277306e770d59e02a741440bc12cd55a3f9a80dcc9256801c9ea445654d210f2df65426563f7ba82a1fca17144263f72a6801f8c64ee65bfbdf1a3593b98b7d7dfdef5934a5028a02e842ff96cca0d6ad5d2afb689004909701e8a4258e1babe890d75e6ae600e8565f9369769e8d46b80b64f9a68079f8e97718c8fc48f3b3a109118a850c8ee7dcf24d67acde46de8dd358fceffc5a89d95b8fa822ec1fb11cd8dbc85a21d8c4da3fd8016c48c813555e70f275e4ecd3856825e1194bacfa732a559a2f80f914594bbb1fa62ffe6748ddef75074cce828e15ae0a31c421f3d4205ed203a104c35ed62dd815e43311840db4a9b8a95c4f1ba3a5d9de652f0da8c4621d945ded6a23b93955a081d0d0fa9249b249cd63a6b8404d2b8fbf05ade0b555349cdc523892173acd2bbb2d8c5a602816b2bd42a0ba98e9e78f7c7579a3b061d8b9c81debffb5a7ab85449c57898d3d7d015ce0818a898e0995bf19e3c5f3665e9a4642496c749f25204459fbcb2f09b20529d650687e2689dc509689e1eb146077727d7854b036b59f602b29120aa97a8ee820960aa6aa13d1d9f9e2b183c6e1c0848cf0c60254360535f646e148ede6e51dbf147c5c1ce236de0451c030325f7aa5e7bcbcf5a81b46e9fad4e6bd9f168c5d3134b24701ed6aece0755b925e5ab830a248632b6312cd9dc676e1335510b0a63362653a5747e27163b0d0d5b417303961628e120faccfc39dfce85bb5b1ef723bac972aaa7989a802bc4a0ec67447b20bacca42f79de28ab0c729b88da6eefc5c249961bb33520da5007d1b4563b2ce1302e9b1c504f91cf3802a760227351ae63ee643ac033465d924410c283e4dbb4e3e981f2478813ab551e22298c72f773ce66093a2b4a9fc0e02e06d0e4446b263fa917c92f4ff02c7e15edf148a7b1ae95f19dbb81a973fc0c4376b02d0fb0df245496e687ea8f85caad018621132dcc4720b5d695f5eecaa4e8c33c135820c35d7952620bc0b33752acccda8c4cea00a1620b944ead787ede2c3af4867c73e5898ef220ac2396de46dd966e15332b0ea68aca539c393e0825d8e6348e07e37744826bfcd6b78f7e60a77a77e8714eae8a9164e5972374cc139cdd89bf35a290cf8f41defd25495c76f43ff46e977ed4a7a13b516659c3920439817bfb0f5246142f00333fdefbd2d1b6c3ecc89e6826ab6246dbcb5f8a5d6a73c5d62e99fa6e628d1590e17aac4149d597febe8dabd24a262367cc766cb3018a7cf76c32e32d5beff8595c218df898d5b298c0b2606b405c7dbf733903b229a1daff96b0463c11183ff356b32042942d93d41390e7432d597edd5ab72848d9fed880c52de5eb211127755da1005e8cd006e85c6aee75759bc663a4fc3a8b34a87f67f1a0069ac3c8c6e7446db53e6ebf80dee6a25295a3893b14ef99e130091728a8e7c550b15cb5531b07b71fe298767a2f93e11b7f070264a888a9fc9eadd3cff7b148b02d5816cda22f038572c5ac082a9e6a0f98e07d2c43470b3935b7ca371d39fede8f45f1b1e52a38515ad133c4df8430de0031eb51e8bb6430422cd52c88e9f77df5a50ee1affba1e0ae58b60a8925835e9d128d59c7a69eb0e9edf4213e1bee42361d1df4526700d992d6ef57ad56a539642b509bc7774f630a7ce9ceb975f7a5eb2ea613c2fcfb132567267facb72340d44d1e238e18bcce563e879ed8ba2d8fe40984b84ed7ef2e7bcadb16308071fae93ebb44fc83d0bc8131502621d9a66c87f81b7789d45eef7cc60b4f19643ea287e046739fbcd64c6cb15b84aef08a75dfdd7bc0288e1da334d7a82bda360a88e672cafae8a073e009978838b62d4cd0832d5d71ad122418e24204a3e88095df3bf58712ce36d150e00d3eee304e13503bfc1fb5f9add60c081a9ddc3e5e3af2c579de02b499f2a0aa8b1170c694946539dc9ad3aab4213cc1390e269521135c7c415acd3b60955aaeef1373fc9cb4f4b08a89f28859fb82ddf1520089814546338e63d8a0e49090649e6b22cc555b9fa4a521416cbae8e982076d99da38669b7d0d2a54316c4b344833dad826bf9d3f04c41c199d8880c497a36795926813793040c0e94673d765222802ed49804983a4c625ad9776b59ffc47876c2bcdf0f58cfcb1d2ba91f3b7828c5df4a57fb14d8eaafb982e381c5df2a3e0dc9b119eaf8e0265ca5508f37c44a3a109e7ddc9808a9ceba9adc038431589329c59a09f6d9f0a5dd14554601a2c7cc7834c093b71d6d5f359242975f6b21d6adc65","title":"401. 二进制手表","link":"https://leetcode-cn.com/problems/binary-watch/","question_id":401,"issue_number":51},"49":{"day":49,"pres":["回溯","深度优先遍历"],"tags":["回溯"],"whys":null,"difficulty":"- 困难","description":"```\nn 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。\n\n给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。\n\n\n示例 1:\n```\n\n![](https://p.ipic.vip/e9jfjh.jpg)\n\n```\n输入:n = 4\n输出:2\n解释:如上图所示,4 皇后问题存在两个不同的解法。\n示例 2:\n\n输入:n = 1\n输出:1\n \n\n提示:\n\n1 <= n <= 9\n皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。\n```","content":"096221cf5b628be1e73e8bcfe626c73470853d846a3d428f680b494ee7f5afa5ba126cb6b71e6983b7c364be6cfbaa5dbf2242c49b6414deb063ea3cbfe8f124fd2d256bd6c5d4f60c2dd1e8809412155da73ec61144c917d450a23e0124585c33489e47213060d0afebc8fa7a004c65ba5fa5dab2880b4fa20f3a548a6fe26ff19f0e296765405768ad719a47c001ba716a068c6529014ec1d81a78f2a4f3146e7b2d2c6be2cc2b45662fa0ae1960494cc1c49e393c7a0f9159924434b6167a2a991bb970099166aded7068c279750ea77e9a621773a6e57761e7b533532da1d8cbd3b37a64f427fc2b25f7acf86b7f85cf34d0f7a7712da8cb0bacf6443ef3b551c7360752fec938771871d7d1b7f85d1fe52a806f810cdbf4af4ab2dde714d4e12b6082e7a1a03aa13f612d995b68e48e0e9f9ff371cf8c44ebe27e8a5eb5104c8797131d5176b96b85be8d845fc2a8dfb3b9bc86d6628b29d79d35265a580989e4fd38df07e5321e50682b55e4c810ccf518a24419330648b866b7a7a1027b913b455069d9ee5550fd4325c25861865a5af2c3e06ee5ed73708543062d67a3ef2478fadde73aaa8f225cc6edb605f7ea8ec8f933c654e5e9efbd5667aeb8951082d928c4026c62993f7d476a403f06d65d6cd3dcaa83805d8ee945666c9f19dd047128c48f05e6c9f20171327fc1add5e316d9568a649c0ab43dc1aad64fce793a89a44fea43b243a52b7d05068af5551d5a56aec43ce2c2000073312c55a56c193b1862114fab8bc723133a63f9f423612456ee2dc1d41df4ba9f6eddb22a4525b698c1c1e244bb97106cde204358fe45e24c079220cbda4f57a2c073369df5210b90de7214b5958f61d4d0302ee3d8fbd5c7f7c0d9143cd22c0938285a46102be0b918d6a9972857608e05f2a9b16c932df45ba668988a17ae4ea2542201d72475dd530232c8595f3ba6ccc36ccc2172a46c9ef3de019c9516272e31ecfd64d1064c6b85b81d7690e076e66c380ecf8de9b4977b129ce87b3dd6d57986822bcb621a3f3682ea5551385c43b445efbc9122fa140c0c0691e60cb6d92cdf66457ca3ac50a23bd431a3f241c07a20cb80aa8857b34723c9928fa4541ca23175ae18775624e567f3079c42ad23d83b09a4938d2e533ae6d7c4807e4f2e6340504a147254e18299275a609bcd68d830dca2b9f69469e15c984c6f9649c404aee3ee49692b44b002e24bd5d32124d3d5ccb8f1154ffc8510945a883fd62121d6714b118e3e9775c6ab0c8baf3cb4b0d38c9790877d72ad6c759ccce18aecb26664b3acf6545dd5416fbab67e1f64ffb98f1ac594d2d3dafc91813a8d051067a377c69e01f75f8f72571ff1a0aca986a5d2ab895a10a68ef5d4a76ff51719bc70b1b8a3ae18fc9698e8af366c80ea23aec94698d7cf0f447bb2fd4d2a91fe77648bb6929d3479c5bb3ed926da0cc86ad64727725381380cedf16ace0ea9954b379059e817985171a7f87e3c8cb241133340c1dcdce494cad511b15f2b1e2fabdc75984e5a1c80920f8750068383802be75a7d2b2dfa002863e46f1be0c4d41cddb7c1f203809b18791b3ff08677d7246df64c5151a3326aef7f4d2b6ead86b762a437516b3616abfdde970ab9c5e1462442c7198514fcf488fb6548fb2a1914b29b0f395c49129db02a89c1d32c7b792cfdbf4da2d37eca925a2d90c5bc35cfab027ca4bf03a5162e4c498ebb0b23fa7fb87b92eb18cd0a216d188ad97fd00f6378e4de70f2aa136c0b2f311cf0fe76f4048c250d3328047d2ad77068f45bb6bf82c86c5b8484746383ce15a8bfcb255c86247d35415584150b248b815e39245c08156c8d41658e34ff14366c2c8988e808d4a4fa439cc2f6757e77fcbfe62bbf37e80d4966a289f5911e6a790ef5c1813ee166de439174ad533adfedda9efbd37d81422ab2d6c66fd5908711d2e61a3ea975cd4d5b9a675b63dff09dc41449803651c2bcd3898335de5482078533ae9f1d5bb9aec9dbd70a42b1fe19eb60e449ac98a9cd79fbb253ef35b780a5a3f03574814982e674a809f8d105cdeea96162812f737b40ed2bc49e5d0ed94d81749e3517719b02169fb388bda4840f6558afcbefd7f42e22234a94fd1d2bad099dd1948c1e3e5b248455548ecda353ee345bf68fba6e206fd51ab27d80331b398d381de957c3cd5c03b8d2679a7b16de60ddbad291c2332e1da649c629f2c4606224a90d1a243b6b52464f26947c92a01da91d96176f840d6168260936ac9a4c32518dc25d1a6bdd4e054deddf5edfd12ca7eeaac969ac6feba11c8ece68f2db63a0e9425964f088dea4f7d10632c01219a0fa1c3cdf9257a802e0a2a9fb8b9347c90c0fb921003913d25ad93fb5aa8c6eb9109d69ba20e69265c7a8c3201a20eb62bc76753d4ddd2905831782d0896d8568c7edf5c01ba8e34fd47f60c1d4b5d44dc6f0502bfbd090b69802d73331b7c10ac09d6c1ae7626ac3fada82703976c056b89b690325b891814467e9b3df33a859f85577756df88668c7239d900b32b9df34fa452508eb918634cd8c76c384b85cae1dc1e2db5f1f6d789abf9e97e3f0ba3003de84356c9088829071988761c07926b636199e896c9005311e232dcf52010932cfe0095d2ac71c7b7c8d0105fbdc77e076a6e3502bdee8b923bef91bec53daf0f1c7cdd99f1c846d320773a0a83cee9003614b1ea05f1542254812a9e3630e171944f44fa41851f4c0b149b096d130503ac97901b4f0fa70750ea82770403b625d4b9dddbb46a78b31bbeecaaeeee8d0606c364bfd60d9bc1c1562730d5c5c2733098e0c96a15924f61c2551d846d28266307f393c5d1babcde8740891ec63adb7b92aaa269eec78d4d6c2873d46762079ed2f22aa216c984f418202d8568e2d337e0696e7bbb7ca44821287c46495fb3b256404f6721a51ec30d9a002977e59b3cc07037601b8c2d969708af098921ed8313e51d762dfaf4dcec4c2045675bad7ab86158f43f9a01873393892ab7a15127f3cbc57106644fa2eeb64e3378130218fdb4db689c5ca917024ba4f77ecba9cb1e8c351848ed368ed36df7aa110ac66c9d260a7a7c9760647a541580b05af96d934fe3bad7422e95ce243c9cdce6eebddb75b1f380409fef1b5aa05f21f7adb210e774431fc6fc76d4fa36cf48cc17515ad5c0d5144815d04881c718db59db630f651a5ef0e967f88b3fcf60dade43ab8c1b20921d7aa28ce46e0ab571d67606805e7205a400d67ac2fdd925f473f9c992c876173025d12993a5c9d8418b388c60b72ce589a946e9d76f50f5149654de476dd799b8f7a04c48105141745e5195551fa8e476469f32061adcfe2d6da8922fe41adee27a1c462edd13ce2c714d575550dce8eced8bbf67069a45f4dd972ef8f83d508881809ad91a2991deada2604552bbde1217d889560e8014d3edcf3ca8d81491dd3365287a62ece81512e9600f21506713297c077027218b417a9dc6fe58ca7b38e1433e37fde695882f823126f23475d35cf127d250d6953044e6e148e972851cafb41809ed51470e05506035132e6ab596785af60fc9e6e9ff0646bd9f168cadc138efd90d8324746eea8349c526d3794e31bbcb6402c1e66c3aa8e9896c4c1f0d7e51db532f2c4fab8f7b51711f1dd7e93b325fe641234ba6410141b9ee318b42917e05d0f5c4462af27446788b6186ff49fac5b67d2ec20bfb71f151cce6c004de85fb330e2c06595ed3327b1cfe35490c321b897c60b0ba5af8d60227303a772ef363689215c11db011cc28ceadaf6fba8d1fa18880eab075f3a3b8672b23a8f6e467366089683a2635590b12f3f6f70e713891d12b92c645ba4b117aea988b3f1def4d4e727fa0a4a991f9bc90c7fe0c93863541448226eef6ed2291a07cc476cf08295a5ee91ebf88a21401168c3027a55711dd3d47e1ca4d8d68c0db04d67c3a1f58339cf9343a2fe6c2cbac77b4c2b77e750cb016ea9f7df201563645db78adc4cd95b701f21cef066804ee22f27d638fcdbb79e777b8d7a77e8714eae85d82be5d836748e5d8d8d005cda2c46010ea63b6cf0abd1a550b40eac5fd04929179fe1a9a141069039817bfb0f52461b2000707092fb1d4c0ac3bcc85992e63dc5aa5926f71fb591bd3041e90f74abc228d02b4fee42b7843f29daecc7fe811e2e3e64cc792cfd4d830af73c3be33147efe90bdcc774aade9bbfd1cfe638230e116a952270435c9bc780d3c0ee52645b00779b74dc475bfc748fbf5a948a3e153021ea1b2b4013dc8b86b58d7dc38c5a397f045bc25f51d98e14a0e68f2a2d6af05baf8e3b8113f102ffe43a5aca4e61c8dafd5ea22292ba2a1659315a5288a31c85b8e78ba8b099daee406101d601943be4dea76f96634cb1aebc5767887f070bb8382c6d6414364c5f344cf19ae8e3d24d7ca38826fd113b8dff02ccd6347ba5bbe9aa8599a25e28a6d7ed3110703cc0dbf871424830d255af86dd4f68cbd078b80331b0acad8473ea361dcd31ffdd61adeb5f5f3826bd7bb84cdc06ab378452934e36243908312abbd99312faf28b8f3d828e9b0b484305bf14d411ffcd8b96276eb2eab989860e595fc24a551ab908c704605cd69cfde2f22371c7824ff2c8ef04e73026a7af150a1022b09f8c08caff08afe26fbc0a0fdfd555fa3901f017f43019103c4f8bdb86da523b8c0e26fff5354a8866d448f7ebd4bad7253b0189c052f5d68bb21497316d7952bf4c5ce6189813d83a84115bdc52d1a60c3ea8e0bf256afd0fadc4c930ea655791ca083238b4615f0d8d1922d19bb7ff8a02b8d321a67dc821b90b48b23c3173695c863ad1b7a5a8561875f3da6e2b24a0bb4c8a71bcea95a5ced33314988bd53a25b1e0edd3cf074db9276b6d9a76767a003d40bf7949e7119c9e4851b6dcacb3e39ec9958902a9b09bb96578f9b527eeee0c9c28c3c791903034a6de41d211d987de63581beec79650e0f655336a3dc06a1764136b690c234f2b97973fbcc3295287481f9c8a8fd3cefe37d7de6b127964c02f0f03b4af4b4581689350d727b5ce51a47d67d9e6d8aa7e87faca0a6155eb63f2959df657e4c29227bf9c34ec69cec0d1cf732e513ec9d4b4eef97c8ae4f03a17aa765bac6b2bc99c7181de8fef9bda8780e8a9182d7a9177f86fe5c25ef85345bf37791344140e81ab335f330e8eedba2d196631feef5442bbcb6b9ae3f0a692738e34a20e3eda9dda1cfd5a6564814ec18a79e60a95807873e0b6d6a9bfccba5a1e","title":"52. N 皇后 II","link":"https://leetcode-cn.com/problems/n-queens-ii/","question_id":52,"issue_number":52},"50":{"day":50,"pres":null,"tags":["BFS","DFS"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个包含了一些 0 和 1 的非空二维数组 grid 。\n一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,\n这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。\n你可以假设 grid 的四个边缘都被 0(代表水)包围着。\n找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 0 。)\n\n示例 1:\n\n[[0,0,1,0,0,0,0,1,0,0,0,0,0],\n [0,0,0,0,0,0,0,1,1,1,0,0,0],\n [0,1,1,0,1,0,0,0,0,0,0,0,0],\n [0,1,0,0,1,1,0,0,1,0,1,0,0],\n [0,1,0,0,1,1,0,0,1,1,1,0,0],\n [0,0,0,0,0,0,0,0,0,0,1,0,0],\n [0,0,0,0,0,0,0,1,1,1,0,0,0],\n [0,0,0,0,0,0,0,1,1,0,0,0,0]]\n对于上面这个给定矩阵应返回 6。注意答案不应该是 11 ,因为岛屿只能包含水平或垂直的四个方向的 1 。\n\n示例 2:\n\n[[0,0,0,0,0,0,0,0]]\n对于上面这个给定的矩阵,返回 0。\n\n \n注意:给定的矩阵 grid 的长度和宽度都不超过 50\n```","content":"096221cf5b628be1e73e8bcfe626c734738e268a04f8178e0a5f66275d38001030fda0652af3b85e3f4321d103e7bd46ab345588da2612d4a92ff52ab5a7fe2fbe3d6568d4c4d3fc0b2fc7a89ad2507e2fa97c9491a0419132f42cddeba2a2891648a54a22f51ecbecb8e7962d212e3a8a072e436a04b3e258d4f20e81055a8450608228794e4c784dab4eae4df322b6755607a263280c43c7fe2879f082fd33567a101268dec421457e2c87acf5f2c58a6e88d6185a32391db521f49355f8999017b65dbbec27c969592217d9212a33139107f3177386e442470425ae94b7c399d3b622dea15888f234121a0b260115a2086ad28cef51661a41cc377c4828c8b57bcad8b7f93a9423234b7049eb9d3eecb32cb9386f8026d4e6be45a4d709a43866f0de0ab0b1a01ba21851c402a5a22dcf163d72b75da8c14aa6ba5a897481105bbab10e6e2c69d8df5a9895e003d2d4a2afe4c58a8b11af4aa893e1785297dbc29728bbd03cc93121446a2c7defcc1303af0ac31b27475946d83cb3c4de1516ee092ce73d80da1833c82f56d10f05b23029c997854ebe89440ac5565b7962fcb4001e487d20b0138e2079cbf48d04d3e88eedf930ea57230f59ba6a6ea1ac971282f3ee3c9b6e688f3e5543644c2906f67eafb7e62d82ad718cfc6e6a709919da307f10c3ab04095c01e1b74055accfc19b72e3f668d0c249b24196a24b96836e80b32b9302ad03c116d7fd8bc24a6a9aae90f55b0fce264cfeaee6d8de7026dccdb8fabad89e420940b3fec0877d4447380c078d1d9e8f3c1e7e1ae30f24421e12f4f8e1aabb6c1278497494546635b6569b2923ff78fbb50c4efab86650c8f07d78a5b7f4afb7beb76bf8d23c31d4d9e6d9c7c1c6d51536d1330238284a829886e6a9161839192754798c08ec6a00d493c00bba72fa2386146dc2146e04d94587bc69dadda2621b4f2ab6d1f9d95eb8b778e65d7f6800ba679a1d08e74f5daf449092fb2e9e276b80f07b9b2e1212a99dfc8f5cd0b94954c4f45b45af0716e343c3c290bb4941c185dfe2af00a53a171be176b4d899a8586791606db31bf8dda333079829ac00d11a1cd93faeb4504b0023820ff8e67b035b30e9d810a0a126adbfdc8630aa53e904997b9249f191224b00929c8a4b005205bade8eb5e4f780b2c283061177bf8bb3377f4e887c8c8483f9876534f92487e3149f77916a7c44733e2a6e75c24c815f501b25c31f4b252483d93408a440f330fa6780f474c71c46a7f81829a7bd67e0afbc5700518db0b68a425440facc9efbc588c9bd85d126ace1575de057802b0b9f9fb49ca4e54bd9363ebef783db8e72cb1770ff40b24037c961da8f6568d8642b6aceabcd8c9ccd0317fbffefaad940ac4839fe3f91e3f5b772a58adb8e936a36a0bd7caeba1389b2b2101609989f251fe2964c2bf694cfc13b0dad8e5e42b2126fcb0045dc275c5f830606284ddb23b85b2dfb99807fd2de33dda7266cb4843166a7e2de3fea83b8c3f299c27ee8736f6e3fd68572d53d4963d28d70da6c66d884cc47f709020b46a61d5503f21449c8108a11b7025bd70d1d9e2b531906c08e5fe5276ce3414050a12058e0414c2552a24044ae2aee3d2c5b3ac994cac7538f8681624c1fc440da22b2a290a30946927a15b16b046ca2ca91b95534f20e2e7fa0bd0817b6e76cf565f8d7925b3ba4c5971fc2931e7d95b2ef3b8bead101eda6619e5f901c04e4deb173bfacbba31a1ca92d99faa92e6bb2c0f557381c302e0affa178f85cc43e0e346b83b1ad51aebee70ca1620257b3f4354e88880906fa227f2aedae6cae97aacb985b411c39d3d1c4f7cad7f7fcf935c5b03e837eddd7ebc16c4a3be69aa2e5c041257dbadcff2f3023628642a7280138a5e6afb9d9eca06d43ade128893bdc18cb5c3489ad7d2a86b9bb89446dc67581ba936eb5ceb949a0eb5b64a61897520ac14d3ff17afe93df1541a53577e7bdf2a78012fc58991084148f94185fb681d6d7c93648bdd016d559e468be5c7222f1aca43a10c43be896c730e4b1d55fdbb86ce355cbb67bf1a0f75008ea150b1e4a51c77075ef9a3ddc5b8709b494b971a89843760f2b5209c2c7d36a03793d35e7e4ffc90577ff629e77eed4e1f102410111cd3b59e5aaa60ab73713be98fb3d2b0c8f03ff28bf4a672be7700ea30bdb9c1a15dbae75c50a14b634f2e2bda2a95b0142ff78b7b7194bbfaab77dd2dc4d090c377829609419d7a2bf3ffc62d332b045dbddf3b89da595553d4b81c35414ae0a8d84881e51a73e5ec6213625406eb771e5872381f26df2fe72a3fd5c5a46fe89eaa7fcd50a3ce90f12a7da1d07d39e50b303c6a3abd5b69378e0cafc75afd9cc95338d54ce397316d37d91f415b668ba90058d91a85e3b69bf57e40d417b11c44fb723179bc8897cb06dcffef4f411a9fc5711ab8d506a1410c046fd5332face93ba9815d52733bae627c9bd601bce736ac7e0d6995b315ed3937c6ce87205d229c60d6f85f0da66f34d42b9d2e1a07402a64e8e5920bce41251d89d784a67c3dcdf3284e967b0daaaf8fc495d7e7c9a88cf71b8af9d97cbfe80350eef96344d884c487fe600e909c43a4c9666709e3883c4087c403c60ba7a6c5106a1b432f0f29730103b9d6966c1892ee00bcfc424b04aec9721b2f72eee79dff1fceac6d99ffe2cebfbf8de632c9c7e1e4d3a7f6cfd48722f332c6a918c313c7f437b84319dab846caeec7ce1d0e35de9af0f0031e084c80e252ce77253c1edec2e11a4a0c873e93db76f5a4d6a757405edcbf9ff7fa3501edb8ef8b786f596a7ca23a2019e31dbb8375b192daa51b1e77c69253fecc0d24d463b1653872b13ccbb7ddb68b85e68bd2e032e11edda92c6f23b8f8578c82946d33e07905ebe7e7d7a7e48dafee8e2ca3fc54fd28c31dafb280f6904e77b918810f504475aae2cda4e0388e19d89642155c6b00830529e509fa7eab8c5a7036d175c270b84beb7ebb42077ff36d74a68a9fcb4ed4374ffb7dadf9ffc938dcbc165832ca611b107e5b75f3604b6a3c6c991b58129868a247d7328dff45c94504e9760fd3aef61a79641c9b606d46855dec09e3499c2c1847d265bc31fb966d89874f42ddf60e7e46de8dd328ecfff99a8c4f1b8aacd7d92b253818c868df714885bf9bcc51f94af9b1f55e70f275e4e8b7704821c1194b2cfbe7dea0afbba0c863a93eee2a527e0ee758a93bd5d6885f428da5ab5ac1546283d0c1fed727f441967a362cdea10103f59049f42c8dec7ccb0fa7c56dab601b6a1ce3b09c76ad689b635d1c50f090c5148f76a9c24b1df3341c4449292d1f359decf8982c7091f40de1a799182ff988ba3e751d26b589b665efdc7d136b9a2079a26061d888989c5fab11e09fd1a429e0bef9283935dc65b5de4deec9957eb877210322ba0ad206fdbcf6cbb0c502fc0e8aa84ab0a529d650687e2689d814c2ed20bb841542365df8667457718b40de09463f4cbccba8e092de324f4695882f86a06266c5d4662d20c246310681a5364241485973958b2be128b95ce3e70e05506035132e6ab596785b45bfc956eccf80363a2a52795df130922624ad4aa8c524db9799ba783586dc17ae24c25f3dc676e133551594f712c261dec327e25422c1e4b5045360cdb4d02a03afa8dfc25dfd895b75b53f03ce09a6de7e2d6d99d27c8aee72e5e3b75de9fac5468d228b900728f84da76e3c5d31ed448a03a5d9b111c96a0563c29e87d42c81419439185310b8d60227303eb37bb362685215a43880103849c8fd6b6e782abd02df852c8065a7621aa58fa72de2d0a3f4c05d3c2fc3044eae5496a3b39a80ac10f74ac792e55a4a644eee78799bc9facb5b562b46a0c35e3614efe9b2c1dd8f3b2c4f4e5cab9169b6d1307976d20b5d695bca0d8ebf7822d130c6ed314121c254ec8b8314ea4d09fc256bf04a1740b955ca42b54c22c7da6cf387da9ccc0b574a277c4970cd6d6204e49645df5c3ce508b46781426cea32c8653ea7d758221fccab7c82c29e30167957f02ebc4907fff8c613e8e56958d9dc666ebd283ca3e90a8254a4124e171cc62c33bdaa3ec632d794dde971e54c42f925c1e075a6b61617a9ff39bddb689e0c8d97b21bc650e84a557d9093826aedf2e92fa3e3ddb40c9af29b552198cb4adc6edaed35778703f897135fa5c8311b2385bb0611aa1bc6a4b3099a29f9baad1daea6863405b74df3f790ad65712383f2f28a1a8d5d9f053b05180e15bb176579d2667fa949df677c97784c77151011b0eb72a0ee9f4fcfca0518dce414abe2d5c37eea0c76b9a21ee3b9f0ef145ade93872d27d6384cdfc4ef66192f77a165d2c5f16afea31f2f292dbfce89996e710332bca1d942ae8deaf21852644e4acfb57698d551602a312714764146b66186658aecba19eed4152abdb2aed1a1d8def0ecc947d2fe0e0bc809499fb1b3bb6d1ca620e74219f90f72f2900399272859ddb30e7437df957e8b0232a632c9269dcc4e177b4b90fc1b9dca9a6a60ae47dd97dc05c99418f47c8ee97feb7a0a964233ce907775e47956c6b1285a089bb4fd0418f28682b17c98e33461b4f28bc9cf7758cf6bf7cae52c0fcb75673147733e6f93475d4001d22c946f6d105618f9dd8ba6dcdaa448de52bd8c54526a9d55622eb15d7ed60eb5696ccd2b6c91b386628d7ec7f90f77671cd831db57cfc020344723ea3c1a11452ddf598447eed10c6a4fcdf72c5817c9c6edf7cec6c968938fe186c89e876e89963708f58fc7c4df07da2855d45cadeb530a7e3a44984975f69483954f62f2edf25b04af426b5940385f7dbd89b338319794a35cabcfa153fa8c58d7b0cca58c67a232a384d1dc0940e6754ecc22317731421a7830b99f7ca2eb5d6d8c686d47afdf3209f6d1789e47b10552f74520c2706d629351037e6b10969a80224db5b828fee9a92301ff29a47d9d3523f4dcedbdf757453ca5339c9892269943a447e55222e4d30553791e22e8ef5656edd0511858d9fcb80cc22c1d127573c3083604b46b46cebe781af28de12c7565fbd4bbabf23b4aaef50c6a9834b7d1079d63d18692f6c5c5d3fe2310af075d60b6f5e0be8ab949b5a1227663fd47f651996955db3db3cdcbc6a0bf12d740910727d7c466c0a83c2d011b458c4205ad83ccec57a82dad7dcbfc90f1cb88ddea743113e90b3a1dd337296c4330ea7510007def25ab67d914a1786ce8d52aa6b3968900e99ae2faf5a9ad43937a6a0c0a7f59cfd53341e8c48ce8f9ac55e3c46eee50871cd4ceae394a08c8f96b58ab26c4d6f3c55d3648b9e0a83370b82834f1a1c82459884b387a70ec3df95471707db4ce57967ed5013ffecbe3bdcb0b62b902730d7a2e55ef7a8672493c54ea0c1604e43fdbfc6667577486b01d1a33d54cb1e06f31e4fb8f2b629a46a912e935056d6afb34275fd984dea8cb222a43f5c1060bd7fa88a98ed11f4310162f3701248a0796c3a60f6fb1b932f4607ecadb5d39ae4e12f1a332c45a042deec602f6c0cd33c4d0672cae565c96081d41a5e7995b909b5d0a651e37c807573414d744d8ec730d9e694f7935118404cd8f60a3ad06747e7f87bf6aa926177b51326d5efe1899220f3cb28f6dc223db5d5418457be2eda0586929270384b360f30168471adf50d61aa4b5522bc55263832c653f7c5d4e0b1af3a8cfa1d8931e2c01d761db6d4f0bc624f254f1f950699c584391b12093a597fa4cb5e7c879e0ca8c2f60a41239813716f9bbc3fc2f6c2553160f36cd61dd015fdfe572888ffa7cd052c8bc6c9e9d36e58b29ffbdf6386731903f18c10c892f39d42ae766e0cbe8f5b7f732a1f95f0809d35ff4ccea060bd7538187781e094ed6a54132b5c6e304d9dab68f15e3f9d1610c03c0468a74c522376fa5b50dbfeb3892e094c11066e0265194c9ec828e399b8655708c1bd7ee24d0b0022938ba1f0ca48d22bc4f8835d96471d7d9056744528ae00df48cf155cca40249c0492887d722c5b918331c613852027fe3f3cac2cd05096e242d133540d0f393c7b7d3bdf048c78a91ae844124f7cec767cdad7d87e7efd9ae4796146d98d86f3cfaf16a342b7c8a22bdc1a8425ad3865602cadbb8cc6dc20ee3e81de5b84514fbda636cf21c4ecb47a73126db850751af66d0f8b12ddd36afb580af236aebd4f5829a392c9bdef3224b9c660b52687ddc26c7cdd8eb33b5a38b9e39eb176f7bfea527bc37b09180606eb6e7884e35faf528f159740a21ce02122e9047f8ef7a3b8b58466a77acc01d6f56acfc513ce59f9ec0b9e462964c718dd07e14218708e7951e6340c1a395b425566fd7a707db088abdc8c25ff4a18bf1a9b627b262cb7387e4137b81deed0076a63601604d69f546940f27d033ed6f63b8e3c9731555b43c3553002019a8d75743b7db2eae7b365fca3317dfc4ad20febff767a51bb55d94ccd4f430fbcff034ce591358acb43f1002c390b6795ca17580ceb8ac1728638651316ad44da9a89760e701dc428d033b42bc0befadf7ab7f4b369258d41f15596153bd8c2bf2d66497d8bc548159dbc84bb6efadbf5834495f2967f9a2db1e97b84ced4b8c4e0d449707ebbcf73eee1ba254c06163761a1456b334597c23a9e5a96a12431ac0dffe5908852a15a5f36c3cfe5f31e954b25b2671a60fdde85d186e464443e0c83c0cb4e6a6ad230ca887ad985df0c9ade0dc8668f24ff442cf362f0608ee233ec46feca3ac462ff48e7cdefb9a0b74fc6227adb92e06c5f9303edf151a5c85ee342f6e3580a6ced28b92645d8ceb46ccfce3a938a3e9ffc9d99e9d05cd35543e91eceb66cc5942476c7da820e29c8dc858e7ba242057563be1667e3efd9d21979aa0c602cbfbaa492faf71b3b0ed3c6fa799b30b03ee7d3b1f6f8fbe2f6a4df98dc5cecb1405abfa3582ef64d2678e54a1d811f3c7a0bb71128adb0469aec6d2705e9fe6cae923294b941dac200eca81ed3de3b07334c2927a9d0d60849766f2e448d65783f9e5d34b965ed83baad2006ff6e67d23c38fd3050ecb4baefbb67218e5257641846b57e5cd4a2595791af599ab276ff02a35943a6d3bb790a6f928b003b354b5d0ba7468a190ecbe27ba09b1f3eca18178138a148906b86a2f7565bd348fe9bdfb4d287dd79c78ef7e07dd380f8db5f84b57a7f3df7cd8f0b027db68a8077602a12b99409e5938abfc3792f526ec7e3f8bdf75d35658f2e258973972be5dbeb10495ecd72ee461d203db2967436c36cb1a2e4859d328fc10d82c8706a7503b7254639f6ec7283c35a196b52c4462c169bd0eaa1a6dcfdfa57b1decdd4829c80b7a3df7c04676947897bfed5798b87db75540d2dbad5c11d67a400897f389444a9585b0bfd5d0b70da4f8253eb00702aef099356543efbc735083fb2bee88620f32a2685","title":"695. 岛屿的最大面积","link":"https://leetcode-cn.com/problems/max-area-of-island/","question_id":695,"issue_number":53},"51":{"day":51,"pres":null,"tags":["BFS"],"whys":null,"difficulty":"- 中等","description":"```\n你现在手里有一份大小为 N x N 的 网格 grid,上面的每个 单元格 都用 0 和 1 标记好了。\n其中 0 代表海洋,1 代表陆地,请你找出一个海洋单元格,\n这个海洋单元格到离它最近的陆地单元格的距离是最大的。\n\n我们这里说的距离是「曼哈顿距离」( Manhattan Distance):\n(x0, y0) 和 (x1, y1) 这两个单元格之间的距离是 |x0 - x1| + |y0 - y1| 。\n\n如果网格上只有陆地或者海洋,请返回 -1。\n\n \n\n示例 1:\n```\n\n![image](https://p.ipic.vip/mmk1kt.png)\n\n```\n\n\n输入:[[1,0,1],[0,0,0],[1,0,1]]\n输出:2\n解释:\n海洋单元格 (1, 1) 和所有陆地单元格之间的距离都达到最大,最大距离为 2。\n示例 2:\n\n```\n\n![image](https://p.ipic.vip/4qlqlt.png)\n\n```\n\n输入:[[1,0,0],[0,0,0],[0,0,0]]\n输出:4\n解释:\n海洋单元格 (2, 2) 和所有陆地单元格之间的距离都达到最大,最大距离为 4。\n \n\n提示:\n\n1 <= grid.length == grid[0].length <= 100\ngrid[i][j] 不是 0 就是 1\n\n```","content":"096221cf5b628be1e73e8bcfe626c734748625960a3d40895f0b427e2234606a2e882dc8c9066ecde89f32f426e3ac57af2400c3906714dff32ff523fffaef2ef2326f68889bc0e04425c3b7c49b4f703aa971879aa5419f27f435c1f4b0a58f552780630bf6d86eacd4c2f64a384f4d9851b0f85120a28e3e60694cf432d7268b9646755d0028451efa75fb0ff86ac84a157f911174013994ce4201c8e785351e2b374a2aef8d40540070b1cd79750034eb89f42659270af3078c3271a44c09393df838cbc6cb4acd9e66336dcebdb55bdd79d9f9e808230654b0ca37119d20166bb501dda07a8e1081813321afc3ed4f747fade6ce233d12cb22efb6cdaea9ed4b86b2bd9a4284454e7a02ee575b47f7dbb408fc33a74799dcc512828955a47621054a94054f6747bc5ed144cd5d20ad90b6d80a3a81c7997ee8c070855bb8127081950107507e956b0ef1b88562eba9e5887cc58b8d11a166a893e078529df5c6b13329fa3d87743a33210028a5cd7e99cf77c77fa5323b6ab863a5829bb55ca1511b4e3d9eeb1701f32e78de0339b2e670d19abc56b5a8610bfa51585450f7b028125f60e43c938d1642c7d28c05f7c08ce5e733e653233344b7677ea3828213b9fbe716ae8110a1430971293124589271c7d2e9b28395528fd37d6b438c1bfd0c7210fe8f38eec6d714703d4bc1b3dce50aebb90dfb9e2b8d3fdf9d11e4a52d171e238931af20cd18ead588d65962bca396f95ce05f7423f2cabef4b4c559bcf4d19aa58bc24168069e84bda5221853705433e76eb5d46209124bef5650756651f5a498aed33135153a6b30a8aaba708d0cc8cf30801a23dead72459f59c6d87458b6586e4c622328fd7477f95cdfbd9bed0a226910a8ed07bd6f7c784f3b4c1ea1cd2c9bd69e551546eb50c7f6d5571223c755a54c974292dc159ee5ce71c67530248eddae7f170737fadde2a40ecba703fb5136754c54f755ada6dd698825f75a3d4bf80f86a11060af7e88fdbd584b4c379978139ce4453ee3ff77aba329c6581408008acd615d2d794d9f6aefa0b40fe6b5d95619f65cb792e1893d2e5529fb883f39b1df30ac1c9904fe926b466b66df42aeaf17070368ad8452b6bf25ecbd85da699451954db264d314b690650f02d2dedd4e3a7455f68ea88fc22e12110b36fed2c1058bd82a63529461e184e8e59b7928e548878909826b8d771135498bb8f7b01ec642d3e619031b94d8e0932506a4a382976ab730e32721d562a49e2efb172c632fd828370797bd16f783c9e77a183bc8bce2d3baf3e6f1e1dc76ccd82515e327dc3b7cca8b65e5a08f1af7797e8191e7cbf22ad47a1cf72bcb7a46856990d5712164d5ffee86fff6f4e0cb5c4bf9a07d03df7191a751f06df6e09b1bc5afa6ea6229beb379049007779f7a5132eeffc66a6fb4f40a48dbae602c1f54c2ff6462b312ac06fd27f323a2ee888b009187021f8149b80a9e752655d6471dbf6bcc516db4843166a7938fea690a7049215121c42ddee1b6dd126b22c149177d8dcc56a7c2e8d7bcc647e836020b50444474518f3e008dadfc74b08bb7b5113750aad7dfb0664106ed4c31f3240856cf5345813b797c2f9af5c659c06c5f305819c694c8cc51afa48c475d1dcc46d61ba9a3ada00876af743fb4661f4c6d432d55a9d477a083b434000a34a1e65bf74fc619323c9cf18d1797ccab3d7fbba00a8d32c3fbd64d07b40997e87f85583ef446eae8e3ad07c43bd10e227293ce5fb3b15a220f3435f270b222b1199c7b667d7a85b8d9598989be6854fbdeda06279bce264d5cb039a8abfe2454af0355b4acf348551941f68295b84d3e3e7405a2fd8a238df5052d612e9c8fe33352413ea62a683ae91412d6f1b42b0cd5a72037359aeaaf91ffe7a74daef3c965d62eb54dcb3c8013c6a9b2eac889cd1157872c8fccc857c991892bd0fe23309d5f75e3860d93a91aef370d3a998542a5a75238014a4ad721dd378b548a184e9ce66811235615ddce62059562946da34697a7c366606badb02ca0007b43fb392747f80f30c269982d3384076922bdc300e384ffa63fbe7f43d69bba14a312f73d5f2e8c61659b3f1a6c5709c68dd9f0c685a7db45681701c9f36a6fbd5ee3eadcfe3460050ae13876d9a99832ba0725b3a2cd3d0e138e26d5259676640cee7229a20bd3a51530c3af79f8071fa43ad5e6b79ba85b2f7ef272bf70c9992a4b52fc0d504f1c27367f0c6dbd26d3b695f936b564a9fa3fe4bc97a3e4c3a4cad1ed0ece7d2f69e949cd8e234bda83ac34e7ba87961d8b1a93b64bdec90bb2f63ddffd3c01509ed2f4ee8bc66e65f877778f9f590896f27ad644dfcbfdf2e0ee678e4432e14e2c7347c2308f11ffd2b605ce1cf9398b6ba4910ab389aa6132689772e4247f751ad64e821c1ab8ca896d8e61f3f0f4e017aaf56510b68251703e11f249f1570ef9e3b37f7be9419d51cfec5281a20f7ff5e6849cd4a5c54f4325f0291413a2bd5cf19ac4187586f9d76df757ac0b492d3ff2ce38f441c5a66b5db2bf69d5294333bbeeab5dbf9530b695d6f5759d03571fc3a2a8389dd5f1b5858b815054f0f74a73e73176109e088d50ff7a06963335bd65efdc68296c97f65e91f39eaaa18e14f0f39b0c1ed837c465f1bb2df10fcfc50a75f3bff319dd9c148c25cba4a3e7ae838d876afbbe97ec126d8a08909fa9b48b6d2b70489f83aecf8f4f6448082e8951c7a3ce32848d0fe8869f4166b4050308d186e81dedfd38ff8d132aa60159e7a0aa39d4b758facc99cae9541e3e6151c45f6cf48a11345db785dc989ae9ce06bb586ae1f3437a7c75b61bf3f11401144018344e8b88b25778e4d4cf7931df749270dbfc308dc790fc061c0e272fb23542f220f64cf03be226b2fefb9d92918f207912380fdd3fc43d7cbe2223f785d0cb7bd7104bf433f7bac76ae85abee4061657009ed4d556698be98354c4733219581730d2e3c29399f05f2a783f35e0a245c5698fc22d3a4026d3f4737846739f35310e0f15cd58be6b9160aa6a63b7b4a41566577c541d11e03f65a7c1aeeb624b990af4877c806df717ea080ca27516ce52c993774915a531072551f69f9459c864da7241b865961bf86d22f87f1be76b5a7f186d596b7d3a5cb8172f971b6e0c575b500bad673d5ea219201afcec41ca9bce8931d3c23ebcd942450760c0318c707fd345fc6261fca927a6eeff691b3fc3ed405f9351903f2095c4f0b0f2c175adffb8dcfd73fc1479b6d583c9c325e60e626709201cf2c12023ce691927e458a716ade9a37d958b5f08530a12f52ad564d29c3d178d149dc596ab169f86c09ade0a6d2389a8916f467b305e0f45954fde9c07de9b517119a9542ad037f2a1f40b5e2c44743bd99646dfb915ee732da9b9995efb9a63732805ad617f9098c58f7b1bfdec1468e3038e95ae6a2e492d47b6fb54dca0425ef8582bcceb3bcb37adebfbcd2c0fa8e1f6b418837834a55d4d202f19cfb948e754cb913b5eafe8ffef8dbfa47981a68ccaa5c2eaa1c6844802bf970c15dd173908b1df26fc8fc6c0d56767acf347358f6c0f6eccf90b3b8af1ad6f53135aa2aab25c5c1497a96cf9782b459991409b3ff4bd6c18fac3d4a8df96d39ba5c8bd62a99fa3ddca9abea9006d1597077ba0ff571e398a501b3515717971c7235ebd496d30680bfd0a2f1aa9d98bc931233c92c14cee2c97b41b2f15ea4f0068df5c9624e3c67899fd3824a4ffe07499c11cb796e60f0a909260da86b5bf4bf20b98b058d5c99d47c7d75d09313d333739470bd24fdf1f8f9f9bf820d090185bd5c4a7e1c5501f15496e98d178372724b314924e51f37c6250bdac07a9ff9ac9fe8ae79fb070be0b000cf724259a18aaf4530a7c7f321d0271d01db5b6c164f6e42e5a524f4a4b650d05e6a6d4fe52c980932f440c65d0d51d7e13309277d338ae973d8238c2915987fc5a04bbe76746125ee644ee034a851877b0d1fbc995565e4eb15b81e4dfac070ea11bc0e067ad22c9d6fcb48c7ea502e9be5cff890c13fd01ba97a8cd2398201d0349e3226a3c05a23c60c8a7ddbc51b719ac51e643283990e091894f23a139ab78f80f96dd97e8809215f4f6d219394e24403eefdc77aaab3e40cb6379612fcc90605d66c01bff65b1cb69b85311ceb4b3a086add21e5d7e27992535fb46997cf76c32e3691ea9f846582dbce38581bf9fd0a360794b433299333e11d1477345281b7bb281f0d4aa079032ceb526cc361190302eb3c6c9fc5d952b848e714f1c1b07e57e4aabfdf7baa0578c8a143cbe675c2beeb0c7379575e16bd213ec02f2b15609c2006dc888b209f37cd7fe6316077e551d98ef09caeca694afa697c2ab413d44c2669c63e4dee528d7255fe3fefc5730d87f4443ed5569652a1d6b20106611a0b0a1ad96596ee5816ff54f3e8da648cc816a32f1c9bbfdfed38d1b61ee85b24c4b1f6fdbf1a56a680870db3985c0927ea51e28fb50e4fd2a37752cc52cc7ffb277b0b943f1bedcbdebe60af260c83fc01c9f41da0f81f8dbaae9f2a0212401ff1b653a03f43e2e538de985ec4d9900ca39286e1e9396220a640a21bc82f76596dcbf7cae52cbfcf013277d247fe1f82214f94515648018b7d5422f87c091f422ceb645d1bb088cf5457b83951662c13fbdac36aa56f58396f38b3d127f688aa66f93f309778f9201b630ca0b1b19367ec68fa14f78ddf598442eb8528aedbfdf3bcd9a2ed177ce11be709de637d94b5bc0fe32ebd03c28f47c8e0d4dbf77ebcc54549df4ec39abe3ac1188974f27173908be7b4f8538fd4ab026a88f388c8ac1f29b3383193f0567cab4b35b6ba8978d660cda43c661653660434f97cd003b11e3cb335f305d73b0884c99edae6ab58f92c698c97aedf361d16f5882ae73451b357450427e0681607c174ca2f83340b80c22cb3b91c3bbceff6457e99a04d2d85b3f16e4dbdf757453ca5339c9892269946b113b4921200427573b9bdd74fbd66f1fdd5d468c94bccbdbe622c1d127573c3083604b46b46cebe781af28de128e5f598f72c1a43f9bb0e45ffaa9834b3e4404d674563d547d214615e2310aa321935b3c5e00f5ab85b1701227663fd43b234acc975bafcd7edcbd324ee2725e0a05603604605d73988b9f55f142ee0a1a987c8d952aa8999b9dec9a0f6fba80d392581b3190f58bb07226de893101ac0d431bc2c708b764914e178ad3c048e2066b3cdd0792882fa24bc7cf1337a6a0c0e4bad2ae07340ae81ccecbc3be4a4146f3e553609c66faef94ad9d8396a58a836c4d6f3c7f8331c98006947873cc83025b0dad43dd88e9f5c347908b89237e42d31aa06a61eb544efdecfd39dcabee629a357dc1edab4dde9c585093d936e9856c4e0ab3ebc66c6e713a4a56c0a33348d65a4bf50576b2b6b332c724c555ee501583fd834575e9d451e1e7fb70b87612446cbd7fa0de8eb044f7584e3afc6c430de57075ffae1b6ccb54bdfba9372d5544733ce3639ad0f811b803cbe260237f5eeb2b0d063797df65953c81974f0c1a8cb04aff82f40ae770875a2c6e5f7146949e7a91a2c0c59f161c4c4bf7fa0d60cc24108b9328b3f1f8353bc71c3b0c755d4709ef1f7eb831478679cea83af94dbeb411c1165d69ad9de4f297bad004ed68259726f8021159f5285d7d4001a4125f08777629a1495a81a331a592543266f581e4817f18507d129454b38ad5440b1409634249a4a5457cce9507a1aba3582071dd520a7fbd9634dff6d34e1b4af36cd61dd053b2ac136692b9b49f06689ac69aa7815617f99f98c472c078515f89ef5f849ef3de17fc173c49ff86405573635995f8c7cf7cff71d4d55ca5417c096ac2a4cfb5250313205c7f3c4ddefe3a921173911608bf6e653ae20d5b385cfa5b50dbfeb3892e4d0a420e785e7c0813d68330f0a0b24d0b49cbba24c80e474a269a8187f0891d804a96bdc2548d6d1d7d9056744528ae44dd608e2f75c979288147d7c1253d7b5791c0649470ca6c27f53f2da02cce05c4831094725d1625393c7b5766f559a638e95ac233523c7c8f39389f1844931c9e96e1392314a2d582ec9fb60ef32aeca7e3449a73d769ec767a4a31adfdd9889f74a771cfde53825652b6af7dc25bc4f1f86e295467f7032155ad3f61f002a0dd26be164da67ea2971e5679ec9bc1a9f45f76f0826ef963c99a962467f7c8fc251f64f0ff8fe23feaa2fa594ac3324f514851a4277ec1e812c301875c9b40e815e07a08e90424a4f8acb8fc84a01ff5cc58d6f920cf03ab0817f5c645db11512d9c189e18b1524339852a59ba3f465e7f3d0b706aa1683560c994b6ccc72ff34402fa45d43c3f7a7bb73b75733abe4fb9ab4d1763610b04c796543b05a62851709fa020ac72d2662d1c0d8a014b1720e1894d235e7da1e6fcf765a0ff3161fc49fe5db9ff777a06e711d15a927f431aa1ee6145af973a8103911d9491dccff033d71b90d1714255d5e87e361b5fa144909a84761f791dcf289475e72389f1b5db2ef5baf725258d6bf108bc153b9e8ded2d6e0538dfc50115c9fa94a82ac895acd465f3899131c65dccb24f848aaff39dbfda4639ea50140eccaae03f4293ebfb2eb72b16334e97957ccc5594eda4e30e8141445403e76780cbef7c28f636f40284b4282cf7da5918054d4320924dfede414c27a5eaae0fbf0b1172470f43c802441c0fdc2bb03a8be963d294e7721cf93aa96f7bce448d6380361b7919797ddf18eecc7fb4e0a8c727c55b3cbe0d58967d811b59fc93db40ef76edd514373fc5304dfb0968e10f1e5346604df811c02161b3ce864ac6b9347ad3dc8c363807460961d334410f536c892567cdc2daca3e7588356a18b2b2cb5f2e6b93899e3f7d6a768517be0fe8d395c77a464a3c14595740e6e8de4817b5ed512adc67e3fc39a59317dab3e3cd3a95ee1119820759aa9bae2f6dd92575d01762bb6f26e06e64de687697c0c28eaaf959110ceddd8d8a95836ff59fa704afe33f88343a261ce48f44aaf078fa42e54429eedcc7d1e02f18fd354f06674ada3e7eb8e97917c7b50f0bc126e24bd06f09d2f9fa282f34c39c46680d3e0211c5cb639aea0f44b1791a82688d3e68c000f9169006d590a7027626db2c50492c634d30b082c6a8ad5990cfb5d41edef969662aeed59a13176bb9c6c53265670da882412e7e69f441bdf1d68e382e216a67be9665d27c19f029ca719ddb2ea5cf9d6dd0c48399a7f83c00b0af21831e2d201e18f72a52cb1140b69feec40d81839c7a28ee692cf58ea8f26e8386ad14373d645e196b50ca7273770a301a442a231ac9a7a3b7a31cf5415aa46a4f0dcc8cb08a665404d4f12cab16ebb23fed8a732076f5155f248a1cc376e4507e63bf40d0580277abc83b152fe4eeb0c63ea3272fb26f12b62386024960fdce1775d0aae0bae936a7c0a0a5c78c8ea769615dca0c0ce46e503b372b8be14b428fbca8deafabcc7b083c5ded2485534c85f900d2d048c8fc39d26ac90dbd96f20dc57bf924e693f915547e03216ca996d29cd55bfa8d7d459bfdf01b7fcd91a80c919adf485ac477e841e134c1c9ae3e940eec725ca52fd0dadf146fda6f9b7f76fef00253c44c2c1a287773af1604cf6d2220ed92d95ac4bf31315db272b957125bfa6c55ae8eab304068ced3cedbbe4984c9fc7b4075a26e18260e2eda495f066245ac588ce26d366a1a9d1fa21b08556716fe1bbc6720557deb37500835c8171f0d3a3d488646bdc44cea69150cd0b0fc04187126144ca79e88a9d9b721722af9eaab28b335e2375c48dc652acc7ae0ee2b4e4e4492d5d1ae379f43956c4acbf66f7fea4d7360b1d3d791a6f71f5668072a2c44f5af56f8abd75b3f373595a606b692ea0dd21ef8ab3f2f5f4961504072379f16bc3e91c521d26526d622f3f96dd97b87b2bc99102d21a3309a1d131cb7be0aa3c288ef2cdfd92b79278fa653422905b8fdcd40776246b7d61d1e6497a137d70b878260bd6f7b8861639616ff18e10d6051a572137f7062ed3bd373e5ee7cf516c1c58619a904f3e9a35651172adb75cce0b0c36b6a2d9367c0415b48b1dbfe4b256012412283275f5f1d672ceb957e78a3951921a7f192fc142cf0b376a31a1964b563db2200dd108c64d7d7549edcfdc230cfff516f65e1d7f2676573a2a3dea77d79ed47e5bd67ea105cde73020e7e8e4edde2f1bdf0e92cd4740f219223af726bd458541f","title":"1162. 地图分析","link":"https://leetcode-cn.com/problems/as-far-from-land-as-possible/","question_id":1117,"issue_number":54},"52":{"day":52,"pres":["BFS"],"tags":["BFS"],"whys":null,"difficulty":"- 困难","description":"```\n\n给你 n 个盒子,每个盒子的格式为 [status, candies, keys, containedBoxes] ,其中:\n\n状态字 status[i]:整数,如果 box[i] 是开的,那么是 1 ,否则是 0 。\n糖果数 candies[i]: 整数,表示 box[i] 中糖果的数目。\n钥匙 keys[i]:数组,表示你打开 box[i] 后,可以得到一些盒子的钥匙,每个元素分别为该钥匙对应盒子的下标。\n内含的盒子 containedBoxes[i]:整数,表示放在 box[i] 里的盒子所对应的下标。\n给你一个 initialBoxes 数组,表示你现在得到的盒子,你可以获得里面的糖果,也可以用盒子里的钥匙打开新的盒子,还可以继续探索从这个盒子里找到的其他盒子。\n\n请你按照上述规则,返回可以获得糖果的 最大数目 。\n\n \n\n示例 1:\n\n输入:status = [1,0,1,0], candies = [7,5,4,100], keys = [[],[],[1],[]], containedBoxes = [[1,2],[3],[],[]], initialBoxes = [0]\n输出:16\n解释:\n一开始你有盒子 0 。你将获得它里面的 7 个糖果和盒子 1 和 2。\n盒子 1 目前状态是关闭的,而且你还没有对应它的钥匙。所以你将会打开盒子 2 ,并得到里面的 4 个糖果和盒子 1 的钥匙。\n在盒子 1 中,你会获得 5 个糖果和盒子 3 ,但是你没法获得盒子 3 的钥匙所以盒子 3 会保持关闭状态。\n你总共可以获得的糖果数目 = 7 + 4 + 5 = 16 个。\n示例 2:\n\n输入:status = [1,0,0,0,0,0], candies = [1,1,1,1,1,1], keys = [[1,2,3,4,5],[],[],[],[],[]], containedBoxes = [[1,2,3,4,5],[],[],[],[],[]], initialBoxes = [0]\n输出:6\n解释:\n你一开始拥有盒子 0 。打开它你可以找到盒子 1,2,3,4,5 和它们对应的钥匙。\n打开这些盒子,你将获得所有盒子的糖果,所以总糖果数为 6 个。\n示例 3:\n\n输入:status = [1,1,1], candies = [100,1,100], keys = [[],[0,2],[]], containedBoxes = [[],[],[]], initialBoxes = [1]\n输出:1\n示例 4:\n\n输入:status = [1], candies = [100], keys = [[]], containedBoxes = [[]], initialBoxes = []\n输出:0\n示例 5:\n\n输入:status = [1,1,1], candies = [2,3,2], keys = [[],[],[]], containedBoxes = [[],[],[]], initialBoxes = [2,1,0]\n输出:7\n \n\n提示:\n\n1 <= status.length <= 1000\nstatus.length == candies.length == keys.length == containedBoxes.length == n\nstatus[i] 要么是 0 要么是 1 。\n1 <= candies[i] <= 1000\n0 <= keys[i].length <= status.length\n0 <= keys[i][j] < status.length\nkeys[i] 中的值都是互不相同的。\n0 <= containedBoxes[i].length <= status.length\n0 <= containedBoxes[i][j] < status.length\ncontainedBoxes[i] 中的值都是互不相同的。\n每个盒子最多被一个盒子包含。\n0 <= initialBoxes.length <= status.length\n0 <= initialBoxes[i] < status.length\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d84c0a525fc6e7d3d784a59422654a0842463d9fd231c0a9847ee3b6bdb79df883c5ba5cb3d35d527a9543c78ef08b89cbc122e1f76d3e5445d4618a6afbe1ea309484d8843d23ce10961654e0889f348f2b93046ddadebe9f6500f4c659e51a6f0bcb01744a62a35469a60d858f1a80c2e5d6ba3e4d5622487139b0fee2b5748e858764b718ba7222ea0bd8c5c5d1e743305aede7f23796ef896771d4224a8f3f478271b6eb527eb4f7f19a1b09e1714bb6f0180544073e6ad2582c39f13b809f31a5195e655680425a09772b18ba2cb077a4df4243a620088e6ddcf90345f34d6e9ae770a93f311b7f88d40f0f003e281e9c450cb38551446f9323a5796b1bb6da61ffd38b99dbc22e8c94af90717adf470c394f74f9a53fba918b8b27d5fac90573f804d5191631c9f42a574da9a771ccce4d1ab4c64861d55098a1d2268573d426c599346e3135ca5979119096714f66c15fb13bbd0f6eddfb56503b52943b764dd4675263bc775eecfb46d21b1bfaa8db55f49fb53ff5128e84c479eb970d19abf5fba925b07ce4752746cfea32b1e487de71aa18e326cc5cfb207effc8de1c231eb5e072794219e8a327272d9392469c446e29d6df6cda2e6aee2c354a6235910460f7eb40d31aef6ae4fa199177802f18c21d8cad028781b552220bd8a20bddc018bd639cc790c55970a54b6fbea99c036d35ef74a90c0dd9d4209c381f79f40769732c90c565e3101b860b3ebf297b6bfc24168019595b3813a1a7257512bc4a81faa2775262eab791e27732fb587d40e6e1c297e7849772e7744f767e44f34a006d333cba2784f9fc52138c6de0cb4d380b49ab86bf8d23118e5d6fdf7e0fa3a53f0cf5fc98d38285d451b30e3b708d6a9972665738f2dc9a9b16c9323c244a75a8a68852a97412d738034582cc210783eb58cfbe93a712125da55339932ccefa2b905b20aade6770102fb2ed5fe15bf5787c95f60c7238db7d649083500e7041dc99c4d588fd304ccbd5d9642625b11e1987f1067423ccf4286dd8542a22042501cf7b109f0a40bb12c7938fb8e0ef12f9565a4b31ce8077dceded5b526c45258af82fbfb4370c5341bec3c140f2a82fd9a65a127db159e4725e9e0be471d2aa5901d5af89ac3eca6a3c8c081cb3e4e26f68d6ca7d5842de45a3d033a0bc5ec74bd4c768248cf1fa3d0c081c3640b2dc215f0addcc28e7fd4e18df3347bfd941897568033f81521e263a68129f90f1ba5a76ee797b4b47a48fceb92ce1e4627a5edd197ff06387d1820f22519accd3ab0455600edd839fbcbdb21823f70dddcde92a7348d1124a251ff1f1db62bf7d91a5d7cb281d8c4bad186bbe10312e1ffd29ed84ab64538e332acc9f9bc7ba987d28fb95a34aa987cb8b019abbcb1323d0b8db4243fdc956029f799e4c1060ca393568519b665d927aa5a591e6cf45d3188997799559af22c2e22b64f62ec4d1be2e3005192f91e04713dfe9dbbc2d19bf456e65a6f623bc18975e63e4a50d0b878d85b72d69ce948e602083f7aa9384503ec3c6fd3b68e0aa7edfc854e97fa92f1172df8855edf265bf3436b6da20256ef6155246d9385ab45ac3673640334a8e6c19d399ac4df552874dd18810ff3f885f87362f808271465276b675b0655a0e4759f8a9e237e6d10100821ed65f81d1604728da63dacc598379215f25ba24d4c5408d1a1fa5d91ee6392566fb173bcb0bba10bd52beb506b75a99066f4b84c6c55600607fcbb33a5049d7b5c4724ccb7e749a7f2e915cd00674ed09c2f3ad5b04029c410376fa1a36eb594ecc89c4c77163399d296a588e0c9a0a628aaac559e4d84e1d488453a09ac97a2f8c5542278a5b0fd337c70a43bff14aff3d6f5d8dafce9b9f35dd37958888524f219f351fb070747eed8a1f1d3750a844eeae28113cdfff434a7be19480ac008286efb0364c930a8a4b57e46cf6e5299f5edcee23ab22ca655f937004c8437e694a880e64f33918462c1119a5ec1155a822434eb4d137ce08c99ad94b3cffa2f9290cc36cda7ca4f90cdc03c64df76681f2ec362b4ab015bc205c86dfe61071ae9067dd7a7f8e199c05a5725f9c8a8a9c7406b2017c9c7616f8f6de0cff6f1327c0306fa3c62eaabab3cb60319be9efe311c0d8c2bcd2bb846662aea732a9f08e2b5ddbd7fa75ff00a118f38cdcabdaf945a287ef3588070f5a6ecf7e3fc0e564d201e345a356c9215d3b9af3cd96317b83c45dbddffaba2a6aa593853ac2c010e268a647f09e8a8da54147fb9a6eacc0def40acff1ff3bc62a3a864d259e69d38c2c595bb858f1846840c7afbed6975dee7ec00caae92c1a7bbf02efe457fba665b255d8865ab7b97f9d35cc6568a1cf321920adf0feed5417c1da8138e082e1a2eb910aa6e64afacc25d12bd6f98ade153f3c527788cea33476163d0019f5a4d9ef6f8df9b85d60017b4c901c3845d1af8436ac0dfdaad4b3374db54849d682e2fb8bdbc446ed0b1c3276fea6884c3e0aa7108a75f9b5917ade4157b36c16a230edc74dd1c9eea6bac1d029360e2b8c818c1bda81283dcc491106360cc9e1230edd75599dcc52e884edc5fac852988b53ce0071be9f19cc4a517d4d8dca6752885fcf354bdb0e347c8a03c5cb21cb3146cefcb4a23258f6859b926f50a3817060e3e583ad51d3e240eaad34ccb9cccbebe956aa999a4f0cacc467fbbf3d399e9488e111452f81726de740224f592c303bedc7d3b29b896d360c1a03d2662d09a694e47be2475d2260e0f6a685e6fedbcd926eb1abf93424264c90b5c99a0e8c02fa65165ee1f3b4e392f867eb2d77d633e2e5a3203c3b5dc1e74998dee0cb76db1ea4ebda214f7b5989b580d654a20f54a49b848f70c892db37fb66ef99691918626bfaabdd840990f93d46d95708089ac8a44bf4e41937ad0c3987bb925aba57c0d0b699cacb16cc98bd5a757cc783d3c451b3dd4e3ffba99ea7d227f3c39f3a347db7882cb20396314d1c77571667658472148463ca224882dc749c91c59d9eea15a0a660d0a3047891d04f1cbf8967e2fe9148ed65f25bf6f79b72d45cb6b9cc150f291406bd0274b5e37eb19e682229358980779c78d799e34b2b76df5dd08d190ee88b9a9d7b8e98c33d6fb16d2c8decb8c41de18fde4c50eceb6fc3955ac4a7e0d4e96777ff9611da6e4c3e500fa7196c74fd47995a0a8f96ee3ab7ebadcaf182785f928ee73c8ea6e2539463f78e120735e0561a42391a25f487a0a048242b3cfbae6782d89933a7e876e60966cb5098d120a0035d51093e1632fd53b9759911e10affb9710d3c684a059c3cfb5c1f341644ae22f77a5c7b19886899c40c27b25976615b89e8236f0ed2ce1467b55ce99cec2aefb5756b45e6ad879aac1838e5dbd202099d2ecd05bed876f1e3349f2f5217a88da25c07c7af6525b252a1bc5ce27752c4066f2591fe72e8b8162af7e14ad0573f1e8bbdb28fdb3cd22b197b5ba930956f228e56549fff46a172e65515b279c0c7d2538725f4c687c6982976314c1ed129695b5450dec2e7b0f2a1ddef30c7684fa1ebdd720dae92c2481b43bc5ce1330164b12e09a8c297c8133cfe2cd4370cf73fa53638199346e0e352a4b43266f64608ffaa9d887d9c5ca8bba296b30d7028afc553d3ba14517090d7179a773ae8727b4ffd98d9a3588a5e768576627f483b15479c238a92a21dbc58e23b0cb9f1ad45cf46f5dcb4d44dda0562b6cad6a0ad7591e08c587381fba6069365ab839f7733a87214711db1c428980ebc2b7eee6c4f73fc70aee1a107f7ece35ee7a9e73476f286cccd7ee3711cad14c426fb861e505cdf63a94e3fb6df5a62761553835475c125fa817855b5c738dad9ace24488ba78af8c1dc83bb17a9606707d05a20a4c685e5c49ceba6de75585437907471612b028db03948ecd8ca9102ec19e03d5ed649e8271a997872de967c6ff889c5b779b9178da37c97a22009633709b497dd4cd70a35132fceeb4ccd0bb33e15cb161e567317f3a71ddeb248ed870d1711933853fbc641c5314a7d74a35b7e44709a5308ca210924e06ca160d83d80afe47560706ec9c35b40fa3286011e035a68547b3fc2e6d282e282b89dcd2724bd2240cbc77dc9092466849c61dcae2d31c150df8366a05612ecd78d978d8381022e623f8d2529e706cf13b92b66ab0718a0b65f583c96ef92b7b189d6b5136373edf451abf48422a7ace5d89b8b7b3c24123dc959bf184c9c0aa7d42d82e9402c5e46d5bfed0b21b5d796dcf257a6c7577e051222817f069f9d7afffcef763a008c74e4298b44bf54c74f2bbfa9602a7dc894af09eb67dbff6f57561c590a91f042c5fda19cb5bd7b06f20d68529e5cc07fbbd0e364992444f9d4a557658b7f5f4cea46652c2876243e1a676aa3cde8ff96587bea927fae0f7bc8a149988e123bf5f2d8aa869af0ded55e423ebf858aea137e0340420570f019f6a6fd33ae4fbb1eb86963a50042e46cb14f0924f2774f8c1b65516627299b4d77c2b77cb650c54fd3343a594532aae4eeebf97ed690d5a662fba0ed4b510a7ea87a8817b3a1b2fc5e4ac78c91eded071c33ed163331c267eb6e3868b9efe29db6001bb7ae2283e08a45ce715e95fb49345b73963f2b862536a12627d6ca4b0aafa546927b0f936ff0604c0a49d93bd7bbdb520f930024ddf43d6b895dce4ac0ffd69cd3253d248ad4643a04e8eb08fc43503d19921510d441eb1dbb779b5223d22e8e9066639a6b15b29c30bf21c4eb1aea507f91c1053129906f7c1d8d1c1dd19caefc94077d4545c05d8f7eb4662f8bafdd1d702af71895faaae80e2f369efb0e511fe7ca66ea02b089ff8cab883374c790a36708c79acd91ba1437c7311b258f0fd6baa0f51be65137b934eee8752cece2d3fad8d7a093c163b5fcd18f3d0ac0fd69c79960994f6309feff6957203ba31770cbf8ad561e52c5bbcf6653fc5918e7f932fcd6ffdad88781efadb76138bb492ae1a86fc1813558334e125e9d047990949c92a96d4b8f15cb2e4f11669a5bd722a1c45a9a7f6ce7235b1bd008305bd187929472b3ed8f91f0918e9261f8be51ba4aa3abc1852e1f0d9b094666326a873be5ff0e15945e50ac7521faa777bcc78de1b6d987aeebac282e689e72f075e4c154f95957bd19751175210ca78c315620039ecdba0a1a660ad6e16578bbc24f96dffe440cb135935a9dee100868a23691e7e94c984530a76bc23a10a1bd6015506158123ac8878518ec0b210100d384837977cfea3fa0437d51081c482c111023de88e28c9a4fc84e64f212e5f2092fb49fdc7917948be1f9ee4f8fbd8735785414d049efba0bc0de2a601fca565162ed62f1a4654f6cb13e1091e956128d2c1bcc86950a2f5eafe690aae2fb5364efa959a0e163cd92341e1803c70eef56ed50d0266e1ba4be7b33d49b8cbf2261affad6f23cf052235436ee6ff7eff249c8d5e312e0bd8ae6062ca064c783b14668533bd3c2891075576812e8861933a7ec98749ab79a85a94a54a321b3473bee0c79aa8505aba7e740f039c47e3a680b7746d39a4ebb85b8db893c604948e3f60f388828109a8371edacf1637a90707a86abb8c5c1738f8e6ba2937021fc9b159a51be2fcb1087958f67121d734c6459d66de4e6737fac4b1663f2116f726eca1ee0d2dc9efefd26dabf5edd7ef78e1d7c32eb9fa4ce665d016750c002bfc99c0b49135f6f0101eb994235c9ca12b687a31b6f3f89134331a3f85690ae961d174aa52995499f47e1b75d3ac5f1e0d60221d38fcbf0e3534fa0ccffdf29a0735a56a3ef5f849eba9043fc45791aff9b40457f2a568eda809d35bb0a9da827be69394132defc88cb3b03423b767f3c4ddefe3a921135de44539d272b6ee2445b225cb315198fb7f2c54c0252075d207a2c5d409e8b7db1ebf7325b08cbae2c890a14546ec7cffe8bc06080418bbdd7449d7d147d8e56615538be4db31bc7520e8304289c47c7da0f3d7b5791916ac42599242fbc36368a2c9305c4831094720a5e6c75797b7567a457e375b90e9b6671357cd413389f1844c454d7daa4392b15badbdaa19eec11a96cabd9eb4d96738667bc39716838b6d7d9889f74a771cfde53c30306abea659400d9ecbb7e69567cfd1e0e14d93f61f002a0dd26be164da67ea29709177ba3c380eebb753cf0986eb22690c9ed6d1afea4b3771f6cb9b1dbe276eabffa4951c37b060b484db774638bb74eba7acd219b4bf515f57308f4197f9be8bcadf5aea01ff5cc58d6f920cf03ab4159a1c60b9e46292dd016851bb2140d3ade6227ba34461a2746420d66a1267071ffc6abc4c537f74a1bbf1c9b31343424f636624d37a11bcbee1e6c2a1c022ec796543b05a6285170d6e620a43c97311c5a118219181f3db5925b0f6c00bff0e19970ecb32126b9008748b5ef777370bb119f1fc5064304bcee0f4caf983581cb07b753757e5b3fc69313124ff9a0ca72c27e361b5fa119ba9a84761f791dcf28c630b376dbfcfac73fefef88603ea741ac22fc557bb4a7876c384422f5ef4155c0f6d5f62f99dbe9831ddea79d38d867b1fb1fd0ce99f9938c954e34f146137bfeafe21431c0fdec20ad3a383f45deca21b7279eae202be80ebaab9c9800ef442457b8eafeb811c71320b2757e3486a3feac86ee6d0a620a98c7ca714158f13fe48d7acbe18b77e7de44862fdb3ffb5b4ea13ad872d3aa668b07a6c2688131f348eac5e8b1bbfe1c8c3673d0a3ca6c5f9303edac7ba5b90ba64a99ff311912a86fae310f8dcdfa719dc52cdfa00fcd98969ced963f8a0b9a73bb0110e4000ea2b36f7c44b0df8d84afac3fecd0b2aaaa1382eb290b4b26faf052c5f7f556b7e19ab7fd55320af9cbfabe12aa30cf731e3d086a0714666d221e3de6e3c34802a5fd4123dc79e3e9729f831ef0b3e3cd3a95ee1119820759aa9bae2f6d886f4fda163d8a1b46842b33a715768ac086a2a9e6455a4aacded08da1a261abc6a949eab079c62b6d2617e49e5faaff72fa8778f7a5092501137cf7951cfca7e7ee9d26bfee1a37c491021a9c1f05be688d66f6cc300d6db18fed5b7fcfb3d9b3dfe278049b47619f8134e4de1ff748a0df06bb239c71ae1458769ee1d21cb0cbc7eb84dbe172eecf88a27390cfb5d41edef969662aeed59a135e2db9cecd61602809a882726f4e28b419c2b49ec7773b6f3a20d68f6cb6394e8920c36ab7db2ea5cf9d6dd0c48399a7f83c51beee38ed1664290532f72a52cb1140b6c2c4c40d81c5d32828e67d48a18ee1f27483c5e2132d282d42197c32982a3b356a58674d00231ac9a7a3f1ec4ef54913ea3e4f44ccd8f69a755c1e80ac78905e90b249e688442063e5054f2d8a029849f4406e6a9540d0580277abc87d5a7de4e6f9886aa36d2faf6f53a36288465d299ace3d3fdba1e990e936a79d8aa5c78c8ea7696106b24958b13c1e3b656ed8fa61428fbca883ccad8c33654454e91f9c771dcf8400cf890d9efc729532ee37baafc002eb73b67caac7e5050e2a4d7f393c36631a338f764aa7df207373c18159270c894e404eb6ac4eaf01e433e28c5f02a219d83f36d25ec774151b94b1637cbd7fb36766c5c8508ac4d1b8ad996b91bf5aa8eaed296c54960036eaeed56cac2ffea41f3dd6f168320bf595ef16732992b400e19bfc32403cec6e5a69566b894916406216f819d8e57b1e237ae078e34300072245f21bbe533b284fa10317134ed23d1f0d3a3d488646bdc44cb743534382b0b604513f7b7d03e9cac9e097f2654220f5faaa1dfa1abd4e4762dc652acc27cab330640e04d2fffbe67202826ba4b62d77fdb326cfd5a60f63dd9b8cdd1256aeb0bce5f3612394553e3eb8aef8e02170c16b0c7bc948b0f8ec6d661b49a5c8cdb58d3bd03391550ca55497ef55d01734a36a990539791db4ea9105f402bdd5d679239645077a21ea1918b49dca0f6cddadada87e406f85ede4822f4c1d1a0b9fcf008302d0fc2ce9fda169e2a902ce66b537b083da7bf496e383eb59e858b10e7bce6ed25a49428436c3476167ccf7de9264b064577f5f96accc6ffe3db0dae84c156eefecd58d84b805e1e3ffd8e3962d2df12bf39a3366f045442ddcae4965db0edcbac170c54ee7f70e8157885c47960d297a44d4097f80b0368b9e48dd873cb7f1dee3fbab41d357178b27d4db7dc30f226e4b8470e0d485f2c818d56125e723dc6880b98d5194adace73b0a29144f3d0748b441aeb0ff9d54fab4a603aab9d4e21d2d2cd2a4ab3261c58596ccaa7bcf26845ab2b12e4b0ca0141808ad0d9590718fc422cb6c3fa93f51c91edb1e920856624c981e08b67396fb2d2c8097a152dc6869f1871a04267ac41793ff260643feeeba549236b9adb38120cedb83d3dddbb61d2a4b48700978ae91dfeb2dcbbca0a03cb0749d53b6792ad56f812bf12eb70b6e46b42247f4b87875287599bcaf0432a3c8c9093b81aeb145ad82e775cf8de2345933659c9963477b6c0dc8b463a74d9174a9b32468432c32483b676e9c867c394f266da94eb3c5d1efc5bdf5bc474324232e473b3f67f03a3409c64753d14a7faf3f6359bfb68e3d4491c473947225baa53b","title":"1298. 你能从盒子里获得的最大糖果数","link":"https://leetcode.cn/problems/maximum-candies-you-can-get-from-boxes/","question_id":1424,"issue_number":55},"53":{"day":53,"pres":["BFS","哈希表"],"tags":["哈希表","树","BFS"],"whys":null,"difficulty":"- 中等","description":"本题和 [987. 二叉树的垂序遍历](https://leetcode.cn/problems/vertical-order-traversal-of-a-binary-tree/) 类似。 **因此大家也可以用 987. 二叉树的垂序遍历 来打卡。(因为 binarysearch 现在 down 掉了,可能打不了卡)**\n\nGiven a binary tree root, return the top view of the tree, sorted left-to-right.\n\nConstraints\n\nn ≤ 100,000 where n is the number of nodes in root","content":"096221c37c5f85fac03c87f9e42ff6164f863d84c18f29f07c663c784b585d2955978e2463fffe010b05aa43e00c74d447ce872661affd1932f016ab682478cb39bbaea21e1a1776cdce467c4918ae97b23c910e55698f7ed6d34f8da4e32a4dbea502d70bdfd66eacc2effa723d407cb6bc0969bd8a02aa33a790ad408370e335134b57630c1370f148e0334cc420b5637ae507d5e3833f8ada4306e6e7890b1f0e134032ce3fa7b5c99d744d88d589cf630f5bcbcffae2f80385dedb7bdfe7cd44c834c78444842b0bb2fe02a5e2f671b549bc9ee45b7180ac624ae0c4b87e543b7cef1922a02a75ed8f712c121310cde5db684a6122203a26b32130222ba5ef5b6b36ebe372c5015f1479e5fbe6e2460822a8fc329647b2f2c6029c8a779a511fc98f56aae8c62dc35477fe58a4b2795ce585577c894d40866f179e09e8799bc57501c1ead8a35238c40a481293012c245871437a549347e31e41b1cc970a142b1fbe775eb000f9dfb2e1d1bf795dee512cf168d48f300f67b867b4a3bb07be2b9f457675d9ee5551e06f29fb5a61874857fed1e34ef8ee5d4a43ee85ffce38e81e761558896793fa7866a6b0a863aafae7b4cc58b66a43a729cf4f0dcf94e478b8a48828cd3770fb414d2d3b6db18d1dab2d451d540371a30a1be169458c19c71fb7da121eca4ec8e60c731d49c796d6e519f4b403d39d279d3dc7ac12c4a7202d222b9303639268f4313c1b1790a547071710b08b27eb8b175c603d7c08af3a077152785a51ae9e80096d3266b98aa4af97c502ed5948e8fcbad6268c98b689d336335b5d31acfdf89ceb11aca2a63c8d1784d379a31b2484c6166595d80925e985453c3247580566a4a6d77d997c016961126a681cfffc53e6c8fcfed0cbdb867141f1115d66ad92a61a96082c1180f6ae359262bf7d8a572e9d4c5422ca4a9775d17b0a33fcd0e0a36e524f8e789fb761902245691073c43ec89c5b8bcc2b7fb680f43f5497da586be4cc08f194644855369669049dc3593de3ef79b5b62bcb6f1604008cd37552196046a07c00311be366714a2d7eeff859e8ec648c5016099bd110a3648e07d3af4f822c3987fbb9e70cb02c4df0c9cb8d3d4c8c6a198a7a0f654d9a739769a625c90796612debf483460b1f80acf5d01e5e4a0f4a212e3bce877bd8ef13f06b91cd853ae99c9d93300effe267b44d4eb146f90aaef2fba6e4bc87d51b9928d999a59616a8dbec88070da2b760ce46e46ef3487cf21fcb994a9f0e78e1ac0f88b6d2031217df89ccee781b22f6b1c6c6b9f2f3fcc3fd75d1f42b3fdd24e709b5691f6add8f8f27e8795a83585556fc18cb7b29c829ed7c4c9d4297e37f207aec3a7f01ffe3c2efe76548c3a37d021c179f0c52e958f6e496d877c2104246033b4395e80d90c34a9bd9f7134575acf366059fc376679893929f0774f5803ff91dd516cf6bee6c25426a812022ecc46fcc05a693430555dc51159975748ade7d129fb2472a315bdfdfd4c994c2e310b96e2a0439a0dd5575d017558ec750b3114e93ffdd2e8b04475e5de04b637e8636078ea8f8758ea4b49a02f3c33d135132aadc769b78579e1c652ce93538bf5e017460ffeaa13bc13318163846e5d7bae526d380e31552768d478a7d89dbf5be6a1d9f104692015d751e1b1917d1ec38ecaede641f5474b2a806d0ff145a35590d8bc88d11c59821719db90188202e4b5288a619cf501df351f9b50bac653a0d6aa16ffc0cc9ae8b5818a21a389beb8fdad9d3500cfa2cbb4bcfdaf2b775351eb03c7455d31ecaded92725bede0379c49728cffde36325814c100b201694b991f46547162f4d0b237405b5133bab48be365d0714f9dde1652a5b700ca7a3bf4f1509ddfdb902e55fcd95a4e23d80d59089999804d9c48b2fcb65cd79934d85520ae3e5dcadfcd06c098372eae7ac13c9d9f41580be2948cc50af2e4ade0043ed3dbea4ba6b67cd6a7099c6fec1c531be018b55f937c4c22c3ce2a1aa9dee4034888548c719bd40c2305b46aeb8e75c22b95dc0fd943bb1d5f22fb7b003bb61a5de4b93dce23f55ca77481f2fe04bb9a43056e932c96bf36a0316e60448d49dd5e19ced577831fcfa8ba9f45d6b292cc4db746f8f70e0dbc2ff1a6c0317f33942efa8861bb52238b285d833371d8d27d82aab516c2ae6713ea704d3a51529dead6dc70926b035ccc4b086a8571451fd65a378d3b8a5a5e368d98f8afde7a6e4c0e720fd0e28373cdb4ad3339245edf5f2838ba79e6a324480cf460a61d1730b64d4dc41c9dd0781e3a3f169a54de9a6368ffc46f1d04aa3d9545260f689ee88f4d20e3ced171199d11d38d99251a30ce1a9a9f8889378e90f13b72319301bf452d732a3ab8c6db90f826b9136e7a75fca86e026150d07fce70a687503f943a82a1abbfa865a9c67ede4f6e133aaf87911b28c53682010c768fd421bfbca8eb9b125d50702b7d42ac0a16b1cf76eae9efbb5cb52682ef433faa1257533dcc4a21b1cfad2bd14df31e8340773306500f4538e00036e55a1b36de0266039b6c1a15085823ca6b0d5f25a9f284616e898a817bfd6cfad8b9d835f69d8f56046e8305fd52ac042c153ad8539acb937a3575c622475520a991c096f6dc6bd5160739e1433f2329ca07c19fa43b3506c9fb04a26f423d993059b24ecb8a9d4888c999666e6939adb1b6db61d55604bf18971a784ea711634092feeacc38de9f45196ddf05acd8b67bdb9ff367512c6640cb4eef27c7209ab327684b2ef5c4486dca75faeab34b6e1feadd7c7d347653566ff6ee0a11d3048b59dd195bceecc27a69eaf1579aa96b92daa40b2e34d62212558010cc0badd1c578780e23473e53ce672b3a10eecb59c9755024e4907d18fad72d56c4ff70beb32943b839de5d4ac592317e78b00df46871ec01a7d9887aea67ebe75519969e5c0be6fb904a7a95e2e0b768daa896226ede0d00add1f4f073a6a37a989cacef2d508774c5863dde625d11be7f672537260b7ccff9dc4df5a61204a6f1aa103ac2dcf46ca3563d3dd9e592e76013b17468b1f04fecbfb87552fe40b4a469d28ed37b12ffe8d2f90bf0ad4600dd5848838849b86856a271c55cf42d46b78bb66a21acf6820f66d1ac9645363286d714d7c32407dd6ea53447a6fcbb309cecc696f0d844560259a936a8ce1ebda4dc2944d80bd196c623fe251c27403864dac1c7c7d7e9b042ba57d5b71fcb7254602bf0bb6e6d0fda6f4f68b2a82a33a6638eda75259d8ba9d9ea6068a57650f4d1c75b2dc5a7edd37673780f22ad06c306ca9771aa0cc8699b161bf19f13475fbeb6683300b1441f51b58481521dea18413a9994e4540015c3343964edd9d34f19b585416a5762ef738110b590b4b234a763bd7b95cdfa631e66132463feb01c1c821635c5f9503149cfbba83396bd2a4a2ed26b80194a54f2f602cab209606e6c10743ae290e8a823f4e8e4c00762ad5d32e671454f407b0c049e6c2a5f6cf5a7ee350a62c1d98d269546f2b1512268a4a605a3c291d1630116b86c46d1ddeb212ddd4823270ac1040574c0eecb14939cbe603bbd63a82c301259cf872efd0134b6d361e9be7805252b97389a5d54b68862fb6676d95f6646e133551594f3763744ee07e71650e3b1951171d3e0d97117c8a39fa8dfc25dfd895b75b00f33ff49475aeecd08dcf7b86bbeb61586645b7d3ed073bd25bf64c27dbcd9538f9efd35f9a1be4621bd6030bd2b75d6776ad7542971c0200de9b31188d60227303eb37bb3625c0680f52894d0e8f8cf1dfb9e9fb8ff718d907ee41653b69cf3dee3e9e7e53126f6c9f83af634499aa057b6f6de71f9c7e5efc2c6c19ede544f0e19ad5b4dea5cecd27f5054a5cb02d0fb0df2454d5f29bb58fc885ad44cf294b099c0870f993d3a1e685c1bac37513116ec30f381c254e81b87e4ceb8bd6c24deb4de8270bc15d8e6254de2c3af4867c73e5898ef220ea6c80a557928c5d157e641ea0918649980a5a5d689aa366864eea6d6e826bb590b7cc2b32a93632ae2554848ad72bb7976174855d9c8dc6ec66ebd2d2c47fc0f82d455d2cf432f471993f91a8f937256443d59b13139072f2255246142f00333fdefbd2d1b68aaac8dd7c3af63e4ed8c703c323387b84df2e92fa6c788f159be129f8131099dfa0bc82b0c51626723e9e7f2efd4fcb02fb6c62ac7e5be4f81a107cf2aad6d5fed193e668784b5b21c77d790fd1503d4d091378eeb6ddd0bb17aa7bd8fb03ca2e6c912e7db5dac9a3339d6f8ac7250a514841ec6f01a2e1a4fea648878a5c16e67d5c7395a0ba3ecf288e11ab53b142d58ab892460023c84018ab658b0b6d938630541c581127e14f054d1e7b735c2e48d6d6b1c017be00e5de699641aaa7253b31fabf2bddd39825ddb0d7a2bcdaa2c4b8d5772f2f571ecfb50d00844fc4ad2220926003a1ed712a46462c3936a7d53b2f01f6e0aca9675160eed2cddf18ba012810800b8be51ec32d75e5b6c4e96eac4e2036fd426182177f5c6c0329b74db852f7048e0f41cc7a89e4d2b1fbeee725b4f518613b10c47da4e7e4192c0116c36dee4aa3e2e4cc2102c4e7f4d784741d7fb330567af8149745653789b47d6a7f632ffad123e69bbe00856a37c0d10f4a593eed1679c9336ac40142a9c621508ce405a727ac32c55ebb8a92d9","title":"Top-View-of-a-Tree","link":"https://binarysearch.com/problems/Top-View-of-a-Tree","question_id":416,"issue_number":56},"54":{"day":54,"pres":["动态规划"],"tags":["动态规划"],"whys":null,"difficulty":"- 简单","description":"```\n数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。\n\n每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯。\n\n请你找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。\n\n \n\n示例 1:\n\n输入:cost = [10, 15, 20]\n输出:15\n解释:最低花费是从 cost[1] 开始,然后走两步即可到阶梯顶,一共花费 15 。\n 示例 2:\n\n输入:cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]\n输出:6\n解释:最低花费方式是从 cost[0] 开始,逐个经过那些 1 ,跳过 cost[3] ,一共花费 6 。\n \n\n提示:\n\ncost 的长度范围是 [2, 1000]。\ncost[i] 将会是一个整型数据,范围为 [0, 999] 。\n```","content":"09613612cfd488c7f63c83d7e527c7f9f538fb2e95f511ac086675266200002e1f120ee1e04ef31b000b9375ec1379d746c7801b7d7d4387f3a827f1371e35a70cdeefb5745c2b2281f71b226151dbbaeb62bf491b7de5f45eb131daf7b0f6c2162eca0c75b6942a2c7c0471e4d2c7b031c656263946f6cd6da8bf827da419af65478faeb180c4b4922caa3edb08ec3bbc80c007fce380f6cee2237ae5bc1fb1d7b3762526a0eb492d434ff8a06df2ec8a6d4e9f05037a3db1b506f9f1f4051358ba6711e2c50ecaaffc6e64e74d77059f7cbe62f9c11a2dcf2886be690c3bc295f9b43ed0ae5694fd030ef6a4fa87d7070b6aee8cce41652a6dce2a6a4b06e2b771e5da80dd39b60d2e53738a5b3ffb9691a56dbc2fff0c8b9da43de8e27afa0c01afd267c0a4d0489175173bdf287d8dc82f377259c60b051baee01df768fc7a65edcc1e82bea65f2be19ab8d000d3cba2aed8caa7bf128d648e8b5b5c52ff83f7ef77a08279d9545963255955b696388ca628cb1a037b9eb57c3fb0ead21d28e7170f087a86a64b20a3554cb15405da6f1898e3991de9962f77d330274c04a59f41706b3f8a30dbdf2619a2e9f4412c2f1b2916bc0e0b790f2bea610de680e54e9767388ac73778fb7d66263f5e726ff6cf46d1cba883ad428dce6169439018e33d7306fd8d1cc4c7f033710560cc97fae915e6b426ef9324bf31cb9813d198201a1723b50ead05f11bfcce88f2426a9aab91c15e0cc2344df781e1e3c49e7ad394c6caef85b13c766acda4c9e613652e5f0b5cd704cad5277f2a13ab6617264013ba9ff2c8d5776c0d692fc543235abd1dc02945a86e9ac81c2abe891c3eecb91b61cbdaead0eaabec3ceeb7410fab93f6aea2d85236603b8170107c76791c4d21bfc12a8fd69b701666d453d6c8d84f2f23d349a54c974cb9c11685d0c063d85f24e1156d0cb7abd7e33a7d2c23f954009539cdc3a08d36b23982c06cc68403fc5a287efb0999a30857ad6685fc8a488de09e9669035949d53ff1ed7aaea528c74f16011781c957500a53408775e3a39c2be4370b351b7e5c7ff04b89d06d4b77a1bd76b9b1df30ac1cf38c200b84e295e00eb9aaa5395b4b21f9af10bcbc2aada6c08a32c722e9cc7cd85bfe674eb2e11d97ba52c09397b21c011e1f2e5a2c66533db3b7cc77643afdd7cd5ceb3288d0bac43d5fe4488b37842ebe06cda3d4cf8482d2b009f245dacccfb157d5d6acf1225afdb6279457b03fcf1a22fa58a8ba1bf20b1ca7bf69e192875617428dbb964ecbcb87a2d5f95f9dcfb1b0d6ad2dc27bf15ae3596fba7de3ac67fa818811f0fdb7490c444b3acf5bb3b476fd67d68310e25f58d1e7c9793a7b11276d493641c79e6d3a6c010cdd339ceb5e3faccdf5bc4dafa6ea5e293674bae71dacc34a8dd6c90b46538cf34a3591c64d6786bb9398247ad2bb3ed90d12ef24f13b8df0a5c582040dedd86ac60e8c9f4b2554eb4815b87e7fb5db7136beb24024f4eb65d5e0f594cac91cbe69ede5ef3c15914c87d2158baf0e857607baaa8d24de54590eea78822266eb8049c82a6377ba98b6b117f8c402f1f5e1201297bd6030e020075ff95f66a136694f2f8cd4c544ecaaa4be90807c4d6f48ebd6a0e6faa395198964f1496bf6ae6b1aa30845ac2c5f53021b1919d3c126e1bad765085d7497ac0cf1e31a76315b0d87c9a527e884f6a8333adc089194d104edb9834990fa1ceb5571b1cd04116c30941e841394e490c2f42fbd38b5e48ec0dcd8770afa19baa6414f3928095404d64a42de3f7ef49f8b2959e6e45208c2ec7cfdaaa95a63e86f47611f70cc8dd4ac740d503d145d303e6d8073658135f5151860068680cf2e58771a4a80f3fc767174cb84eb33a939d7304a649083c6818999980ef5c48b0dc767e97d9c64935d14cdecd1a3f3f45b098342ebd0b913d9e6f715b3719e3fb34bcd65629f6e598f4991c7d24018b26623f5db87bbe55efd30e328e755bcfb4163d1d6c582981d14274bfa47db21298a222e1b9c346aafbfba47dffe941abbe8e4ae4f5b855a08eecb05cccda963548e09537b66d7ed380e5b2ae34da04793160d70880618af9f8a99a48502675595cbe1fbe22632074b81ed1c1d8f07a5cd9da429d3cbaa855f7f80cda153ee225bc398bb7a206ed504b244bc322f3a4afd91e475f9c0723fb6d0559a6628d041f3b5d296cc071614826ac53bc302a5e32a8000192523614a724f3f8871b4b5d964e716bd12374dfdd172495c2a0bf186f34154c4f6fe3696cdc1650aa78a8812eeb7899715ba19b69545e0d40aa5cf3efdc335215c9fdffde7afe5604fe47b79b393450794fd7ad56ac0c6f0efe1d173807c22e06e367344d4398209134412c635c14ae74bb16f4382076d3f9efcaf20d633cce4f7de06c222a9cd606044ae5dfd3b277826936852cbd92de822456c4ef3009d7d4fa5dbf2c39967943c52dbc45e9ea50847ddccea0b5ad4b64c3171c857a394682017b9b9a4477bdcb9e405aa4ce8554e6f6ccdb968c40290b60d3d85da37fc482506c39b9d33c1824307594027ec25922762f30e29e77d02252b8493b75d7beff5567aea154f1296108a51df7b0ea2330fa564cefe6a366e52029011065b6eff9294b4b29b0c1ef27e94db6764eb8a01a56cd0e0203e4a83beda34ef7ac3f3e0f7025425ff16f6f7eddf6124bdb682cc34494df952742c092e6b99883a3d6041438836a0ba6ade0729cabc8cda3e691fc0591b5b6a902f6e69ec1b1bf4a5a43575ef86b4952941dcb1d7f009052e188d98a7a63ae7501ef2e7b9255c7632682f4c9226b4b91475b592efaa349d3b0a8ef5b9f6d3d5d351403a97cf706263bcb77de17cac532dfe44394a6f9dce8fc0de3adcb254c025c40dcd63fd6daa7f64710703dff1efcab74cc94cd48c7195ee180f6904e77bd5cd56f5004002c73dd05c38ce95d3c56b3a5d82e3112014d11f8ba1adb09ae928700c08417acdfdeabafd6e23824bde4a65b7fcfda3452b81e288919fec88a7e18c659e2cea54ff0febab4209709ce796c98cb5cf6cd1c32b336a5381a60fd04402806bee3bf52fac867ab4ad2cd46855dec0d0348486ddba23531c8c56be529bb106ce50c44ae7e46de8dd73c09cbbd4d3c5a6b8b7cd3edde107fad9bed0dd7ace08f1f5c91fdea6c77a07ef46690a4ec27719820e0addbdcfeb60f649a4e917da769fa0bbec6fb6ee73d398fe777485e4289508b5e61558353d0655966947105135802389881e5d76170cdb12b397c7c1b0a2475a9da0188993874b729f6adf94a035c9960f4654055eea77c83ad79a7d06900c928dd1e359c4cf8d9fdd191f40de6828c6a8e2989b89e751d26b0ade320baf89d172bd9614d5685257829fcfcbaef26303db1a089721b2b8deb91d861b77cebd9ce915c79c621a650197872469c88475eb2b13728dbbb38df2451ec8314fc8ac68c6ab1c7bdc02b7564e14659bc034047040b40aa9d700aa91b2d9c24060a16dba2e2bd6b923063c234357219b4332390a2e0741626e57c1c47c5898e5388b95ce3e70e01c4857512ea3e20c7684e71ef2cd27c5e84662c2db68c5d3134b6d605bd8b3cf001db5719bb5834e748e7cb63a2cc8d57c44133551594f37272466b54f3776423a0f7e067d3e5cd247338a3afa8dfc25df9edae5531af827b2d327faab8ac2cf2f86f5bf265e296fbd94a75d33f828b900728f84da76a795a816e71bbd27109f1e4cdab1632625e53915e61c5b4fd2806b56dc29227e03fa4ab73630900e4611cb0150b7cfae96b5e8fbd5c814885fab5b633a20aa72ba329e6e5a324c6c9f83af634499f8406b3a22a944850425b2517733ede544a7f4f9c4eaf4b494a70ddf751308f86241b0bc6b10d3bde393cfd88aae1df86a56469f1420c699d9a0bac5a4f4d95f13116ec34b7d5a250381b01d53f78cb5c04bf20fe8274cf613e52b068d2469b1ca3a7fe5cac1a174f06ca8975489a4695b371954f5ce961f90082447429aa366864eea6d6ec63bfccbb7f46e1da77077e03d0be0829464e4c3687f9454b68dc6ec66ebd283ca7ac0d378761524b821da32ea73c9eeee7476607796e61213c234a85b2957690500333fdefbd2d1b685a39a9e6068b12207cdce199e4c306988df62d7b4643bc046cfe822e91a5bbd9ef0ecc7fe811e2e316bcc7138e473ca2bf77132ae6415e7bc5b623cd5bbabd9fe95c39d21271c727d9538794bdb4c3a113f1b55e6b3da9db053ea6680ad1eff3752d27d7af388d8aa24d02b94875b4f1c1b49e5634ae7eafce6b2578bce5946c56a4d56c4f08777ec0bae3144975cc44202b99344c5c56e4e0cb9a823b881ee9884b18ae8d0cd484000791e4e65503e783a420ccadb23bc21693be453ced60c5c70cdff59e3ac06cc1a4264603e416b5ff39870795f77538f826d7b88389bb14273b4c8a93015bcb6d8aaafb3fa11b46c3e6a89d43f65146d1faff8b5b81dca401c71f724d5b40991647087ecd58e10b60e692e83305bfd654309ecc1e71be679e25bde1653ee78d205305162066473beb0e1328dadaac65eb6e8e61d2e1e1fc14cf44a95d2e4cc3702dadcf6fba0780473b1147c7ad3169b6c53389db7b8b9ca621eddd01ee598b20a8d5c0dc3ca2e496616ef364ec52d53c51d4fabe30952bcf4079f1c6f96087c","title":"746.使用最小花费爬楼梯","link":"https://leetcode-cn.com/problems/min-cost-climbing-stairs/","question_id":747,"issue_number":57},"55":{"day":55,"pres":[],"tags":["动态规划"],"whys":null,"difficulty":"- 中等","description":"```\n你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。\n\n给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。\n\n \n\n示例 1:\n\n输入:[1,2,3,1]\n输出:4\n解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。\n  偷窃到的最高金额 = 1 + 3 = 4 。\n示例 2:\n\n输入:[2,7,9,3,1]\n输出:12\n解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。\n  偷窃到的最高金额 = 2 + 9 + 1 = 12 。\n \n\n提示:\n\n0 <= nums.length <= 100\n0 <= nums[i] <= 400\n\n```","content":"096221cf5b628be1e73e8bcfe626c734748e2b8a04fb2c860a406f254d170e043d310ec8ab1a6ec9ebd627f465eaac46b8280bc2d829199fbe23f761a0f8f223fc3b6776d4dccee61a268fb7869f5f7a25ab17ecd7e24c1bd17cac2e0e245c6bded61e630be4d56eaed9cbf96f0d4e7fb150a9ebbcb03d49bc1f35508a6cde67f39d14285a534d6e7ba675b947c001b75e7d06905425255bcdca3379f0bcf03c5a772b056be2cc2d6b522d81a1196f5040d9da9e18177a30a65a8d4e34923199b714d13b0e46aa0de7c7c1874ae4751fb17daa521b6cafe6675c0425ae94b7c3a1f5b403d64ddd2a3a6f1abde6ebe87fa2ccf26b80e35365396fce0059451bfd5ae1015c6d753a91032169448d633d3fc695e8308b6ca238dae1a447bde2089f036ef7e6048ba0a228b43f7014976645eb9e2957d9c402b2a11484c71fdd4df97568e3dc21612372d9c35499abe50eebf2ada3d3ca94b9128d4e8f9d4a5d68fc80c4c37a9fa972dd5858663e555e8d942783ac15f01a05545946d83e9cefdf3d1ee43d160a6f99a66a14a37c6cb05c34d84f1d96e5bf1cdfb22e78e731357705a9874c5975319c08d4f0271898c7de5ed1a9e8c7aa4fd70d5d3528c97d0cf5bce64e86a8b426c72d7af844712d3b737878c022d78f8da5ddf74bed9549312e8d77be2b3f5bede540d6ae8e1c0d4377a2c2f8ab73ebd365efcc4799769aa453919d4947307fc831d65cde649ed2c797742dc0add091734cb612296924e2e3c59f6ecf97e5f2ee878f3f574dc1b8f2e536712f671d55e337cbd90c7f373aa87d062b7c27babde6c9c45a60006623c9562247a51fed1947857494eb2e23a0aa1218dbb63573c8efe614b6b7856ce3f83c33e5d9f4ebc4d0fdd42b11d129033b0a74442b23e0af21d58b98e01f7fe452dfcad44a052ee96aa7509642a6fc179cc1cd68de503adb13653eb5adfbe01a7d202fea5b10b23fd3d2a7b0145dbcef84dd698a27cf581d5c3f83f8fb2ad6412ebc8bd777083f02eabaa4554ad9eb4758c221ce71e00a750664d9ebd9bf6a6906c97980d49657a3195f5233f7768c70a40c802f792cfa873f39a8d90ba7ff5bf9bea54156192f5d9f452dce998e8c5711a03b77a01fb3df8ae578c805ac7dae0ff2fd89e7fcbd4b1227470d5e06bf0d2207c2040ca2ce937bd8fc28372998aaea08b7262c554937a0af4dfc2c43d10cc6817b6c596348265775a45c994f9fab8bf9d4dfb3f01162380b67cd450adcbf1257bd72e4f41187eca26f30c53d3b0592acae6fe791fd1f791daee9e1646d65beb3cfa014c3b47f2fba42d2573fde1fb35fc1e81a8c1667dfc9ef56327ded0e7de55077c78313e7534918464fb2b0c90124618c88da0127feffecba1cd9fa2a27bd758f7e2d1bce69f5cce4c55076fe931ac3ad41f09ad6ab97cee7947762f1cd11309b225ecd2c0da3b64742be12bd6261cf54ca3a454798ad289a609e55aaf52e3d00b47876e56d17e3f7005d9ac7131d49fa781a6e59575d43d42acefca6bd6f50f85f3972783de14a37fc04b08b820ad553512dc04492e1da54aae51d4d1abf596d3f72d97f58a4c6dfb37f51e94fe0eb478480bf2bc9876e83c5f0f7375413ec49809fecdcaa475e7c5853bcad834d6e1df558d73792411933cda5fa180bd2033a03257b443ba709ba6c5028f3eed7bd35658a390787989cddf95e027ce7461794af2622d0099dffde8b085efd4a9ffe73ce143efe4aa2f1eafe4e9c699908237fa6956bf3ba4c630c393351bde77cbc58de240b686981b1eb5eb3fcb951bf513041a8e1e6e44808e3ca9347366f2b54bf287209acd408ddfcf5140f1992859b750834ff4d260480304d171e4c94e55ead97aaffde42257bc3dfb227706def63bb26f1a4d63e4569ffee9ef456e642646ad21ab768db3fac3b74cc9989bc8a8a4d57c640b6babf7eb5ce87489bdb5155bf17b24f0bf34f3fe954f085d91579b83952d2b2ccbf8a0ad755b934852b8f9e387bb681d6daf7254b85f015f57ae750bf514a38fdab893720c536d7b3cb20dfb1c55ad0bc600d05eef804d1e3a875588c3f517b42f32bd1af5a15d14da7659319157fa31e17af9688bda487305155b1dee1e0dd2a0e0da426994d30c55587b1cb9045514d6ed96505f2c9c736fa5e3cdbcbf9504903fa72d862d56e267fe83755b465aaa36460e3c407c4554c825d97e4d0c19612496e9322b63f4f46bce3258d061b11176d62754f199e7c9ab8d963f210b70b1644eecdf39f85a6ae6b3f6994c17e1669e5530b49f9de58cadd0cafe2a7e8678b73e8a22b8ce45df3d972651fbadfb21b0c1161338f164484306cf8cc7d7fcfe8288b50a595cda7bffe27da757e9b6e5528658751b27591dfd259fd54a13ff011a7cd70a4edf74e760f8ffc0877480e46ea04e73667dbd1c028a002aaf9a79f0cdabf6f74e88223131270986cbd0a2b9f9fbcdbfc07a05420fca018bee5547f914c3994c6bec574472ef71ff88523750df6c798281efcfeb02eec32ce00832e25fccc36f149d586d6bc7e7b36c16a2606e19b9728cbb259c1b5a19867d45448529791d571be9c9cb3eef18b1a08e192b010942c1962ac51c074901c2b13df7c942780e3207f6333638a73666a0ca1b405365ad76a1c69fe5f37b2b9778a0083a80c3a9d94a346ffd262b64c77fdcef8c6dc8df321f9f6c5dd6002b3712a68357e667e2d407b733621ccba4d657a292e8951c6b0df31899a0fd7989d626c78a54766cbe4902f7a6bcc26dd4b2a26c9af691a03ff7a6add5461426a3c5e19fdd0f32aed04b297454b52f1d2eafde2db8f4da4273dc88f37543f2eb16fbfc65b6f0a26b6b34383abb36773efd0ce7a1dff76934ad7eb008beca8fe0d1200363235cbb64cc56c844f9550fa10d41433239c942f761c1d0df62e03c388785010a4e0e7ba22eb440bee7a09c38f7fb72881a54c308ecb0f45d664758bdcb55acd543224671911f6e3cca398fe72297b3d34d4bd47ed670a21e787b4de1773d5da9b8bd7f2decc938421ce57a354f20fb09816790dd2f68b9aeafc812486d11f713e6c92921584474ed458a074fde03b2ead5a3ec948d29d417919932806155bf7b4ba57e064d9567ab550ac18ee502bf14419e8449cbfc0f8afcbc5ea08cf3eb213c598b8da8a1007ab6c3244b61a3c2f354528938b98e72bb39f071c5199a4b4be00b6cf6423864e8e1d54587e9f22ee7a96c6ba0e0fcce425951ac8a6dac49c1768c1758af28fdcfd72c51a48bbd78bd1c124dc0e634204313bfdd20723f2561208fbbd11bb102c24fd5e66c9dbdec2a701eb008eb1f5323ad55d8a9c99bc0c8d8ac382c10f264cf11c3ba4d6b6c8c893e85e826511cb2f1df3919866e2f80ed573471cc090d1cbf39034de59abcc0cad2b093754c66093da461b6326d21e77eed0c2e42101a18c1e02ab05c7f88f08736c482e809b21c5ce0143ac023c84a13f8b57b890a6c55f58be4d7a44cf0ee09463f4bfe67f3ca52da7748f20588ff878296fef8d96a65786a58afba9f4f0a1fe854b12b5950218dd1739e4f8ff549080a197c8123b97b9033acb3b10d95a05de6b90f175c5c5138cd792d82c7145f2b833a3636e2e99ed3a927eb78d1152e6a99d82511d1f4c7509da1f96f1dcd4bbffbcd89c924114ff9964a176444085175e34b71f03cd66cf9627a3fbe3cdb2a91a4566bbb6f4d77b5904e5ac49a493c4ea224d66d62b43725fde4bdb3420da5000ce9a0a1225e6370ab13695f41109b58663fba1b4834af214b9b05bf0c89f66c4ee7c0b3d0c393b12ab991dc812e11a347f7ed472fb32836e4a744c0adad7af214484aa1524455aa10b935456b0693819a4e559a7b9c899b8dee8d4a972b8564410f56348e4973f54dfacc2b08fc3e0fe4491665454984774f09bc5f5f38ca9a1e97513536ede0f555d7106c6b33f44ac99d68702f118ec3a70cc3aa86216d73710f4863d73f889dab76dba77ee832df78d6541363613f581933599063077425f25c442d640aad426af6755700fdfaf3bd6b140c08a350612843853faf140cd3a4a4f76af5c46464e935615cace83a234ee1aeb16df107215fe8982c31a37da882f7b94071c4fdd96adf7a2703e7a41b6ace4d99725423ffd9c5b13cb1eb39cbf1867eb3e4ca9c40715ff912931a4cf5e1c48285f73458683f4d744b4ec05ce36c634cc90c90745ef3da191b3780b1e525a143b54a19d80c6f62df5c1cc51a3db80d9e0e15174551f419554fe4860d37ea3bd548fb13f2d302fd038ee0023b9c19ddcc752acd64b7c221c2fa56906b7b479dbfded59260e8052e20499ab0df1c77902bab77ec6c5794c298567a60b629198d3fcae977e2388123d2a73473327362ba2c4c760805cbb6911338d11dfb974513a9fda0bba999b649bb6a4d380affef5fc8e517470435086aa6f5a9238ad81a7c50dcfc6fdde267b460e423b69d3fb70431d81681f6cd8f161f1ebcff03355af81d7f822c2b536a56740a5ecc48d1ab032c7c1f4695b28abe05674029f53bb35873fea3cff009e54f2e9ccb7ecf4ee423811ff84aaaa29de7e6e13c7baafb40fda668f33644b00da953602311466e9d1b530de8dc221ae1c9eb1a3392777241ff5f22441d40b5c71ce1fbbd94038d2a6d4b025b5b541d6fe53caad6f6683d3432c826bf4e378aa5ebbd6dba0da31490c6897a931c6c21d759bc22a96568f4d0c5e6824b88fe51f78c0f5e3393592528aa9efa42bf6d561d13f9c37be2993b605863620d5a622fbfa0724f463c8534dbf63ae95540c91e9b522bce3ed4998975872516a17fb3201ca34b94ae226b79429ccfcd0d19b68a9193f05678ee4c81216a88a8d0b4d8e0bc865626e304e1ff299002611b0f87754685a26e1db79d0aced2ea7abd4c6c28401b4f32d9f3a25d2ff59591b265e3b0c3a548366600179faf51e40af13129828c086e593812c57e29a15afc371620dce9b9f355e79a95832c9ea6d2dd1f5d8c4364e3045b39fd0d5f33da5cf55508f4d5cd19d52505821a2601692d2fa8c2aa5dcc871f049281d03ec43b449b29d00961b34e9470c3a8e411f078cbbfee86efb92a5f4bba1d1d25895c950d7fc212f1e4b8ba09fb1195e66356cd4486c06cb8646b5d13087c4365ef06d3d095f0a1c2e032d4ad6bcd043fb1acc761f9b68819766cb9483c2b9c94149b89f8fc64a7e7f90aea1b07226de83384ff717161fdf9d4dbe6cbe036283c7c041b75e3e7f9f07929f05af5a9ad43937a6a081f2a1d3fd006e43bb4880dad796506f0fb4a000788b4ceae394a08c8f96b59ede6c453c6655ce798bdd46d7301c98d6501544ad429096d3bdda15e9dfc86d3d07db4ce56860f04952fbfbfb3b93e4f265812c30a4fbd611a6d51c5993821ce9852d1b5efceb8570722527241b9cfb7c4acd5b13aa4c62a2f3e952fc59cc4ec4501583fdd21030bcd702e3a6ba63f16b131029bd2bee988bae0da65f4e66a9771253ab6c393a7889a969dc784619f1adf281d3a0ae360b326b45a51282ad602f6c0cab5901066ecaf565953c81974f0c598fa709b6cdeb57e93d8a5b2e6f387175c08b64c1b48dfd9f16095c5aaaae7568a228109a8338a3f8f12e3b98417e9eefec80c63689d002f6dc223db5d541840a947c9f51d3c0dc6b1219735b6544ca71eefd757a804b5522bc080c6a26ec5ef6d7b5e0c1f66ec4b5538952ead611284cdfc1e28e7d410c7c138e7eb9c68917480f7a650e00f08211329db40ca881a31c6537dd00453deeef7193b0df4e551fbe3fcc1dbc5caeaa682795a39d964c6599c6c3f2d5063de59ff6df728a735a1fe5ef11cbcaf39042b1442663ff864055732a1f95f0809d35e94fc9fd75a13c6c3e5dc2b5c69f25031320103a720a8ab63a8f113fd4585bdb3b2869eb275b385cfa5b50dbfefacf2e014f0c497d182c405d9e9a679bebf7325b0882e82c810247007dd6cef8a2c71dce1fdbeeb944f0471d7d9056744528ae01d5488248248304289c47c7da0f3d7b57919036d126ca7127bb6a60f3578378ee831094725d1625393c7b7d66b60cf438f45a8f2f20342cdd7c6e93180a911984a1b544223ff3dbc7a1cfe257fb23e58de302d521d720ec3f6f6063ecb39ecd9766ab71839b1d84574ef0b51c940bc4ecf83f271235b84d755da4244bb357f2d126ee4408f07ebf97021971ab9b9be5b9757df0cc3bb430b2d3eb2867b4dbe17e136cfae489c876eabffa4951c37b4f4d4845ed62639fb155e942d20eb100a855ca5002e3c1fb233e111a391e26da5d6a9e68492ac529814c5967719d57f1bde805b513f343999ff618e5b7be5b4e742e4268006666afeafe07006e4821bf1ee894258054eec17e1fbf6e250c59e95790ab8aacfba4ae970e14ecfcbe28027b7dd69d33b72b99791a4942cf1c19043ea3825a796f34f686f4d131a8f36235b611c014f1b7323854f85ed210845c0f17a5f91654ba802097c44bf2167033442ed0d4591409a0858733912a734950f116dfd8c833522a12dc3b837baf6cdce1bf9828f3b6e0256caa08b841b2587f97a7c7316f0835dfc6021545190264f505126b3bda357c19da19ec1c027baec3d4c3a6a69a493ded4e4d00e2acbb1c1982fdfd30ac2a257000ea8c3d980ecebe7b6aa305b6b6d1ca10f2551e7880dff0b01bd34f7ce073722cb893d6deebe46c0d7b1e9c84fc606e1ada2ff5d23fd3fa9a42d99b04c86b8268903de96ae558af4c6fb238c12b46ae3d9837d5164c001a2f28fa43b7df063462a4c03dc47615bd0d799956a6146bf898da41ee43d2d731353cdb0b42de1c69c0191241636d62d61dc726ab0c8dcc72abcb190da8f1f0733960101430b3263e756d1dcf1117a2c7a8a72c33f52520749e3b03142834e2bccc517a3d04b6aa15cc364256147a0340fabce19fc7652c45fbd22f5e9eb6662fb7a832dc8918d5f4aa9972c0ac1f5acd4a56ebc1e23c74ce78168b4a20d51d11eb6e67e45a32cfc0455543afcea4c46126731b7f6ae33860a944fdcb709524067417212bd9695fd0d042fc7029c9e7c5c8c32f3ac2366e276677e33c759bea4620c5a038daa032ac11d13363f58b9e1b415ae0fa277e58501a74a9c625fce05a19b220439f32fd031b9e10a25d94688fa4f055585ea11d0c0d22140212f517526102d1bae5b4af63d6b13d327abdcf951c4765f0968c713a3f14adde5a712467ed43ccebc780630c","title":"198. 打家劫舍","link":"https://leetcode-cn.com/problems/house-robber/","question_id":198,"issue_number":58},"56":{"day":56,"pres":["动态规划"],"tags":["动态规划"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个未排序的整数数组,找到最长递增子序列的个数。\n\n示例 1:\n\n输入: [1,3,5,4,7]\n输出: 2\n解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。\n示例 2:\n\n输入: [2,2,2,2,2]\n输出: 5\n解释: 最长递增子序列的长度是1,并且存在5个子序列的长度为1,因此输出5。\n注意: 给定的数组长度不超过 2000 并且结果一定是32位有符号整数。\n\n```","content":"096221cf5b628be1e73e8bcfe626c7347380208a04fb3995067b6629472e032e2efda95226d4955c107bef418d6b71983dd2df8eff401fc5a93ce974ffa5f124f52a696a9fd18cf0076dc1aa84d24d6d38e6718399b2439021b427cbf5eea38b142ec00766b0883a6438097cb8d4c9ae77d84364285ff1d37bf6a78e7dea1fef1c3981eefd0c2c7312c244f438fa6ac67ff9e53cd8e04b69b1a43c326846459b13043d462cde8c52410144bbcc47780211e489cd10581a3ff00eb7314f988bbe9d7bbb48075aa50cd6f92218d820281ffc16ad365e5bceb9602b86b8620b1ec587c7b939fca36c8dff2f0bf8bedf85cd020673d38eda65643a6ec0304f491ce7b758dad985e838b0232e6b558e41393fc7b4e830986b9a201d9e8620ebf371f60b18afd246c1b9ca449a401e1ffc2949a2c82d1a9dd66dcfb979e8c0718a4e8b12708153e2c1e7e6dbf378958ff808d4c7adb3f6c9bf8110a5528fa377554ef184caf199121bbe41321d5c681d730a7ab703ac1eef1b2f56567bd83e80d2318fbd229549776bdaf957be4ee5ecb15428d97a3b7b7424d67de06b7a844c132e6f97e41b4afadd60e153617847bbb0987babf8e8b9f57fb5786f6141c00f51c9e09b71ffd2bc4cb73b1e8b6a0a7207382d63924cf2d2ec97808c5180e67e674bae19f9297213ed8c1ee1cbe012703d4bcc92f0e603ebbf00ec71a4e97dc5c548f501f49a89cec734da5de75b4c753643d2b60a12594df2dd089843ddbde0dfe640e06779b5d5a9d6a251d6cecf85d3e7215a2f671d55f708c7fd38731a30ab4b26275626b6a5f4cbd6496621742ef54f215aba1fe006814bf55f7099e03c12d6964d0cbb01bede1d057e2f3ba8646bf5997a6cbacda050bf983270881f8deeaafaa8401896cc119409339bc2ef5a9a556603c2ab975a09fc45f62d9f7bd20d54c04eca5e17d2cccd68ceb7969339144916971009c67be1aafebf73df21cabe538af83c90060531871d26a80c50ae7fb4fc8a66487d26957d3d4c9c4d728ec40fce9c409667655b11e198780a677403c446b00ac571ca7d73157fd9f255eed266b073c4709fb4beff33986ab299c3a63e7fdafed5a128c4534eacbadbfb6270c8192fef263508128d1fc966cc7dcc9e4bed913e5bc91b065edfa4998e05083c192c7e2c674029bda5d2ace267a6c28424d95b04153038fee240a14d47884ddb234c460823030c6e76ba5c48e6f1ccb45dd4e4acfc006f1233a5513a8a7eb12c45b050c5fe258fbd9a6024c9e1929a5b124b6f05024e1c6425a7c2db5f554c75348ac90ea1ec6cbf552bda297cdcac6bddbc8228dc7b76a49dd4c7fc0cc5b5bea151d713369e2ac7e3184a7fb0b7dac4adce8c8ffa0813c9561462d34d9a879cb34d96bb9fa310e79799cabb3d539beb3ca4ca688bd5fa3282a24b48e060c1ff103b96ead1874c06cef155cd678929ae07c7315c7301df336b80ee059039e5ff465036ca056887152f8abb3733fbc07d587f7a1eddf5c698c5f01ca04d2b1a0da9e95b9a6a431e8fae0293520a909d8113cf58573125f23d277bcc620ae2c8e81bd394d1fc38a89c20711a0fc8844eef256df541665d1b92b473aa95bff0384f4fa920e399e9ce8e3f183157d4594f03dff2ca58cd10a82264212ec2b256c18c14a15c423d1b1939ddf531e2b8d165157c77aab307f5e21a54165639b5c9a03dce9e2b77a38503ac0d21706d85ba03cf6c1aff74c9b629a268110c689769fe0cf3ae9e5fdc2b7261b3a5efccb4ad726baf17c013d28bbd85057e1ad74f7c33af12be9ff56376ac894a5f89cc0ea8a5c724748527501f4243aed6f9c9f6ab5303365e1a2162a56e698f3ef90a226a249c8ef618505038448ee2ff416376f0b5e5358439d31f4749a28fc98b8ba18204e4d88b38e266d9679341905f25e7ecf591fbd37907a349eae7ac13c9d9fa2fafbe0c60cd6aace1c49f7b598040a7cbdd6214884e20d1cb8b9dea53d326e328e75ab5c44169f81465d0f02b8de8fa50ab5ba52aac292c21a6f1866f7be16d888d877bdbf28d6ea9e4548709f8fb04fadca45c61813e587b75cee77bc82e32bc3d901efa1c5e349f635ca3fad68ac1e8250f279b9eb1e5bd5c3ea584c8c2546ca041e2d8c1fd2f76050ae13853d3a99e00b52238bf86c93c1b248e0bdee71b3d01378d3119e47ae1cc5f1775620cc06340864494fad5ceb31d46508222b8138a875b2b74b753600277325c212623e6019bc7b04c93789b6cb13aa4dbbeddbfc3c2787134a49002120f8944480ad2981cd6a17dbaaaedc632ed60adff18dfbb5098a875fc9d693334c5f69b8980802442870353f4d94f7fcffb2abb7ba595e1a6abee2de4427c9d42581a698a6ebe7493f8d062d054a13ff014ad00c6c995cf2c0030e47690746a0d4bf03bea3370d8c1f82aa80aa6e9ae9e0dea72eb178d8d5f762b10c46ef1542bfacfb1b79e25d53901b5d33ec0825f19c47968e3d51809186e47a91e86fc0d355fc2a3c9374489d6ca6ced49ad1e732e30cacd04e849e3ae64409cbe68df2f7c02b6feb65ebca1319cb8d5d1449d306a16e3aea40299daf89986b59f5d46f1f56a78eb206712983c8654d97a3ca9ffb3f90cc991363d1d0e0dc5481c0535dde22c7f26c001795db5003bf2de51eb7c95c0510bdbebaf19715f6b9640be81f3b2a2f7e0b410a5bfefb63c07f41e270b47551fa662165f2584a409ee4410161846f64990defd75c0b15cbeafd63d743ec74300b4e5fc724430a9124d8696c25061bfddb45ba1b72fbbc9e2aff8eed1676e3646c26fd399100c54b0bdd47b0dae8f2ac8034c91b847161b63da46f38f452c7e2f0a5f26a4ccc45b00b7f7a72417b519a528a3cd79dcf4c3bc3045701778e92029ab3646a34284e920b239a5b9e5e19b51241fb18e1cf14afaa368e8b5f5a9e5c07fdb1155dc32e390c46fdf9f4b3cb5c1b3be341211096fc1b88e3e94407f64564961cf856e055c239dfc98d9806ee40ec71ad2c573647764bdf813177bdfdbac81f682f16559a0669065a3667d9cb5a70a656668bb9f45b41904d6f5fb9b482dc40e83ed58e006e079b42249f765718f4ea1e24a055499427f2f04a9a8d808e93ba54721e57eeb5ff7205ec92741df040160431c5c1e0b200afa3f75ef2a0c5e4b3ff744cd66640abf7c6e1e8c9c40a3e1f6ff4fec8846818e1a404730f17ace731a8453971572507dbe3b2aa26c93b30d0fcc99538575b52e94d0f2b9d80529bbbf100260a031a6896d10f8c2b75ad256197d68760f9a9f287b8c6a7042ebd5489a6651319a0477b89cf3a1d410bb59ae1d10afed8014e9dbac8848a3cf0651068ae093a3a5a86982accdd6da9c18af6b9f00d59b6d59168c4924e205fe9cdf0a421b8cbeea65518c6118ea2128282756d0769ec74b1b442ed21e77e2c7f5ed083da7892aed0f7db9fef94d66241727c2d43ca0823d27e52544eea65ad65ed1ccb4a23156f2ed9fd02dec2529cd2a5e4a7c26b8e978a832d4dd4544c190f780d2b8f409acc1e0c5c297c2d1a6890250afca5b1eb0a1bfa25703e092bca795f80337a4b9032bed3b16c55915c1a34648ae4544d4f1c9f98221cdaa1241bc6f9681c54576867bb67862d98e262054705917462d49741da5327124107e15055e4e3e1393196fe532b38df725ced495f952499c73b29a27e7ab98d9862086a7f76b434925899fb254268765ea7b3bf29ef076e3c5d35f9a1ba0275dd650479eef16610fa87944b13698d0280699b16ee29ab79a54f103b9b351eecb8d5acede6606043b33090e441bcd881cfe044d4871fd727d883aa8edf9a3e6264631c3813007cc9ec2b549e207fdfe3a90c5de57414461325251674df49de73bf54f4a9b0a890ff91c84f6bc8dc4b94a1e6838fa6e29545281145bffab95e9f38ca5ef8e266858130c93941c6b1b85ad0556d9d8103b8279de14acb929820dcf9d63aefe6f1db8ee504e3456e570c30176b01b74bcd3cde19b5d73821510e6c298ea2466eb368b70c2ab2adcf6dc9d827ea517fcb240c886211e11931951c9c541c610486963a270574561a25606edc8b98638ec07e52ffc124531fd8bb1c81e35dba307be54b997e087eb9a9df97567147f330775635b99c63cf0bd5b17fa1d9582bd3f4be72765afd82dd01d43ef46af872c0a3959583a1bb8eba1fa0adae07b942f9347eaf74b949f7755cdb2e91b0a74ffd4150b4ca1978cc9cc1a33152aeb03aeffe097b07e321b393ff356b3176e942d93d50585e7470a5b4ec651b0084bdbcfd883e922c1d32e18227a79b4066ebf3c946a5cee681201897ae70fa747bd74c74f0ebbb366c5f7674d1abe649206629389d5e2ba9b7620881010ef9fb18ed3fb95011501d71dd07a9397d25ac61e107e621d9fe62fb8b49b669cb5abdca7aef9c2f3a46f7f744abc062f6e40883bbf8b4b44920a68bdbf2c1937302b5c6ab4b95b3267a9e2f3ef4c3810f5a794dc92b6270f13a9054f39ee7eeb89513b152cde3188e9e240bc8a30b1965a480cc507efb84ed306a82987638947041b3a250b2b91d99015f3f1af8e30a4889c11454013bc14d422fcfe9f981442b1e4ad8986395f57d7a6dcbc7fae976e6f39a7a9ba86e66f30f3d238f576008d4a8d5db9ca46394b7eb23526ad233b8c352af5d4463da1ab76b1742e8ed75ebdd7c2a3802b1d2924c2e57780f30e3cd38700e93ec302081e3467fe9fae5f6ed2e7884b42d12185e495d23bcf85079b52fc0cc329cae63ac73069b5dd239dd0e8aa6de33fb2882897234fc46fbbf7b6306378278e04363c0dd8a29a70f7ee4bd47e8c4587bf8f59dca39397d519a9597f4537939ef0172afbc48d1543961692616c7822204f89d0006f54e485311626501df9c540dcfe8f68d9bfabced59136bbff20d17e1588fe73355228206a457452bb3b355e29faf8006ffb6c5fcb268cc3abd4d52a57f49a489796537143a988d65f7453ca5339c989226a947e1405551955550a0773cb997c9fe75539dd040c859d96cbdbe52285815c1e414b921d4b4baa6c85b2cced6d8c7dc87462b51cbafc76e6cbbd1587edce4b2e5555ad655a3d450021005ab03143f03c980b3d1f45afee9cd5536f0d663fd43b234a9ed24eb4cc30c1ee1d1abe2165376f201c2e032d0398e89c5efa1f81730ed821ced45082dad7dcbfc90f1cb383d4c6585436deaef3f13c619bc23046e57343528c9308f33cea5a6a8ace865ca00a212d984982d66ee11ddfdc7037ada0d1abf5d2f4491e43a648ce8f9ac55e3c46eee508719066a3a594eed9c2c5ce9de56c536f72009e37f08532cd4859cc83025b44e317ddc5a8ada70ec3dfc86d3d07920ae56d65df4f2fd0b9c36d98f9e32bca61278f90e177f7c56143b9821ce9856c4e0ab3ebc62520253a2456dda3741a9f1e45a6087c8cf4c752fd59c548ee1445f8b4af6b20c19146b1b79822a43f5c1060bd36ee8a90ae44a6434e35f36c1258a0253039236731c215c5c4d16e143a007f6474e098fdcad466db4408d3a9a6e678fd91c9f26630ea09f426038aab801341b081cda616b135c40e633c433808c0806491e6c8ab93164a0908e7e52422df5301e78325a3bca15572b5682ab5c5f180927bd9cb28f6dc223db5d5418457be7c9f51d3c0dc6b5e0478487545d071b0a86a20f243196df212636469ca1ef2c7e480ccd42af1f3378931a592543266f581a2ce2d1858345cc054fa8a8d085249096e122eedb6256cfa9e07a890a3453d71990271359bc724a2ecf94e1b4af36cd61dd015fdfe136edbf7e09f4c6887c68abc8158479ed58ba463f773514ba3ab0fffd78ea506813d3c49ff864055732a4dd0a4d5cf7bbb59c8e52fab6c075d0ab9a4bb9f634c4120157f7503deac7bdc563699585a9527233aa65d207121814b2ddbe3ae89620244054b7a0425776adecb3d9bc1fd389e8c2f2e9123c7dd86ea3b3c6b4e39178a60bc7959d08d031db908ccb2f0b869df3dd272cdcb1982eb3ce5edf0023dbde00709d300b54ec1e1489de83aaa5c997e877f9c1c23042c3d16767da17cc36f8f7d9f46c3be81de4aa3be5084fec03bdfb4ad3d013ff0d8c767666b926a96cfa72bdb23ba76da25f499a4a8123876075bef22b5524194778bc16330f01a9e026c49f99a97fd3fceb0fb37ebd75cc7394be226a28b06f96a34d29e92370e4c3d20e9da341ac331fc6e5d22b5a36d2077efb2ab37061d5af92f276281d667b3c8ce8ed60ae8ab6626a069c70ad85fd845d046d7c076bdb62954692949413cbf3a50f4105d9f0aa63f89cf2201b13a8399814495538b4ed3c1eb52bc9d07fcc9afe3dee2c9fe0ae5d0959abe6d702cbc13e497118e53dfcbbee817bbb482b452cf5737d1d0d9c5c2867f51efb5ca3a8498d34b20982bf912869d8b9e4393f384e04d0fa8d8e2e50b3e5316a16726f49d15db2ef06c42e5bde01fd507ac0c84fbc20047c9e50f5094350c942c9cb8dcceee121e95ce834d050ee947b982939a2fe7562701b0b4cddb649c5dfe5f23c1e6aec529a6fbad2777f309a44ab25674d382ac77221621c8dc190098a982af22f69ebdc052cab7d036dd6bf3bd1cc59d80fd99e084523ffa4f053ee4eea47f5cd8a0f520a1262666089ac1349e14d7a32636a101adb7dd951de04816248ed3d4d99225d4e93686f9e2451602524302ad80adce190710fc94996fd20646c026afb349df8a6e8722ca7673959426e51ee54119f83bb4695ed2c965a718f091b3beaef21bc47e31cefbaf2150d259a1bf62b2d146f607c9f5571b03a87ca82c55c89c39cc3f8bae332ea62d7b184e3b3ded765f9278d808589a415ca276dafa87103be8fc6a01e564173a260f85463ed087b0f87e168b4c0633c0144b5f1d7d9aaea63c61707bb811be3dfbd0adfef8ffd0f485cd90f97b2f64ecdf3a6099a27caf7c44a7212cdf5d302a4f82534eacd115889636376bb6fb1df9ba58ee9c0696da678c9c62aee84247053a7d03cfb6e1622574184153e216766dca6a68ff60b5efadd26129973d70bd662bb17c5481c4a994d47d5ccf4a360201f85afb9d6e24a6c5564acf050ab138832fa685214668f8d4ff4a2bdeb484ea94fb5301ef76","title":"673. 最长递增子序列的个数","link":"https://leetcode-cn.com/problems/number-of-longest-increasing-subsequence/","question_id":673,"issue_number":59},"57":{"day":57,"pres":["数组","动态规划"],"tags":["动态规划"],"whys":null,"difficulty":"- 中等","description":"给定两个字符串  text1 和  text2,返回这两个字符串的最长公共子序列的长度。\n\n一个字符串的   子序列   是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。\n例如,\"ace\" 是 \"abcde\" 的子序列,但 \"aec\" 不是 \"abcde\" 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。\n\n若这两个字符串没有公共子序列,则返回 0。\n\n示例 1:\n\n输入:text1 = \"abcde\", text2 = \"ace\"\n输出:3 \n解释:最长公共子序列是 \"ace\",它的长度为 3。\n示例 2:\n\n输入:text1 = \"abc\", text2 = \"abc\"\n输出:3\n解释:最长公共子序列是 \"abc\",它的长度为 3。\n示例 3:\n\n输入:text1 = \"abc\", text2 = \"def\"\n输出:0\n解释:两个字符串没有公共子序列,返回 0。\n\n提示:\n\n1 <= text1.length <= 1000\n1 <= text2.length <= 1000\n输入的字符串只含有小写英文字符。","content":"096221cf5b628be1e73e8bcfe626c7f3f93f2295102e8bf3736e305578596320559db5276efeff031709804ce6334038d12f1bd385394d9ef220ff2ba4e9f225f573696bd5d7cefe4633d0aa8b91587224ab71899aa6098d20f426c1eaaea3831431da0b72b08a3b2c3f047ac0bb8bfe3e53a1ecb2aa1a478e01357fa28370f13813e69dfd0c26701ffa4df710d664d5431b498c1346263386fb4b21d22259f8a97c2f2768daeb21505b2e98841b44714ce3fe9325327a0f8050b05ddb1988b09dde50830f7d830cc5f62332d7ce9a72a202cf7d692f93a70b76a4ca202070869dafe90b508577737ff3d62121a3f3f9882d713f0c39bfb04d7da467693941d6ce03dea5e9c77ac81b6d1446fe3c117d9a87be6f820cfc3ebd92b51de8e841fb3130aec77cc0bbc845ae4d1639f42553b2c92c199bd367222f16b4f81ed46cff587de2df086c0c74d8d16f5cefc0c78de2d5d1e6a3edb861150cca1336225d9eebcd9b2c81de3dd630055b6b0867e6e62ac4d310a2503830127ab863baaf871f7baf3646757ad8d74051ca5729f87b62927156c9cce269f5ed716f8543042d6f80e9096d177ba666a9ef78679ab09958a6e1d2b8f75ab47e41614cd70f6df3e3b97efccfa843bb2f1e814a097318323c789369ead8d8af82a94e8cfc6e6a709918e33a7236dd803dcacad33e731a5acd87cde73afdb33ce79e3e803ec4a510f6b1223a0722b93aac15f519daf389ca4c66a6a57f9d6061b034298c92897a3d19a57753bbeaa51f07ba8e8d4d7c78237e644f3a1a238e32a18d0f0d751ec20d0544db94327a180c7e3a31101e53d2e9e6b3739a1ccc833023e9d44f618cc340399fd90c07acd0a28cf6ebb02ea1f34e5ee197bdf590bdc2b86b14ba7128707575134d0b95cc2ebed69b571343e550ffe5d951002ee845a66eb94f88d61594f8cc51db5119d813683fb7a7f3e00d582f18fb550da733dcdfa18a19b23ebac757e167899d37063fa02bf3ff1438f36ce7b5a51501765ac85373cbd91344e28c1a87c34ac20a5f2c6edffe083d152119ac1b82a2c272d27d732bb944b53dd24b89d06d4b77a1bd9428ba3a86dea86a811b3d8edbaa7bd75bbdfb6a124b3eb89642e8f528b0b398cf78834dc319e269df1ab88304939231553ddddfc2afa5ce828f20610f6b6939b481e7794c03f2dadd5dd5104d366452e49430af2437b039bd39e96c4a22006346ba25f048c1ffcc9377daeeb6f1154ffc813251ece356d5a623fc4da5a5263d85aa490d01ba84d33b381cd9955b0b828a9661685b773e0d35364069e72c23b7877ffe4592f43f5ca075ccd93e8f1962d5c4fe45107ccd3c7dc047b84639c752ff8068781dd0b6afa4a6a4c497885d20a492cad7a45e338fd736b430b1acb712ee9997f2a73746a6eb2080c84ead106668226c08fc643e9dcc7fa123387c2e4322d9f15fc76c8e163fe737a2f1d8d8479aec6a1cc305927413b3c18273dfd22195f26c7e925ca3c51f386e35f9a06c7394dad91d8664223a1aabd96e9b62581f9ab40d91500687a9831cce5a713e2fcb0e2463d86f26f8c5d31ed080c6fa119b90276f1a19d141d39c405570ae0845d65d78bde4efc6fb375c1efc37ef87f88d8e2118311fc25d0058cde0cb5acd0f92256b2f23cd8a7aead706add78eec98d5db1568af24156cb3ade77aa49106c8ca1560365b3ba4cab13bce9c1f7d90b000a1032f6d6e888b06cc7603fe6ac7b407af68311c6a965ff836fe411cebdd227854b2abd5eebaaf7566b01722a6664cfc9d5c3b39b4defff4d01cf3dce20a29a4e50165fe78936e386f246c8726583bacf305159cc154473619401c16740288fd8a2d8e3041203741a4c15e8a9aeb72148dacb440f898683a23628642a72801d6172a0a4a81bf9407d5c88717d266d45c915ea55e30ddefdaaef1e762009f4c2eb8924eb4fe8449bdca515eb318974c0ac17430cb4df79ed1196cb4357dc4b3c181820ddd55be348c0fac9e0074bb90f9d6ff0649b6c415c274e94ca75c7222f1ac853c1fde37f3a9ca03d4bbd450577498779e7a7ece19312eb2880ce2c6ecad35e23342ddd57a9a1fc54aa18ba12eb6c01c532f560b6ab80d008c9d8df9bd550e663b93994d00c46380b0df884563696feb480bffe3cb1eca5e34cbc7e74b4425da7fe84ad56f0579d61854a94aaa8b4b6be7c80bc9584d9d5097e4f8c4a4314a6eaa20bf17809e56abb76cc68f90bca7beb1cae066fc460c4fbc1adc55e573c56e6b260b376c16f6f4e11e09a8dbdd42f5e7cf66181fe0877295a5e2f238e35aaffd3df95ee6396dbe35593606669cc7d3edb6fe6e6dce94fc3f55db74c8d42b936b4b244749e2cd6b814a1ae152127170ef3982094937428a3edffe329acf527ae6255936b1fde063d641feacf69457a16fe99f4d3065ae5eef3c0f3128d8202db59d62618cfea8d45dc67189cd3e1b74317eea41c9f43d24d7496fbf8a159feb0a0f574d9fb3e23fd6727fa3bdf8640353d6894c761ab36fa43cc1caeba77b08e511da4320adf5037bf259e0e0e3725e5498192eb94253183df55492ae9511060fbe2c13582b43372198cb007ea3d73388c0ff229842cc53bc8939b1e93cbe462ed6a8d9d1ea58d4dccde32a24c6b1ac1fe9b4bc3acfa06610964ff5463e94cf5b6679832914e36da57f796c7002542c4b8460325f73a6a831b6d683aff1923ea19eeae7cfe04e62f6b1df84a433fe000949ee2e2aca781759f9e9be0fc5a171061be6ede46cf393407823d79365121ff368599d754b4d636f7414fdc1f3ee75a97a34d88df8731d76516e2d09e977d7f95935eeaeb9f603de153097a6b4858de49c2f0975d9cf2b4863bcb77db129ee1f64bd4470043bd9d3bdc7c00ec59b37916ccd1fff64ba13fe2f50581e0b9bbfaaccca478a12add87895b532256904e77bd5cd56f5490602cf7e9f4e229d88d3c5682e49c6a2032f189214888eea81a4ed122d6e085c67cdede390fd6e23824bde4a65b7b9b1f05274ffb7dadf9ffc938dcb8c659e2cea54ff0fa2e5167249ccd88fb4eafffc299bc32f3c662086b927cd4a43c534d414f752ab862f99cd4fa9131fdecdd025f9cba7c1332e1c9156fd1d9aa0298b7f9160a6aa3ec29d3380b6d5e7d8a4dbdbe589385d2ee9abe2838bb7139e58dbb6855e8df581461aab5a731701c5775fa84c449fb886b467dc0aebba439d748eeeb0f769eaab698cf0b81039caaa5bc04ae6a3440d70730140e5736e42057baa62898548442e5504cc169a97898bb0e77f0ec9f641f281ad46728d17d694ab35979a4c0f065701f361df60d48d2f088a108c8cd1b709d69b8b88da5c6a5aea3b76e48be2939b98eb51842e1bcf290ce18e9f62f3e503df63524bc089c8d6bfb21718fa1a199b21ff9b8a8877c65b5de4deec9915e29c745f7762f3f9646088da25aa1a5077ccf4fd8dd54f0ac97408d4ab32d88945359e07f51e5d3e3eb1c0344d3e14b447e09963e5c2a0f5dc0925aa6aa0691282e56a45742b5f127ed20c34601b34415137274ecb9f214a98f419809cce655ae05506035160a3ff0c35cbb44afc9e6ed6eb4e638db43091c268026d3b1e8a9a804f1cfc6b8af3d7185fcc32bb313da4d56735393551594f3763741da532376b427e5f0517003e41960753e94781c78125c2d8d1e7201ab67eb28b5a9ce198d4cf77fbe9a926012945f49fac5468d228b900728f84da76e3c58e5fdf57f3625d8d7a449ee1186f25e839049b1c504f91cf3802a760223753907ec64d3ebd7512118b401ac28bf5edbfa7a581a220f318d6451e776bfb3bc749d46e576f773b969885634499aa053f6f70e744c1545efc2c6c44c7e544a7a9d399f1def4d4e727a82f4a5cb02d0fb0df2409bca7c9b98f98cafe44806c4e529e0920f186eea1abd4bfabcd265a4b2bcb064567710b90aa6c12f7918cc90ab630ba430b8547a43f7e833710b4c63c59cf838437a447aa797cc24759e5bdc5a2e345c98235f34b709bdf0c6ad1128b6ec0a83fc9394c3140e2daa3157fa57144aec4de2f780bcdb120cb58154bec2beb1731663edea8ada3bfe154fa65bb0d73b5ee688989346e865ca4b781b24e9097dc92eca09115d3fb15582c0a5b5c5badc53ed1a55a15d11695827febd76392f06c368611547d853db6d753067dec8afe44ac823125ccb4d412cd2bdd33f4a8e34c5b2a4aa71917d86d6c71fe182679adb088ccd43719","title":"1143.最长公共子序列","link":"https://leetcode-cn.com/problems/longest-common-subsequence","question_id":1250,"issue_number":60},"58":{"day":58,"pres":[],"tags":["动态规划"],"whys":null,"difficulty":"- 中等","description":"```\n\n一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。\n\n机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。\n\n问总共有多少条不同的路径?\n\n```\n\n![](https://p.ipic.vip/61uj0k.jpg)\n\n```\n例如,上图是一个7 x 3 的网格。有多少可能的路径?\n\n \n\n示例 1:\n\n输入: m = 3, n = 2\n输出: 3\n解释:\n从左上角开始,总共有 3 条路径可以到达右下角。\n1. 向右 -> 向右 -> 向下\n2. 向右 -> 向下 -> 向右\n3. 向下 -> 向右 -> 向右\n示例 2:\n\n输入: m = 7, n = 3\n输出: 28\n \n\n提示:\n\n1 <= m, n <= 100\n题目数据保证答案小于等于 2 * 10 ^ 9\n\n```","content":"096221cf5b628be1e73e8bcfe626c73473853d84c0a528f07f6231776859580899120eaab71a6acaa2c327b76ceabd51b4230a8a962459d2b221b53ea2e5ff2df533792a8edac8e21c268fb58889556c788e17c5d7e1897bf130c52760534a0aadf3a56330fbdbaaf3dd80a47e56154cf81698693f5a99aa3da4f20db30e9d6da839a8e0fd0c237e1dc24cfb0ff868da5cf9e52ed5e04a4c96a71e3b4208389b1e2b3e4823cf61c2e6c7ebf48a671f7d07a8e1f977022f8d1ddf6cb4db194f2b3dd34ab10e7a970fd3d12f37dd202d18fd21a4374b4bcfbb45ee630ff597f90adcf6c05fd0fb309d9e6e15b6e5feeb9d0f7df1a4d5c9233715248f04312f1da8cc438584869a4592477f5c0dc95c5575cedbb432fa0886f1491a52d6efed703e5b3dc2896ca70b4d46ba60143ad8287cb7ca39309eff44cdaa58e4fb4789568b11528e95261e5c46baae7bedc8ef548fe8fed1d684ec8876d363cfd0503814e4ddafea3bfc8227897b283e140e25bece7fabf973fa6c4977023bc65fedcf8861268a5d077f3a83cb1428ec2c74de091e80330adc98a772b5a77906db6d5f487c5e65ca9383bfe201ae842375c1d5b4eb45a9fff3ab55e801403629ce630ee29de44588a1950bc63375fb4a612e19537958db20f2b38b9bf91adb0913a184c11da7069fffca0919d7540147f5b9cebf41497476ff2b73b65f0ec43eb2514b861908cfaae3a44f80ad06e91bd0d782ce72619ead90e2600ccd3d4fdbaee1e0f64de02d536e52eda5a13c517fcfb9e6e0197c2d433e56cf12cbd8167f150da66a05256132bba8d4cbe05a662167c1770b64d81b1edc1345ae4fb1f09bf6162c1208e9b41e4116722b146f2f3ba86430f9846d0353a59cc9bdbb32ae16a7a73437534b2f2c3f23708abdf6775627d03c8feda30b254ab546c939af26c3c149dddb990ff53eb06bd60b13f3dfc8a963434d61fd1d73987394c7f4d828e953a29733dbe66bd22e40579db826699039db57e79781d280ee9e9571049cf746f84657bfceb65e975779b6b94b510825132b2a93de27050a28d6090c0d12547b8370a413a62c7e2015059a3965a01dd2ae7244b3a64182a09e57ac7aea67114bf94965c40323007b37564ebe7cbd4316f841b4916332ebfe899890d7470d5e02bacecca5f5e69f88060dc8d8fa25eaa32977687af0b6a2555a27aea06ffa174832a46a817a71482e4f260a75a5418d5e4c1b031a91e3ee8f010f8d896efc71e469ca446bd910ec8f4bbc3f75f3880dbe99d1131417df810f5cdad48770655b0b7f565c1e0c29f34351e0967f26ec3d72e09165e0818f02ec94d2175882f88871e20873fc49b26a2b2be35f32184d50b39acbc9b0c58c8fffba87296e29414fcb3c82d13da37a2b7215942f775f0959b2e02039a31e19ce22067ae7c78b7678afe01c5d96ed7f605949caef3e71a84df75ae525e926b8a78bca03c1e36912884a9f7004a4d2c2328f9f6a9ff02431fc9d175cd99cf43fc096b9f6c47770d92107553969c8edc052fa1a7f89cb4492fccf1ffcfc108a064bbde76e476c71810009622a4ab215eed18845a0d792f11624d98466f72868e34d6f59af1844e2514a2871b287b774a5046d693437aac6db9d26bdc7fe74285dc91b8c0df2d6b6f64a5df02e2fdd1f3b03247e450bb5b310bdcdf71b79553ffd9867aaf057121d3875b3af17970b7ff0b0776e9141dbf3dec81d15e05999f938971f22be1ff7afbbe009d771c61b621cc21682113580d581c1ced97216f919b948f0c0feb173390d9f306971d202f3dfe8232783e00c4ae89711dffdd26724a7621605241cad839ce5624909014e233d75329a1e019d4895105f172ff9fdd0693749733ca8afa4761506e3fc892ce05fce770958f8eedbf1c9a0f967faaff4068421c917ef75fb0711a8a4e3c486e312678f23abe3c757fe91be26dcd8093d9b6ecc71609c6d718f5599cafa7414a24221c4f688bbe551f531e13ff654baff4d71c6d9d49d9f1521e8fa50ab5ba5289d272d199af1b6677be04887bb8479c0fc8c70b1e971a505efc405cccfa963438a106a94c2b362eacb1c3ebc0ab710e1205f2ba1634182f7efb8c2e3010d35af9f83e7bd490f6709a8987d18c67483bddd854f656a6fd86505c3c6c414f35d22d1c6e762442ccb72d17ed7541370ea0155b560a9bd5266c5f607c6644bb95f96d8eec28a2d497a8b21993b8a9c44266da1506439741459212e33ef25b8c5a9689049b96f8018a4c0beddbdf9c34f713bad9b011d3d8a585609cf901ff7b87fb980e2d73aee77a4f41fe55e098fed3ce8dd34117021065e2879346262cb7856a093560094ed48d56afac8d8f3e3cc5c8e453ee06b347346e08d57b3346e07ce71db4cae3dac5943c00f636fe8a4d2e24a8eb12d080eb913b56e53911206e158d3abc4bb9d17f0bd6c64e9b73611266e9b7eba08109092acf9f1318b5b3fc4a13aa3e554759e712c9cdd89c6767e22f334f8842a7a23dac0a020f16a7703d467bf3cc793b8b06a07fc51c70943eefb5532a256aeb7ea6f175e964e7eb20e373a9463e1567a7d9a9efc71be9c9cb1eff0ba0c0ed8a3396aac4f6a71e530ce0ad6204fbb7a7da50b89c9127d6b3b62a258654836a2a61b354df06a005bfe5f00b380438b2ba4a9241c9e9eb54ce7ea870024ecb7abfba380a1b168e69099cb2967ad0cbae68da88f76a79eead6c1ea4c3dd48a93c4a963ac54500fba2e698639440af99af14390f5380f1aaec7ae6cbadd046f2499816e535faa2d67dc2a030f62261b58bbcdf3a36fa9337a8c81f83d077618693f00880180f91d7babc993eb1ede774bdda6b9c19c84867e7264a4cf21482dbcf132e329911f2df344224575dac6cec3b408a5cc378c6c894f842dba58b16c2d601b4796f6f5b1980dc444c2d06999b57f2c732ee77bd5cd56f5490602cf7e9f49239c889c8a726f5880e31f3d5ad515d0e4affc91ae750e44085c67cdede390fd6e23824bde4a65f387beec5b13aee59588e2fc8e8d8ff726d160ea59ff1edf9e443d5ae1a3cdc9d5cec266cabe192f717fc2e45c953764ef25a96fbd2fa7866b9bf352813a1bde84ab7984cf8dd04e5552915bfd0cb5cf3d9e6df54aedeea86c70b57d3e3a1e2e11731e6c73cd98b879abc5c30d40c607bf65304db2181b23f0cf61c0bbe44ae47f69821611b3fdcbdd70f6cd62208a63ae1f6a517e9a0f2ba05e5c6be770eaec459502b5881c5c1f1785b17ce4a0be4c71bd1994bd6b5a4259c130c80c407a042505fecc3321df741219dfb537b3133108f2555fcae9e5c1850fed21b65c65978461e75506513cc5720a755048c0e0ce2afbfa5b16271c364f5af317f1de5ec9d1395c54fe725693029bc0d44b1e1d343f16a8d76db60853bd57572f25986ecb5d8bd6a2901b8ef927240223f5f93079dbdd2ab4515e779ca1a383d74302923149deb43bd58f067ed947d43f919bf25f5d8789a59773c74151ec7204593f49b58627bf77aed8233dc6ceac8bb738480a91d3e2e7f697c2e4aa8d315287de5c25974f0851f9c4689d889394ff053aa0830214f83903dc5817eaad6f68ad597cd5f6e8fe81202f01fece6093081f12cebe28fb1683e9446ea1f982f0cbdf888dc7b1b31af78ceb8de2f3c3b787f6e24f91a714fe622735985d1f2f139de52fb5212fe270255c4162a316586dbaaa1845ea9f6beffc14863cc6c81b4170cd2a65619a07a9679df91edff95b4e97a78675fd9821d4c6ea5778aec107c2085973b263f3793ad3756c5e824458e0e5e5d6b6f7f1d5fb12c678e8055f60688001f57ecb3a1320285cb5a9af634499ca496d3a0fa405821c1bd62c6c19eda101e1a986d7b88fa1919766a14d1954e36843f6d324198ca780f7db94cab05ed2605453c5472dabd6dcbbba96c1bac37513116ec30f715a2503c8e3631cb5d899de02f14dbc740b945d8e6254de2c3af4867c73e5898ea065be39969007ccf5201563645df5c3884d9c12250f269af023ca08e43820cb3aa993c7ce2a28f4723ae87c4ebf86d765be976a74d618d0cbc8b928a283d68f4ed1fc20581169f071ef239a73c5e7877b657426ac981d1344de68c6e6c8d38d991915d3fb147f0406447f59b2cc3ddcaf5a21e81eb99e5189dfe61c6aa9e729d03757e058a1840a2cdae1c73b3e84e88de709dbf472a8229e70c8f74b9f925876c29bcdf2a7d612774b5a51fcef8aa2b22891bcd91ec6c6ca80c9ad2e65275961f32df60525c709fabd2beb866a88f2ee399c278446eef6d887f323dbc5232019767f8f0d6ebed11cfe7601edb3c7f35da263bb2039dbc66423bb8963c6d9474e1ea8a243d3fd6765592c5f02806cd025c8b68fa9bad795e2100b71ba37be40a988ee52943159e1aab53436d23a0c2889526c2d2e474169551e11e0b088afd50b6efb9637b14472d9ac4188833832f1afe49285d5b1553beecfe26703662c89b8f53e42087ab87f8f8cac26bf327dcb4be8a57f6f685c9478c0fe983bffdd4baaebd1bcfabf59f572c73d8553c1028751c4a4ddb1f1afbe733817f60e7b430ca1706702d8ac88eb448404dc36206e03d8953e1f650667f293dd7586f99573a458e1fcfa13472d652de6fa704fc8101168c518ab9b48408f86d4da7adeb141c9fe5acbba2239c6c74b628f15bda636ca04b0d7c3a19d3149683ddae47b94eb76328bcd64b03ddd4d1a5f6f26b9cad10e2c95a698592efe07c4aeeb9674c5d5749c238753b7298ccc7e97086f86f566e0947d24e925e6531ff676e38f5d4bd7bdf97caff2ad52aebd16275a764bb77f03c834f103e93ba59e3285bedbc49b7e9819760e6cc3b4e8716ba8978d20438843ce64666238404f94d0113011e8856b5f260f73e6830990acbb04b5d6d8c686d43ead886ae22b45dba023225106741a0c7e56bd78355e37ebcc5511e1465fcb7ba6c3ab89ff4e57e9c841868d097116a08ba43b745eca4244d2a37f72be7a043e364e5e1c234f319b8a7c90c16256c72e26c5ddd69b82b26a8e9f0d147071d0334b35fb20beb3c8e066c438a4180bc636feb930e69ef35cd6fcdb3b720166857c0578183b2d4658f83143be21da0b21440ba1e5c0925a1f3966769a6f39609ed20ffa9f30dcee225bb23c7431545d1c2403632998e8d011b458c4201c976eceba7acb94d78efe874859fddd8ac65c5d65baaea1b07226deca7e4fff594314c3c108b93ca3146ad88f8e54b7027a21d1498b9e05af5a9ad43937a6a0c0a7f59cfd533443e218b5c5e7c5552146aab5733b906beaf2e98a8c8f96b5d7986c4d3d79018636c5cc0b871917cc8e024a39c9579d858287c47eb3dfab227942c166cf6975e44502fb83fd21d2aaa12ba72e2f8abfe245c2d54773c3d75ea5cc2f5420b3ebc625696b6e240393ea254fda6e04f2047ffff7f47ded69c955a71e4183b3db106b96914db1a6b222a43f0a5523e979bc96d9e010b8430a65fb221253a0343c3a33aab243dc784619f1adf28197f0942d5f706b0095429fb07177135eb07301066ecaf523da6e819f06424edabc09b6cdeb16bc35d5156375432615c0907f91ebc5e29a16112308a3b55f68a228109a8338a3bebe7c3bc05a759cefbb808f7b97cb25f6cd393dffd55f9957ae679f5cde8ad56b561b4d454d168f6cadec771ae04b5e22ad283d1d3dc61eb6979fcab1f2108cfa1d8931a592546023a1d4f0802d5c084f4cbd4fd08ac8441b522377597fe48b1e56ad94066d050e9e9dd318c88cba4e1af26146d9443160fe6c10aa46dc4a6ad6ea76315d3d89f20109160685731f889ffcdf1c8377705ba328d61e57444ad278bafaf45d43dad3bcb6a5919f88f33cbf20b7ab24effad59db253000f2780cb9cbb7655f8d05e3b951dd5e814d3f22fabcdaa2482ef3c33f23650d1fedd802a8bb1d6cbb6dbe3c1ec5804c9b584ff5c520c4453b846bee6c589365f20484ea7248d180a04c738a984d55fcacb8db7178d3eb701eea7479c8858dc5a129a99bde12805cb1bb454d7e25a9de5008f50a566a93a997226deb09dfacdc41bfd11f26cb909d861777039ca6d7bd05c01ca179897ab787941ba988be49ced02b56ab4d8a649ca328321bf79284a1bb3fd1f272fb323eb0042e9c3cba65a678f25cd717c3db2a1381fbb4e759a1fbc8e5591695f9e79adc38c54af97344f39adcb0e0863b3f36c44ec761ec1d2c27037a494bc785329fce598ad32afb2b9075f803402421817f0657b8fae48e642cb15d602a15ba7775bbd4536dcaba3b1d698a112f8cc55d68236dc0dab85c10c03bb328ebea24486714e88357878d9761ba93a13546e1717486bf167247fe399e2858234e74351b20b8558767ab51dc4eaa1f007cc396cf7b3a0c1a1c05f3b918ba96ebfdeb54842e737a75299e2d59332d6f0c5bf416c227926067c5b4c5fea536586aa7d8627942747a4daebb6118d0fd7164e14a5e31e58af95f01164c212e7e3caafac1670dce3fe9f828226962e650150ae03d9cecc235d775e80659b34bd6f9aabed8c62a9ecb77631eb04b45cff5a7fdb82a47e3d507d8cca150799b5be","title":"62. 不同路径","link":"https://leetcode-cn.com/problems/unique-paths/","question_id":62,"issue_number":61},"59":{"day":59,"pres":["动态规划","数组"],"tags":["动态规划"],"whys":null,"difficulty":"- 中等","description":"```\n已知一个 NxN 的国际象棋棋盘,棋盘的行号和列号都是从 0 开始。即最左上角的格子记为 (0, 0),最右下角的记为 (N-1, N-1)。 \n\n现有一个 “马”(也译作 “骑士”)位于 (r, c) ,并打算进行 K 次移动。 \n\n如下图所示,国际象棋的 “马” 每一步先沿水平或垂直方向移动 2 个格子,然后向与之相垂直的方向再移动 1 个格子,共有 8 个可选的位置。\n\n\n现在 “马” 每一步都从可选的位置(包括棋盘外部的)中独立随机地选择一个进行移动,直到移动了 K 次或跳到了棋盘外面。\n\n求移动结束后,“马” 仍留在棋盘上的概率。\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f259c1c3385f76f7230696b5e66115584ac2460e5fd220008b051ee154dd47dc5882972a5cb38d746f23aa4faee7bbf7166609ec0c2fc0d268fa687d35e703aab6d949ba3009b39aa6ac5e9aaab854d6fdf1b6eb79a2c203d0e6bb39cc1b333d54c2c2859f1cf7ff5b6c4198359e336d62768346920316bc42a8719768763e0d30a884e253d5dcfd82079f08ffc3959772a276cc6f6207a7a2ca6851d787a89a9f4f2bfd9ef64973dea7b45f60d119d7bbb48075aa10cc2e82f36cbe4f4e539fd45a19ebe4762cf278d926b2f38cda0f3b906eea04d83f5372ef8bedf85cd020a59d28fd964661a4cc030484a1fe0b771e5df8dfdd42680e4d10dc95c5a76c03506a5386d900adbfba14aaae90896268b4149cf05e8dd1ec36057a97ae1e6e9943b58d5daef2206d12c9158f421815b0c8afc463704cc352b8b1c278550daa8da91b89488d44e9f0cca7da8f430d880d0f776838574f851556a2e566e8b9639a8ae0fdf12135b587fd73c93d8dc1f1ae9142c085a88a66338a1405bb06332d7540f97e6a811e687e9d24332014805bf87477a72328d32d5f71f1995f3d259c5a8cfcfaa4fd702653b2aff7a03e8b7e54da385a88212a7d82ef302750f310d6f914affd3dcac8eb7438ee94566658c18e30d551e5527895f0248cbba96e6cbaad8c236515667e0cb4892509b99769a996f806144b363e014807eebbad1fa1a3cb9cfdae83a57c9b249e3b2ecf2cd9f63fe91ddefe583ac3f5163cda3d4c139d6b9f397d0424a8e873b167f1bf80f31511c18c4f7c4b5b67f055f58805d2f6873f65ec34c2bb827f3d2686c162c1f10f8b5236fc9c9f8d2db8fef20feb16535a8aae4a4bbdfb08d2972951f4a4614d040283aec8038d3b38ee0166ce752dfcad7433c2fd569a464ac4c95f51781edce61ff520eda11763ab4a1c6e3166c2e23c9571d8bf6436fa0883cb11691c17af3823ff95b2761fa2299a2204daf7e8cfc8b794a4b06957f179ee3413ff1ed79bd9f2ae37e173a0682d6565008668511deee83802be6240d18099bea31b5c432d15578b3271650a12ad50399ff79ed7902e5838d82559e6729caad6116d313af3c759634b30e2a9c1ed64fc642d69e9f722eeac3ac441d1f8eb3c3d12d60470a672f2c0b0929dfd9c012373eb5a0de30b5302d555e1bafa75ef2304add0acd48c5e48fd9e7e9d8dc7dc40088f787ee58b892939b4975a2dc14c136805fb1276dbc4fc1ff15b75f2fd8ef4888f091057879cde093e21d6513a4ddcbb2f8d4b39ec4ad29cf9963fe9d63831c34bbb7149793d448e22e3c80fe82d59173f10771e35bbe6701c24efd63f72149d7fded9af2cbc1e0d67449dc85b8a1b21eaf2154d44bfbf7bcd977dd3a94d3ae394680eb068eca559cd7ce13465688fc5a009fd476669e8595a429962a74ba688911af6b67c65b27454b802728e0d06723b82d562e3f18b56273eb5613efd40abe30761c2a643dfebe56735f5e5a1189682b1810456b22d0611754bbca48a5125ba0ffdd238626535245df454f568f12248c98c374bfa0b7952cffdf1c1e7710a6f64d96624f9518622fff0c38bf4a0d7352f1fcaa3bcb2619290046efd2b8e232d09dd5156d6a8541b37d9be1f7a66016a015478f155c7106180608d0de3ae2b2e56621627482ad04fcd416460e5c16afc4b431c2911d7e88bf07b1352e6b638bad30cc4c15f95dfab628b7682c3a6ba256fe0befae9f451abf103a82e28dcff2d46b2bf8059949cedafeb37a39079b306a7ed12bd6dddf2526a4da0167c49a26cafdd2672f8043131e121e93b391cc48442a284014267e3680fd8a238df6202b6d1fb280c02853733c489ac7fe724674dea9e43f8239d23a4b718583cbb187aab009fefb8b0add65fe7f9063be5d3df1efcdb1f3f571098547e9d1a6ff7c56fa09a3be3150c54ca42e52f90361e931a088b94a7dcd6b719acedec0de32bd2ca157ce2bc5f33936f9b5a8b9c64f2d8c8e4cc1138c7fcd1166458f90eb5702b975e4fea528b2d4e92c99820b896aa4e95b5575a267628c155e7a73cd29eca3550ffb41ac4a9e3601b6316571b1154125c2ee170c05949c94eabd411f6b15809b7903c743a2b1ca984675476edb5f04c4ecc427e65e2aeac7e4584b30dc71c27dd66e0770c51b55b547ab987068e2e604e66b4e9f5f94d3dfc8983f497a8b21993b8aad632778bd5f7c307b375521141ae510b9c68054934e996f8107a6c6b3d086d0c278513796a60c2f208b636409d6921edfaf7e9dbbe3e638e44184fe3fc1b24f9faa41dd9c553839eae794bb868e1c5e85237bfbcb557fcffe2ba96ea887e1abb1c52cde6a7dab675818538a6d9b7691fede5cef59be2bf2318fcd5181e6f3497d309410a2262e1b3fb910a36f75b7a1d054d634d4998dcb51dae1266e89e910766f7afac66ddc852f452eb0a507d72617b6f100cebe751bcd776be7cad4b5453065c357a6996b2513b7a09d4467e9b3dd22a870c55a63426cce8164c8019e90323a9fd73bf9492605f79bb208cca170c380bd9b61d65558749988cf70a8b4908cc9f0850e0df9bff0c621901f498b5de84c961419fc680af90aeb92171c1d0a08cd492d0932cee1396327d6007a5a8a021be3df5ddf70a9cebebd5be7b806bdd92cec63dcf3d7c3c4feb1f018f0f7d1df6000817e166d3b5b71f667552c362569b29f3a3d6f4071a93198b2846ca4e257f6d0e35d2e14990301d086d71f2a15d47e46c5eefc0610b8b1c873e9d203f48cf2e5b3e391395c6c29c121501edb8ef8b786f596a7cac614b6b4d35736fcd3d3aa489f5d619de6f9cfddcfc72f4a39989c784810f3fb28e560a15164e66e5a043b9d8396dcf423ceb2728c25c71bff50c163fe7a6471541696e4e0bcdb408a0e95857495ee23296909f526d9cd0de745060fde23930f37dc84ced478631195f2417c06cf5cd8aeaeedd3a77d794808076adfe1e381a06223d946cc4665baeda0fe0c44ffb7dadf9facc6cf87c5269e68a501bd43e7e55d3c44dbeb92b9c3fac368c48a2e346a71caa012d04a20c925e021e92fcc8a6b80f852d43a59de899e60848184c16804369156fd1dc8e57dde699035a5a82893a008bd9cbbd4a8c9dbf6ef9a7dd6fd06c38486b0992db5668ceee31fdea6813555e70f630e35d90a7fc16111c0f4deec57dc0aebba43d43adaeebaf775ade67396c7f70e20c0b4288808a4fd150b61781205f13d3a7b5735be3698901b1b36595fb568c8dec7ccb0b33a569de448f29ec81330c152ade9d048c19b5f2f0c484da5399c7ade8833058b11d0de948837a3b4a0ad95674e09a36133ec82e2989b89e75194240a9b6e17b393d17fedf0578a200610cec681e2e1ba5713fa13229721ef9283935dc65b5de4deec9915a495690d7f23f4e33029c2c738bb114b3e86e8fc8def1152d76e0d8ec8689d814c2e9e4efe15543e659bc0344d3e14b447a6d631e5caaff4da7250e360bd3b1dc1ac231b212b0f1226865e6925184a795f646e148e97285198be128b95ce3e70e05506035160a3ff457b9fb406bdcd3aedad536b90f165c5975a1928754ad2a8ce29118124e5ab830a248632b6312cd9dc676e133551594f3763741da5327e25167e134444545d41cf5762a037fac9b5779a9bc1fe141dcd62cf810de7ab98d9cf6686e9a22610326ff49fac5468d228b900728fcd9c76eb89920cce69a03940d6404498e7182364bb6d769b00502191c93e02eb21712760eb29a63664c07309118a40119eaca58af6c9a1abb35d8852ab491e333b8072ba329e6e5a6f66469f83af634499aa053f2b2093018c0425b551175390e54fbaa997c98a92b587b355887e061de3796ccddf2e5486a9d8ab9a83e0fe44d2291a07cc4720b5d695f5ee8cebbac375134c44e90f381c254ec8fe7e1ca4d8d6c852bf50a12d5bf102e9324ff42c3af4867c73e589d3d80aea6cc4de07dddf20512c311fb986884d9c157040688ab84cac4eea6d6e826bfcd6f1c02c60af3339bc7107ae97d73bac972874995df296c6a56de0dba9ca3e90a8680b1924fc71a123d13c86eea5726b600ccc9b03139160fb45525a14411b3375d5f0dbfbb6c3ecc89e2968f86c079f8f57d9093829c18c2e99e76c3cdf6ed29c52b26e5abdb4f0ecc7fe811e2e3139892529e6468304b23f29c92d5beff8563328f2ea9695d4fb90e56b2acb8bd9538edb860285acede2949656d0b65577cd24e73a27d81af8aa25eab6608cf3be199101ae48c6d9d5acdd20e7e721051b777d830a52a712d16f374590a2ce33ec0b63b21bda46963a24d1cf7fa2a8520e7d95182dfda3486808771278","title":"688. “马”在棋盘上的概率","link":"https://leetcode-cn.com/problems/knight-probability-in-chessboard/","question_id":688,"issue_number":62},"60":{"day":60,"pres":[],"tags":["动态规划"],"whys":null,"difficulty":"- 中等","description":"```\n在 \"100 game\" 这个游戏中,两名玩家轮流选择从 1 到 10 的任意整数,累计整数和,先使得累计整数和达到或超过 100 的玩家,即为胜者。\n\n如果我们将游戏规则改为 “玩家不能重复使用整数” 呢?\n\n例如,两个玩家可以轮流从公共整数池中抽取从 1 到 15 的整数(不放回),直到累计整数和 >= 100。\n\n给定一个整数 maxChoosableInteger (整数池中可选择的最大数)和另一个整数 desiredTotal(累计和),判断先出手的玩家是否能稳赢(假设两位玩家游戏时都表现最佳)?\n\n你可以假设 maxChoosableInteger 不会大于 20, desiredTotal 不会大于 300。\n\n示例:\n\n输入:\nmaxChoosableInteger = 10\ndesiredTotal = 11\n\n输出:\nfalse\n\n解释:\n无论第一个玩家选择哪个整数,他都会失败。\n第一个玩家可以选择从 1 到 10 的整数。\n如果第一个玩家选择 1,那么第二个玩家只能选择从 2 到 10 的整数。\n第二个玩家可以通过选择整数 10(那么累积和为 11 >= desiredTotal),从而取得胜利.\n同样地,第一个玩家选择任意其他整数,第二个玩家都会赢。\n\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f2792103385f3677f31437a54532e54a18c2d7fe710b3f0987cab7ab5e61db7220ad3962513d4f02ff460b3e5f06ee02c656797d1cce04620c3abc49410683eea32ecfee24fdeb15ce047074a2b7dbfa53bd80bdfca6069b7ef8e2e0a0435b837cce7e9cd09243ec382cbf515fa2586bd46755d0d117c1cf376f636f762ee54d3088740252d5d0806f47ec880355e7f25771418a1f14ce580bbf294771e493dabc8f479282f63aa322cb0a1fc171f5aa343ff5268cb7dfc905c3982412372aa20c56f7f2db1810959b8cb353a7f8489afeb3f9ffb5e0d10a88130e7e6e6920551db4144612e080a27a80e3e0a20a8d8796b362e5cfec539791451cfd1b7f65edbb425ff2593a837580382e4cf75f92f2fade563cdbef7aa2cba91c37a295aa50cb48e4863c54f449f695ada8479831152af951630524eb0af53d1c2dc6b8cf7e1d1cca1efbe5fd060dcdb6d1414cde6a3f31afeb334856f33fbbe902888c0ba1279b4a0672b330567ba5f87a6ae317894054f5159d8f75e5cea692ac05863ab6757e3f2e849d1ec4c6a876a022d5e8feb10551879a167a6df796992b0a46da7fed6b8c565b56c536f79d70254c12730c52967ef30a66c76b73f437f6c6b1d0af976a88fdecfe58c39e9f6220e4936f6be111558e3f542e6bf8c3e3b427faecce2b870d3d368c9ff4b864099b54f9a997f806144b36dc7118750c0b1d5ff16069bcef2f43b4ed87616dcc991f0baef74b3e6ed908aa2053e7d4cc6a5c509931a75545215e96792e463223e46f6435f4c5253fda99ea1f13a32381076d32f7153f542f64c24bc21f6e14c59a8c06f069ce03b0094ffa0beefea8712a0e557997c11bcc5927a6909a873ac104b492416371849b9a17089bef5544e26f32888f6b8012546b77af6339b1ac2f55dd0f0890ffc0376cd46081cde17413ba6ccf9b491321529dc96f4ddd538cd5295a433dbc765e0084542af70b72ad1a408ae6d774193cfbcdb398fe11c1f90aaa9c97097ae29e65b14293b83c04d513a6340af51e3bba32bcd310f2f1d92ca3db5e524d15c417ca3bf518b0cd50390f241e47a20cb81a5bb54b67908ea4b0e6fb08644e8c465e8f28045bc7f98578b2ae51f9c4f2de1c7a54d0c3682b8dad30043470040232b38083ad0dae71b370db2aacc0eb62407564511a18768f20361d01bf94efac48dc2e4eecaeb7dc4098bc1a6ee7d9a9ea7a24951a0df00fe399760be2f79b056e9fc23ad510cc3e354b7f88a37724ffa05258a475e42cefa9feefa8ad79384e72d8bfbaed427800ddffa2e5ee013412ec31efbbf5f0aa6d6fe2ce77b28dd28f35d479b405f5bcd2844d9d8ea45723200750883fb2e6e3c5dfe51f7153bb06b88bbb49c13fa94505b13ee30998c902ccb52add4eb004d529811ca6cc7e11104b5edcabea1f12b6c990aec5dff2ae023b389969102dfe87a5fdc0983307cafd0c33a909767a5f87e3df4942076cb8eded0ad84cf9cfbc795489be4abe7ec3c04c075325559dea460d24a7835fdf20e8712575066e24679668d32218faec0749bbeb89524f1f3311e6c28abd9499955639c315e25fa3638bc480c4f77f3dcb939e73b17381943cdff559f1a99c4dc702442c01ab131f1e5a5fb6251fb2906dd03320d09564508bb74a324c1d433bddca23ae579c989674e542b26d0ad9f97cf822f7e8186029d042d4967898323ce7e33f34fc0bb11a16b1722ad0b16a73a95c9b52c478a7a7193a8d2ccb9887a699138cd02fd8995a2045f3fd9545b32be3fbf81ecabf323846c5d4c43a96dfcd5462a95751310161aa8b773ac500d5222245f2a3b6d945e65a01bf527156d1fbb8ed41a5f741145a0c2ff425b74deade511b6ff7eaf4160958fcbba8aba9406fde78925c266c37c9063ae9bac7c2a5e1c340b909c4ab76b3b759a25177f4089d25b64a614934506f96b3ce643fd9cca1872b6354dd57564c2f53abd11b357ff03cfc72834f292ab8bf04d15a7867ee413af7acd3843449ebdea6424ba56e0fcaa28b0effe2caab40a925dafed6d92e8e13f54e57450342fd564b480045bd615cb4be0660e34e2067339150c65446ab8cb9e3f9f80c2bc7420683189955a0c2be42a7529fd2a71000ae23745eca8aa2e0f90d42e572ea796a447f03eb959a0e1b809fbdc228c3549ceb66871db49d79d0ff21f383d5347dccb9735a74ef80d0da1a2b06cd38e85e7e0bbaac2e06efe470d59a01a925ae07f8f312b795e75224badb2bd490889f6ae4f1a6744a3b87b8d931fe4839752a801d02c4046f2ca0aaee2876d11a7c9ac09555d277400f2b214fcd87f1996bf120da000d3761775763e43fe4986fe62b2def8980bf95cff762c198f30c265eb64a3764285416226abf2fc229463f2a3e7dc3cc864a792596065c711ad6f9994d752c3e0cbfe202f5f6c371dfa6a1fc18b721e75347ceb5bd3bd586a9906e7764b92661593dd91cc405e22fa36f88e397205d7292a81d84376be09d23fff1ce9c163e7b06be4009eb00930a4e634ec702723e09baa35c1a857c385bb9360e2b8c8901f4e3dee2c571d6d437460d6a23679bedf7dcd9c932e980f8d0bdfc176baea7de10a10c4f68dd2e24f86b9cde32a7098f0a61dfff5a07f80d4384daa03a90925dae4522f3a9d7b17e265ac6d1e2c3b426f0ff303f3f5c4ca6235b1720848396951f85d442c001eae4466a6c39bcba660b44254059d4a7e8f3f520bf92c0ca3c5e534131de6a8ea18f5890166ad0578e894873bf59755e1ff99d1cb9a8c5d056b64b031d9f148393dd381b5f18541238b0f9dfa54f167577e6cb319ded21b2813433f3c43a39c5ff306adfea6191fb5118a26a6d579dcf4c3bc30446f177bfb25209429a92fda4bb116db4e90e49ed6cd3f1f7d0d638b30a74f5ffb532687edf6bd23e3510ad1588eaf9b09f035c9cf6b4d6850eccc8c0743efbba01a9f445966475f61e2a08090f1a26b402b0545a6bc12887ee84f9df1fd6691cc130966dfdbb9c0c499c921ea63be15b30f645d99b79d33675c67563828ed1c6d62307f70a1a113cb190f8769ec06f37be2c12e9bb6c16ecc9a426c178f10042344fbb1a854ed431dbcb7289be243cc2f7bd42c45de092661431872133f290edd30985e810d456931ee72088ae4c51f93e7d9561da840741f0cc7326dcc48549ab19d8a7d33af6373e05cfc6f7e3935906977911d215b98e42a20b23b08f1a3461167780671a2747b5c83a941aa4d61d9b3a29fb31f845b6b0f59327ca6fa557bfc3761394614cc5b85d1689563f525584a061ea5e004945377bf8767e1573444d973166f6d1837fca1870fa5a94a454b015d074d9771ce9d3df391616b179e5c29cc16fc9dde09410c4a5a07d6b852de9037e9471e4530f803fdc8277e4eb33f6d55909ada837b05d5ed134be3068497b06c2d4c3b4592f259fdad4e55e65403f4e102e2fed0d29ca3257cf2f8aed139f02536ec2159637334a6e97dbb3dc9f14749e89bf394dd8ddb0b94eaecf4ee9adddcab841f50a6f15d13a74e1174faea469a9aaf94d20f38a4b90d31d63a1ce1593fcfae6c74ad6949d6e3e6f5be392f1febc85b93070b20c29d37f40ca5e97367a1ffb1fdd6da80abcfb0803af583e3421a3976170b3e875ad6ee0b853d3758e36941502bf4950bf67a1da4220d0b1a6fc4acc364b598f4cb5b5a04c4ae5d877f8cf34a2b55bf436c14e53edd15b7985be78d3d7cdcf7882d96bc5480fc863252feba286059620feb7afa6e17883a404287430e8fa6ebc2b3e0edd3ce5d47ce078ca5b3fd0df67c851ea7e6cfafe6254b30c4813608c38affb47bc408f4ec3f8ccedf45538c070c17047118574723bb75cceaee7797ab7850999b0a0b0f13255d564b8366a1df996c83b81e1209752a15547c7bfad6bee10794bddb9fea0b5edc368ec6d6449d068406c5cc3fe3a41945d22c77b5de1f3baac6ddb362a629ad9053989865471e649b59644fa57d80c8d2ac0203a21ec42ffae847c46f1f0002bbd00fbdcd4cb4e2344360bf7437c35eaf9904170276c02d641a0ea00f6dec8cdcaa6ab611855ff457213197e39cbd412f85d71bdd3f97f2828ca5c993a41665631736722354240342f9177a97c7038d596b618bd07e9cb33c31cc1bcda879f70617ded5b9b5c9b4d159271b410adff9709028904ae9fd7f819d4749cf82f91d0c6f1165525466c9e3afa2b13b95b1dc21c5ead082d29923570f5856dc28db22cb71bb35d432a1e75d255862da5c8b2d847b88a6bf8f5ff78f4d037f327fc05a6dd98d3da0dc8a2b3665f35e8a6ba73b39db42bfe02c50e8432189dbe109d166defe725f55300c78d4a34c89fcaa9de1b6d8c88767214fc24ed166aed2af6c963b73f9b1fa0438d433536bed46692a21467166167a45e6b0aca6c5427dee825eb25576c1f50e85886c72b5bfec80c7d6bf5766d985a33142356fdbf1a66a294b3392b7040410b4378ae00dc00859edbee7e45bad4f1716fd40678e2d5c5c5a02c50aef7dc871c01695058d5381eed8adb4e1ad627e4f904b361003f43e2e538de985bb4c964cce7a272b4e86c7330a62067af9d8833ad8b7f3668452cbfcf013277d247fa7b7701486455c78c51ea3c94b6ae9cd98e96fb5e30084fe0185ef6f7b839516248e6dbde236e318f5d1d7bd94741a376497eb7f9ed5147dce910fa430ca2401456330a9dda14478ccfc826e2eb8528aedbfdf3b8bd57cd12f871dbe2ad723f10e8d9651608e4914b58433a22ac7ee12ea4d549cd013302d9d63790286183bd08fadfc8926beef24a86ef32dbe2f499c1532566f5ea312d19c98af5f3677c1cd670b21ae936e867d9623626a5f0a464cacef8a214df6d7adbbfc681387513962ed1574f2c686d47afdf3209f2b58dbe473591b7b3d570c74499232711564f2f00d78e14d5f852f96e9abd4d56457e99a04d2d85b3f16e4dbdf757453ca017c9ddc7027944e162b594e2e4577077ed5997cf38e26138f4158d0cfd8cbbda76e92940d7d3c3083604b46b46ce8e74407951b9525dda770ff015ab3566372892b6e2ac3f7cf8012ebebf8d9c5e4dba62798a735e244ccf4f1c248025230d3dab8c1f86e9fe5ff0e11af58b530dcee660bb22174180074497c4d2d47debbd801bd7284601af2160a5dd04b675518244ac89c54091154d6cfd055300976ea831873ee8b65ff8cce20569165f872eeaf204e048954ccf8a518a0284bb3039c3265fca73764580a3018479bb3c06fef644b00639d9ce4284db9b50bea2d78136717025008525fd0e6aba4fed96e4e4aed11dce50a36929ec954d345686d0806c64d4701ca90c25fe12c899cae0c526f3504ab335736b27ca7e3482437b5a6ffd8c13346846342d7dac23449019f84e39a999e4a2cb2a210dad8398b987fbee96cb9240ddb7e958836384582f7273e85332d778d12f8e6b4a608a62b07276de40486d3863accbb9e15b5f5b7946413cd1acfd0dc51143d1d7f6569c199c3d7d750cd470ce86c6a1be473c59ee30f5ddc51a42c52e0badf7766cc044265b613f2709fa7a6edfda74f49c438207d3b569bfdccb42bbf55ad08a0d63a22fd0c4034828dc219f8684d35192dbe495aee4e53eab22111d92e9e03fe58eb77097cf0dad587c9b0a74dd2256d8fc765d7f9e433fae2afb7009e075f3568760da34b40b94c9e2a5bf49ba0401167439ad1fba99a78db3e126581aba3ce90e696046974564e3c8f6e210d9cb9d918f8b4ba573efb434916d0b38d7dcc13b065da6152dace613f7f3889c725003f2c4580972c3f441ac33db0faf46b4ff3400647118b463d1644ff4ec6f4b7b3b795a3c5c9357db2126d8773f8e094be6207090389cb8c999affab894653fe0eabb42a8e970fdca0a773c8e8959f5af97ad6fe7b0f8f8993eac8a6ffead1c1572bcf747645fac4bc47539246b8e3c6971c5c1a664cbd398e0e2607fe05a8a6c356ccfb8282388239ba04f2ac83c18d0f835d74c7a2c2922c77a00cdd0dca98339d84679637ca582fd53bfd998da0fe80d0b9fe5e9f0e892dc369abd191b92980f000bf837ef0ac1f1f87ed8f7c1f5f120660ef862badd9b714c969d866ab3f752864eff39ac7d27be62b83cd4ad41a1eecb723820488a9bd6b645d71fd423711eb6644bd43f38963ec1919ee37ecdc06166ef0c48be1ac3e22a2c32db26d84de9626a24c3075ed90a821021260cee8b639e9f3e9518acbea83019bf3577cdc5d8942fc0784749529daba2698d34b77357d663066a77a04c76f3fa058c411e5963d7c21b44752508950811ab10f1f7fd82903f3640f5929100b5d69ea626667e381a586dc3eaa607b7a8039b4c5c6b50bf7ea87dc05d81262eda5a6fcb9cc58229180bb6192f5b66e69e613aa5291ecd88911d4e1c3b95a79ceeea9ba156d3a39c4333f9dea368742c71139dff59224a8599f52c1f9a07372b56685994efcc34fe307742311659a8b151116abc9c4248b2e395309b212d1c88a3c4f3e14e50252e66fe52d1d3f2ee4786c08a784038942b574bca9593749ebd895fd5d7bc6af247b0e3fa12f772d18ab4a6953bc10ac7636cb4d6e667d565d1c9fc47db8feb40d457ef0eb072613a259cdad9bf4531ff905e63e25e7c469fb77300f2c8c1aae9890675f61549316eb26b8fa82e4346a25182604e4efbf41db4a2f97e5981dbf3123bc2a1e16ac331a976ea03ae67d8c88ee7052bd76aaf401b5635fda49ae478d18357b0b4d7df81aeed3797d46c19939a92b19eb6045e9e30ddc27c3f946be6dbf63d515113deb0642d00c63c326fcf71e275ab374ea43e22ace847ac4960977f7f883373404603662e51747124180238fa2a3df80a80f3430d9eae40579713e725dc9f69679025a0cdd36d54ffcb9f1c3b48fe081fbc4e586665919f2b37d47f3ed7efe2a5fff4b0fad1f3e5b09a2352a89934789f56c2e3ae8d77d615ddb06fa5fbe9a27b1fa1081b30e4740734369b1904aae8516744a3f863a0813f32c15e001cbc92c1de4e65fa0f521bfd3783374cab7b4c1b96722896a7f6416427af0298f802b2a82dc119bc237f244d16209e6e5f80c2635c1ba4b791a3c1c13c5fe695c4ff089269a935eaf2be89049e824916feb755f6c8fa6de4eaac18ce39cd0f978dc89f1e331dc8adc9a4a9bbe2c3423ea1a06bf17a3267f01aabeaed46718beb2f5a826c27e2d535fc7e3c0a0f66509ad0db881158c06ee3d1eaa220b07cb136421b38df53cc42d30bb1d96eb9c92df5dbc946bb0850d7c025e82463938bc9e77f19a5a4d0850a9371769c7d7afeba39ab4d11ed1e3ae97bbdedf8423498cf3a33574c332ce882387cb8260367514c792f84428a172c27757f251159097e23091f2e237be5dc66296c6ecbf44bf504f36f3ab351532b7a7bbc42fca237bea2847ff23b4029dca3112b5a61d147999edf93b6c683a7e4a0e30acc0bc26bb9a2dd9c4feb3864d5ce987153a6d714e2848f986e5ac6dc56aed976dae2a0752f1115b9312c23cb140634ddd1ebc69b5221b45c2dad3ca9df5aaa6cc597fc1f5a9744a8cd2fd3f66ccb18309a1acdf4549c472ef4fc1380d978d65d037b0f01ad937bf9fc75b27eee150c517a2ca5f0df80149024c2d65e14a0786281465a4b8bb06d1d762141034ba39a38ed79d7a34ffa0c469682abffc9643148f126934fde1b331e6de82a1e960ed99beed8c10f8443689a0d68f58e95d859a88eada55dc70b7af898464cef4d4b55ed1bfacf5a1e0d60ffe8f09f34d47499dffaa41103f72f1d00e5d280bf39d22236cad7b62e574e7064e6da647e6ed4c860c07bfa2a2a51d6341d4640e8f77e4e4431985a07bad9ae81c63bed4c898087c84f0fca5a3384091192c39aafadefc166fe8386935d362b0f8ec6d225e0fa58b8cfbe44c997d990618e753cbbf5ddf0b5fa12cfc56783b51f183df51b145f8878a3638d85b0b332baf0114bf8bf5325e93c6e1b27e0921d1e4e48f314c5f5544d3d563c50283a86dbda8f25beed4469628fc75f586e070a09dafcab944aa5aa8134b9c0b9d090800c873aa0935228bb28c884eb064577f5fc7a28d3fae78fecca5524916a1eca1dfd1fd2fe1e3ffd8e3962d2db83ea788327eab6c4f1e9bf64139b056bff28e3f960fa5e90ebc4c8e5700800a647907844e32c9e965b49266949336a185d8b7f3a95ba85e3da167949b57e9cbb9ea4b983570194d7b73cc51a0c664bc4ca71c15c6515035352ed9c6aff3b3bfb21fcf55c6ede5c80fdddfed34c0e0ffad733b5b80bbdc6f72ace0bbb0c56ebd71a116c09b77372bed7022826b81145fed23019948aaf36eb5e9be5afb6edf270c3a65db733ef422b6996633cdeaab1baf742dba854f7f29cd008f3e37b0a38b610dff5c51d45ac4d212c61e5c527544207093c3b681c2e4fc562a004c9d0d000065b80abc1fd87ef7fc5ad84eac2a8e6f9aefcd6dddcb1d7dfa8ce3e76f667c99a6675064c1ad24662ee2adcce77ecfc673d1af4c1dd893c0829af9f54071f9218839d26f0d9462490651033bed9c44479be4c9e9852bfa111d5669476017db6004257064053c730a946371890a8f804cdeba2b92a5e41d7314bb8b0d7e77fb7a68b3699e4a08295310a527b3bbfd63e75bbfd5da9c285d10017696a1e3bf13096e9afcb9b35603f0c932aa9350ffdbbf4604ccf2a6d660bd0aef3ecae5a156af1a57fa0d5bb69077b2d247b1f0ab27a0cd8e8354897b7e76600244e94d549ae2791dbe650a1b23ea62511b541b9b1f2b9f5404cfd65c8d9b59e69c31ced16d32e677feb9f267a249e7250dabf46bf107b8d69e5f300f435cde8948956089d24e0d8c2df76960efc7de97a06063cd1b81ca791b5f27591a459a1946e452feff996be9936cd88d9f910658a05841b24780def70c3baa21db0c99da408f43269e4aca22039504db9c8d933e19e6e80cb1e2501c5e96af8dc399d0c1a7ed9a4e14068dd157bee867824f2af1643905b08611918463b8a813fde8bf0f305d9dba3c68abf6b100c1b4048e9b3daa49d7b01f9443622308b11cfb5f36b982a76fc57fd48ec60ead6840b434989d62463e2828263fd23b21c865e2f66a60dd44be55b85a7bde37587a311c3e2847acb52658a49351833aa5a129a0665744155e1aff0ad078dfe8fc34131f1be1dcd448f46dc7dfebd48e388585f273e1c207777bd43004657561783bd7547ee281cba9adc0f1e99ab9cdc6711344e13bd27abf75121dcee52c43539ddf793a0d7fec972664b7ba22f1c614e4798ef90fa0dc6b1287a532d551a9be535a2904b79d7b4a7e0e7e30d97fab6d4ab464e78ab42bdd014e5ac7293cce44dc757380559082c89fb0ddb0328b779dfa65d108c18778e71a18e3ce08e05329987dae9278fea16e211a0d2a0f54fa6ddbac8a698ee5fae7eededd5111496f8d61278f60c1d2463e7c7c1b9e7dbf6792f6f0b6a45530ab9638d7c902cbd4d51b0f8851b9df203a85560c10567c37691cc639723284731a3f068d081636384b5e1c45fdbdf80b8b19afa58350f531cb1f6cd819f072f2722538b9955fa1092a5d532c74c3232794348cf37b97dd5606cd82737d9ead04061e75b0b1529c11f002c359fcf80654b95ad924ac4f432765ace4d7c5473c8ea935f590d69ebe1d1dd5047cc71b2b4a321ef0bace5878ee1d5f16137835df7d12e4716985844bcd2c9438822f72f587e8d0abd31fc36c5d623ea2672b69871ae055d6222a289d8a62ce17c26d104857fa7f2a75610ceb2797e828efd8844b5040d299c51be1a27b2a641361614d8cab019f36764af8b7fb4d71e403001ec196ae701adc2309def3315311f6d22b4a18da986a4b2e9e3b93994de1ed3b5c140daaf577afcfd1c849cb135735132861615f03023e5975b06f0977220c22e3620346d2fba7f21289b07b099ad022b9abda59761c7497a52770fb1c222c2f13d2be3f8448e23a42aca1f162af38234adede3e65bc76b6fbd3e1985c9dc897c65a2b060efa60d636c03bafead6bfca083d39c4754f1ceb1c2d16537ab60021f5f816318fe4c22bf8dcf6cf1a50c7a04ab7744ca73932ede10dab69286e307ae848038ff3054ac40362f8b9d855ec42d12809420b3528fdc454ee8ce1294d23cc1a8f1c6729867afad5be04e8818b686545bc7c7d257c8cd50a06d7e256312150fbeb05a8115259c5953fb14d08a8174a64c451f368228d8272ee473ebbbafa2025f47eded22d7ebb5da3924453d8c8165b78335fab2765f2c57bbb116318d9f19274b5f72aa2b917a89dedfd8cc09497e221c87ae32dd47d8e2204c8cf87bdc4d68d235a6e9ead31ebe2d8add2a26de785ca1307bd357f3e154cdf82e932da7654c98bf72c1f7c93a4561ca0a9250f6113d376ecba754e2966a84f498ecd907f4e80d2e346508e2aa53adbb1d4fdb3b94492bf1d5c2bc8b097d9a06ad93ceb863d3100771e99789946fd486b4d03c1b33befb51248e650cae9eb8a3d55ccc5e54134f85363d64630bdd5edf3a51d76ab69ddf2e4d02c79f00dfb74d75db3fd6880cc1342eb55d487b5e1319f50e58b5041532fd3208ce33bfb3f3d2166b949bbcf401e51543fc590b93e8adaaa9dbc54f0e062cfbf789653d085a22f266f64e613658c0f1e2c9af8259bbaa3f7315d883f321f461f5b383d7096f548537fecc1b679c8c19cd26bacbc796c6d94adcb38583dc0b3e7377da35fc3a729232f38045c71f2ace6e1e0e25c59e326db9e0646aff488177965612f6ab317ac6bbc60a31a80ae5e1588e49538650069f56b210ee37bbc101570fa17566b778a775946eb05f3d307e97513ee6b33bb35d7879f4eafc155c713b644f6a128cb94f49cc6b2bf9114706f06184012e6117c16635c735814a0ab0788dd049f9162c53e31fef4a1bff972a0e2ef725497b42e9fb3fb5990c395a02b6761151698cf23d218d6b5a08957d3cce6fc9fe3df9b7767e09e36267aaa079a2f6b4932ddb95f51dc5eb6b896c925a7c93bb45789550202ca64c686a8f69ee1f5980668a24a9f7290fd0a8fbd65fd1be19206d567e8eb239a12ca6a3c62cadcecf1ee259c7d39873db5283f12207b0af4f37351c0d3eabc2f1683f50839a02f2a80cdc4e7e5e7c2f01fdf834339244683b42a7ae2a419a4accfc081ac86079684f3244d6b4c37ab81df1774bebef6534f178b698d64c250430a235b4431aa0608602e1d64c613abeb23c63315912977995785381fdc8ae892e279de4462511e77309ebc52f8ab2e762a6153bce44ed5369d8f502d37a6076fc68b157a3134c403bb8fe7ddc52043dede651c388b3d9418625ec6a64fa50efee10f159d63ff2ca91f36d60e55baabc80a24195f71e2f4f1922b2fe0daa16c56500c941c5fe62598ff65d5009d376855d543064a64db3ee8ec17bfd5da22bdc8c1ce2de328eb9f3e16070c336ca3299c08abb69082bff6620067a22eedabe51a8c5ddfba54a2fc4ba51594614b3b52cc3d23855d0b218ed3bfeb5976cd19f2ce9fa657fd9a48ac4465a2b447543cd97e067859bbb28387574e17a9ea245fb77c0693ba8af52c1da886267eb0640847872bbc00dd196d37518c17e47549f8b551786065560c78de1544726af27a5a9cd5a4b3b909bbb55c7564f368d6d97216c82af37cde4af4e6c612739b46482b35e5e9eb109d257946ff0d68653918219a330ad06f4374ec8725ff97a649b19b8d0a2d9fbd85540dd622221b90af5450849b46d2ce5062e9b491645e45c19d769afb454b259511637a486b89e622bb0770db1c67243e4830983c67f16dc8c1dc8fa6d1a8f7bbc31850534ec0813513f1aa662629fade52e786cce0932986193ec64ea2d788eb3c0bafc131177bbe4c56c96ec6d82667043455ffa08efb298a17bdf7aabbbf065d77dd968853ad9b8932c845d48e3d46a929324a70073e366ecefeb339bed9aa1e499c3b00ef2a9afe40819e06de0f285302e84da4a6ec2a03ba0a61e1ab5686468fd75f1bc6d728f09b465a993bdef423a100e549941bf21934bde894c49b17bcc5dd4f032925064824c9ea3fc62f379c1fa235478319b4199eef49442ef2d01e28621dadb83a27e399dd9247dd39740a012763f78930afeb1e16ef54632e6cdb482fc14357ab308ceb74c87efcd5d0d7acf062adb6bf384c75b6c051912df35228df95fc20a39334f0f12e9af0f8177d526fe1055a6637e63d4128f52d32cad7994d403c7be0b5db1b8b9624d5c7b602fd533a48b20f21ec10a4cb01f49f6e97cdc529bb03e9051bd09e25a7609e24a9b0c41c55a601d93316b95695cdf077cfcf7deabb3488fa4b6f90a153225ca27da48c3c4ac57feebf12b20aa422bcdc65364e95ba0ada7e38d226639b0509ed1a5fdbb4deb2926d911e0522be9c5cdd8bab0c52c088290dbdd42cff6db768d6e170f9f6d85d2ed6d7e75b432230a0faf2b5580c5d6dae5c611eb6fc1ae63f33cadeb7c39d3a38232fdc5deb3aea627f4a2fcf1b79662074d4319bb284ad3257c02f373fc62c3b819a5ccca152a06079bb4de1e1ab97c35371d24727927204d7a61fe828c908803ff1402802e22cb5fc4433d9d512481fffdfc48a6809c54c48f39cbaaf6d9c0fc6ae4bf90fc90a33ebc2be131ffc755f2c547c124ce4fb7a524d30b825a05fb6aad6c07a33c809804df8276b14b317b6a8c915c666c5ded9aab6b4fea2efe8d52475c9cbf5d842650f269f2ac1777dff4c744ed79f0a35d871bc8fd090e1ff51676c5377dd537dbc000a0ff806d6848fa824d4f567f872cb6f39eaf9839f45b1434e6dc6035ed81740bc9ec0faa87f509b5f88d0f8945e002771a4ef39ca143a5b64fa7fbad60370dd5ac63b973638da661ecabdaf55ff98cb6d0e369bac9e8f38aed085a4b5210e6c3019d236786403fa6908d171ce7ce79d5846f6ed6a85c7567c6b172486658dd4729912772962e5cc163ff69297cb536bddf69715f12745eb391602baacc1d797b9950c3b664863ddc35d92aebeafe2c349e307b81553a0dc8481895e18eb549ba083bccae6a85630f39769ad8361746fd22d92625a6bdb3fa7e266c3cafa285e5d66a4ae9f820e69d1b283cf160249238b08fc132a1db683a3b012701fe615377d9a9d6fd5970f6c06e564e267f81bbde20547e048fc219272800fe206ae5fe6a7f90c32ce7febbf165593802c616d11bf0ad2fce3628dd3eaaf366dc83c5068721c2664a2bb66ce2ab14f2d107a78cf6d1eb3af9c90db2e081435779853f30763b2d8da9365d1f9dd8a2c758c17fabe937f134c500f10e4884045a9035621ba133edac81c7b2f232319de2222f46d2453873a3ef6337cb1dc65b3cae17b7d174587d92a5dae8cd0b6efe7c06100bb6d87de2ddd34803b516cc4e38c9d4bf90a4ffd574cd3e007de480fd3884cc39e862e52c887d87b8484df8b951428f16ba01400c5546a2d0919d9440f2c0bda412754618383ef89e3550864024662302b7eab49688f8233bdb54dad1339dfe1e17ee220072dc15ca4e40ee924b5c72ff8070f626f4ba815dfc1559cdad20b928577183451477b096312353f8bc55790e738b764d7d235567f371b3792e89d494a552733c403b4708a6e05fa3de83f309c3c6e565a44083cff4bd32635ce1223fdfd9b8b1b9752bc6f9d5fe40df23e276756da134a5109cb41d602ba9a1d360d74c9b0b8342fd2d7d684239cf50c5460640b10c2e7a4f25d9bb9c37a6d802a9160d1299c67ebdd79d2de030d0ad53efc14f65a93c31ce3a27e3c84ab5c8e498fc35317dfeb6e338769e845cb121598c80af4acd39a77f7446113f8429d80c04a88495d290582229852516d35c8542f93e0a5ffbbef1d06d48e89dfa74aefdec893eff8c0fc3e4db743cc27d84093ec82216eb52152fcc9a6360f23eaa861518f5d5ce25003aabe573ccf30362acb7fc936c39d9bb6518e349dd554ce464d5bbf4f97c994e14270f027a4c89287c1e28f62cd1f0571d8b0f0f93ba5361b6ebfbc316f0f07a99d87d41910625dc9199121614de2ad8b9e688b79c9a3d84ad9709287969290ff492ea9c47c5a55ed8cb9b01a9356076f9b207596d523ce170f0e1bd82f1136cd3053a50af358f472b18a17c370bdf3e0b3c6a0ad2e328b43eb336f8857d6f89b8f7afdd6efa60f405ad50758bde2ce9fa0ff7ee2f9407360c3ae4f6352bb124a70d38d676795432fae021d84cb31ecf26294374364e7bf771facc9376231a42f32f9a402f88f686c7c48dc3175e67b5aec7291c8877958ff22c04012953a747f2dcdd2d6c32c0c11b5740c9eb440b416ae611563d04efbd8b1d9625003c880d93485bab66afc32cb53b24154e0b2dc066683ad0cf9346a615f3f8476fed210e27116393e3f2b321bab40b1486074939d4b70ec11f7dca794f920de1d26fdde46199ec37e88fc15fd3c1b4204401ed04732761f23c2043cb90e876a1070f7eec67f1e44764653bffca1ecdfd288dfc86243fce2586c7481a6069b49e322dfb9cb83829020d6847795574cf01811309e555c61bad5273236b8d43e587a60a72963aa1f0c15cb0c5e18dfc2371e35aa25fe611246bbbcdcfff43a47ece3bd24b3bb63b87423356554308465556db97b6142051c1fb6deb238d291cf65805ed1427c846b6ea4d622c42e660e4be6cb4e730322b6530bc70e550446b034bd7741da7017496bdecbb382191f4309b2068591912af4667a91ae90e3c311e5a7a300de73409726ae73033946788258398922691cb445a392feba287941efe7a729985d728adfb6d17d8b6f994cd23991c3ee9bce5976728bf51266e691e99d92b6603ba66b13bd89090d76c71b8d5c97601966ea439a33029d25ecce1e6ec3dd878915db93c8c669a8f7e7243b8815b98229e83f2c4b9ddf2d09ac7c8d787bd6e6231900b59bc05059c5ad2a9eae5b3c8662b370826d1b4efc95885c661c904a3ac951154d14e9fb15a538d2683e78c1843adf0ce30909269f56f7d213b206d3922c796286c3fc0f56ebc4f293ed5684bfcd10e4e4b407f23fc5f6f2f65db3ac16d53e7bbfaf50949593102a337273c47c30ff55443d64c97093b4c6da07fb57d7807ce01a7ba4a9c60b37120a3891278f6b1273aea1c54de7327867f3dc8956a5ac09038a2a6306cb5bb0b7cd92647ecfcb665c84778444d50f90a66defa349c17a0bf2acc02eb0d0aa7e41c2948e9225764c086051b066ddedd228ccad0ca890bdc6aafaa1bbd5d0a2f98ff3e9ff1fed8b11fc117e00c727ff7992e7c3ae4c7fe69d4298cbbb19c8334b38fb900c05d208ee1297db4d6531263e273a9d0b3474ca1f5ad07fcdfb979439b2c4a591bdc8751b77aa5cdf2eb43d5a69b84be05b436fba0bbc2e4f2ebc3b703d3d843b7dab48d341ff5d657b921166e4f22eb5878e49a32f27eed069f7f6973a1753751cf4d7eae8f63c9ae8f56d98b990b987e9d72301be5a463dae7a8b6ed3f9c0a77ea62ff77a9192a703770a0f37148b0c97095e72fbcb8ce5d52cdfb9a0ab126d7c745125df673966994e69577875fd96bf780fe3cf84dabdbc6c25d468f25c1901bf228b919ded4b798c3c9acb21c45e7197929d5a92e6b802496ec6ecdd7ac0ea4c3388e08398997f444ba69a50a033642ec53a1dcc278195d0ac0a5a3eb2e0d6f2a9702bad167b185f610243972953ecf3c4056e180687d27d820ef5b42249df6d4d460730db97095140630c72f168d2f2041a18bdb0cba1ea35a6a51060d32b8e7155c1dd94052914ccc1d731a7f85acb32a75282405eef1c16a6a4c52dd28663664282d6c5ef2dacc0d75d6472b21253ff5dc8c7c518a266ad596f30216817fd3a034e6efbcdcf3b8cee514e7dfe2b57f930dfe92e4a3bb2c105b5f259a57f023adeaee33d5ad3561d06c16a7644d6f0e94e3967dd9f030a42434c213da1cfd5cbf3ee8d33c4f8097d6726b6b4f2822a47d933b1b3efd633d69fc17e6630232cbcd7d119bf0b449d3d17506fc80461b49b04d1ecdc8b4034d4177d99aa9244bf47ac6df607c7bc959f0a415ef35e5d549b33006c6146b1396c24e463e4ccac26cef527acae1fad8dec82918f3569c3a8b52c8cab8f6a0d42fcf941c61c748aadd301ef3901d9c1d2888e5ad7cf3d8b80a7357cb42b194ccff672d9e65215513ac8bdff09236a2fde4949b4a631c5f8daf8c1c92869550fa203e162ac8fe98650d07e756109aa9eb044418464d3cc89b33181a76b0b27d0bd4c6cc3d57e61dd43a24161a82d03b9d9739415915f5bcea2bdea3d73201d18404a4d0fb0adcad09385d9f96e36763767dd7412d917e9597fe18d35c8c3256c186e317f143bac4e4064352af37601d276bdf095366a59ae63a09136d7c0b79b3802edab06e62152cfa06a27dcdf58ef3db126d25d0179ee004cb6ca59c935f44c8ea2a34c00882afa063c2703c9b95a4d18de9b6713d6fc1f571de0b9bcb9fc19eef9958af9239e4a7ff3c8f93f796e46cb4e96bc7697a199d9ea8add8320b32bc5fc4f0aa481bf257f143422a19ac1203ccf00ce48c80dd33f34c578ebeb53264fda0efe4a6e265273212202533acc829f7329b53f04db11cef90c857f0352715ef582eb68a40a8700c687460f0e9e72e1e67a49714bbcd91baf4beeac6b70b1056d7f8302fca2dc19960ab607683aa813fe18aabdff4ff2ae890a7ff34101c2eab0c4027b1014986fa16e8861529bce5c7c2962506c0631c3c6fe00666c9ac830d340b1c96244ac90cc415d2c4d5f31a083573eb12799c492d369b9d6190c0fc672ba2301a950f755602f63d0bf040327a1d3f456586eab171941b1c83a05940a560480c94159f9defbcf15a923d6c8098e23dd84ec416c3fda53ec45326bf51c3ce983325dd799458239e87d17f3139d69d0ab06b9d21dd26b053fd9178bddd55d92e8ba2446196a15c8f0929721d04a5603c76a5d9aafe02acf47dc06ea8193c285a4b2137f68661f5c19c3532fb114c52cfac0a64674284f1eae70efb26994de3eacd66667469b3e1a997e8551b75e567d722b3a8e6e4efe6411aae99157cf10cc43e6d9d065a04942500dfe0d71547c8d3feb92debda6c6e170a9d53cd2eed8ad8512775a189c3d2ab03fa402e979eda342198fbd05ec230e8de7b56540cabb5c67223f1e6d385022338e1b5e9aead750cdaa7beef072fd5b4d9ecd973308a1beb3c18dab6ed913e1d10b70657894c9a7b24f2f35ade8bd67667d1ca051d433927621986bc75ac54cea343158ccffaeb0b0e6f577046b2e7d25806cb32b62f42998b931aef54a73ffe6393b7ac7fb46e082421b9f8f7f90acb82e7859ad6411bbf23e383f2c959fedd13f5c18a79243dd322eed0935f641f2c54fa3fc7fa7ec691b21689df2d70ec297290b6fedc24bdffd8fb2ed6999f0e8993d564059b028d66115d0420abd5cb8b524738d1a543caa3a6b7dd46e6b2f66beeebd21d47362b5793ccc17bca3647426bf9a73fa5bac61cee08dc8726172405417787762bb3831f7a4f29b77a468c340f77a4fffdccbcbf6a7b2da7ae8e1fc4f9037ae31b6f0bc8c8edf2067ce51c99931cbf57866279d48ed54c9b7c9fcbc116b9ad40974ef9b1af44c3b2452db8a121d77586ef009147767f35b1567432164bf70ec7ef2ac9670c2f8cafbff529c9e321986357f569eebef45fa2982dfe0c2752641e02d24f7551cd47324ece6c1693a214dd9192b67aed49499ed8465ce0f2caaf4b53aec9ce6a1b51861eaa53c9e74ab5ce9369f61bf0be555f4d1a9ca7c752d367fe6a75e004849b81770954ad0dd5d397e8330bfdd3c6dc16e558e8dbfffdaea918fdaadc44fc37e2386551e7c098ab200b6d0be871ca9f1cde1145bf92d2392b997dbf97252482e09a4f65591a7e2ab4377a300356b781d9b2bd30fc43c809a275c0af298e80a1f1752a1fd504091c148f09629381126118e5d9c6a55a29af6eca43ac18362bd33b337eec35b1d57afeb75122d3a9b4e9462f5a768c445199180b9d53daf8b8b35adc59688ee37b88247719e74b199beff7c02ead7dec398cde4c47a6743cc4fc7445bae06b0872fc8418b10a9d30327d9804e6f8e4f10237172ca01e1c3ccf9239e04b6e836a25a7a714f67cd51191978d21d75ed58a1969ef784908b1cad1c4b3d1fdfc949c56bfc9d629f7162356ba17ee04548fae71a08b1534df362f80caac5706d888534c264e619e60ffc0823cca7e6374429e895b7e690503548754743047df6ac7b62f57b62501508287be91aaa4c98c14441ba92ee86eb23be24870055ba5a93c4c23a52de0d8c95d32a90532500b12b6e50ac1f3f75680d052ff881a9c4ddf6ba653e0cff8dc1f7c3eeaef31aceaa334e36d888dddee387eb0ec4d7c10fdcdf84834df8bc9e5e5c4c251d4fe5901f3f2c3eeb19d904be5443fe562ec19b43196e743ff9906a10bb91c2d183fedcc5a78bd9f27964dc769e66cf75aae36b69419e8badb80efdba42a6e436b53d61c5a3fd8371055baa9ce6b40b60aa4419fe6ccff3a4a49a3c2a36143543a1955af8ccad71bee343aa459f643b53c276cf1eec6e4514fb6ddbcc15d88c6e99eae7fd357dacd064e61394461e20570aee162b5dd8504d6aafef7a3f1a693bf6f0988a9102300c0fcee1ca537af6ccf4b4fcf12c4cdc1d577519d23a31cfbd2e42cf7f325adaae29a4e2a0c81b0ba35155749206e1e6ac8cd9c9b5ab96b1f1fd0e9c6e832a048d2b4d50731d957dab6cff0aec132b51a7e498c55f1f67dbefbc369578d0b517b7aed9fb6dc31a8ab17380d52eebbe9eaf4a91fa14c40e3d7b43e0ff597df4d0b8200dcc469d4faded2f33ed359079b6f25ac06a731d2796186a321a3ede89435b71805adaa5298b716f9de5e5d9b532f61b68140c07591af1a4dcbffcdfe9ef45ab25af2b8dfe934119cfa077620ed105b9f3ce005e1a26ce342c3b313f59e5762ee54447221ec3d1ec9383ce748934c34318aad6e556ebec85316e30884f24f92af32193e50f3902b2c124db99004f4fed59dfc52e82a63219fc8022b988532feb2f70a09a8a6062d5ce9910c0b01efb858589730c958d4aa8832b4405b6fa4e8dd059efacb3ed0abe625d793b7969fa5ba906c08c2e0b3eb07ffcb866d7ad31e616d6ee54b948053f08c8535aa831f2b12715c750ae27455558a80d355f71013dbd618e820640372c67175c8a261127825ae9a268937da804836217668f2659b3fff476a3ed9cb115e27d32eb7ecde51e83e569bfdf114367166cd350250b12eb3cf7578c1443954300cfc64f908a1a691c51ea5100110b680734ebdcfe9c970f8679a2ce6553cd5fab280f0be79a6d27b37d43c7b56ebc4a57325a6f76d71ec3c209b731952468ae2c3f9f1624964b1bbb5307b8c4eeceb2a2dc0d2f635aec935a6cb57ac5d289b8bbd445b50e488aee4d04195bd0c69c890ecb7de48cb8c54340f89acbd8b207d63a2b8fbbb36bdd16b09f645c006b31a354279ef2cbc45b5f0972a1506e7fcfe3ed4f21cf7a7a5ad1899456d9c4ad6299786a978e2ff64b628f873cbfbf1bccf8317d7b03ff2ea40d06ecdbfb8aa3f973692d73688bb7e0253ecc2ac79b3cd6d3457e4057948e4c99f5922e584ce80c6de3048ab34135637801cf1837f5d42de5d019ab05d1c6fb860fe801c57a3df980ebcbf78986bac54f4ad5de1f9d0afee6606cdef1058ac060d8cf8e50801117d60ea10d969a907dc1d8cf6eef04a0273029bc5d4304b814e370896f7d586a0b89a36e88e578261a03ea1216c213c2bfe120abac6ec9dbd7cc1c86658477ca22a3e737fdb0597901ff6969749054c76c0d0e898323706b7b47eb66dcab5c126fe1e1ba2b8d1f0fdfe4c6f20276f342864fe50778919f0ca3ba6c80086663fedd09aa33155b4cdf895b58712f293b7f9fa442140ee45651cba81bc8833f0721363bfa7b4b99fe16a680bfaed596a91629be21045d80851f8e2b9d9b3c5d95d9ad2e6f0c894205f9a12389a7e653b42b49fefc910c6a1f1cb9d6bb4e2c56ddb6079472ae1aa563ce2cfe7f3e1fb4bed3cc7e93950030986f18ce859269c6dbedf008a18c80b87137eda657ede48088d75fbb33390eae4aad256e3e77b7eb6e503e28cffd69d9b0e8f181e9570ef925300a8f79fb6c9983245c69831cdc73e2efc7389b5e80957e7120352e4302146069ff2deb3b7d32ba2c4516eee07da95051604bfa95be3549ef64fc7946f295d6f5a7c362c4344bf1502ab54b57366120018eab9d6ba57911381572855362d8157ac85efd79616fcf8125b9f9084e9ea8ca01a8496ef1fdde098e4f75513cb19ef4fff6502d3b6a2b782551c8848cc53c8bdcb8ebccdf6456279adc6fcf64d2708ef132aa2f24a79035ee3bffde132729db753505b2449c3bd6b2c8491a293fec0a352da20d1be9fa258dc03c41941c86df6bc27c13700667cbd49cf5091c8c1b44b69cadbad134a520b2c6d42f7482db3c630a1026fa3aacd20c34389716b5703ac9124ee6f0603b2e5c171d1362b9aa059e87983a97ac294a34452493548dd0bdacc8cb9a7d9cef7c3c7b0128c3eac4ccb16fff9e511672dbfd278159b4da08fa8778e9f1fb3b6f4ae1e4be3c3deaf22babe8ad1bf8ad2ffa0c10f1e197724669951d6f4bb0f9693450fa556e0546917b7c46c2883adefa5863938e338c069ad81848317610c56c609032ff3eadd8832e9989a641f0d3e4397dadfd7f75e5f45c6d5c8e288f33fdc06d1de13f7ee15ba9a8764ea85c1c619349f9e330c77e62e2288754ba317cd62950e4bec35f8d68b206be92a5ebb963a06b12cd00f6f813556c2853d2c0f6dd690ec7f8d0c5941c058467bffb8af37325d16dae6d58105714009c182953b6d9ab016f2677891f266077c35842fbaac43232d404bb1067965459dc8cf56ddcfc3bf8877eb9e8e3dc40a29232ba4d600aab467ec1f5e66fe61ac1916b680d5a71b0081d90e92c7076645c9c6b64af23f6b51119177e7ca83a0f73f37804bf74d982239684107d79a0e55571a5e9d3e4278893eb45cdaa2174302c05c81684ad7498533398f37d06487b0db001d214aab78c3f0e145f46a74717973017bb078ce5555bbac045f9109a3833c1f2891bf1a4c13b5c1494f1f657059bc5d2d8e5c9419d771d825b832d000fcc1575a1f37cb726511a91dfab48d50d095a2fc880c8308f5d361be31e1daa5816c07c6c866bd90573cfb82df2275b8beb7dcea70493c458127fa5a91577c0b61e831e7417c5c891159bb6190681a8223ca914d5bcdf8f9dde0181ea20662800caec778e7ebc3088b69e63b59fba5455005259db3c9e7f713b5dfffe92c89b19f43534a4efa4edf007175ab85f6a392c13106b0d1f0a999ac2515722d625ceb8f8c7182e701db17efc6c9b6f9288bdb42961eb7c7b2ee1c3dac1b1d895ecdbdebcff2ea8917d05e5bd3d818e2cef004742ca92e544ef44646721fe31a040cf03c63e540568c86e2af53e0370e85735806ac48873b9ea327d79d36986ee0712fb6afd64925cc41847b0b97746b044d9a63e28884390952ee0af9bbc8b29c6ac74cf071c845823e638c4ca9cc9cc70a77babc39ff4d847b6e4c78bf8e2cca1ed20b5eccb9d75a723e2c25caedc3e1472ae6f94249f1fa6b4480758d7bb41d95b8ae550d25c2ef1018d291089719699f97670e4d907c9d349d7e3c9ad0fcf1ed24ef020e30479d5b98dc8f4bf907dfdcc458f17a34ec6daf889566e1f244275328e0bdcaddee98f8e63967696c23f408a453d3d438c7abcc6177c68c51f7ff4b542255fd368220cf443ee55d083b316a25fcd7cda5d37d47556d4d86876636e4ee9cfcdab7e6817b9f7d43e25a74ca9bb5d681b001da3529545f4d4531a09d9896d455a635b3aeba53624805944e0ff77fb6cacfdb5162aaf555a1e13e1fbefeadd4c2e131e494c4a1dd4faf0b1650e95165bf27a6dd45d373148439801a0c43cb62c6c110f36d715dde49efc81c48403a841b746bbc7ed9facd196153d244c00e67dbb503687e10a90451e1e52cc67c912f3f4a82c3c8984b4c201ecfb6b997da764085713f5c736d9484e45c2bbb9ac1fda3df20dce0f568b33384143e5d3a5494623a9c5dff512346ab7159fdf016ec996d5b9e31742c1c940f86997ad80ce64f4ad307354ff72ad2580663cc77164edddf032f54bfc29e9a730a0840a0da49655b9850c019cc9a8e6b0c74ef473864607f941717b7437cb9747514fa03e8ee9b4015c79c137dadad1abded259c81f08094446f6ccb76986e7619cf9f016d8433d71dc99d48e12573f0ee3c115913547c3c25b560cbc00474e9c4561b22ff2cc6d21d5424ceab3b13f56c088b0b2b67d53e4c7b459a75222f4c8559c49cf16586d3383d2444cd06be8a3e373fe3748c1cfc7e11a1e037f745cda4c9cbd39","title":"464. 我能赢么","link":"https://leetcode-cn.com/problems/can-i-win/","question_id":464,"issue_number":63},"61":{"day":61,"pres":null,"tags":["动态规划","DFS"],"whys":null,"difficulty":"- 中等","description":"给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。\n\n```\n给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。\n\n注意:\n\n每个数组中的元素不会超过 100\n数组的大小不会超过 200\n示例 1:\n\n输入: [1, 5, 11, 5]\n\n输出: true\n\n解释: 数组可以分割成 [1, 5, 5] 和 [11].\n \n\n示例 2:\n\n输入: [1, 2, 3, 5]\n\n输出: false\n\n解释: 数组不能分割成两个元素和相等的子集.\n\n```","content":"096221cf5b628be1e73e8bcfe626c7347186258a04f82d930a676b276a35031e3cfda9522af59c9092e660af7dffba08f46803c2903e14deb929b72dbea4fe2efd717a7794d6cdf604308db5888f497623ed7288d9a41d8b35b568ddf2a1bf884d6fdc1c6cfaf1446a7247fa4f14415d9751b4cfbcbe22aa14b6fccbfb0af6259ab644407f0e337812e055fc14f064c675146db11364043386f44217f5eaa41a12102e4a04dd61c2e6c7ebfb88781f4b1744645bbf58152ff13f8d3c76974e1b2f3ddf3baca07ee0405ae8ad8e5e2e70a33d20d9deebcfbb4229a3a687bdb4091ba2f32197dc79e195044aafb14c6b92137634e5f3a573024679826a590741c1d50ef197ebd27dca3673177ed93c275f97a2926fb132fc378d9c9b26eeed6ff82c2eaefa4ac08ee8449d7f1413f6247994c82e159ec655cf9e76e9f07c894fa813629597162c507e95ae46ecc4fb6187f3c9d0e193ed8e61d176ced7681017d5f7a3e815ffa21984513e3c3b102892fc7db8f173ea744c573cd656bb682031622598500e773187c3150cee2d43ff0909bb3222da98aa56bb9c7d04f6675a5264f1913a1d596de614838c2478c1d5b407d7ef8dcdeb30dc4b213c6ab75a6daeb89811a1edee3f926c439a3f654f665e2309fc55a88fc0c3deba34c4e328154dd340d7532a0198d7338a96cc612f0d2a85bab39b10bcc6048bfe2de96ddfc464f2c65e186469a669c93a68f490e6c5947a0a1c2d7f9f7165b12a0185bbb5bfe7fe24eddebae88edaa0580b5a89fde28e7d42513701368337a948b6aaaaa8a87c08254032b485ffcbfa796c2d772fc544206e8b11ce2c49af4353629afc16c15e0c9eef10c41d684c3ebab19b61c1fbe3991600756d1776780db9b816a1f0d69a181c3b438293ae114761b595c9625ec0e9d86913f07007d766f411a1a47d97ba934c8c3f16bd7f5f68daa75f5db7d1e9b15e92a27ef694ddc810cd6687700adda1cd897f5b076dfb0c9c8510ee71cc08f08c6148551b4ac1ce4854d5ea4749ac0706fa2ee5f85435f6946a0fb8eec34192795e20c7ae3f4b5c1efe6c9db6d433d0727577a7bb5c9a3dd504b0f370d67810f18388ab569b632fcfac8ca87911b300779124744123e76dfb068952a225fff3ab041b4cc2bab044135ed316734a3267cca66a512abd91dc79482cf3ccee5ddc394f295150e5a831ad2b368004b203deabf3ed8cbae8b311ed49d4d0c3a741dbd4aff3146ffc8108965db939eb2020e17ca48b23f80721a49c5de299935812638c88a289784743fef49dd4f08cd69689ef11afc55f51e2638d0f0dbba72d9996c64bed1c3786f481cda07cc43171dc53b25e17c448f28e614c10fba8ae989ea7e19185672aa9a5c4d69376fa0f2ebc70b1bd90b9fd4afcfad5cb6f72f18d27c3a66df388d86c0c4fe4836f61e5da1136b5e5deaf4323d2f242cd649c1bad31da3278550ce4056885df07a41ce7eb4b520bce075dba181087b43e35facc7e5b6957a287f29afcff9c5b950b6b0464f7eb23dd421472a6c75191136d90ffde0b8936505f7bef46795c863611622a43bbd2b3c8f0038d9c207b1b3ae5887ee1277ec0427b7aa10158e8626929589b86bb7363f98ae1531cc195dcc553a58682797e1fe24dd7278dadb3a90a649b761bb4670341675231568fdb778cb3b33f11092fa5e766fb8a607656062c135e68f0051687b2151003b9392d4a4b88ba13c14f1df25bfab40498680e07628675ff0ef5ad83781b90113283c048a5c6ab361baf74ba20a4d096ef705767b8643a6bac71fcb7853a7ae7dd580af6f670ef83ab7e56e47978611a63c0bdeba27c235220285c102865a67b668e30f81f156f3faa82e8005e53024898cbfe4b4b71cb9b098eee5fce7a2164fbfaf3fdd5affb7dc2ade632853efd15f84df12b13aa90e4c8b6f71a53af21b2c5c65eda9fba03d3d8073da240c048629c6b5c8042b6cbff681e965c2dc3c287a0e952e72be23df3579ee08ef9b889fed6ca0f49b1f915c87ee75cb85f7e003f3eeb4d1376f8879aa37bd8d142e0dbb848e04acdb946d6a2fe4e0de912e294eb78edb7990357ef0ecb4be26b3e1ee8077cd691ea0f2e863a7959a4d6ecc9d62f132a49b0f61132aa07a5cd95830e3f69058b605287f1aecf27d59cbcbfd730142f8f30da2bb2506610df7b0d81e74514d3afbaee619a713419ae0630780204818fcf27f802a64302294b5af034534f3d1234530961a73adb9eb13cef53d331a682322c7b163563c27861369ea902073e82436104c5b41cf0847cba8fe0f529ec69bdfd36ddb279a4ab44c19f5b2d33c6e397a5838f136a862572f9e47774cbfa29bc45a9adf0a7becc2dd6657d92765e177e64e410b3fce8b404cf2d31fd63e1220fcc1d2972f8a8af3dda2278541346fb2ae90041d8c1df28a002abc4ab5bc43935eec62de82c706d59ed0f8e6a489ef51155f01dba5818eb6988c9bd6019ff7d6ac0d6da857d3356e493706ce2ee99b7a4ac4472deb3d039a96ce95b55786cd88968c4189eb009308ecb3be246e0fd2b1c74cd497d36a7bf109463e1567a5a9791ca708eb89d84ccf3ba1d0cd0ab36589a4c484fe724ca08cb1c4da17f7cb82481da237d54276cad786a7028a2983df08c58682478fd7403b88547893ca6a80c3a9c9f9447e0d665ab68b3acc1beb2e9e28c0aa687cfb62b1ffe2a3c0a55401fa564175e3d4a36a9e26e0f140b67f678b0ddee6fc28079bdb8ef3e591dc0590db5ddcb717319aa11428582f25e6e84ddbe5caea20dbbc6ebafc7f2d0655bf3bd20e475261b2d5ababff595bec3cc16a4565edef25b457e51ba1aefeb193e33433f0a4096bcb0495eedf0ec732bd174a677dae03a83ff8afe10330f2911bc3264f036c84fc02be922be3aa6a7e4e4a85923177762fd4e980b10d8367d8b94acab51be5b6e905dffcea26aba07a2a9613e0b4b86a08d6226cbded22cec1e5d1238442ba7b2d7cdd8d8054d535562cdec1ee718f6c5724c536bb5e1103960173c6154045c48fd00ea43f439b30b22acd6cb3f06036f047a1d85436be6bb88a50451d341fac8039900a73aac6426c9e39cce4bd193664f14ac24050a6c3924db18c139855622c77aeb65f4224ed62e7dce07076b8ea2177b1a80e7b90a189b1e58056b4a97559c397441d7413645adcf2393ad9ad508b08423d9977f30575cb26ab0c19003947af02a673c27f9af689fd6a35d6985b77dd808bae6075435731748be20fe88d6fd73d1186595d68ac9c304e6c4de8499e2b3fece0721d5411f2eebb710a4133d06fd477ec6fbe0c3b62ce326905d6aa38449f355287534cd5c0a5265a4033144f061f774182a06284c42d414dec85cfdfa325b7d62acbf10df6fc2c1541f1c3f3f13b3de60b8cd258d28290d55dd6194c1489db9cbd13c49e3c2ccee1400a1810c019336c6ea9a0a5d70a7c75f1cde314fc8ac68d9c71f26d01bb346583e31da9273086a18b404b5cb6acfc2e67f08abeb5d98a0280ac5bd3e54732b0512a467baa885e660100a366e0a8ed97d1ccbb05ecedb896a38ca5506035132e6ab596785b40cbdd23dda874e6b1c41ee007baa616d361e9b2206f0c74283cfffc25863c366b62c2cc9d067a69ca197e1e1f1caead80da2f0e6f6b8deadd39a988e4efbe03f8e3f3642718d8dd09d5b53b673772aa1220321f3cf6686e9a226d59dd931021f91c17fee0c90b4273212d646014bf25fb416e8c17a98db2524bdeaec488bc106ae500bd79c304cf22d717f03bf76e971319475021188540f99b4e6c3a4daa481f008da52a0490f3a3bdc2eba76d83d5221330bcc8faf3705cbed406b6370a411935455fc3d6533ada5048d831622711a6c4e22a86cc3c5f374b585766ab49d353a01192c50734f817d9fde9f61828f0319095928254b7e58f0db8ed70aa894da92d80149ead920751031a07ad727afb30a47cb6a46de523aba8f7073202c1836b8676c8adec16550205b36290ef5053d8f1eddd494dd0566fc008176c144a875fc13121cbafa09bcc07eb8f93a4f5386712ac3b11fdb59094129e87d172c45fa0b2dad9ba4ec73c466971fb074446ab592f29f3352bea944de68cbcbeddcb88ff09f753f4a5c717948013e9bad65dec11f3e914abcfed332178e373cd4f74ab01724b557d5d222584d69004e27d6a9b241e6727fb708c917a12d61a07f12bfac0bdcfb666d7845d4fbd3a628604f5935c6702b0ac8574313050028a5bbd2edb801bf32d4a814ff3f0c9d687bb4cbc9af38db2b8cc024024f1249be494ae7f4fce6e75690831d0bbe290966bdbe95728274e77e891bb041bcac7c47974d64c895ac09e36ad1ab2d16542b5b5ed4b3459292efdba8b3998ebd452501cf1d8623e8858521d76310e3bbe1022bd87f5043ef4169764e146b3b753411b9e5a5e38b0b7cfe8b2af2012596c50ecc947d2fe0e0bc80c1dfa31332a6c8f03d42663a96fda57a61135acf64afa69165e30c29f74aeff46e6c3b249b79c5febe3ba1b619e7aecde4aeac5fbd74c82aea1695088e1589fedfacfbe5ba216b55aa4b6a4c03b76b7c5393e9cbee488342c37c2a6c04d3ce77141b4f28bc9ca530d8a3ed32ae148ab0a3563c57247ffa9d7014d400087fd204f6932f6a8f8cd4ee6bcda445d0fe1c98f26f6b83c94a48c13fbdac72ec05fdcdc3be803d127229c5e17b92b65132cf9703b507cc181d6c2a77afdaf34f73dde4914472e4788aedbfdf7fcd86749f7aca4eb22983a72cd00e74c4a671b5822d2ff4348e2b4db726f0eb096fd1b4f51a8d273ce441308ce1b599df01ce8011cc39d550ef0223ef3d78134e3ef5348ffb9fc105281f9dc3195316eacb66e8019488f084a3891b51c4b7a96729c198e18eba1b1cc1390eca047d49610f2178bc5542e404a79c467bb4ed93bed391c8a28c039bbf9589477ed29724e3cc0fbc2206025e13daea2f32b51643d7f7895c1f43cfb1ef42968967409feb5380e0b683dfe7fde1c0f17251f26146a1901ea4aeafb787c5db23a4631799eb3c7ed62d184670f466213d0fed5a954bb897c628baaf23abc4af1987603cc8f7cc861ed6d9f8dac7e7f1952ab689da67d80baae2832e1b285cce90eff99813b3888e065fc06633f6745fa2903ee4fbd383afb3ea9ba7c52d7819b2299e7caf9f778a086dcc4a7a72182764cab343031a6ad4cde954361576c7b61951da8b67d485fb2c55b45af56bc3a32953048b68cce6ae17b212478f0d9c3265fdac2a684e3930334b948ee760fd5e4a28699aa4dceea55838d32dafa7e7f5c1cf59297b5cf4e0a686cb16fa3ccc1f9e211289c7710e09e30bc0c5fbf8ea01d11054c13dc26be0239ea36c80f36d381ca90b7b37b777a6d97b2d1e9a484d8659d3c655bac62d1c4ec0be8b65e385980e7c1b0bc5de04928016e0ea40287fb558e160d026cfac476556d4a83656d737600f9d6282ddd4fb2bf3440a5532de63eac4f34dd1ddc41a0f1afebf1b6cc56abdf6b736175645482328e3feb8edb32cda299a4a2c791efa3257473d89a72cc568abc10e5e1a99b447db8cf442f8618d412d3c5e384e95ce27c5af87e5931e045c45f0bc5f33882810d6c66ca3aba4633bd513759da2a28ec03e9d9e6bb3d42a7cf6964d8419eb319651cededc2a510836043058d13ca1a83768b1615522f513263f6e9353b6929fd8b8af61a6fa1d8931f7d7006734bb81e48f614b1d2f76c054a7a0c844485a442a5f55f79e137c889e1eb3aba3586e2490010a62e6f26192a5dd1d5418a764de5cdc15bff71373c5f7a29f4168c6cf9196811c5ea39ffe8c27c7734656edba12d7e5e3a31efc4c1649ff864007367e4ac7be80db74f759d8b30def3c213e77c2e783cb70515d2018396f4590ab77c11d73c2431e996e366faf015b2855e1710dc0d499cf7b03491647661e2c1906cd8333e4a6a43e5b58cbab67f3470a4166dd96adb4c04ec30bc4f9b011c02c54339c5637107aa744c231c75247c50420cc0e84917d783616d88e64896dd76c37f56371a068da5687c242d000185b6470727b607be859b631e901e86e783c7cdd7c6cca4a0ac400858fe1220115f386ed8bcfe21ebd23edddaa07d1019224ad3f6f602dadedd9d4c374e3389c9d12914774bce277dd45c4f0f82f274e69b80e200fa43a4bbe57ed8e28f25303e12aea9e4f0303a3cbc9a0bd3022a5d020f92588d6c5617cdd8eb32a3546b9b189a722bfedb44959e97b4f4d4801f9743f84b656ba0d870cd203a367a53749a04a7f83f8e2edb1d7db5ca09e25daf9648650e8000be5b44ed30760638d18961bb35c0e70c6700de6686c1a2746424920f22e3e62fdc7a7ccdc30e00123fa4bda3b357670f3367f4b329110e1ee00562a2f0b09c7d8017656dd6b0422abea20e769c5315e1c00833b4b4b75faed555e663dffd1d6d520b9f77260fd5b879b1d70671b39bbd505b90a9aebc0274bcbd70a5ea02a03880297bed60b00e61487f483471c0ee974b6b9969729e4560805b0a3d0db5a835cfa52ec151b3509d6786904a6862887469e75a2af5b0940ebd3a7fd4543017a88ae94de6efdd2e583da004519e724e2062498335a113c662969a2b5228585ed1f2421e1835c027ec948abf0bf822b2fb270f15851c8a33ec63943045dcc3cd7e58e00375cd97e9d432cd64c30a87a5d4342338708818ac3163d07354771da7a7139f5441849c93a67c254ca49de0bd3b762a425ae1e329064a23507f722f45cfe653e2c76531f870b8fb65e1327d6fb5c9f4169d42f00d842db435e90d8e72b866ea789265a47e9550dc84d0fd5436c791f1c6ab365d742f418cda263c69c2375d3d58c32120779196ce905411f706fa60d61c7e0d6cd3879b628690eb978632b7366d9f4b650037d1ad734d24cdd8df0d59780ee81fbf6e186537819c5a17258d4ed66c3254bf44a33ae1e2f590b9a3b2a88b14487ce6f2a2ce0f175a7812a97b361d5d122efab07d3fa0b052943271a99dac40d49706c2d44ac644325937200b45bdd88babb2312d36e65de3e1ad53243f1b7b4c1b9643c8b5c47671f5ab7766ad7b642559fb75383a97bd405a35e48a4feb376087c5b758e3900575c098c8349ea8d2a11f35e7ad940de657fbf74f97fe506add5a3462723936f5c1e6946275d8f160f0311b63962b59d13cff9adfea028600ad598c47f4a44f48ce6984d57cc8985ef05a004083701d68fa8b494032acd53a5e241ae53a30c7deb15679d1ed0001b036f6785c42825b924aee49bb8df4d8e9779bd831660eeeec8272e5bc68329b88af5c7a836f32e4302ebbfdcf4cbe69c9674d7bbc084161a82968ade51236476418856ecd64cab8aeb7a57182cb5f4e810758100a25d34a85ca9733178f5d0f0924da63c9a47f5bbc52a8f4cf4c7f1090ec3e67db0a7abcf2ff76061fa2251d66ab1c7e9e85a6eb1fa6b09e9e3e9f301656f396b49261ea1feb225b7b2e43a026e72e4174d83cd1b7a107023446173066ed031d50a9ba707279d0964d61d54af11d821b26c718913f929a27cb2812ebff9bb9684a9c78d494b7cc1f69b4f4983c5ff3e7ccc88a90fa79bd56b49c56ce740c206c9584ff017d322625ea303dfe1e51452c266e47f76c1c30a54fc4f2e2728777eae370109b9ecb025ed816e8cc72049328d21e3434ba483d6b7297e58b0eec5cfeaed1e24d7687173b3cfe16df2b4e3a783da005fc2facf6aed1c788bf8afb71b945de7c6af928040b73c84f32852e0181e564bc8d0a5a9ffb0f84ffd1b01e30186b39f142866c1b1dc7b7741b69e4e1c49709b84a90e1a3cc026a407c66d4814ebbacc41b1fa3c645a4580b8bef0405a03a030f72766b8aa2f236036c8f8795e2a78d7ff03b0f5e537f9e014e0fda25a676803dcfc02d5e0d3798d025428f5fc1b1de49a8af0d93b17893590d01bd05d10d536e4fb53c776aab6b1be29250da931aa04123aa0b736aecfaee32dd5c62b782881996c433532546a2fe396ad8e2f185c484cda9b34c51f83ce16f4a8ff12b9d802873ae760f596e93fa880e3acde10aa1ae95a24d41093080e07d036ce472f3281a4a5db19cd247d55986d344b9f0fb0631227818782597512052f7da27b25425d270c8be26dd46340e4f4239fcbc04d76d7dc348b417f67c901d4416ad77966bc6147ce580002075ce4a60c5aea344cb01546f02a6d3b250e4c851af3fb39c25222c72e711d2fe445b4bfc9da9ad162b04f51b93d4caa1c6e03fbd8f3968f4108487d5e49cfd03389562718169f6f5d29d84d280e6699d9d3186841b8ce7c570b6e7bff60f8099d3f7ae5c1f46a958fea27ce5650a06252cd0ef8bd79bea038903ae71ceec6e38f509bde7af53401bafd4d024e9057ada6703cc7898c289c23f6a8096a2ccd8c15909739ab4307fd943b6f19b593eaf54b33d8a7c1a6bc15e786ec599683c7e519c23d971ffa6d9f36984faf39d75bc9ef9428c0d7026bb0b4e9fd697e2e99f226022384f924a2b678ad82b2339cc6e4245fdffa06573f6813181c40b47f834e876e3b4cc6250c52dcdd96697a97874926986475fb3aa88447430a2187279c8ed19d63063c6526f01df055cb99caa246206592afe4493246fcce597eb041deaf290dd6455a56425cc917ef14756fdd50b2ffec900f5f10034a1f7c032ac4a262a5e6b5bd59d77021f1367bc81b260786aab194fa9a67aa90369202a0b212e3011a9b3ea1b6925bb7c7755c6b0fe1087d4b31f84de3e466a7b8e02cb09e0614b67994caeafab501ee510b54de338f2bd17e04cf1fbb6f0cf70e9c68801497e3a864fae3a42ef62ea67d6ee3f262a28367291e9fd39ea687d11ecc19a402751a72c17e8c201dc5c7de97a06063894bfa8330565f78242f40b31912aa16fecd935dd79d7bbcd8d2c27d11dd2541ee1b809aa77772d75a9171b38a09cc08269617ce4c479d4ad2b68dd76e62afe31dcc991a615e8bafc993e299bcdca4e7a1dbdf0b4de4bfda7980443ff054020aa4b711b3bc6d908812ffc37bfa9edc7d1cb7c91633e61892dd1ad2c100c317e0d46f9e00effbc56ff139b1a27d1768ab9b41811239937fd4cb5ac7cbc0301c7bf59ea0f84abbe903ac7118b6e7148826943a5c55c2daf6ea1b367e6807e6e60c0ee5c151c07bebd168f27b5810125e00ff55917dc1f2ed21191b5db19dd956fc7ac2dff1bdcd38c2c0e87aa8bd4a7766d47e5128266f2a7e93013da789c3e8ee83fde9d4ecd08632451fa574c37cf231441693e629694394c4533a0d36aa972e37e2f722f4c606ed79d5d30fa0dc390596a435c91fddaa47535041acb77b4a230e3b7c8a3aab3660b464e78ae77ec0481011d1387f9c0e91283eef5dded6c8b5b0ddf37dc524c9fa2181088ec24de01a17baa60ffe4f21ba19fbdf2bf7af23604a0622c3fc5ab676074fc5384d13136a377bd8dfaae531b2e3598b4b0aafb3ebc48d56837ac53f2267796ac0d92b7add1924ca4f1837d59f2c970554c9b0277c4a5f047c3f2559926b7e66cc21442444854b4162245f500443e2bde244d65db4b5c371be788b6e6cdb1af0b51cb498d1652be177ceabd40775214383b352ae5ef37b94de13495922c6f94c762e65d8d41966f3389d40b206902a33e59e3fbe10a830f88a81f0633170ce8aa44f47ae55544f7035d7b019d5a654afe982a18e253e68d7d444d4bbf4adf5fa1eade862a9840b1fdc428810f519f19e492e2e650316fc3cd284d3fc02ed9e8c7ca160f93b988ee03728a56c8e4ed88d878503f6e2a0eedd4cff3f78ff75404097abf222497bf90c67a3ccadd6a8df985e17d118f8d6a6656511ff9f35b9baa0047c41cee8219dff2b2c81fd11a5972260de624a84f9835bc6590aa32765959d81ec4b65924b04313bc036e3d0a9b2edcb9ce2ddd3b7bcc35f9d9d9ad9d8a467cd036dc7f9b9d1109d8b753aabd3369aa8d5587718609a88197fed3f2d1b2c1bf4b63e8d73e33d5aad9ae36c8c10276de732a234db52d87d31415da95555434fafe686cd16a56d8f63da492f73081ea88ba2198bced60ba4abe8c9c670bcfa42328599445e32af3a3db3c85f09c7268276e19a6c80d73724479022a4a6f42afb226c839f62459760619ef9c11aa564af403e3373044eafdf1e53472997c223cc1a873a6fbd69b83cb3a74474621db59fd269a9bb5a49e095026cbae8126c201191e263f52a2835ccc263900954bd5e0664a223cf1a498af326f8395fb7deaa0643a944463d734df2399ad41e60be46aadfa5f3ca5d826be7e07a8d17a790533475b6f1fc52e7fd96486360006f94110b8a7efed77ff321fc7edec3a3c0d323693b29b59ef67a2eb4b3b0f7c4bdab1782bc141e15b9365f349eb61d1509fe60dce00e0261e887980747b7a200160f61f4ee3bbf3a44fda6cce0499e8d4a1554a394fbcbdb38504bb011b71867554f137fc4057081b4bf2e5c2c6132a33cc15562e6dcfa939928e1994fd7485d4303dfb138fd981f71fd94562b26749bd7596d2cc751b77716a54a58ffd6998b9d7729bdf81c32635686e01c9b18fc35a52831b50a3ce5a75dee85d0fde92581539cc71e1c0362db3eb5e167f93f39676ea401f4de484555472c85f5ddf62507395d6b926c17817831fd51bf176c53a783e1ad1cc8ed609b8ad55269fe747b1f17b7903efbe4d0cdbfc5e08be0132eab97ec6685e9f16b4e4840f54326d6e083236034dbd1a571767ba7b45fda0623aee6f9fa95ae8c793c11671615dff759e0764debdd1c6163fe7372a7c1ba3b9a1bad16f44d822d2ba9d41e2004b99a8fbc74a6b7c604ed2ee96d15718c85ad9f60fcb682a315f9cd13fc1650a13560a77e9584bf4cb78c54c30d0781ff7e9a66502c767826455593de3b465d0f03ccf3e3afe3abae9c844c2acb0251981857ce77fbd2452f1b556a90432b27add97042a1302276c835ca87eb01a1d99ad24620b54a9a5e68594c9954157c01cabdd69bfadd5a5893adbf6dbd58bac712dd663999dc58966d512422eb6e568335995ad9c3ab53974946416b5653170ae1ad1fa343b7204bcd0334a547b26067ee50fb492de27b9a1fb3b2ab3fd5e3db2abd16b8e91af51fd7d0b598befa39608c9548730f2ff4e71312cee423f1f6111541025c0a080d821574ca4d36343626ac860b30d823431c3d0f637907206e28b58491c6fd366e5181b1117576baed9c6a843b9337c2b6d5adaeaefe42db8183b1d4a82b99437fe00ad86cef949666c763bdda7e1b2c4b28f302f88ffb88b1903f74cd4337ee88a88aac7b65c749ff7c4383e7bd4186ab5429d3d59ef24c827d24581e65cbc05034edf7da0af13ed7ff9540408027f06826b2b40b9819e37bc3be37ab8b080101b7a61355b742493905a4b93d2e32b69994f275968c34c00453a07a8a5b8fe711e433724adb25d26027f204554728bf5b1d1eae3cda28349c2d24e392cb66af3ece030710494822829fbd16d2784404f839e41b22de6548c363ee5ef7d0f1943eec23845911660c610a21ecaa4dda4d457a46c3730a8734cf6ce8d7041f799dbda6da7391bf83d758420eece424d175f0904a54092d8981685ca6bf7eaebdc74ea60611c503808df5488a7bb2fd7073f2dda5c3c3cfd8357949366ac0736cd9def6743dcf7f22f0ffac13f32c18b59f52fd3bec05c74ef7d453fa65e2c8e6d1685d6ed670d5f1b31187c8ca13045cb77353b12a07742b0ba93b0f0f8d2c36458ba558391f92b802b7d4e6edbc49974a6dd70a7b97d6617232c19be3061b826d83064ba265c8adcb9782690448bbeb3aca4f240846281ee56e4a870cf0bfb090cd655b7f642085a8bacf3529ef9e4510dae6b8061ec6472d0a1770a962f271c35be6940059d68b7e744b6f39fc495d84fb7a36adb3f6fe9a312e5c10a92fda324e2e7fe11e1629fad2fa79e6dfbc4cbf56bdfb3520d13a7738755f4b312592e81cf1232a2bcbff16a8aee22eabfd59b4982dfcc66d5fa006d40963b42f6be70600b0961efa54f257f5dd605225fba74a4d9a37d9d2c02eb86fa375db6446823be99ce55fe312c4ee5d0236210a4023c9e83bc50d339d03af3559b5fa397ff8f415ece9368c28490f28c4f32847b0a8b8e07b87617c497b2e297f41f6c0cf4d5ff81a080d058c515c917e0af4002862b018b98dcd87a8be72c57edfe0342b238e833e9a4c8c596381ad9b489ff64ad7409e6997902a0204428e4b5b1b6fc77bf2af31cc40b0fcd807465431db100eaf004e967702df0fbc393b36ea1d52b00be7ad25bdfa45d4badd60c33b8c81e11b76d3d91a059d0a7a2ff0c859da52bfed31a13e4b03a21a76ed351bae5f73f1a6534bd1f1b22a906846c6b859b6072ab517dd2dae77b645712995cb58dd0f986bf1c602d2b373195fe9b9f0ad93788b1f3d3abb8471dca0a9c9803405bdade9a0ce54e673ef4f241cd25457e35688cf9e356477834078022b5b1a756c9b706b0c901f9781641294466b07c22d555112b338e59feb576f4803fb1b71762b52d7dd39faf0ae48d809a2ecde4bf7a5087db40143fea06079189922252d607b0b565ad0ea4bf1e20e6346d36161d64647c91f6b18a873baa3e4be168c2e1075fdb79e820d67ca352dc2c5e19b25d31b9418c33e4fe3466cf57251efd775e49f92add8d6821434fbfe107128ff4ee37b3d0354d7a0098d438b21444c04c46ae8edfe08eb35d4d1a1b3e5d7eeabeccca9a4976e45200e54255a3edb7a43d6f110217b169d82478d7e729989d1b4f7f04069606363d6527c1dfcd8cb67e06ccd8206e9bbcc2e9c488b1a2c86a5afc7129a2f0a6bad416cad7672051358b4f94936e85ee2b0c5f1ef8eebd3d0b726a1573909fb1cb8f3dbadbf58ff4ed84aa9fd5cb0b440670fb51d4507eaa3879bb6a08f0aa1d2a5b19f1a4eebca9770d79da09c17d1a05ab9298f6914d38f5333d31828cfeb8babea1074c0d4e009dcf1c8e4a549f9861bd0aaa20f6fa5868777840f169d22b9ef077c784774968d192d280423c98814d7f6e5dcbcc24db803fb5614b8dbcf8e8d5a5e853b9ce991b24f1a489dfd1dd221cbec6c6720c13bf16d5774933cc3e5638ea999e1fbf6a1dba4e6f303d15534e4b922a921095387944c0b78fca4cae11c2867d567427effd97aa4e5341b40e716bd7c996e8a955b598013d645322cd1309b488d259fa39c7d1cb129f9e36b7d0e07993419003a805cb8817afe8ec8e46a5689617d1c2907500ab2e617e69b2b88d599037caaec5ae98efbd7d74f5d35581ea207ab2204eaca77512fd593978574e72616c8839d593540601e12ed84425c890e4f08bb1b1fd8e53a713631e747db5547d0e5c10aa596d113f6f442298a4c2a6295c0cce60454a6e1d8e789aaa9b081a99c33ba4154fa79ac5582ed46cfe3561aa97c9bd328dffd0a53b031befb506bce562437a6d0b0f1c324dcb0458b9051aa05cfa3173e00f480fbac9906c8b3fa8b1fc2c2bba94212284c78560e530a5265f4b3b7ee4c40f40fa727e320ef1e29a98ab862e206473bfc76852cf72bab3841e550e0c791b7f347b03159d358659359b0f1f7f81ebe9f965f6061b3ca5852adcfb31d3a8a0d34b6bc9c619ff9627d708f1e3e28f65285b4388acace3eaa06d8f562e4ff80aec5c7e136b63ea1e6218192423f156a8c6ca43b970dc127ef7ad3e8fd8e3a89fe9a821aaf41b51753bdf45ff4387d2fc4844e23270fd9566ed3c6a7d58aff3b2c3f4ebe1b7e2cf8a53837833084a347b9671f801459ef8fd92cb90a9b3280744eca106fe6edaee212990ec1831517d9f23a2787c02c844fcfa41a00e37a042a9afe34a8e0f90c9e254e48a978c1a2a5cb06b45da9e1acef2dd1c118353c755757924291e7563e0b572a5f427053584e35cd85189c4ce3690986e382733ce1abf242e3cf7a456ebaa6e89263de951f8e8d5d72f2a5cf22522a0dcc64b411735c329b04fc22b57e15faf58425a3534d2328bebf78c84e553a1d4e570fae5dd5e8ff78755d4cff7bc0a384607aa3db8ed1701f7c75d498ebd162ab912c2e4de2fea09e56c022906068e80fd2551242525874e8a84e09f4bfa3a4a18df34bd6020eb30b84b21a597eaa17cbce9c1e97cc738965c974b271b00033edc5871db50869662a472c2eced064","title":"416. 分割等和子集","link":"https://leetcode-cn.com/problems/partition-equal-subset-sum/","question_id":416,"issue_number":64},"62":{"day":62,"pres":["背包","数学"],"tags":null,"whys":null,"difficulty":null,"description":"给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,target。现在你有两个符号  +  和  -。对于数组中的任意一个整数,你都可以从  +  或  -中选择一个符号添加在前面。\n\n返回可以使最终数组和为目标数 target 的所有添加符号的方法数。\n\n```\n示例:\n\n输入:nums: [1, 1, 1, 1, 1], target: 3\n输出:5\n解释:\n\n-1+1+1+1+1 = 3\n+1-1+1+1+1 = 3\n+1+1-1+1+1 = 3\n+1+1+1-1+1 = 3\n+1+1+1+1-1 = 3\n\n一共有5种方法让最终目标和为3。\n```","content":"0961351fcdd44c9dd275f1df845ed5904fbd308704f820b0066e5027573a011801120ef3ed4eff2b140a9073ec2b60db79df883c5bafc93938cf15a16c0679fc30b6b59d1f083b77d0cb4d7976f7373c74a4f4446c26f750b145f54b1a432351b176965d2ff51cd5e7b7c7982f232432a23f2e43335ee7d06dbdfdc47fec1fb4755cc6a8f08ac7f8982da03cd80ee230a296827ed9b4c2a44f27d0b03b777894f099b08caeafc950227f65fba77010591944649124247a298d5bb45435ab017a20a91aaf7700b85eacec7b6bf274772e9d74965f92fa07238efc220fa399b9061b2a3f9550a2458bfe3322f4b9ec86ee060971cc8fd47b6d1e4d5ceea4cac139b36be3db83cf3bb00b234c4b8f47343fc69be830b26fb604d8f49782cfcdc6dc14a1aef86005c3e78dc55a7346df7522b7a2702ac8b45eacc14aa19f60e822a14e0c81fc4a30342287e10de9998672d8a0f9b8b891a8d975882be59c3401579cdcc45351b8135fc1f45b5319900fa05d7e9be47dc774495c1738e45becf8916232a7502f5a3388f8143ee42d50fd090cb33e2fd39d87775703215df73226560597a340415533bd3ed5f71f1b99ddd074ffa7d3d9a847df007d3d28c9440de680e760a9677ccb50ec9d6afa0a530731186f9259c5d1d39c839a718edf676b448b1bc1337128c48f17fbc8fd3574274d22203a60f651bb24d49f108536c3bbfc74c97b3366418a65f5220c8b1b265752a5b40a074455fedb79b29a4f0e3405705ab434013a177e0505e8e606978abf842311774582b9832f8d810010751ed4e3b2efca9d62344a056ff5b8bdc5eb4ec3efe33cc853988a21ef427097ec2f2cd1875160b6d507636d05723228b74e75e8927c1a68601371691cb5b4059e86edbbc189998d3404a5110e33f3fac98c0ee7afb45f7f56d9d4a5719e4cb3f8148bcbc047c0510cd8115606b5acd1e0267a2c16fe562f99e592cfc63af637d6272ef4404ea390352e30a21cf0d81534e44008121fd2455332956d107355d53efed97a8680c579ccd19fab80f96b531c5eaf2a17a8a3cd56e87047017dced05bc5f1648c4d14169cd100b969b331d08e568d030689d3afe828a72676c6c8efaa3c64af6a189b7828404f81709a4dbee86158e55d46b5f3c522395cec9999af120837352f7d2866561e711792234a669ee78415f35905233322f9e36e914e40b448c30e663c07300a720d23fc9311e399aea11b87e4ecb93f0f8d896fca5be544db4a5cf7d72f7eca7cc3f9356206b89bd02b2d14de8bcaeb791913e1b2c0c8bac0eff1ecf575c9e02627d325fd1fb52950f61e488811e67943949ec4f1fc01da790ce8ed239bd146ab0b86414b10debfaca2a4a6c5a1887727a8b8c5d6a75ffb0b37b26690b1acb712c88395d7a63957afe82187c440a4d5f309465689fc6d0d9cce7b6eac987c2e8fb83a7ba90bf75bfa2ea264f6ae9d8206cce47e1ac114927417b9d2d527c6d609fbb32e2cf7c7742293c9b1fa681a321c1b1c0e9d778bedbba03b0ebe1eb6d6de3d290fb56f07b0b48115ca5a631f2fc9182e5af380814c0419fe4661257cdb7258a5dba3e43d008004e8a31bd689af329af727aa8ab8ab7b495ea771f7dba8b6aaa4fffc9c0fbdc6ec612441c61ba23df1f793fb4a75f9181edc321a043e65abb9047ab2e2b1ec64266975808606c8ec154e125b2682cb8532c2a7217d939f02ab2c2e784e89861a23c2b43604f3d1769c2d792f2adf499453ccfaf05051e51474dbf1fba9dabd3909907e9420a2d782e04278a201f4366c8f70d2ba841748e6e4670ad8d27df6acaa4270e341778f95d708d0f5ce1905117d183477213bfc6f2fea159a4005394290cfb1070d2c0c28003b76ba9be6226f668e32f16f790153f9dee3fceb80fb55e9ade1288500ec17e073f0031daba6c12b1e874a76c675bfb9b95a7146228fddd8383da675c777629e7c778f759fc4c55f179b5220fbe188a6d553fe0cec11e6559bda4c50d2dbc3b6973329ebe870ab6a882ab2012c039df29b6f78c77c80a5a37bdbfb8c719ae553ba0ad5f405cef3a85b52862c647a70d624cb905734cc4da84d9f283972b90d1588bc8ba5a583326a5483fae1e9da2f3d2748a8f21210a5089ffa96a0203d5c1143ba860f2802df33cbd9b59fd231293c8c2ac428be576b16e97009860bd99c1934fcaf43fd0014b5b8173a3d0747d2dc973a20bf108abe642778bb515c2b7a29642d2a21e826afca9c559049b16cb826a6c990da87c12ccaf8f00d0600292d8a5f6ce64fdc41c6d33b80ed91df67877ce3a73923359a75a266c929aac9b415014124593a8cd02bff807d56b8ff1712f639e0214e2d296700a96c9aee65aad4f4dc07b84ab37f27588605d063e973f8515f81786836b6bde6638259cce8fddb30d823a996533d4fb953fc28196552973752cbd42d2f969de6805d9560818b23572b6413af129d973426c80629859103cce00e171219dcb8bf21c03713afbd997e030082db132335a964ea68dd96a6b14f22ac5f8e5943ebf50b28a714e0fcae131f4ed00a6fb75415441dae1fd7b6d956246db70613582b433773dd9f1462bed73e93faff229842cc1afa8931fdb16ff60b55a6b88dd6f74d91f7c4aa622485f9e245b1bce333eea07719eb4fb3096cc6f50f7a65cd7b45b600ca77346c7b51106836b3603a0c26eba83ab6c48dafb69e6ae1d0e5b59cb52327fea0d3cda7678e7d1804a40437ca36520ef9a0f05bbef2240d54bfedbf11a1f7402a62999070611e82680a9d6f507640755e14fd87bcbc75a1337a8c8db1730076413c6b4088109eb70178acddf5ae50992303c6a6f08e9790ac050975d9cf2b4863faf82fb121a75130bd0e70193bced68b95bd3f8ff82a8c22dc02d756f363e53e672e5902bcbfbbb1ca4c8a0387d87895b57675124e9a7bc8cd12a5324c7fcf759f4b3cb5c2cec825214483b0363569ef4bf2dfa3fcdfa73d61105d0e29cda9b3ebae3b6eff50f4174ff7bcbd893d1e8ce39290d1ef93ee84c82051b0507ed54fe2a5462b27dfef879ac2b5f266ca9636347166d8c35c844a4e8160ef6ffb66e9c21f88e441913c268b8da775dd91859276625a9d56b34885b671de799e32a0a139e1dd7ede9cbdcbe798c192aacd7d92b25381c897cbea509d5dbcfd874a93f588355ee75b660c09ce232e821c11ddf4cff77dbf4cebee43d13ac8f4d6b827adee3ad893f75d7485e47ad05ce0b45b5825174205ed203a104c35b962c0c044103056048d68e2dec7ccb0b33a569da018f2c7873d62f017dc94a361c1d40f4a402f1da5249c349bdf3305943f82efd1ee59cfe5e4d08e4d6409a36133aacdb098d289ae1fd23919d5211bf58b9478e5a302d7680f50d4f0818cfaba1e18f11a089721efd4ccc15d8c5b14aadebed85be3962e0b732bf3f8297af38e58bb0c502fc0e8ed9c8810789d650687e2689d814c2e9e4efe15543e21cbbb7e303e1fa947a4c918afc2ebbac05c60b05fbd1425a8f86a546f2b1512629d493470112e531b3415199fea0211d8fe38a1ffbd3e13af1143197b4ae3bf4c7f989e1cbdcc6ed9e4002fadb03a82964738387b69dabed3521cfc799ae5c05e6dc97cb639628c913467136e7b594f742c3a4ef132643e0f7e420559557312dc056de46fb9c8f42d9ed495f55253ab6db2db27ecabdad5cf768ff28826107e2aa09ff85475d27bec4d7284848e37b182960b8131a0271490504ccae11d6f37e13956de48051ddfcf28198d60222703f637d67720887b495d894e10c29ba599f6b5a19a995d8811e4074d673bc422ba2f9e0f083d271f97d7af684488a30b79263cab4cd15d45d62c6c5dbd9e54daa9ce99e0c5ded4e761ba574a54f36241e38b241a96e88fb9c1cd87ad4dd2723007cc4720f399c7f5e6c0aeeec33c130c6e971438552550d5fe3007a491db810bbf168b690b8547a462108e57738986776ee5cdde8969ea61c4907ac6f52015636400dfc38842f346700f2dcef634c84eae3d15d616e7fcea945420e73a5dc27b446b0e7aed0a35a4ee0398342b0052d6e1d8a9e0fa0b2c685f5670bd3da1e70fe9114b0efcb1b4ca2600dba12db467a31c03536e547a699bfb16492c06496b59bde83cf48d593ac7f323357b4268b85b4df8bd0bb85d5c8b3d89c758024ae8a8f6fd587c7028973f39f349d71fa12938eb7914bbb947197ed8fe9787b994c7ef35711c527d9119534e98c4e0df8de5bc237e315b44f12ee1062ec70b3b7e955268a8c9debd23da7fc5c271441c4f08b7240fb3e5e2a0ba0cc1e43715bd679a8267755682ec0b60a32ada4c803918f3cd58acaa531cb24df229551182d3bbc4d0c1616cd02570564626510f4276bdaeaf42d5399a274203e54ac5d6097170f8f652e493c73b9ce9c7edd3d7cd9bacbc2c174a270ea1e61644ec66bbf22767c87956ffe011766e38403546d3fb70433084858fcb135213afc7a3b722d94d0b54ff31f5579445e1b47a73426f996ddbfeb248babb1ef4a2d6a6b4c50aef7dc835855095128759d7ef96adf9eca82d771bef06651c03a07f7c14c8bd8ca12fd04c8f39642b509b8e314f391c7df194b920c1a5b67ca5529fbda25462292d7fa2b762149b585c3b9a4aa4de513fddc2d4aa009fe30084fe0185ef3b7b9e951e319472b5e263e705fc839df3877040612dc3af3ec9b95c20abc24ee67c8f4d4f116227ec92a13403cd88984e2eb01ecfa3b7916ec68675d124870cb72991a92c97342081e832b2916363b12dd30146b73ee2bc7e4591f4b530a7e3a40dd4ec065a672964b76a4f9c4af14ae926a58f2985b1948a9b7a83507105358bfaf41e63fc9786661dd359ec282336380a4f89d0002b11a2c3380d685e73e5c602cbedae69f0dec9ca86983fb3fb6eca660bd2e478590a726e3b0c3a06c632355337fab14e3be1465fcb62dcb8e2a9ae2e2ae98704968820766b9f91d2640979ca5339c9892269943a447e1c642e45774e38d5d07cfe8e6846905777cf9087b6dbf83fc1c13d577860f829363dfe11ebec9caf6c8e69c71806c678efb1259d81b004fad4e5013e4453fc74563d547d214615b0745ea527980b2b0e70e5bae9e057035a4c7f947b09605b7d893f1b861877d9ce1daeb0d7dae7a8a6ca8db15d7562d709dd0186e317a06202f4221f7a6978729bda5b494566b37e55d0eee1e02b0c9d863f1cac59301dc0c65cba73a440408acec057b74c6b7e9e4bd4c127fc1fd6923537e8f58df4f99ca9126604e31cc795b0c55e3c46eee50811dc34bf9cd7e1cfc7d3bdb9d72208661655d3648bcc4fd7261c8a8344530def179e90fad2f45b8ed6d2473d07db4ce52935a40652abe0f86ddaf9ef36d42d2691e3e55fc1861543b9821ce9856c4e0ab3ebc62520253a241f9ba3205bcd5900f24c31eabef97cbf5b9600a34a3f83fdd21030bc914db1a6b222a43f5c1060bd36bccfc4fb16e8435f1ff36c1258a025303a23a3a969dc78464bb4f9a7d39da0ff49757d6b11e84282b0606c395ee23655533c84f5239d75819c4f1d16dab65cf9b2f543fc35cf0e2d690e6b7389fd6d91edc8ed9b5f4a0208b2b95f2bf77a6fc9d675a3f5f1606e8540408192f8aab87bd9cb28f6dc226ff08114d619be3a9741dfc0cc62380b764f1a","title":"494. 目标和","link":"https://leetcode-cn.com/problems/target-sum/","question_id":494,"issue_number":65},"63":{"day":63,"pres":null,"tags":["动态规划"],"whys":null,"difficulty":"- 中等","description":"给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回  -1。\n\n你可以认为每种硬币的数量是无限的。\n\n```\n示例 1:\n\n输入:coins = [1, 2, 5], amount = 11\n输出:3\n解释:11 = 5 + 5 + 1\n示例 2:\n\n输入:coins = [2], amount = 3\n输出:-1\n示例 3:\n\n输入:coins = [1], amount = 0\n输出:0\n示例 4:\n\n输入:coins = [1], amount = 1\n输出:1\n示例 5:\n\n输入:coins = [1], amount = 2\n输出:2\n \n\n提示:\n\n1 <= coins.length <= 12\n1 <= coins[i] <= 231 - 1\n0 <= amount <= 104\n```","content":"09613214cbd44c93d26dfeedb25ec28da33ab1ae2e3e8635064c41275c12031000fd9942eb5d288bb6cce140bf665b833ec2fe4178e85ebbd724ee3aa0f9a76ebf326f608fd7cef70c6ec1abc79e527278f46f8996ad099327f626c1eeade18e5123c10e64faf1446a7247f96a364f70a0bc2e647bcf1908f8075303b40d9f488439a8eefec9404c45a777b5a276a0722a4b42ea5b49a9dc0b618474ea9af22054751c2066f9dbc2cf037084cd51620211c38be613540225fe1d91334b974c3211d24a9ac8854283240aeb68f548742d997f9279154b90ea685fe78d1097f647543e3fcd93c755e0a61d479698a2d9f54c577baeeefc2d171227b52a3e0305aafe7c84b3a29b65894640600de14b5b5bc5d68b19f12a8744b4fbc93e8d8a779a521dcb8f5cb4e6dd24c17b5d46c84d22b586702ac8b065aac0548e9e64f020a8540c99fa4a330f2282de0fc4ad8740e5a8e498b99489d74db12bfabb38394f9fdcce951b88de1dda3d3a4a661250efcc16cbf600a26631f77c7c71eaebc0b98f94e50800085a90a74a11ac6668b1543fd8783d96d98a12fca52c5ae230274c068dbc4d7d7f31982ed5fc3f15bbc5d17bcba3e8df47df3384a58d28f6500ff88cc35528a8b430288110a049084c26382d7517aa255917075b308a585fe1bce71cc9069bb7df1006d1005a48b8b796fe22c2e49373dce66fd2e19d0431d8821ff9ab2a1c19f51eaa749857de5d755852d5a5172d92dd640eeb198b51c1b9c2567028ebe0b8f7afd099418f8140772923a4de90edea9f4be94307f2f4ee8273c98bc81308c0fafc94b16213b0c9c19a6d7e36af72589a4eac5e795a42728fc37f1395ed0187433b2847723228df7503f5992c5c36384c2e7801a8a43c7c134f757718471a9f199ed697a9244e48488288f6abe49322ee72a753b64599db915737469a498ab003c7b0a272561269f393bda44f92a6293ecfdca1b72cb80ab715dd84c939910228f72a5dabddbad6a37891fdb757426c24138efc170bd5e54b32ae760aef12829dc9e51151d095b0c44d9e6defbc9022fa02dabf5bd45cb7b6ce13d06d4b7ca3acbe13b110b00b369a0bf7f612495c6adc44bda26a13563ce8c62bbdb036a1b38fc569990cb84d9f6b8244fd933d4a0c8f908b6d005e09abcec3e8a7b3c2f6ce8f661d4cafe4897b2f02b25a9f8b933337d4ec62baa1d8d135ed48d4fd8ff0d8e3ecc27fe4028ac2a3ee48bc9e8cac48739cd10bfd3a8c53be3b6ab155d9fc3799521fdbe254a6f88a32755cdee68df61f7108a5eedeb0d0feb19adca62fc5bd6c3ab864e85734f1da3afec2ff028c2c79dce4ed908f2483181bae54c71f2b9729e5ed127b74b2bbe6c4afc08cb7dc0137eefdd498d96292420ad8b67f3165558360ffc0d9c5467cf18d16c3a073f0aad16e0649e7ab4f6bc5fe111ab0e4db804333effd78fa65b831a333ee33474203fa1d68b8ce07b11de4ce619f9ab64c7ee6743fe2df145191d313287a33e7a2765393c1f6118e44293e0da7de4d9b62611395bb029344068692823ac75b77332cd60d2968de6f35ffc7f315d394d1f009b09c234c1a02f38e5ff32878df4d4c52a02273e16f672a5697859353a73148693c1ca2c1d39e3fb5c8d463ead0827eb37d98cef7a640198516478f345e6b3e1a1102d3cc3dec87d9643c4177a28304d7eb16421858038307377eaaa6a792f68665d90e481754c5dd0da617009207eefd76bc3c783103de41885fded3ff5f50eb3f45dae2f2a4e4b93436a577b42caec8bdec576b67b0683d68b973c09a842665230594cd89fa04a8bcc4274096254d3f86c9cbb5fba37c2d5e370d52300963867766bf2ff6343a6c149183ef37524b2a439cc7fc525274e6bd23e076ffaa173339baedac95f8e7a45b69250ffa32f5309c01be345f25d92a04514f5fa8cf1ee53e552b13ddfff42a92bf0c52c24f982d6ee40f6ec63090a4bb6e6101347defb2ccbf820dc25483088429a49d0c72b8a3f0dccc254882ce14f653e472ac507719f389b03a03ec37e980ca19eeb1ce48dbb867e267e8b761f4acea5f0be1020c256bbc6dd0cd32305fa20cd459ae5f2da26151b21566e19fc355483cf9eea6a9d7486133340c3794fc4001bbd92261d4b189e450305ee40e72ec58b2f63b553ff4efe40cf2b871abdf89f60af4db6c9b2e2f8dfa3d248a1fcfc157a9533e374e4af0c79374a247bf064cb8989e38d593c3fdfbfee4c0e774b9554f52ac1a871ea967a84b793619272a40e0f3b0414f8ae1ae50c2cd823054964548e721686a19ef78d3607ecd0e20843470e76549f3c1a05a0e1f676607f2fa5da3d62c5ff1b05357ec13ca610e3f267203ba08caab3cccb7b7dc4ef657fd6d156bc235c131b336e2675dcc46673b9ef4e262836ce5e8b88e6cf63483f537694fed12cf3d0e7002c4623ea8986127d284a4d41c8b7a99c56a57307f28a609b79772699a4271b7cf2accb35b4a0929f6f6ea6c937876fdbd91374d5482980f3f36a975f72bdc8aa5f96c08f775a4590aadf5037bf259a6affc7e5653d6502ebc0700101fb311dcf9d0160e71aa0652156416797583cb083bfbde2ed3faff229842cc53bc8939f5b93ca30205d6f1a497b80ab9e299e26a69ddbeea1cfcc7bb47c8a06619e04ff75917ddb0562f74cc321bd023fb5d346c7b02452536ae3d185f73a6a86c9cbaccfdf1db6cad84bfe7c0ae4d7785e19ecbbc7da17d185de9046b87374217ade9b50fd4a16e4059a5edb46cfe8d3b6b2fd6816e4e73e4424ab73e0b1c405f2e4da989bca066a9197b9cc837efa75c7b672b49d855b4ba1874ac80b9985192221f94e9f78dd3dbcc404a21d0d5014863bcb739f46fee5c2bf40a134c7ad3c48386ee30c3a03b8c2fc606ca7eb61ebf7362761a5f9fa591b1ca4c8a0387d878d1e53238697fa6369a9818a1490d02de039f056cc6c9838a702145c5f24456149250d8f5a3fcdfe33f5f54755c7acdfdc990fd6e23824bde4a23f8aefdea17279bb7889ed1bbd685da8065df61a501b15ba9f41f68279ca3c6c991b5812986c3627d786790e91fcb0300c56ce76ffe60eec838d39c06d46855dec0d03484c28dc1332e1c911fbb1d81e563c32d9c2faeaa77c2dd73c09cff84a8d4dbb8aacd7d92b25381c8c3cbb300b5418cf5d41f93efcf3d11b7746e23428b3354f9551c9ebb86b900fd1be29043d43adaeefcb827ffab6e8dc1b95d7994e461d308f1b66e197872174bb95d3a0d5135ac2f92955e443f52048e428d929489b0f76a2ddca907a794d33b58cd5796be8156b1af0f38064158a5eb008eb1f573018407c2c2fbb0159f9c9dd0fd02285cf7287ca282b9b2cbdca51d9b2842b1665efdc79878b9ed14d572483a869bcfcbbfb2485db24e47c53da6dcd78d5bc61812ad90bf9515ed9d725f3e66f2f82a7d81c77e9101503ecce8e08d815c17de3149d5fe21d3d5522eda1ef654197130d59434463e05b847a1d42cb08cb2b19f0036c924f4695882f86a542b7b6e021fcf116035584a535f646e148e972817d7ec1283dc806a70a9551b03407ba3b60c29d6b40bb1d13bd1f9556b90fa63ccd31c416df39f102225f701b86fb4bafe0a7a8676e64a6d9493322047485153401d63741da532376b4225750517003e41d25728a03afa8dba6a8dd89df60e07f975b2d968aee598c3cf25c9a0ec7519186ff49fac5468d228b900728fdff076e3c5d35f9a1ba0275dd650449ee1182663e8314d9b00500cde86760ba7236d3d57a279ee736fc07a0011039cf10f66085f4b256d212f980cd56fd3b0fbbd21b71d8359d4fea9c6dd560112494499aa053f6f70e744c1545efc2c6c19a9b53feed4d384f193bd9aef63a57e0321bc2d4be0a46d549ba78af6c6d6b7fe4fd238131ce64720b5d695f5ee8cebbac3754e3b6ec30f381c254ec8a3541ca4d8d68c02bf4df32c5fd015ea62108e577bb9c9293db1f48eef3dea2d899152938b2b04637b5df8d28805d902202629d7ec33c81a977644826bfcd6eaa5237b8d3a37a85b64a48012af1a51dcd640c71a486e4aa0556289c014ba6cf38f194afcb539b950da5d2b1e9ae1ac86402e8ed62ce83c8ede838c8ec7b492196a491e2a6fec89d3663db638075b17cd1fa9a3b2236ee71047a8e130d03672e15bbf843b3b3568403b11b1ed91c9e65b71b4ce34c03edba626a9f62945a9dcef5e654a6ffabe9b8868200e4e39da6637179107436f4952ef6f60552a6d966fd6465cf974a59752b294fee795a73ada7ecada784b36","title":"322. 零钱兑换","link":"https://leetcode-cn.com/problems/coin-change/","question_id":322,"issue_number":66},"64":{"day":64,"pres":null,"tags":["动态规划"],"whys":null,"difficulty":"- 中等","description":"给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。\n\n示例 1:\n\n```\n输入: amount = 5, coins = [1, 2, 5]\n输出: 4\n解释: 有四种方式可以凑成总金额:\n5=5\n5=2+2+1\n5=2+1+1+1\n5=1+1+1+1+1\n示例 2:\n\n输入: amount = 3, coins = [2]\n输出: 0\n解释: 只用面额2的硬币不能凑成总金额3。\n示例 3:\n\n输入: amount = 10, coins = [10]\n输出: 1\n \n\n注意:\n\n你可以假设:\n\n0 <= amount (总金额) <= 5000\n1 <= coin (硬币面额) <= 5000\n硬币种类不超过 500 种\n结果符合 32 位符号整数\n```","content":"09613417c1d44c93d26dfeedb25ec28da33ab1846d54af1fcccdf92542190f0c39ff944424faabb392dd26fbef1761d77fee86056dadec1f3ad61ea9633178c907b7a89d1c2f0f70e9c1467d691588a8b20587006f75895be93ed5286f646f05bace4ae5843261caacdefff86d3ca2d73d9504a0f9b2743bb0624e5bf614fae823029ae3fd00326012d07cf62ded6bdf6cd3a644dfcaa9be5c36d4ee722d3ad79ff6e7cce1220ee5a68ae57e4792d796db210c1afad0eca874d065bafc70c3f2d3509736818f02e0405ae8ad8e6608728235cc5c7c2394b3e5c4e994145239b0dff3dc5ce0cb3e9ab862008de6dce592094334f3e8a4590e4679a86b6e0742cdeb02e6ade4dd43cf2345146df03e3a619bb8b16e8d38fc3f98938e03eac37afb3b2eafd149c086d646ae4a1723cb25419cc534229fc961cf845ee9c07b8b7d9e107a8d953b385746bdae6afbc5ce598ee0cad0e4acef977bdc53c8da722715e2e3add23ffd801c8748343d18102499e07e9be377c77fa5dd5978e63fb6cb1bb4a40bbfc08db535ab4f27a14d696fcce453b8c71f0a27c87d3ce5c200b8d4a693383184a1c1fb20b31f4baaa128bd8872aac7d2676de1590c622426d560d166e19d7cfcdc934d85061e886308750c321e40907ee9d2e3b68098418ff37a674cad15f92aadb4485491641b55b7bc95e419206f3da4706dab5f509f04ec4210dd4f0af48bb2ef1e80ae1cd81ac8de4d40c48f2ccfcbea3b6ff0a88b02436a2d320ee068536e5e2a5c4ab2829d09247a58aba3c13709208e0f9452a7aa904ae94a5145718c73faf484b94a21746569946b59e0f663fc4e00bc21cbd14e7491ce790b9fd60a02a4c2a0b4e9e68f15adfc448aaeb1db47c5fee2d8361f16a797d69a181c3b43808cae11527eaf85ad1c965a6a00deb5ea338e2bb8608a1861a9096e75e3810903bd7157b4720675c426f7c362c11a71a7594b454ed42bf753a28b33d8c866f43b4b79a15dabddbad67be63e251293c0bfcb1e95b5519e756382ee0ec284525acfce81ab5041dd8588ff851cc32a5845a428b8c05238d8b305d1a81e9520530e36f41425bd10b90626c96e7939cd82888e5584442dfb948fa4541c970978b51bb3d99a30d79844a9c8ac05ea3b3f929c8004552aef104d07b60a1f082f6a0a676104bda8c9794533112f02d85ab68b90f551e98332b815d832837b44cce48ec3e2eec3d17cf43f6576082ad3dae1b7f1154f1233a5513bb87bb0014d52fd62388dfb370dabb0460e1dd3100717dc86c8e44c1827c0751b312f343f493723ce297b270de527d80f72c99767f6a947c44a7a60909fc5daff2ceb782fc32bdf6a4aa65f96cb60e79275fdd0a5f0faede2fd6f49d4aabeb1befb19483ecd318ed7f7b141a69af1809e7234beb57cb09511bfbbb1331801be81ca8e1d02afe84d591c798ba16a70aa39ea1fbd16d9258be0d3c503c8d661228b099f2015a4dcde20b99b5eac9d00b91d02f9ee579fb0aa1e537148212610a9210a753c64f7ec23ff5314719e0389529f8c4c400cf34f5b77332df5262476e16c1ed8cfd51d156c214ec44a12b8d6dfe120088d0c9bbe27f9ce2efe0035875703476337034cb52df9a4e5e1806d9ac5fc518ea48160481cff4ddc18964119f9794ffb282d14e7cbb0eba2fad9687476bfa1b83818092c87ea56db4f968ae9d7bb027046b3040af0b8fa8145d7056d155ad2dc1d8116218c04fcfa77bd3d7b3009df76b452c7eefe7765ea3c51d8e5d2a9ca8434328774a43aa8ec98ec504467bc423744bb71c1be8a366de4c65f0bfacb7ee590ab7a76ef7d6f8fac9d586e1016dc9c96fcd8e0fbccaa31d7e47ef6798897a9c7710e3af3eca1cbf12a413aead276f0bae42487d5457b157ffac6c8fffaacfa6dc8a7d2183dfa25981bb5fb071107598f9d982ca5bf29cf5e26559d3e1833ec5a3fd1e220fa48ab8e099ed30ab979512ed0a245bcb0083201495fbc7b91249207d6465bc7bb3f50285658dac86107dc6d976ca351d6be98357d60abb37cb1007041ed6e7424a34c74b76e83340cc8556973fb8707e4d294e87bed710e929275cc5fd747aee0a65ca6db13370d684b15dc9c9d345a386651e9aeaf8e0c5dd5aa459e5c652f389df9d78069ffc2486d029c7298da35517ebe8ce206b725ac5fb2e6be06f1df258e204c93fc7661d976cf8819fd537d780704938fd27caa50b70602a5ade36ad792cdf6a0e3e889e86df6414c49f95fd306a026a861793619276306e0fbf30e06c4b2ae4d968bcc2c18c45814f86e626b03da61a03611834974cc346dfa6559f39dfc5a4f52283349a6fa05eead752bdbbb4e57a843b1280e60636519a10899c06d9be09df64ef61eb3396e16c223d465fb64e2224e9c74247e989f856d96629bc2d9fd7de860ed9ad2f5f5c738ee2f1c7b08bd3a39b3d46e67d79aef915ddb358ade70146f3676e11295d63f26cf4875c0df1483e715091b0387dcea6cd07177fce9993a53009fdb21242ae836f92ec18ca6a23e08e01ac01e5ee5ef033abf16b5aefa7e551a890473fc095b5910b05082ebcb750e6df356684856432a2189d06b30f09161dad0dd6edd16cc10f3c077f5f67aa3051ae4f68a9ea551fea3cdaa6462dba2e250e0f9a63a8da06a19a800fa477794f95b332a833a18e27fae232f6c32094e2c36f54a325f73a6a831f2c0b7b48cdb35f5d0aee5f5e7092afee39ccda74eee2a1840f40477e0781704d3e9be5d80f524121ab4a9fe17fb900f7f2ccda93b3053e44257dd3e617609052e149e8eb7abba35c01ef2cdb8335e26010d2845c95fcdf9277ab386eda251907710f7f6ecc7d0d0c51f2375d9cf2b012de8b73ef968a05821b50d3e503bdcce89dbf32183e661c92fdd00d631f350aa202b231744dff1e8b8ca17a00387d87895b532253f41a42f9a9f4abc07521ccf3acf072d83c79b8b716f1acef24467149d5fd8b1f38796da752481afeda1655d2a374ca7a13f4b974aa20d583a38b3ab651f1c6906390f220c36c1588c71924a9f6b42b9580d9ca3c6c991b5816dd6b872003e35c2f847844541c5e006e079b42242f65671b25caccd7e0448bed087d992336d5dc2133b88632df26be878fa2159e8c2dd73c09cff84a8d49df7f8cd75dbfc0787c88084be1ece12f1b6865690f5881f55e70f275e4e8b775fa81c11ddf4cff77df60aebba43927588eef4f169f9ee73d88ef71e3bccaa339541b5fa085874700d50a3742110053ee66bf7c010103f59049f42c8dec7cceb993a569de448f2da8746728d17d694ab35858f7412340500a560cc4fd2df3e41870bdbdcacf352de8b9eabc7307f09ac6b33291f515d32242eec50aef807a1e4590050ba2875f6963bc3df6c1c3f30331ab7dd7fb9ce39a42b0a2855e0439ed940195c3fd30448eff8cee23f10646085846af24f5c3e096e424b3fb69605c8cf274bad13228bb51989659891bac15c70928b9e8f7de05150e1588be6b081232de324f4695882f86a546f2b483862cf0c6025436053024e6e148e97285198be40cec19b6c3ee0115678102decaa4261b6af4afc9e6e9fad4e6bf3f168c5d34e61302d34dba7c0780bf6fa4b0645b78643a830f4847f1ad9de193f7b738bace73adb1dbd74240b300cc2ada4f8f4429e8f0f36fac03a9d5099d8f80e1de259989727211c0e1078f2436d0fe0ad90aa6e19b6546cbd20f40a3c8680f07be3025ac553ac34e2d97b96f93c2482e93fe83d6b9351594bbb","title":"518. 零钱兑换 II","link":"https://leetcode-cn.com/problems/coin-change-ii/","question_id":518,"issue_number":67},"65":{"day":65,"pres":[],"tags":["贪心"],"whys":null,"difficulty":"- 简单","description":"```\n假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 sj 。如果 sj >= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。\n\n注意:\n\n你可以假设胃口值为正。\n一个小朋友最多只能拥有一块饼干。\n\n示例 1:\n\n输入: [1,2,3], [1,1]\n\n输出: 1\n\n解释:\n\n你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。\n虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。\n所以你应该输出1。\n\n示例 2:\n\n输入: [1,2], [1,2,3]\n\n输出: 2\n\n解释:\n\n你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。\n你拥有的饼干数量和尺寸都足以让所有孩子满足。\n所以你应该输出2.\n```","content":"096221cf5b628be1e73e8bcfe626c7347182268a04f82d930a6148296200033502310ec8ab1a6ec9ebd627f465eaac46b8280bc2d829199fbe23f761a0f8f223fc3b6776d4d5d2e00024cce88a9252743ee16ec9fecb4fdd743cc00b6e43450aa9c448fdb0dff17f67718fab6054175efb3381a0cc827a0286604945198359e336d5024a3a4417dcf16fedfb1cd668ed4df9e52ed5e04a4c96a71e3b4208389b1d3d134a03d361c2e6c7ebf48a671f7d07a8e1f977022f8d1ddf6cb4dbf62a1455994cff5546cb72e59d730d83791d70a713cc70612cb1870a60b8c618087896b7add20a98e156e0a11246ada1a1fbf14d4278aec4d12f390e25900f32173fa8e0648899b19a679e4047730fd45d5b43d1d0b004fe27954685d1c50fa488408e521dcb8f48bfe4c80ace594c44cb5522b5ac7322efba4094c04bbe9b7aee23b54c0caafc4a301e2392e20ed1bd408e48a0f9b8b5afb5d66abc2ad2b334025890e4c9961cbbdd1ddd161dbce69022bcfc729cd072df5247540334f272eded92603391511b413384e21902f7204fd6090a9d3028f597a249b8b07b05f9535b5460fdbc2b1f406de52e8b842367c7ec8005f7d48ef2c230ce732c2273b75359666d211aa5cbe1299f6d64973e5549676f3b0ac47fa998dc07157a13c990410c2e9a7ebd290b9e0e0384501348e2fe656fc796d6e61ecab83bc29e21a13dc48413cea72d1f1a209720a01dde1bcfe74d18de60aea19cfc530dee0b4ece87e0f5cc5aa9759ce1fee280bc3f5444ccb4f3e6346e2f632d56d51fcbe0377c2103a65f0b217b34b7a2dbc9c45a6e06562ddd4e224abe1cc814449f6b9bd3172aa7871200c9b92d6ec9f6dcd2c7bfe103cbb9433da89cf0a88fcab78004718f224562031525124ebab0708999f55c7026cc1181df810b1976b361c0dc194c96e914bcd1c755f3bd9abc4b4d6bdd989bbd231848039a1c29cb55f2aacb9373d70ac99c6d85c020963c21ddfb0a97a30876ae768dfeae79485f35967d159cdc6f3de4c377a89b29f84a14200281c96d501f594c8542ef82982ec61ae2bf7ed0ec59eeca4197f8cb9915de0a8a65b5290c36a255b2aa4d546d239278f8e67b726116314ab26917b0a6b3dda00a1fd840cd45c18473d745b3dbca3e395edfb99a8d3c0b0f2c2d6b3c677c3fbf85d97a4d14feffed51f5004d0a6758f588e6f11378dd03f244ebdc8fd9e7eee7d67cf30e8afc97ec7bb59e81bf4971b7d634ebee2ce47b9f27d8754bf334a05014f5e354a4f1aa37794bc1eab2f91f4e28a8f0c7b0e6ddb9a8e0ae07f8bf793bbb78f3542ef1d818fbc1d7178f3160d3fbd990823b5b7028cb29ea5a46ae6497ea402f56fcf2c9a2f2cecae2ed5b49d9b56cd6a675f6001fb17a82b8ab9a1ff6a993e8a1d435908e7e9d8912aa90b0313606adbe283aea97733b21e1f6a6a196adb060863db94eebb075dcca105bf45d08ad45c172832c4496999008d3de31dda45756925ca3c51f386ee06508567394dad91d8664f78c8aabdc6a99467b1e8f870e855c0792b28003ff597f3b2ef62b247bfe6f3be7c9cc2dd0b1e3fa119b4a7c435567e2c806d25030e0200649c55f53a43b65702f9fe6c654e86c67238d8c7f9edffabcd19dc4164b5f8c61b67f8ecffabb511ba62045a133526c0d1a333fd0e428e18be46a1e507aacb107f6ca1a541b581fb3cb8114cf89047db28a038a092147548ebb0b2316139605cdf775952d793119d256be5ec2d8f34f4430b3d75f2c084a5713f3aefa18a54bf6c2fd9749342db6ded8f915cdb38ec86e7e80864a7a8ac10c103327b6b870b2cfaa899e4141113e9e8fd5f7c594f3ebe629ceb7379525908fbf8b720231f4d4a4f2c90f2975a690bd267870f063ad60ebc6b5730d2077097033863b2d0be614ad3c945dd1399b78c28686ad9386676729cf2d7c0110d4daf6208d51bef50a19b07407fe6bd344f5f0a7e3185f85dae85cbec3b08d3cd9bb0e914093c6fb393be9914539963501e4c368a879ae2bb0102216bff1b15c79ed5087be8c7dd4d68f71a6e4548709f8fb04d8eda8767e8e0a6c776de728e89c5708c14d92649f3e067f860914839089bc92840a7c559cc7eff4fa21383c4b81d41027b101bbd997bc073e7c0e844a7b8ed0875ae91954ec90b6572f6ee734b269963219128f3918e840dfc67d0dbad343985712d15ef0b8d784c10320158041c73ac6c7615325843619042a6e4a574c37977cbc92db62d51b813af31ecdbf9fb9e3f88324674bcba36c7435cc175b5fadbb7980bb38e4bb8a971b8f18a1b246c4c40588cd3cf4fb303d5e9ce3fbef96ce6261ef7b469393732096d36bd470c5c7ecf9e3cc47825724e052157e59d2338721fcfeab0afe24f716b969928c09a0a6a97e3467bb45e40e587716f74ea2201a90d98c4db084459bbfec51ffcd2e489705bcd9a811cd60fc702bf8c699ba822fd71027722e9ac39360df04cc6bf3fcd7ab573271c256ae966a1509bb87874a44fbbef905a959da56594480680868c2119ebe253d97f137c643260ec398b90bcbb259ceb8bd994cf0567a549b96e771aab49199ebf8bd340dce9f344fa4415549e701d009fc364ca94871b31682cd0d7e55166a967865651aa18e2b354ae16a1170fe5c0bb3814b8b2b83a919399ea28745c6d068ba5dbfbbd9b49ee9e1ae03a69aefb60c17f41e290a50731fa6431472154a3683ee7b3c161d7b3325bfb5caf4c2974fbd87e431660bcc65035b6a57b7ed6bc92914f4a4a53b4d0a3003ffadb235b8e5eeafeff1d15b6c3b7aff6ce597f2a7fb701db2caa4ac892926b431dbb8375b192daa51b1e77c69253ff6ea4999a51f98996a4400ccc771c170ba572bf36e5a2e51ee83a5c1f93095cc1dcc2cc905d707b514f4142d29546bc6fee9f0874cd14dd2953ad0e749583404a051d5c756951947508e339f54229bc58c8077146c93e31e56149850b8a7e6a88af521241f46092a8fa8b1cdd76e298d619d052be4a8fde55e2091d49591cbb9ddd9a8c42cd268b811b10fbfe5502743dff78f86dfb5896e8ac331743e73e8e95cc34a53c562a73cf27df38e6388ba06966155c3ded07584cf8d833a35369156ae1dd5e52ed07e9032b3ec65a9d1738295ff99b6d49ab8a7cd3f9ba97981c88f8ea3508941f1e8c90fc5a68e3a552fac849be108b2a41e3611ddb88aa37da540eba743c421dae1f3b8ee2872ff410132cdee406bb0bf08b5aa500c356f0756ed3d3a00571fed628a88595c7a590cd80bc8c2c78bbeff7f18dab000f2dc814621c717ca94f83b8d9a411c1d4d14a57fb6349bdf334ecb44570f623adc420a57428e1e2e09bd7c332421415d340ae7169b6b9e2cf091616b18b37128ce08fd9dd8064c12445919dbb772d5943be754064525cd00c0dc2c487f5eaf0016abd6baa60d6bd1b94d5eb37c86cbfb6660262126c3e0354f0687e268d4c74c26cd35ad5f293e7b86c07336795dc94ee0c249e5c2e6ba8e096aaa2fff727282f86a546f2b465869c4174a254360535f643c51dd9c234ab2be128b95933e35ac0643030a4aa3ff0c35cbb445f39eab021e87ee4534f157d340016d2a1e53442397ae7f3f88e283cc9310fd2a9de55c40a2f781f1c9f48794feb28624faa1f88addfcc0b883f1dd7e9e9400f27c2c3a885d1d11309ce91259b29a27e7ab988a856d8df2882610326fa9b5ac5435f828b95237dbd18838e397960c8131fd3c77961004b4cb722e73a93967d4581555bbe57842e72a632542c174f7772793757c5e8a54168380eb96ad8da881b35dd807e90557703bc93cee32d827142b0509d1d7ea2d10fae24c732b22a20ac91d10a8571119aae944eee787e28cdea7dde77cdf054a5cb02d0fb0df6d1ac2a79bfcdc98d7fe54c9031a07cc4720b5d69594bcdeaae3907b405e3c97077f153e64c8fe7e1ca4d8d68c63ed1fe030588b14eb3000d67f33efac7c73e5898ef220ea258a8a0794df3d1573685dbfc3951fc95d5a5d689aa366864eea3a26cb27b9d6bfc67e7ca73d79a43400e9de9f2bb191613e85419cdec8a023a595d7823790f3420b1924fc71a1239773d4eead72633404c1e0576e8167e60f013d5e52093364f4fbd2d1b6c3ecc89e2968f86c079f8f578b4c6b708fc40492fa6c788f159be129f81341979ef0ec8ef58a0504316bcc717cb4088356f76c32e32d5befb200126ef2aad6d5fed193e6682a0e0f74c8333c0fcb46690c025220a181d5e0f94deb28fbab26b83f4ab72e2efa889de677952b848e714f1c1b49af6841fc92b9b2e705c5ce1d16be675c2bb39ac737c621a43b8113ac28ffa07c09c2006dc8daf75df77bdcab745349653c78d4a34c89e5c586cbb5d9c6c43a0b71ba1df765ac9b60bd6d493af1bef51429c655554ee2417f6d175b27330b7d5ea4b0b3c9c65e6de78f69e72b378def0e85886c7bf3fbbcc4e6d6be4f39bdd1c0790b792b89b4eb623e4d33c630d7909e7ef9517bbe42adf47c6f2b789a7e94e4fc6febf14bf3e299b384ef0aef7dc871c016bf41c81581aa9efebcf3a173235dfd45745544bd70265a81e9c2b5409e0887306d3050b1c7774f314f28bc9ca43adea2b72fa0108ebbb95d2f74287ff4b9355ac24d55239b4adc9b056a8f8cd4ba2ab5e30084fe0185ef6f32cdc116258d7afbf836b746ee83bcf3d33112266897a67788e25c61cd8708b27c925d54110c77ec8fa14f78ddf5b2442eb8528aedbfdf72c5817c9260d253ea29caf665976120c8a632e0d02d24a36dce4d08bf68a78412118df4f23ef4aafe0c8c9e16211a394afb3209d97cf119e775ecd56c8dfed2f29b3383193f0567caef995b6ba8978d660cda43c628231c380a4f89d0002b11a285775f21527bebf345d5e9a67ac8cac595fd8736b8b574e22272dbe473591b7b74110c3a06c6691f5337fab14e3be1465fcb268cc3abd4d52718bcd450d9d3403f3ce4dbdf757453ca5339c9892269943a4439502168117c0c65d5b37cf38e2613dd040c859d96cbdbe622c1826b127a64886b50469e6cebe781af28de128e180bc66b90fc76e6cbbd1587a99e4b33556b9a271317547d214615e2310af075d60b6f5e0be8f8d8de1c462c6d24fe3b234a9ed20ffa9f6df6ee660bb221744a450a1c2e032d0398e8d043f10c917214d87f819034d6c1d7f6bfc90f1cf5cc86c63b547f90aefc9a2f3df48a3e0fd5736922d5c740bc72ea3925ce8bda39d84a2b6d815ea8c763ee09c9d44a78eaf594eebad2e7793443a6488acadcc5187508aa86473fc423a4b7f7e8c5c3d2e792d6641e2a7013df64ccd64fbb2b0a98f84b15109e1bdd96b2adcb47908bb3247353a645e5242ba44f1cffb3946d93f9f22bd461638ce5f845de81140bd6d459bbd629537ee1be832c0a253a2456dda3741ad81016e91e78ffecff7fa8769610f32447d6b8db3a30bc914db1a6b222e376501033f436f38a80a244b6694e35f36c1258a025737576edfd69c1785633f1adf281d3a0ef630835225dad42c5f960703912f53d094167cab42bd13cd2de4f101a96b047a39eaf0c9b35c40e633c433808c0806491af8eabc06d194075a3ab4268e55357d3fe2289f8f12e3bc8133bc8eff180927bd9cb28b5937773e1d54a9957af569f51d3c0dc6b124b360f30168471ada87428aa404822ad7f26373dc61eb6979fcab1af3acbb31d822ca5837e3266f581a2ce2d180a71089506b48a8b0b4e415d000215e4e15476421aa16e3c019dbaf718faacb9580c3ed5dcf98a80cef322d6d9488f3b4b83a94053292ad3ad1d40a0968c1cd152093f68e64ff7f7901e4d9a1e183c42ad3ba3ad8d652884c8ecedab1d341a3bf315b858328820a0d0d1cc42734b1be3b485e9ebebf9c973388730d4e917d3d712a9ffbc2695c13833f2151c94b9fd8004400a8587b3999bc9851a26bb0c4932a8ddc71e52e92eb482a6bc570003352c8a44d7257a78f04bc3afb80af9b2f3b168d72cd45bfecb0783ee1ae50162803d145f80c96451d85a6c48fd7362e7629a2f","title":"455. 分发饼干","link":"https://leetcode-cn.com/problems/assign-cookies/","question_id":455,"issue_number":68},"66":{"day":66,"pres":null,"tags":["贪心"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。\n\n注意:\n\n可以认为区间的终点总是大于它的起点。\n区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。\n示例 1:\n\n输入: [ [1,2], [2,3], [3,4], [1,3] ]\n\n输出: 1\n\n解释: 移除 [1,3] 后,剩下的区间没有重叠。\n示例 2:\n\n输入: [ [1,2], [1,2], [1,2] ]\n\n输出: 2\n\n解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。\n示例 3:\n\n输入: [ [1,2], [2,3] ]\n\n输出: 0\n\n解释: 你不需要移除任何区间,因为它们已经是无重叠的了。\n\n```","content":"09613515ccd44c9cde7bfef88e5ec8bca03ba94db3a9af1fcccdf929652401171efd987226f39a5624643ce83ca1e9d44ce7862078aff81138c020a7473e72fd1954006d8fc0d1e0536c8da98c98497c38e078cb97af429d3bb46adef5acae815c2fdc466fba95632627026da6d0d8ad77d843643244e7c56cf1b38760a670ca35108228584c405672a55d954fe83c58c4c2c12d1e74093397c14307cceaaa20130b254614f88e7263074b9f08174c4c4cf1ed91053976258f58977a3890167512a31aa56b01814cafe9436fe759752da17385551659a7e4747ae688045517b6d4f7dd5dc8ca32a2a76e1f82e6fcd291134a34c4e3a964034459a66c562f41d6f00dcc98e8db79c90d711464c6323d599b829f6fa30bfe1b9d949c2eebe57cfa0f2daeda5dc086fd449e7e151bf925479ec53427583e90222fd12f5813ce5efd6e44e3fc21600b7635418b1c4d6a00d3d6a09ac6c8b0b0128d648fbf6a5365cc80d0f77a83be78f15c5267035644be951293a008c7150956597be73291e4de0924e822140a4fbba56d34a17843b37935d7503d9ec28b11e0b62c6bca3300510594b64d6d4433ba13d7d31215a5d8d36eefa3e8df47dfb5576d614bddd0e14ce28e5afdfcad428c2f1ca6600845393e065b935fc8d0dfaf8192688ff37a68539319ff107304f38c0aedc9f2017f1278cfa8e3e316d95665e2c147996d5f7ac7521398806656a3aa128a4ecd2b758ae87a6d989e92ec520dce2a4fd9bce7d8c09c4ef09bfad4e8bfb8345062cda4dce52b5f2d433e54f030cad215731d2fab6618217b3459f8df94ba6002bdc9f177c32c6c821cfd0c9b309f530b9be02e7bd6962163b7d7717e666f61233cd9687e82886102046d7f5052d43607d31317e6b0c1a8a24ea28a7db6b929e01764d35ffeee11b5a8e663bc62338324cafd7eddd7810dd13c77c2720802e8dee8b2604f6862ee3b7ea45b94c0e4d316d5bcca806d87d308558e99dd155aa9d45559eefc224312a99cfc8c2dcdb52249d9ea3645bf7017e341b2d2e1816f99532667491f1ade38312025e13b0132134e7659ede16aab4919359ed113a269a928d2ae5d802632413c0123807ee92cd78a8fa16611a82574b21774762ee57bc50ab376ad0cd83b3d8792ab2f5535c7d3feb79c09063f2c7827a2dd895137952143669eea58980b9cf382f9851428f54e99fe0bf37bfc4c4680fdf0e3e3efa35c9d6576c3ae50dafc832e8f0da5996cc952e94ad74462d910e6a044841374f8bc0db982d332271af2bbc0d2761b3ce1b1c3efbac1d5f0d7e576fee9240ed025fd1f73ca9f6bf8a98222ca7942be9cdef0f914e8959e27ad37f0a902ed5f8f5d401ff8a4402b3a6181b3c70210c21057121fd1fa3708b16db4541a16d7a4a2dd8f8e57d9132db906c97cbfd6d50a4a4986fe48167378d7a2332290a43674fdbbd06865ba1daf39e333457003fa1d6a94f4059139e6ea4b520bdbc8d8e6783eeee4139e37b1603b3156ffd3cbcd9ffdf813955f293c0eaae8639b62791dada70fb14c0ba8af8c2dd25a75182ef62f2861e46f04c8c7f315dab4ddf036b79e355f1a0be6855bf4274dfe8ec42ddd02358565004070fef7973bd90e1a1c3244f5fdbbc01cd0acde19574e8d67bb7da8cbf6b9661888244aa3375f53021a0f29d3cc3de09cd1662d6276a08c06c4e21642325a2e99c89127c3b3197f859e028a3b2f6c788bac3fc0672ef17bf278bbcb0d1eab6b956dfe10fead9e591ab93138b6e58cf8d6d74a0afa1d9245dcd8fc9043bcd9108fe3f807cb771a39b9ed303cc8cd3741b579466f9face34177601648ceadd6ac500d5220285f2a3b6f964d699919f7323ea9963e82e40f5371184b8dc2fd737cb2acb5af60bc53ab27043991dca08edae48665697a813ee164fd5c9061985f25e7efec9bfdf84108b9412e6c0110e1f9f715bbbc1951ce4aa62c42d50361e031a088b87c4bc347719bc1ea075655db330eb8870bad923e6dbbb1ded4fe1948abe316d36ae744b55c710ef0a488bf7ad55f86848d7bd8ee815d8be776830afbc207e8db2d3e7ce5f00d0e46b250f3cb3e08bc3f9b10e00a5e2a816356b87f8bbeb785226055aacdefd2fe2e12044190f1100f970bb7e494800f3d5e0a8767484267cb21cc5c04ffc5fe68450bfa72f553d46f0c73e2039b270ecfa7150fd3ae6bed0b13953ae9d9bfbc8a550f75ff759371f78d294b63f12f5842182d377d1b6c8c23ddb58936c87fd332924ac1d53c13e2ca8f246358c8ba647b1bd2187768aca564818c3ee7abb999019918ae8546c4c409aec23fcdeef9973ffaed9ab78a8d3e57842e47faee5474cbfd25ae48a6b4c9aaa4ee2cdf6274bb595818568a6eb37ba6c9d25adb588c2cf014adce548aefef797c0f9f13a00f272f22b514966d47b0a0e840da28ce93adf752fce9276ca2e9224d6c4cd701b94a4e91c0fcc59d6b883651d1cc59a683cc1bcf6667e6d8d5b9783f68d457a3b96a1216ba98854567ebb0d019a94fe7566b6b63dc8c68c52891a128309ae934ec702523c9918634c38a63c2adbe56f69d3b6b14c7a5ab0ba6daedb4848d855c53c4f6704be7286210a0268741e379139630118ba94c960d1ad99dafc24b1a083af5e22c7f24f2317463bb031ad3dc41f47aaec35b2cf7e7a83abec53cec58f8f1e9cccad2aaf50ec23855598c6db7145672413454a72d7c707c393acf8b5767760321a662c7bad932ac9c02d8b29e624179ad5c69eefb9c354168c20818da85ad0578e9b88d3bf1bf58eeda94f7f99bb84b056b74b131d0fd650f3fc9b9b0ed87a2bc17c53e4b91b74116345bdb44d88e75117032125004bdcdef7f0c8beaa60e1bb9298327a2e674f3fecdb925475e2378c523218d28aa31c04bb116d94aafe9b9facd2e307f296a8812894274e25c02a6e6c9a622c0550bdb718c88bc06c73acbf464475269e3c7a00a78c1baac1d9964556b7a7e61c4bb4e0299d763245e123ad48747d77e8fe21c3a4a35ded941bdd01a2d5099870e25c85791689345ab657ea5b4b02365715f580215238c0bfdc6f6a96e2fd33082d066e609cd9705a6fd16c1fe52803806c4cfdf648a8bdd8870204ad806f20a9cf434c839d12ab7a364c2f7bb60303830391041166551c7b8985e8101417330eb40ce60570ea57a6039ba9c5bafefd8ef4cf09f4ba5951a4e6b32d16cc35c2e8c48961f557c7eaa292886785647f374d7a17cc05afbe6d2e291fbf593288083d9f09525e47c05b1aafbc1a45bda42165a40751f8c953d4662ffda4ec4ca4aac5850339807678093cfa4db348658ac1e19b3dd0de42057534d9642630670228bdc8666cebc2819675f201120dc7ba4c437a3e57d015cb22b45e65ea08a9e747e44247e7ca89537a78953ba795a0532986cdb997c742b14bc617cb19cdf899787672a8803be38c6d09fe6c2a0cdc15a0bb7264ac6b13b9df20362cb1ab75a1a244f9bc0344d7a51f247a5cb22b68789eccb5b61a2749d270cc7aa3c1523781d4127834a6c250a2e071a363855c2c43251f4f741dfeea27723b42e4f4d051ddef60c38d5b403b2ca74b5ad4e6bd9f168c5d35d4b703652dea9881b4fa87a9dfdc246778f18b6312cd9dc676e137c175901377e691db5283739072a0a5759002e6bd25728a03afa8dfc618fd888b72042cb73b89a69cdab98d9cf6686e9a2675e616fe99fbd7e68d228b900728f849338b7808109db57f3290e99021096aa5d3638a47849d958114fd0d53843dc705f7a29c137bb3674c0750f11804e10ca86a5dfb8a7fac0fd1acd5ae70c503b72ce26ff60c82f163c6f4f85a9af634499aa053f6f70e744c11211ae2c2619a4ab44f5e89ddeb4d6bdd4ea27e4094a51a1210fbdce2d4ebca7c9b98f98cafe44d2291a07cc4720b59fd3f5a7c2bfff9123525d3db84645673533c8e0631ced9682c950e90ced3a70cf3adf7329c4063af4867c73e5898ef220ea6cc4de07dddf201563200d8e8af51fc4463d1c3092e736fd0797616ec63b879cca8f7560b6735de8714eae8ad72bb7976174855d9c8dc6ec66ebd2c1987bd1e3680819e348e065b939b56c616b978cf3a9015e82b344fc50c9e5d0dd9894f5916c3e487e717948c49eecd378aa8a1b4af856cda3fe4176a45444d152a5159be129f8134197ccb5b892accf1e603166cc3c3dec00c706fe4672a36d71c5f201dcf1756c6b773b4b1523c08cc8b1c49f3953699503aff2d29b9f723f18303fee49be1a67942d8515f22660faf69df47e9101898eb6c686d2fe71a6ce4a7e0410229f430181acba085465e7b4ed1dc522a4f31599349d5c8a560ac1036d0e280fc135a6b881ee89a3b7b7e11d21f44127571d5d5c5d1e4ed7efac02891eef777d689b73ab97323826e2b60ad3d3a735d499c5a3baccaed995d765042d491ecd8f0a0ead59c49f3f29b55803bde6761250aaaff599687c371c1cf4edbaab407462dee0087a98b7110612af0e4f76bec13b58ef82ce26df2c40332cfe5d678f3846505c1728b04bbb7dd907b8328268b7ab809dfdbfa02abaf4923aea1c3a43b47e7e0aa7aac9fa56834cfc76287e04d28839551b4f28bc9cb330caf6f339e0159fb49f554b145777f4f23c528a453d308026bfc85111c6c280c7239fee1e84b74fd1f5457b83951662c13fbde836b7568efebcf3d33112266897a67889e45c618dc20be635c14d2e0b0c77ec8fa14f78ddf598442eb81b8af0bf9d72d8903f8521c554ed6c94b201db0e669cae76ecd0682dde2587014db72febc1544591f4fc76a7aaa45584db5369147d10ad5d4f8d60f14ae926a58f2985f7dbd89b33c762767867d7b4f6716ba8978d660cda43c62823367d4606cfd04e6445a2c177103a1437d78513e4acfc33b585c2ec86d47afdf3209f2b58dbe473591b7b7455027b5696777b173fbfb8643be1465fcb268cc3f991813105a79a489796537b1fcedbdf7574178f15398cdb633ad155123b4e286f151e492a90cb2ab2c2751b8e4140c391968295b2679387661b6f2a830c0215e01787aed2fb53975cda6576cf36b7e276af85e90fada99e4b33552ed674183d497d6d035bea7844a430845d2e1258e181949b5a1227663fd472654ad0d212e79f20c6ee344ee67426044530362e032d0398e8d011f516972047d82de4c57a82dad7dcbfc94652a189d49050182c9efdeee2262e958f2752b3180e10c8d208b226ea1b119ab3c939f20a6b2dd10782847dea0ecf867737e8a0cda7a6d9b1153a0fe30689dbd2aa18502f9ded413fc423b8b5d5ecdf86bcf597d8466765369057c94d71ed12f8df092ba49dfa531dd7ef82a0a7c8744901daa9c25fe1239497619cd464350469fcf1bc679b262dd6ef81078c1295c35a35882c01c188b7112e5ca3efb9802039d5ed7d1eb53446a54cea5e377fb8580eef9d71e9dc224e1b92887915c7763d1de701a7988ac672aa428a5435c16ee4ddf169c2d7c608e0b480ea2111a07fe580a558687c22141a4ba6c2ecae9c5881221260aab6ea75f5a3c2f66a33e914f9301f8799a11d4fadabb9b216ca23d61d753243fc906d49c33c23672b56adf4cfbe0470d2d867a5a75d0fbe676063e9816cd587682a750754ce490c9378a12a75e18111d74db173d31496949f24560e384c7e19c73ee3fc6232fe440267f91e6a6e308551f8c3da99e5a2299de312d963ead018772ba68eef8f7551156111cd1aafc78a014902466c4f1beb855333d1db5ee4c0f308693f9a5f5a3eaaf57a9ba49c035e47a039944e8447b4b0543dd4fecab58ac036021130448c862030791be90fbafaec6b70f840067e1b885fd195c03a17f593dab4da3d604634957db6346f9d4bf9ccbcb1510003249bc5a58798e7ae824252fd3687b621b89605c8a09f74c8ccbe9955c895664e7509898bbedccb81c0e8c5e05a13f7775e67f5c0ac4670a142a2e5c98d105e345840aa0e8314050ac901a8b1cb54ceee83b90c8c06a203ca844680af5af2571d9499bced3504fc39b96dc1e25abfe80cb65ab25047881eb4e886e6999e515765f65963974b9262cd521610e64a3856afca0dd66f1307a4eeba7c1f5c240856df33b76f487ce75dc973ae61c0e6d5b46b405c4018f762d75c11cf6fc6a36a6bac3a0ba8858b3feea5bb71cfcd980bab8e5fa0687d85718af78c54af97349fa03c0f510a27f4f5363ec33fcb785f06b5a36f237bf99ba436171f7ff62e255c86cd7cbdf2c880e415ef966025a749c832c35fd842d04dddcd64b4ba145769104bf9a857a1980885e32fc04fee040de2894fdb4b6a638f5b9a03ee0c573f953548f767495468084f4230e4743c76e0c4e282cb74ea0405fa54cd3337297fe430605d278a1bdda40e5f3620450994de157542ab71187d90b32df3739a7b1c491cc844461939afca5b3c6f70f1b2f1d52cbdec3c63f8578a4faaf64d","title":"435. 无重叠区间","link":"https://leetcode-cn.com/problems/non-overlapping-intervals/","question_id":435,"issue_number":69},"67":{"day":67,"pres":["贪心"],"tags":["贪心"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个非负整数数组,你最初位于数组的第一个位置。\n\n数组中的每个元素代表你在该位置可以跳跃的最大长度。\n\n判断你是否能够到达最后一个位置。\n\n示例 1:\n\n输入: [2,3,1,1,4]\n输出: true\n解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。\n示例 2:\n\n输入: [3,2,1,0,4]\n输出: false\n解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。\n\n```","content":"096221cf5b628be1e73e8bcfe626c73470823d84ccaa16fd586d3f787f5a6e0399120eaab71a6acaa2c327b76ceabd51b4230a8a962459d2b221b53ea2e5ff2df533792a91c1cce34424c3a88cd2371574a73d037164857edd3ed52860577de733738149e44777abc0dc8e8268563259fb3a9ea0cc9e771893624267fc35f628a9aa4455720c26701ee65bf710fc6af5431b5ba7137f2031b2c6432cf3e78b301913114835df8e6c620165abcf63730135c58ace12580f0bf025883d738b4e0d36171b815603974caec0546bff6b742db47c875af9c10820cf28aea86a1a292031667151c4ed32b89981a833226688ef160a6bed634be6a2467985687b24ae6e73cb889e9598458245487e03d66bb7d11e5f6c82ff33834793e1c41a8d8955b45d1cd58258bae7d214c04f4145e57c21b6a87903f4b75888c36e8c9d72f122a7780ebffd481d042184cf0ce6a9874bc4abfdb4b894a2d44bb829d79d333a70726dace623ff8319856c103c15342bafff7e9be371c27e48631e38e778e0e1936123a1503c453d90e61509c92f71fb090a913309d496b046b5be4a05f9535b5460fda803136568e53b95881f7e285fd369eba6fef0a968f3025d282ac24c03c5bae45186a2801aca3546f8466d2c13597557f421f49d809aebf76cc790410cc1361bff0d7300f6ab045f14628f7f195ccdafff3ab6006eac5d579f22e85315ab74c97b33664395b069cc108b135f85d55d6ca1ad4f593862c47610cfcb8af7b8c165b0f6d59abd8c05eacc0884bcb5bf151a7051530ee66f93c6a7aaba47c659507c4596b7a2f6c9e370a9acd4eb9a4d723781779d2f2cf47ffdb41741fb9b54964b7173539f727514b4a2ad61ccee3107f3d7c5cdc7cad6d83014d22c07382d7d451508e6a9163bd4b77a147de374c7780be49322ee72a753b690051ac1146c04d84587bc6cabe766eca49a813cc7e9e213dee446dc99e8e7d911dd8c0dc240c3852dcf5a2359f912a0a80c50af7ba2feb249496c2495692591c64b3fdfcb7a97b32bcb55d28fab82eb69513f43429d50e9bba829fb1e001a3c90eb30b7fc2dd053757583b651bd27d83b85fe4ee7770dde828aa954bb66ea7a0f84a055d4c70510ee27360817a011cf5bcc7dd75ac1504481d4c4210d5fef80968b28083e052d5622665633bf85d77b6d0efcf2cc5bd03ea2b9b5d7290edf3688f2dd27d646fbe28fdcc6eecbd39376804f949fa3168cf8031e8cca38dc0ddd3a8f6e5da6e9781ed9a4449a3b9a6e270181a9de1032f9482fc8f7441b1de75f5675bac2c1fce6cb994378e095b943f85822f235889a8bde49d0103d87eb81ff9770d71273fa63b8462fc468fd8f635b1edd8bae9abba4e6a8895c0aa9adeed4b441fc113ab15f8bbaa8bb12ee8098cea23b63a4eb1589c475aad5f1114772b2f377379dcb7c6eac9d91893f7aeb9c3cfa2cd71ced67e14c27626184380f28994c8a55a1d82e342ab55167e64b03e2f33d5285f91f237c33c5b3baf2d59bf265e55561630fe08571da324549d2ab5ada6c66dba6e849d212090f67ac225d03d9376ee78f811288e0ee894a8dfc7a7b6261cfe305d05432dc260b77d55f558a39516e2fabf5c544ecaaceac5919fb99e7ec965b5509839b9337ddd900bb6b21f151723f742ba567004766472c55adfb759f90ba0d380525a9e76bfd4fc3da999ef846406ec643798d7dbb9e0a8d2421716b8ba326ce6c11fe56c5b719986a282968866c3b845cae8444dee5297fdaf0fd606e10351db5759006adf7aee0534061b056d8ded00dfbdccf2f29bcf80d6cff9b3bd5fcd46c2a986e113d2610a9a69cce444428134f2116f162ae5d65b12e704f0b324180ecbd222f2c0d02c3cb9b2c7725afa49061b66ea907013b89ceada1eee7a44bacc7f66bea0cb95ec43ea92e78f09985a899877652c66191baa945b9c8ad48afdf5244aa158c6c09e3633edd77fd9ec81f4da6357ccab2eeb7810ef158853f863da69d3163b985cbd7c8044a97e515c875e678845d4419f38fba3909ec3ad080cb26feb3dc68dabc79e851ccb860f8a1c35d0bc71c0e1658be45f5c8241fbd17b613c2245c22a3634da6f9f4aac1f0140d19b89eb3c13b2f1b3f4997f91c1f9e0bbdf3523580e8866fee6c07e7e2c13cd0b2b6bcabcf313023337fe367d46a00cb42fcc5799d3c1fd2a0382197149aca17be1c3077465edf9ccb2dfc1aa25717faecaf7dd388c9fcecb7ebcbe56ffb1b4f5caa009645a668ca28377d50692455efbca14b4380eba0009bc40bdfbc1edda772a393e1c82ce44180f30ddbb164a4a960c3916c2435fbfc9baa8b8e1c5e841371fbcc5c77faff238f66a48aeaa6a8c02de9457fbc63581947894ab577a1ced25ada52910c1c862109ccca8cfc2c0121ea74bb796f3048c33b0583d21da1c17dd733da9983f751d7ec2762bdea0b676d7df002a8614ca3d9f3dca46a962252daf95298bf0b65f30a12fb9f96841b4c4eab07bcfc3308b3540003821fdbf5bf29cedd429ec32325e8c024ff48ed856b59a261f233a1b6ef2d1d48d1547af964161b509619c4a3dc2f5739ff495d4b01695d60ce8a1273a29e7edcd0b66ddc07d67996c979b5f36f89495fa792d99da56a84e29feb2924cfbeb715eef9a041b9fd7757be02e0236c9eb03b7d72d72e07e32abb357b233747046b6b8460385059f0e963b6d38db39b8e73b8d0f7b5c8fb4764aae99ccae93bbb555513fd0471e0781715bcbdbe4284f9715d54a4f6ae63b5dd8889ff5c509fd29b6fadbf0db9f1f8acc0ced366653776de6ffa93f2a7f8735b3903276345cd589eb05428ffc3a2eb57de6b4b93f3f4d692d5c34b4e2191d42b0168b7be7dea03ee1f64bd0d360433d0c29e8ea175c6ef37de29dd1ad663ba58bf727e664f0b99b0bb7457ff4faa2a10e72c71aa85af8962b276509e60d9c29a62bb379fa352240b758ba6ac4c25f6e8dc07c01c6d0e397737abbee2225c67cdedaed1a56e3e82269f1e2db9b1bcfb1f2080fa89a4d6819386cbc5699e61ab0cf61488e5162f27b6a3c69bd4e1d47bc8c32f3c6628dcf45cca1f03962be52af368f3ce6bc4b617cf4208c5ea9074c4e8a7a238251cf219b958d2cf579e6d9f23ecef47ab913293cffff7e7988eece3823392e979d19d8187be13d422f1f5c91f9ce9ce7955a44e69341bc6270cd4595289bb9deb34b85ef5bc439a6f97bdf5b87c87ee3ad893f75d7485ad66c108fbfb5b0d786e4c56a47a7f18452ec762ddc010103f5904d60c9cde8cd1a0a810569de448f2da874634c245dedde561c196124b524c01eb3fd53f90d61941c4449292d1f35985e5ced08e4d6409a36133ec82e2d1dd81ae4f996203b1665efdc7d136eded579a3b0659ceda81debfee4b4abf1a4ed66dbcd798b95dc65b5de4deec9915a4d32602552bbdad642988c725bb01503ec3e7e04522979a0af6c32f72ae2121899e308a66b590a6ef5f5d998aa39a9e47e09963e5c2e6ba8e092de36db261139ce524597e224e3862cf0c60254360535f646e148e972851cafb46dec7803e24b20043187b60a3ff0c35cbb44afc9e6e9ff0646bd9f168c5d3134b6d361e9be88f52c567910a3630cf8d2bf62b9ceb4452afcd8efdc6ca888dc7b2a105faa8d785c4fbc18aadf9dc5c7d28a03afa8dfc25dfd895b75b18b66eb2d766bfa3d3d5cf2f8da7f76b4349268996b77e68d228b900728f84875ce3c5d35f9a1ba0270f930411ccaf182425f62404d5114154bbcf3802a73d082e18c177fb765eea1f4e47870121858be08cdc8de8c1f317c904ea635d7f7ad321ba41d1220f3b2f09d183f4494499aa056f3a32ab0d82541cb363205cacab44e4e89df3a493a4dcae69a17e375cfe7842e3d6240fbca7c9b98f98cafe449b674e07825a6ee09bc6fba2c9a5fd973d083b6ec30f381c254ec8b73048a493cb9c19954da1690b8547a46212917e32bdc82873ac949ee969f622df970cd6d60a1563645df5c3881f826c705d689aa366864eea6d6e8222badefe913569fc5077e8714eae8ad72bb7976174855d9c8d94a932be80cdca78d1e43b4e020efc71a1239773d4eead3b253451ac9b1e13817bfb0f5246142f003c30de33714c7e547f0d36b9ae44ccc22f219341a9fce30e1bb33f3df1f6a5159be129f81341979ef0ecc7b7c716652f76827c6dbd53a956f76c32e32d5beff80b1975d8aad6d5ac94c7b33a640e5b26c076626998036945445228e6fa9c9df90ec17b80e15bb13f119d2e2efa8892e97751b02a4becfcd9b2e421fee72025377a44980d598ed104c39a974e78588b019b00ff1cbe369f718a7c09c2006dc888b209a22992e0260b1a1357069cad01c8e0e790edf5d08da0452552b154e923f3f4af21d76310b1feb50a53967f1602a3122c6d36513f330d7a11a1b0f6fe964522badd00fd01378db22491ec783bf598d8f0dccdb85432e085c07e067075f1dbe52a287829c637cac2fd73e10e2eed05d2bb667f3c659a629287b23bf5f70fe5ad99abefa160ba3098799353d907c415cfffd3ada6a082682401c10278447efd3e234d8dabcaf449ca668f39642b509bc7774d334dee1c213fe203330fd06aca61fef2110d7d247fa7b77014863a116bd84aeb9b15408f8cd4ba2a9fe300fbb244cbef727bcfd0586a8f6af0ff3f8056f58396f3d331126027c5a677c6ff1232d38300a13987320354687afd86bb6578ddf598442eb8528aedbfdf72cdd5039c6edf1da2299efc54974b20c8a632e0d02d24f42587014db77dae950117dff4d371ebb0e163849716271c3919b7774f8d608e07a87ea59229c8b683d0e47ec2413305299ff9e02022d597866645d369c6282336380a4f89d0002b11a185b3c7c3ddce2e409d206878a4707e5c003059bf527ce623829d746bb5ee9bb4e8bdc8a7a0009d8597ad7e76f49f27f1c90e8635051e4413c9d92d06be175dc6f8aa4f1c7dec5e53ca5339c9892269943a447e55222e3a3a4626d58761f3f16a56930401858c8ce1dbe622c1d127573c3083604b46b46cebb5c4fb7d8c5c8e6c59937390fc76e6cbbd1587a9cc0e67007c987429701525215808e24e46b53bd6066f4f21a8ebd4b170182d19fa5096e5f73c17957c5a987a28d8bbcd2b7e606f2d1ce8b4bbca2f7c1595199e79829f42ba0159c086b5dfb2b6cd2511f50b0f5cd8e3eb552a0c76cf841b50f88063e3473d848201f716c09fee0d0b4e853785f2eb5c834438866bc72f13859c6033756869303bdfb68b39e609142303f68d815b5cc0f930a9764f52083d492a1c112ffa84d8a89c70f94f50f513faf9081ba29dfb66d0616e6d1619c94e6b0bcd9fc160d820ad8f6388e56d3a0ba8164e3abc5ba4cc502f308f445b8390240cda4134abf4aeb38783607446756013dd6af6a25799c662d79f322409e6719e8d01ba004699f2dd5779e8d918f3a8f16de9301d4a2cae2ff99388bb5cb3554179b629461bef61753ae0030b691bc3c8dc58003716416774cc5f6e7c7ae811d6f1326cfceb36b0a1a4440f71e250b21753d6b3df757acd304863b322f35786a594f2ffb26445c11d22541c56b9ddcaa80970f5d36481935f29b8665271ed9b63d6a34e2b6c0057ce7a0fb05d1bac8a7346f44cc807b922e6144150a298c3f38ba4d524d387a95c1ca2030176ec063c38329610ffc7d689bff973dcf504c721e8874d3c2ca5c6abe4","title":"55. 跳跃游戏","link":"https://leetcode-cn.com/problems/jump-game/","question_id":55,"issue_number":70},"68":{"day":68,"pres":["二叉搜索树","分治"],"tags":["分治"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?\n\n示例:\n\n输入: 3\n输出: 5\n解释:\n给定 n = 3, 一共有 5 种不同结构的二叉搜索树:\n\n 1 3 3 2 1\n \\ / / / \\ \\\n 3 2 1 1 3 2\n / / \\ \\\n 2 1 2 3\n\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d84c0a729f060673f505b5b522e56b895245bc1fc25180a945be00f4bd74bcf881c76aece1138c41ca862317adb14b89fb51d390f74d2d0445b6df7373c74a4fb467326c1405ed3688e624b4a0b8bf9a56322f6dba7d3ef82a56cbba2f03e529ce4bc871aaa14a4f1cbfa2be2278d9d47516d0c345614fe452a9e52adb6767e0a9d7a273952ccf82878c78bf32b6674270d68e6fa27796dc117408b8c96da744159f3d8faf374d068b1fc70c5bdde589f3498944288261ca6fe48b1fefc68ee4ffe91a245629db7235ce8d6e549536625cb1522a4281081813321afc3ed4f747fade6ce233d12cb22efb6cdaeaaeb728492979b66ac477f5b0dfc6f5b4ece1f6267a404fc13bf9f9b07cfcddc3e9aaf65a84c4bc3e7449e601929f22b44b4cb2d3b9edb75cfbf76e8c276894993137a99941a2a5266aead77f5c8c47d8dffd4d3fba1e78c693fc48d976a5e4cf35d40797ba6ab78e47187fbbcba25bee37fa4f3ae67c8a53f197fb55c827a31622598500e77f55163cc9477e4ecb15405db520397e28ed568292e45ee330545058880434163319e05d4f11b1898d9d36ec6a6f8c1aa61f1026516f558e0cb662730d53967288a02abd83ee9cde9a3f7b1dc54e56c1744075430f14953e1aefa36dc7b97b7e25d49844e0e48a5b887ef080a7a2fb67b7ca04e5b812e855f01d65e01e5fc89e40faa699851de56754d52cca506075559efca75b28b430e34787c5af375537d522a1f17d1ccce09397523b9deebff98934ba80e48a7bac6826ec998e2db96733f5b0e7efea9bdd8eb21c3e4f231cb58898130e442708aec3c06da965a71a9c40c726614722f28a4647ef9996d11796d1150525ce8f43c9e8effb0152b2541b88773ae96fb6f76c9629b47ae8b627c45d907d24af41e87a752a95405c98c3f16be44568458145c2663786561fd0a9d29fb51a6dc8f7fd03a2709f78be83d9d120cdd3292f0de0e39f16008351217004756fa639f735bd6f88edb08cf9b429750535a0aca7be798a226209e16a494c571ce7d510a7cc3c852ecc8ae172c5f1afabb2739ad106b92a81fef05b84c47d4b73bca54684025483ff912a11178bd3399e642bf6e997b8b26f33e9d650be9c0a347350280aafad12b514511602324040801e0dbfd023834b4a8f83cb91e30544e19aa84571fa1379717bf1bc8aafdf386abf375f75c42d3f0cd8162d7c0a5f12046fc822d51ee2df6398c2ce76ea7bb1afa2d14a4a152e28295580847839a9f8b727841c9c59ee2f98ad9a788f137a0d86b50d745863017bbb7139b9fcb49d2133d9cd08cd8a471ef2971cf4bb27208c576c549bce71dc7966a63f4c1ebeeef444bf892b4a69218b1355ee97bf7d286df4ffa3a3148c64c5f394cbac0a576ffb3e86c196ae4935063e3f6d4c3435656c33118ac816a8b04bd6bd106a87a5b1d68c65d3d9c9846865180f423353cb64d4be74b192a1db8518fdadafdf43efe9fb9f6f698f46be879636f22d78853db3e487cdf846edb5e43d0a7e948dd1d0b2b43aa1a4c03f90664d4ac812eacece99848a7c97e635067c7e705cd7b31fa39067de95e658f3159532290d3c766cd6c5228531cc19bd7e9528e8c817f6a13f67dd73e95a3939d05678e7a1d8d642e6767721256bafb7db8a8b43d240a0796e75dc5885c7a573303d69dac7bb28b8df63fff55be4c737f00c0b26d937eba27c191c815ce1a2a6e0da316a73a9ac3872c45ae7562aba9f3de7d01330e9d9b2249cedbfeb57f3a1f953c7d60da2ac13068a6e1e4f57b0be4e27df59bab7a665bf0cfeb86d20804246b1b3b327e3d0b752a0e10daa0e825814c01254d9feab10e312f2e2cc6e7b82f6722aca2876bba53aa301738a7e8afb6e1e7a461adf0c464f833b64bf032b50272f18686a9858b4e43c54ca9b78079b5cdb64b8dd05d589118965ae454c73cc66cfc98d3165ea5347dfcb2cf9e8a0ad7578c2387088c92276ebbbfc8dbde174888d716d559e75a895f481bf6948c3909f135eda0ca29f2b0d66dd89a68e175ef71a09af8c13d78c4776a272dd47eb5901555cf2cc96fd5aef9758104fb1e3f858787840b609d5e5aecffea2f16208e455dd8aa10cee3edd8fe35690936efff0beaeec605da98fe7ac6ee654a13c7b739ed1cf5eab68e2c1beb78ff2fd0afb9c072985404d05de1b8e5b5cb0f2317a373c727e9028de3268a3adce8b36f48404e32937faabeda42cc178e11f92ff2bc9996e4c3a4cad1ed0ec361246bc3610b64d4dc41c9d11490ec8bc06eb771e5b93b8ecf42f3d75ea2d4475b7df28afda2f6fb0afa0fbe1080ff1e15c09870bf0fd3a2a8c6b19275f5caf52722053d1afb66d9099dabb355b50c8269ad08e4a27cc0b5c3201a25e5508377503c48c122ea3370dbdcdf2a890aaaf1a29e38e3bb417607055f561013e648f35e0af8eb92b98101d51c1972279ac19b681af87a6bfbc6daaf7f3351f85ca295691528ba988c4a54f5b2e009ab6fc355797f6fcfb365ff3c9c971f36a3d9d873247b2db9debb579886855e495813b24b5d7e799092d79d2c53186b136e75d0840f1ab39b6fdb83d551d70e9907f5c677ef933ca34655e9fd9f97eb5f99d79fef21779ca3a714eab0f274dea03e57bf46b3047294f9157b2da97b55ad2ae077346c3244456b36b27d324e698ca831b690ccfdf1db3ee8d0eae7cbfa5c75b0a0c2aee933f5001840f404788f2b1744f9f9940fc5a1714054b4ede823e8dd092a2bd7d4725b40b82d1f8c724b126a7e5e05f4dbd9ee75a97a34d88df8731d7651752e5a880783f90770b395b7a54b93031998e3ea8dd5998b05187cd9c52b1b26f0f173ff7ca36b36f801230c759d8ec6c7b45f8fe6378c6c894f847fff4aab6c6323064ec595fbf18a66a0c71f72b12837f59fcdc07cf8124df731d5bcca59db59b8fa01146200bcf9d75c628bc0bd54d07033397e1a00f5ebd8a499dc4d2b6e143bc69246d05282c514344412d3f34a706e579fb4d2de83c124ce2c2ce97acb3e5dd3debb533f6a0d0a3646a9270be5dcfab0692fea1d8ed546e229ce78833d45cb6b9c2cd76b551b6543fd304c4a63aae69b129043ade2cf70dee877c62176f62e4ec6ea91ff43246f1e152b08ed2675d40ee2cecb3fde5ecd6e530cb3686f2187907abd0d744d8877c0199fd65d55e5ddb579872332e3128e55285019e831544a81c7bf123a96e828f678c5cc3f286c690a4aa3333a730371a878f7ea50507f295dcb0a8790ed8ffcf269059d9707be8fd30f3dc30dfc94ab35c1894608005158e1248134df967015cc4db8b8d1f359de8b8b968e033144d73376a9d1eacbdec5a15dd225429b2f10a9ced13bf3ed1ed46f1c73ceda818cfaba1e18b85c08d921a6dc83c0188a1d53b297bfd041e1973c757f2bbdad642988c725bb01506c89bcb5dfcf0a01d8294089b421cec8186bda40b95000362b92ea344d3e14b447e0992aa3c2a8ba92142df23ede695882f86a546f2b151262cf5e257116321d5f7544148e97285198be12d9d09d3e6de0452c035160a3ff0c35cbf205ae9e279fe4006b8bb02682961b5a6136509bec804308e615cfab830a248632b6312cd9dc352b40355a444f6426385bab7c6226362c1a4044087741df5739a93af08daf60939e9bf90e1ec221f7df74efe598d4cf2f8fc3a22610326ff49fac072d9e6eb7563bdccd8e33a7be9d229a06a07518857a449ee1186f25e83956de48051ddfcf6a47f44a623343c11dd84604c0164055831b68e08fe5d6b5f7f8abf011c901f8496d7c77d526f37dd06e014566469f83f92607cde55723263eb35ac10217af65385ca9fe6ea7a9d399b890a0d4a377fd4c0408b06306b0840e5496a7c9b98f98cab702d2214c4e9f0e74f092eebb9385ebe88621464320c359714f6c1a8dba0552d9c3fc8c02bf4da1690b850eea36549f6269f49b7c63fea38ef220ea6cc4de079b9072156b2d13a1c3c11fc446604668d3a37a8600f16d658922f5d6f6c12d60ac6777ac2146e783d721b7d3317ccb5d918d8fec6bebc38ad11490a8680b1924fc71f366c32686a0ad6d6c6745d2de5a68cf06fb1252075a7c1b193fdefbd28c9c93b98ad2602be246079f8f5790476c7bca8a63e6a8293ddc1dd2af7df85d4897c5daecc7fe811e2e316b9a382ffd5cc612f92d61b0641ca1f045197ed8bbdad5eed888cc682a0e0f7495337915d1502011011653f6879c80f942f05180e15bb13f119d2e7cbfdcc8b439956fd4863f46073149e5634aba92e4a9cd45858e373cb46d99af43767a9503bb22fe29b537bc4faa7623e80d6d0e3f24c015bd572f8bd0a7dcd3c8526cd0337c777b24643b43709aafaf45db2ca5e8b060bd7ba6bf373b31e1b036cdd39f11d4bbfca18eeda0e7bb11847f744f53b0af6d4bae3ba1ac4a55aa0a71aeb202263704285f4db9b969036589cd356bb4f9cb147a0174b872854b5eaa64f8e97b810c329788adb653e314177b9b4732d6122c234c686fa229ea59b45a9050f36415d7e3cdb7e8e5aa21b0ef1e8eb297c66491e7f0102f3d3405be831395a190d05d4af38991d4ef063830fc163f08e86bd6663a4db1e2e7a2bb3f2d7010e94d32238460dc98066a48374c7f8f0c2a823c39ba0bc5457683ee0f77cf6af3e567ff13f8c1dfbd92634b2b3bd2e76c85fe5166d3870bb571c60432196e23b8dff25577d2b2d11066ed1084aef09234ca8f30c2369004a63ccff3689807658df271af94682bb669c84342fa6eb89511179ea4e77fe5afe104d7980f32126c57fe261ac86db303a767f7d624d6b29a8ad87b8e4d6d402299b9fa1265e5d3844c261cf852eda78cf188f7415783eebe2d41ecdaa09aec653f8c5f0451e90f72d8aac3912e9ebc64da2b91595cbbde98bfefa2c9a0b509ae8f1b63aee11d21ee49188272c496e9da962b1ae6db5e9ecb42280ffccec760625c86167c9dca6d2dd13a87debe64e9fef9c2d7785ceb6149bdbcdd171cee9dc59f9ab4220464a1949c92a94a8ee327aa786f440aa41a8e39dda451f31047b04f4878bf076c34cbfcc98213dedcf8fec6e6f29d24a9af36cc46ccd4cacc51365321fedaa8ebf75c9bebd52617a14557b75f27e4b37481c982d2afd3b2afe89a0e2c48a572e46de5de5ff5696abf39441f5b3c0693b033652d00bbfeb939056705cbe2434ab6c0599cebd94916bf3bab6595f626074bab34bfc3e879904b06976cfa38fe","title":"96. 不同的二叉搜索树","link":"https://leetcode-cn.com/problems/unique-binary-search-trees/","question_id":96,"issue_number":71},"69":{"day":69,"pres":["链表","归并排序"],"tags":["分治"],"whys":null,"difficulty":"- 中等","description":"```\n\n合并  k  个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。\n\n示例:\n\n输入:\n[\n  1->4->5,\n  1->3->4,\n  2->6\n]\n输出: 1->1->2->3->4->4->5->6\n\n```","content":"096221c37c5f85fac03c87f9e42ff6164f9a3341b49540ac59ceb2e023044c6a2c91e1784c888f097f578c3c92372d8d7aa2cb0010e4c1585ef17ef24a6521cd79dca9e146144934e0a61c520142a4f9cf2bf86e7227de45b060cd413b5c257e87aa0ec1e5685baaf5cb83a6425e144214bc076a7bcc3327f92a6ce119a45a259eb5447f66e3a3f5d8622489169937f4c4f9c22d12780e3185cbae976b213552580b743420a3f77820794bf29477cad5876e8be61758263137f42c3069b94d1d2fd2489401759302ebd12431eece9afd6def5aa0c9e4046f8aab7a4ce2d3f20758257fda1f2af87768e4c07c642b125ac58aa32c0c6ca0afd1ae5afbb3c989213998154f2275d40f80e71849f13c267598b08360a73810a85d1b40a807887d965138fd4a2e856a8500063e4909964254e8961956ebed0d898d1db0f412d352ff6e74e0e3266d0d70dadb659bb7e401e6dda08ed3c59b8e1e946689b352525dcf82c2f57586a878f3585b54005872b09734b4af27d21a35535b78d13d95c2de3f38e23522e7dfd8e74b50fa43f65fe66d804457f4db3dff06030b4243e690f6d4353291d6fa15a0a10246a1cf0f6b02cd4582c87d7ff86dd2cfdac5ba5478a380bbcf3976259413a6c62cf7d3faaee9a5c24af16109510a5826db6313a1eec136df78977237f08e19c0c9f7207f0849222077207fc8e268cfd3a423f99a9c649b9873460d56ca30c6b268dd557588f75260a99f7f73f3cabc0a148aa98952715a27cccdb8c8ac3508fb046b97f1f4ac93d3eb3a1a248302ac628db9b982a869252a4c1959159391c737080e1169e52e5f7cf761d74c319821cae68aa73cc2421c9fe62902a2c0a38edde89200adcd6751ec99b6f1aebfd78b6f3386b4c1b9f584c1c7c2600973aa9df6497da38e2ae7a3ab50f92dca65ab45ad4284e91b9ac6cb69eb9775ca7a0937d9d2f68b60755860c91e7f847594c9f7d70cd3ed151cf90e08f112d98ea470c06322d4f12ab470794baf85b8ca0491e64357dabf021df75e44e110809f93ea1f1dde8cb5f79d15c63f0d05a123fd9cd6f6103392322dec55e69cf26c42d16baf40fe59749501f3eb4e5f0821df46bbad2f021873ab8044e8bd6beee18dd32e9a1bcac17cc35bfa52428ef926460b2c838bd2d30a67463d6c212e3b0b3fe1d8f5343f3f814568897e9c400c4c5ec8973cb73335a22abd34f6aae5ed84bdf7b307f84bf7d3c29a4ddbdaa1fb1365f1bb2b985e9330cf0322cd47a6a029fe3712abb870e0af9c5b184580a1b18a427342e5d89dc8dd80ea988ae606aef05c5cdc7e83283aba853d99a4c04af01a3eafc882fbb473d10c72d949b47a212bc44d47dd2f47ccf3cbb2fee3f1eef16747e79bb8a1b414aa1b963ff7f6e6bade72c3fdc4c8cc625ff08c39cfad65f2b8cc6e2d44eb87406cdff3111198e7cf924f24eef062c860b20ea33dd632785203ff1769b0db088b2ae7ec4f5035e00b66ad1420a4b9101ff2ea765b6d45a3a2f391c3e4937592076f1e69d5df2fc57c16428d43825c84865ffcff2a8a32725251ee41416463806ef3808f3c91eed98449acd47d745066f4c404e34b32fd1e0176ca52639e37645f23b5f8c447ed6c6723dc987553321dc452454983af881e985bb57539617f949ef80827dc3c20021a49463abdb20ea8c7dc01786824ffac7dabef6f120511728ab2fb01a3c32f21fa996ade1445176ffcdf32851607b304f3e575951e79030bdc678b52c4c0f16452e62751d9d1c9a3ddb2da6bb913ce32d788a7a80b5a1dd6565b31a51ebe83d46d4f91845e628be81da5b4d22d708c2548254245b2d0f6da1b2f067d063877213bfc6f2f6e4880205f3012f8e9c6650d447136a4afa1491b11e3fc8b02663ccf1da4d6f8e3fefdd390fa69d8acd52e880cfe14cf7ef22638aa96ebc5acef1157892084f7c661ea7c198e6e6987f647955aac8b548cf41aba6a563894dc46b9b60828330f0dc22fc177884c9c5055cda3375d614519d9826a1b9b3dc634e243d1ac8b1f1ee16317b958c7febb25b2c9cd22b8aacc6f993421924f6b62a1861cf186f2a935e32b46dbda20864c9817a1cbb937b7c60a295c3715405d543415702a6c7b2c0b3c47b8d312089806a0f6948630d3eca7433a6aeeab900758959cbf9ecc31153d8e19c5288b5aabfb0fe6d668cd3c4a8ffb7642e95fcc88dd66d0baf8a62eb94b49b922821689b663254f9996b6cbe5e981a7dbe070eddb9eb1f9248a43e173cc7275367a57132cca91b25847b7f1fc048f99cc06579e00db279b010f10e16b977f118c435ecc3e6d9a291af3dcac0a521e6d761de5b505fbd67512c6a24057a05284261327227017bb0598f277b2b7b7d664f614b3427c05bf71fc74fc71e92241cc7c663db1f0eb2dba6be2bce0a47d8105a9d51d211bb942fd75533e17d2292ca29b696a9897e79952966783c97212762c36e257cfd03764d10b72838d0389ea56165b5088a5e528d66d7afdf4c92a4a4fccd46a7672836ffd67b985bee4265ce510c05947e8a7443e860eaf8ce72d0a4990483ff907510255fc03b8e2d01c4123e452131c7e0e7a78f08e0074f0ca2ed38dce0898428016e8897aa0eb6ee60801ada5d9d3f04799faa5ef25608fdae258a3b3f276d5ba7708eb42ad097f94bd452f22a97b55a225e03b26767b10452828ae7432526da6be1bb6909bb5b8977be8d8a6a48eaf143afeee86c8a533f306180ce6042bd7651717aca5f206c5fa5b4054b4ede72abad50c3b6ccf956c1a12ff240593280a106375053efdc1f3ee75a939618adfbd3d49781f62335d88119eb5452effdcb6ebd874dd8e4d097e3f385f119eccdf590a83d8a42704bb0f9527acfa75c5f82e3b9d83c68ebd36dab465c922dd4f992df94bac6c686d0005d8fae3e5d14c850c871fff0e7098adae9f54bd6b719f46d7ce8347b925abaa622f07778d4511cee34d7c14de41d8e8a3b0cea921611c5c4767c2e2e3577af5e628c31bdaca7046596ab5ed112f50162c625b0c434bdf3aea46f336bd0acf16720d9cfec68cdde6c429dde9627d3e28c2e91fd1181c806bfd61f36affd26bd4b64ac6737fdec0d03484c2ce94617c59df02fd00c8a6288c7f9a2eb3ea23ad8527dbb6ff84a8d4dbb8e6df7d8fb21f93c68d8eaf04d522f1f5c91f838c813508cd25275e07cd770cce0d11c0e9d2f733a346a7b3438f10daeefcb864f8bc689ddda3533ac0bc7c9515b5aa07431f3d4258ed6576430935b648ddc010107c0c56cd07868ac982f5eb6e5680e404e3c1ad4672d03dd694f970958a5d15494148e869c55cde9e774f8a01cac6cad904f4c0c4daa44d6e09c72475a5ccabccd2c6a95194240a9b3517b3809d6fe0a11ed470431dce96c8dfaeb43418fb1a4ec26facc6cadc13c63714b78a82d651e1db701e3322bdf64e2982c725bb01506a84a1b383d74b1e9d7806d1a32486ab4c249e4efe15546a2dd2933a037b4ce047fd992db08eaaa1a40927e379de69528dd2655e6501151862af5c2177022d5304082747daf96715ddc56fd695827723b4062c035b60c3ad49619ee604fcc502d6fe1a0596b52d98f91341621c48dab5801f44ae788ac0ef4377d261b62c2c9f89292d477c1e174f3f2f3d4ef1613e6b19545f05180f3e8469c9ed0f98322d5fea436295ff0f07e620a89528bde3cd98812ac7a7ac7c587b27a191ef1b25dd78b61663989dcc66f1d4f95f9a52e627559a1917cab2162360a67e50d31c4d528ccf280ba732672756b979bb78218c39143bc6010b8ccfaddabff4fcd2bd11cd1cec1d5633269d6fba23976e082a3213cdcdaf2f0dcafe56447f0dfc6ec15417ba2c6455a4b610f4a79fdcbf99a09ce73ae8184a4eb92d549adf245496f58ceddaca84fe09977b5d42b8106fd99fc6a1bd84a7f39021406a7ebe0338506c1d9cad050dd9d1cda602bf108b430b8504eb2c078a2c77bdc27c6ee5c5c7a174b962889b499a8b68157d7a5de4d8a21fd9053f133bcea32a974ef76d15ff70d6d6b7c93132a7723bad254ee78aca2ba78c613d85419cc08fa87deb9b88c13790f3420b1924fc3db058de0ed4f3ad776c6758d5e0576e9a51fb0f0f6c3e2f00707090a886d1fad1ecd59e5215e346079fc9188b093037c18b2edbfa7178c25cdfed29b2135c978eebec8efe9d1e627838982272f84dcd11a32429e36450e4f40b537ed3a3d68ed4d193e668661c743ee8336443d44a3a111729619be1b69df90ec15180e109f46b44cf602eb7cdcfa132e17ccbe2381c484841a82618a0fdd2deae56919d155aaf6e502ba3f59570834ac872d247a20ab3b27500d92a30d3a2f249e203b8db7f4252315841d4c003cdfd20475bdfb3c6ae5038589e55db64c2ddaf45922559ffb7e11e36d87f504df1127f242a53273f527858a4fbada7964766f89224d70237cea34f9f953817fce1a6eecaddb50156f085a33142352b9eb7a51517413edb2bfaf3df63e8033bb205f9fd30006b2cd52c88adb23bf5f718e5a7dfe6f8ae46ef60c829ea159541c81581aa9efebcf3ab6d315bf40e6e4403e93e401cc3acaf91469c0ddc6a64581fd79223067e0132969cf7758cb2fa3aae1f8eaeb7564c116d2cf3e47847c3091a268006bfc85139958cb8f379cb986ccdad55eba02b3efe9c166fdf3fd1e565fe38bac7d3e9f93112266897a63ec6f85c2f818e0ba874c3041c45757ec6a5a14f78ddf598442ebb52c8acec96788b963d826ad437be29d7e67e974b2081e032ac956370bc259a1c4da735eb931111c4a6fb30c9acea0cae9716271c3919b77706cb60bd0fa772ed8f3498f7cac29b61c64d6a5729caf8fa083ffbec9d1b26da43c6282336380a06cfd04c6e5ff6cd7742751461b68850dcf8b57cfbd68b83ca9274b0b672d86e2c8cab1f10482f271940735592614e434af6b10272b2120cb037f1ca81fed56457e99a04d2d8583f52ad8d963131538b1d7dc9ca6d27c56f163b1c2d684539482ad5db3da0c765139e455fc0cebccbdbe622c1d127577179c7605646fa6ce4e881bd02de128e180bc636baae33b29eef5b87fadb07755b6393261178202a6e2a5cb16559f8269347295046adf9d3de317e6e356b87336f03cd865c81857d95aa1b02be21270f09661263467f44dd83bc58e70c972816916f9a9601cf9393c6f1b40615dfe6acc611547fd4ebe7b03f638c8d3b3ba8162f1bdfc75bfb6faf162c86ce8c02e80a07648253eccb6bea569a982b2da6cc89f4a1f2b217714aa645d08ff68c0d6828a1a14d6bba66eae394a08c8f96e792cb6c506f501c8030e5830b926a49c5a9025b44e317ddc5a8eeb602c39cda613d44c84cf82979b50a52e7bbb26dc1bca101d46163dfebab0a8c825410dfc71caa946c0158b3a8d43f0a253a2456dda3741a9f1e45a6056af7fdab29ac6a8155ad420fa9fdd21030bc914db1a6b222a43f5c1060f470eec981a012e70f4e29f32f0056f6647c2009a3a969dc784619f1adf281d3a0ef635f7d6b11e80191be2e29610ab06e016a2799a10bda78c49f0c1d148cb445a2e7a616b135c40e633c433808c0806491e6c8ab9316091808beb51c79ac6655c2d712a3f8f12e3bc8133bc8eff180927bd9cb6dba8f67279fd5418457be7c9f51d3c0dc6b124b360f30168471eebb292fef130122a1554a7e6e9270f9d3dac2f2bd34dabb51801ba592543266f581a2ce2d1858345cc054fa8ac844581d09374216b6c51039dfca26a881a3582071dd520a7fe6bc34dff6d30d084aee6c950ede5bb8a64744dbf7e09f4c6887c68abc811c52a9d6b0df319b697056a3ef5f849ef3de17fc173c49ff864016602451d0a8d49d28bb498c8227ef3c7c1477c2b5c69f250313205c7f7e1f9bbf71b81173911653956e653ae20d5b7d10a91e4af1feb3892e4d0a420e29502c5d409e8b7df2f8f97c1e50d6e8318141552a2f939aadf0891d804a96bdc2548d6d1d3fc213350e028444991bc7520e83047ad9139288413d2912c2ce2ad1289e4667b57f078a4fe375c4e05fd037473c0f797c3b3e36a573e574a809916e0b7330da6d71d056449f7e8788ed6f6a41b6c1eda1cfe257976ab6d98d0bde36dd69a133732774d9aa96e4d627f322c7b21a905768b6eb739e0b85e0f8536e4161d6023118ae2409f902fbf726be164da67ea29723117af7a586e4aa753eb5c32af173c096962e33b6c7ff77026cbff99ea332f195fa4951c37b4f4d4812f76e7b8fe313a801815a9b02e115bb5008e9047f8ef8acb8fc84a01fbc8a58deb82dd155ea0d59bdc64993587f6ccd11d515e10844399b7413f4711e4e275b424c7da167702ab0d5a6d2c23cfb1e4abf5bb1727b7a70b77f2c0873c35493ee01442661500493d71d7708b866142882e63da47e8c31171c0c8a53465532a49f5c6f262095fbfc9965fca3312fb91e875df1be2e365aa611cb5e8c4a4e1af2ab5718b4b23581cb07b7532470564095db1b5846e28aca2683377a1641ef01c8ce846b1f381dd028d575fd23cba9d0957abcf4a2603ea713b45ce947759ec5a86c2a0b769a9d550eaabc94a06eeef1b9d65fc2bb9c6ebb24b1b251e88787eca5a090457ab84e0521f0a4dd030593faeb69af2a28670ac598198509ca832e21e94de1fe90d400f2440c23c3ccd4f3549e402cb23c3029bbde8d9dcffe7617380e9cd9db6c2b1ea07ae5c42ed7fd910cf4ab61a47da576ba172cee629d219ce56fa10fef8c3c815ff355a3c7f5e2bde841df622985b0e9775ffd03f3ac6abec830e302dceb36574ded39e2631e8d8ef36cc6a16988a06384d6ddd9a9fa76d919c93fb3004280540eebb3727c54ab998bd6b3a418a28bb2f1b10989a92e4b1f3491bc308aafb005becb9ab7fd55320af9cbb6f741fe2af23a6b35463e0b0561791c2317a984971b43e6e51d638f33b0872bf29f1796fab09969ee801114821659a79be75264c24b0e9e5235c3125dae2b33a7152ba0c086f5e1af091f4af9a5dedee8f824a3cfa905aff425943e476a5eb7ca0cd1ef0fe1ad78f7ec472c2b0c67c0d50db2df88a9d8b57e4bd5914c54989c59b7a378d63d6cfce648453e773366928b1a3819575c0ca1837cda84033b308bd654b942ec9041f06cd709a31cd6b150282c886f4f2168602a5faa15093e1877ffc7f99b5995f06d4c00edd69ad4acf37c6356fbb6d19a465f230c3e28c41cdaafda8238612a226389c831d97d43c872912beea626ed9bc93d83de8c96e0b16848e5ed72ea51602f5f42bb394bdc0858a3dad1d202cdc6d92e6ba17043facce4bd2c8ccbec0e2d2c36030c6a1f953e3b2b4215025c246e5f9be0e6fcbf01a71d56ae330e169ed0e994301044fec72fc60d2d52bd2312ec0a5c3d8ae6ed2baf51de5c95dbf57ace6e9dadf86f53f89dc96c23792eac1ee8ea0ed5cd318f0aa6eaa53641dfa9586653342c860b052d23021c336fe6d4c278acc87cc5958bb0e82b4361684a382f1b687b09fcd6a8992d997087f35231c773668e4b49f048c64bfa762316e97fe05cff4e302eb0e4b6848ba3f396a5f1c3078eaa243bbaba8f1011a9b6c856bbca825721984a8339f97d75a7cb19ee51fbd658bf29d0e1d71466d0a119c875f4d3004de7421111254745af173ac163212cd7acdb6af8b01c289a58ac39a3ed507993f1a1b0b33d436ccfe8e11e2ef5615546331421f23d02290169931d1753204bef17c1bf693f26148445fa5b151f3753fd57bd593d6b49e50f59d0bf6a17d8b6b4f8e12b832a568b2cec151fc7dbfc574c30293e8912184b097b9de4a4e868316fa22ad862cbc8a647e0ef69b40c20b8a2a6b515455f6198d603a41d32c6a4365985207f1dc9ca5e5e265dd7fc2e731c4e36f9ec16c8edaf4c59692bf1fd32c6e0e87c802f4129d0d1dcc82901473d48bf44f031f777aa6ebab758ca076cba79bc0a697754e4a3d20ba24beddaca793f8f1b153d25ba1554c7","title":"23. 合并 K 个排序链表","link":"https://leetcode-cn.com/problems/merge-k-sorted-lists/","question_id":23,"issue_number":72},"70":{"day":70,"pres":["分治"],"tags":["分治"],"whys":null,"difficulty":"- 中等","description":"```\n对于某些固定的 N,如果数组 A 是整数 1, 2, ..., N 组成的排列,使得:\n\n对于每个 i < j,都不存在 k 满足 i < k < j 使得 A[k] * 2 = A[i] + A[j]。\n\n那么数组 A 是漂亮数组。\n\n \n\n给定 N,返回任意漂亮数组 A(保证存在一个)。\n\n \n\n示例 1:\n\n输入:4\n输出:[2,1,4,3]\n\n\n示例 2:\n\n输入:5\n输出:[3,1,2,5,4]\n\n \n\n提示:\n\n1 <= N <= 1000\n\n \n```","content":"096221c37c5f85fac03c87f9e42ff6164f9a33409c9d41ad4507437e220640680895e1724c89803d7d648e3dbb342ab259aef3271decf65565cc7dcc696d1ff876cbbae05612460cccab0d430a7dbf155da73ec61261eb19f9674fa4aae32965bfa41dd20bdfd86d69b8fda12f0b0ed7149b04ade387740d978dd8c830a993628ed439633875193366c2e52a9b4ea372284f6de94c6e454398a51f1961081fd38ee7e3dcb46944a4a081bf7e479b9dcbca204015f0d0b0f765d06eb8b47ed8bcdf52936e9c8f4b9f2654aaff15a5e9ba139109f0d322899b0855a0c902387f958b415bd91027dde2b53246aa8fa0fee54c554aaef2fb2e2c3826b20b140deaa2ec67849a8f9940b04552410cd25f7f7b3ffdac6e8027fc37899db512cfcddc3294b3674ac20b2f6b8068185144cb482085bc7125fcb56bbac07a9b9746e022a74a0fbbe441342ecc35ae44c5c9da698ee0cad0e486ca909f15f24a593f067e91e4f7972b95dd30f93121734d10a620962182a122f43f0fbe9ee07cb0287c1bef5ca1511d523081d433140593a708ccaf1ee5924c5e46ae3454e9c94396e6a2bdfb8c26f0fa3e8222d7d2171ab7e5d15acb60299fed33cb4b233b4db65045a092b112a2c3eb2aa081f2dc7ae7c3646c080ada5f8e972ac8da9c39d6e7241555d847e05113319bd5268a94c66302172893ae98a0d7b4e0088ac433e676fec45be6c45908677caf6ef1128d42ffb6edf0f48fe4877f73394eef7615e80e34b7e0e0ca5f9be3e1efba803450741d13b2bd0a1b4c65580ff1d31c44b6b6ae8e7db4b2c8f151f7a59f90d5febb72445177c32c6c821cfd0c4eac5e465a42728fc37d0c95ed01bf1f7e771860233da87003d3b38f915347c4d5c8db2c2ed92837d69ac182949b2567b40d0e33f1c0f358bc6d8891e4f9aa30eb48f5308ac0c87fdfe3860ef61278f770e7847f179a8e001b7b3f78b8b400f694cae8d519efbc2709f785f701932b03dd15913467565cd62eb5b738f84a440f9674259cd5623ff1ed7a8ea12af25915353283f14a5a3e4240af51eda48f22fa02c29f7cd1d15bc5f1a31ce91412a9d021a9a00dacd3b37e820b284b4d10ec32a1c3c0afb4cbfa7450c42a12ec020f040c8113c25cc17cdc51c5478b249e831b5400e9d6d1ba725608a50a66c5a2d29331d2c1133900a6abda35b5113056491f69c6757e8b34830fb317f56caae30a265875f25c914f16e9a9d3d7c6b6f1117e38fb2830846b8b7786e46ad77c3bec46decd632cc9454c5ce3b7d945e9a7fe1d552ca2d5f9b2cbdeb2aee269d212309e9575e3579071e5bf67d1be8315d07b598c9ef1c6f528e67a0fe72bfa5e45a95f9bd2512277fafef184f3facd272cbcc61c3ab8a3b0d152f6dc09f7f6e690df4feafec8d2c67b54ff9b2ac9907af2bff36f1a6ee6a36a60c1c81100a6e4e3944e11f9f155cd60b20e4188aa59661d41f15e318a9b5b875495c62c0e34bb5d6ae56d1eeee43c50a5fc13224a3ffd82b5fef195dc75e674496000e8897ed7354e76d39a75db6e4dd987c947cd240a2d4ea9084001c93e6ee7838a11b7025b388df1f83f134b2a6f500cc35a32dc260854da5c49b7395e48ea5640c544ecaa19303e44f7d3b9ed06d29be01f7c76837f9c7cadc3f6ae6bde5eb2478c2e5c7106190e3cd1ec12e09cf665085db262220bf2f41a5b3e9efd4b0d36bd48044a029bfc7d914d797508d1b76cac467ead6c91d627cc35266d31b81da1189adea62f45867e5dbda9edf6b9887dae74b1cc14f188a2850b710bd46e5cf405b6bca0e66d54b787715d83ce156d796f2674ba276031406c98d6f9c9f68c967e281c7a25223ac56fb237f50e386f3a8281c1305070128c616bfc5b7eb20939e60c803ac7344844b24c63fdd68ef971c5adcb058802e716f47c3e917ad78e869d968b4f41c550beb89a71beca9f46b7f85061a215984dce38c73cfb5938607d167a96364bd9b3db90832bfe55bf3f870b9a9d1851ba84e1d5e5194ab6e513cd740bc6c0007446adbeea6114b97ffffaaf1cb2dcf92e84ac04a16ca6e0639cd1f23e54cf745024e815edb6b43654e92acb4dd4682e26e63d75dca3e0eca6c3565135fbc289aaf5536813270c33d5a501dc27b1cab24558506cf66fc28ddfae9c1c98917a6d7efb8cb94873ef67d4700470ff24528d6f452fc3afb7f77a956824de47f7b4c183c2003a16a27fc70bdfc4517c2a81121f2a1182d821280ee8378acba8669149916da4186117361627710625495f0e68c4bfae23d0dfcca2a27e838819e5b1ab9614bb1ab79f4bcbff04baec3debee363a669cf2d7eca9ef655ae37774bf92421895ff5dd751edcbc2e9efea488e4c1ae269047e69d1338435fdf68cc21f9e23aef11686cc50adedf56b731abd11b915211334b514886f7f9aa1db6512bf6f999ee351c1fa277c9dea335c6177d502ad564e9fc1fdcaa968a83951eecb5e9caf0a6ac70b35ff958eaf196f7ca90398f01a225ce485c41a41401878a46f996781c32c10c1ce30fd4ac3846b4093bc69fd247911b7fea0509b8933a79ad8c8745883e215f0b6ab1a84d5f09b8692a95168c9f4684deb0d771397088576f77a159b3123b265f3c56a237d5405a8120d486efc8f524d679d0435358e4c66d79e23db3b097e9475cb89f226ed9d329128f698aad09e838bb36bcda19adc296daf0155646d35439e2c486073120ccdbd706666142ea851c3b8e2de2eef62c2d1f0542f16be013afd4a5e714c09a43443899ffd5c4ea6de966568799d714b4e6ab0ecb8fdaff3e375c77526d84a42d7dbeaf3e3f1874eb90e3ecf9137513223905fb0c56a631e1f5a2403c193d3d3c5e4d4cf7939c378904bdbfc1782d8b5ff060f03172bb31d67f130c541c105ea34a93b99b7e5e98e5923177868cf4e9a2f1ddd0370bc9bacab68bf4e489141c1c3b263b81f98ab742c0873bca9827b25f0f9dc1cd11f7b143f7f05aa81d2cdd2d9087d725645e1e62aed18d8fe7860516687c81c0054161d445b0a6f4aed1feb76dd3a9f0d218cd4c2000f0f7e1f7c0391407feeb5aaa00671f141e5f606850ba61d9d621bd90e0ca213f3fd196249fc23484a65a5e8a41e56931dd5f87dcfe243cc2169e92e6ae50533704313401d162f05e22677e83fc8b8da8a936eaadbdfca1cde6324a69c5381e0fcd7a15d0982d9b954337b7fbb439a2e37c5118540284034e10d69f24c1bfd57b10043ee2098b5ed159d94ab84b07d20271089b04aa468501a1a1554045acd511770427931829e025f80737642eed44590555b37990477a993ce86d93dbe54b33f19bbc003ff0a57615f9e646b0b60228ae9a06ad6bd25005ab2968923ca4daec83fa3f145017cb4c7c754993bc2c24d1d012dd09013183995855fa94f54371c9b6afa9278649cc041ec9c684cb0b711ce1459475b89d1729fa26082a1dbc02078ed3c52cfad268e812f61da0be43f7e7e25db906d19765bfa6dcada2fa491b5bafd4661b670bd261698d26a546f2b515724cf4e256416341a19312275dcc5690890ed57c7d3c23e1efa554f4d0569a3f21235a7fd19a8e527d1f93371f3f168c5d3134b6d367ed7b5d52d42bd7c87ee8b646bc877bf1b2cd9dc676e1335511d0a7163304dad7c3e71687e5f0517003e41d25728a03ab3cbfc6bdfc588b74a499c73b29a27e7ab98d9cf6686e9a22610323db1cbf90626d253a87d588f84da76e3c5d35f9a1ba0271c98034483e163120fe839049b1c504f91cf3802a763220812e779c636b058f8ca9461c7f75a092a2233063e4706cd4dd61158d89b8d44ea1af41ef9706f66469f83af634499aa053f293fb544805417b22c2849e5ab44aaa99d99fed1f4c6ee3ddf054a5cb02d0fb0df245496a7c9b98f988bb017d2220707b70620bfd687f5e38cfac7e97513116ec30f381c254ec8fe3853f6d8948c4bf14de53903cb47ab6d54cc2520de867c73e5898ef220ea6cc4de07dddf20542d375dfede88649b467a5d7ae78966864eea6d6e826bfcd6b78f2c25f32f25a6710fe0d9fd01b7976174855d9c8d94a932be80cdca7ac0a00602330ebc31e109bd10a49ead586a70499cb13453c13bb85f026c576341606cde889d9de397a587d02933d23c52ddc31e9a13127b84df2ec4bf2f2cc04787a867ac0d41d5dbb1b993b7c74b6250399e3025bc41cd02f7223be37671eff80b1975d8aad69cb8d19ba86837130f659c332b06cc563b0b440939bbe1b69df953eb7b80e15be77a52c9617ce6c1d3b2699579c1dd6a651c1b49e5634ae7b8f8e7b34ac5825850ea060e79eeadc7758360f16fc855a44e9ef22e489b08658683a300ad3b9bb00c161a7e1652d4a34cc8edbb94e1a7d0c1a6440953981d892aaa9bee74832a56e4b2d4052bd7261e4cac0025764e146b665f3411eab0aeacc40b27ea937eb20737d5ef14cc8a7d3de1d3a0d28cb3f01b7cf385a33142356fdbf1f72f3b0620c72ccdf39571ee0475ac0ff9f4272a7925ce0688adb23bf5f74ba0add6baaee74bba298777c04e955bc847c8edd6aaddf2bc285d55ba4b361003f43e2e538de9d7fe56de1cda6a2c5412da843c47234570b587dd5f8cf6bf7cae52cbfca25673287631a7e535479d6f5c2a804aabb15871a5cc94fa00b58973849d4ec1aa7551a9d556228b6c97ef79e405a183d4b69264466f2ec2ea5f94e41d6b81df4ea029c10e1b586939ec87ef467886df984462fd068aaced8d3b96d507ac34ad1dbe6885b470c71e7380ae23e9cb0724f472cf4801f22fe38006179fb8f07ee0b7ec499897582e1c6233b7774f8d2cb41ee972e8df2998f7a0a5801983193f052185e6b35328e7d9de320c9343896e23776a58468999462b19eb857d5f7a147eac990285b1e060bcd68c8bd6da2aa8a068976258d1e46159167b6518171006c632351578a8b14678ae080c9f26c5c3e492d52505bb93049b9e5b375fe4d1df67744fd75377c0897624c434142b4f2c260c770d7ec79067d98e2613dd455ed79d8bcb8fab72dafb2757611aa9604b14f138beb5cfaf698c40953256dd1cfabc36cce1d754d1e89e287c116bcc5e7c7d143d6b0743a31b49bc3485586f2d44a4fec0d2155c273d15d43b234af3935fe6f67e88ab214ee02d74030b7467531d2d4edda59f11a9588a650dd8548f9632ef9b87d4b6d2251cf5cc8696441633d9eda1f93c72a5b77e0dba181606c5d55dbf5db8082bd3c6895da60a2524d15ca8842faf5a9ad43937ebe58de8fbcca8073c52aa4880cacdc517721295985360cd6ff1c994a08c8f96b5d7983e083b69079d64cf9c47996b42e683025b44be3dddc5a8adf75c8a89893978079202b15248a44202a3e0f03993b7fb2b8f4b63dfebab0a8cd51c10d58214a4c0210104f4ae922d6e2c3a254bdded2156d31745fd662cf7beba29ed24c555ee5015d1b8864562f29100f4ebfd2ce37a08182eb42dc48a90ae44a6434e35ae461258a025303a23a3e02788033b19a3e8a181cea0a126087d225fbc39cccd7b46395eb07301066ecabc2bc13cc897520c0ac1df09abcda616b135c4482c6e4330418ed464c9e6d2abd746420146a3be5f79ab281f9a9131aaf8aa043bc8133bc8eff180927bd9cb7ab38f5974bede3c844abe6e9f5bd398dc66125a2d2530168471ada82761f7615522bc5526373dc658f9c59fc2f8e16e8ca21d9331e1c25c7c66fa81b0c72418031e5cc054fa8ac8441b0f092a4207e19825358c9571a89ca34a207bdd0a1155e6bc34dff6d34e1b17d96cd61dd015fdfe13239ebaaf911c3dd3cec4b0814e52b696edf5728a735a56a3ef5fd6dba78b45b2176e0cac9d6a55732a1fc8daddb775fb4ab7822de5f9f8b9b17f170305a3c6bb869ac18c47d4d410568af791585351f6fffc579d9ca3f833eecf1e64354a8eef20680329969bcb89291fb83546318ff9cd186ee31db8436f27ddd6e2b7c71484609bbd05dd17a4aae955d2d983950c81039d08ceb4876b20d247ccda43723c1998c44ebeb56fffe36f91e8248155b866468a12b7d991e0b7aabed2e931c223fd41d305daf0f5dc3dff9617dde148914b756297a3d05441011c4a2dcb57eb7a342ae336b462d02bed98a5b52a38571e57d32db4584f956d8bc37633fe1bbe0c634dfc87b01f9253759b29a08272ba685aa579a2dca605673df49e80200e613726f7ce362ddc3df85fe79e6c33a3dee06d1063f5f49eb635a5fbbf4401937508041c0dea653983ac14a544c208d80fac50ed3940ac452b81e7f8f9be99f350b9990c9fb66ec257ee0c09ed875fdb4f29e5269210e4699bb1cf11d1bd7994e4300d83e8b6a008a5b78d14513b6348e51a8ecd2bc334fdbfe1f5ccba899bb550dc5503fc6a6b295f5097c54e340aea6d142495a964e131d47f5b5f5ec71e1e443aa4ca44216534f9beae966c333f9de726a741dd323af7eb9e27ab589349c2dba47a599985180cf3355dc21fc3e2d8baad2f7fdef2ce242a6bb777f868317565df155e1cdcdae98c09901bb35baf4f045d52c0183107e8f704c934ae19d0b50749778bada59a1a4186d00e2a512ff775566d45a1273642c156981a74c2310148140d6356c8ef16c4dbca714907a8f9796630c136f3c7f5ed2642c9659c297ba8d2388e5c655404f36588ffee5b37384cd159fc8777878ea7706a4671246b99d0f3cf6b4e0182e5841cbf3236b215201aa3151a964dae01e973a0a228ca2ce6600e3dcd42e3960bce75b6486a0904796e388b1798b65a0b2ff0e5db57b9fc28bfc751a45688ab0d1548ae67a66c50d7d0e9758a92719db87692d9919cecae35961bc36d70a8a9cec7b52c76c6d181270b054d00a462b7efb2b0fe48d0a2a2f799ac1b1ef50e28758b280f030838fabdce624e3f1b816cea01b5be849c84e28596b29dcbf72347498bb71f28fb911ace6039c80f56bd5a704366ff0d68d58402c2ec095f3684aa57d6c80de7fd5cab98139cf42699bf00484371756ca9bd608e4a7b4d2e6bac666a25937617b569e7828cac2237dc6f55f23f2df83870ebb4abdbb9402e8a467d643b77b64376d4977a56bb875ba5a176e700ae7e6caad786742a4f93bb0d341f425c11be8e71d384032df17d48db6ffc6663af7ee154ea09b3d48354291c9f6557206874235c9a39000b09b5257671499e1676cfa38265101fa4dffc3609599efde2e53b64a1e39bbf76867a623765400c6e544dced231c8691d932fcc3ab9927eec8c933b99948ccbf5be6d17e1a136f959240a","title":"932. 漂亮数组","link":"https://leetcode-cn.com/problems/beautiful-array/","question_id":968,"issue_number":73},"71":{"day":71,"pres":["位运算","数组","哈希表"],"tags":["位运算"],"whys":null,"difficulty":"- 中等","description":"```java\n给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。\n\n示例 :\n\n输入: [1,2,1,3,2,5]\n输出: [3,5]\n注意:\n\n结果输出的顺序并不重要,对于上面的例子, [5, 3] 也是正确答案。\n你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?\n```","content":"09613310c9d44c9fc671f2f8b95cc9aca10f934288bc428f6b084c70221171acf9514dc8c94d3999714e903c92212cae6ba2f2271af6ff83eb7cb46e350537a417e4ed8b4b5019138fef03227379db8ae761b071d48825b7bb65cca48dabb899493195462eb99e2b3d32087baf9ccbb330d54b24745ae1cf7cebb78660a609a97854cea8f087dcbb9927bf3ec115e47dc4f9cc2ed6260351cfef1a97422f355f471e7b101ea1c55fcfeee83e081662584cf4c87c9590bf63af12eb795819a1b09e17179e4d0fad63ade94d6af3759a9f28b50a374e46c3bc7f29a0b868282dcca7e7b721dfa36fa3f20b27f9a3de84eb230c51c949a573024566a5694e0243d6e40def99e5ff5dc90c581556e433024b99919b6d8732fd03bd9cbf07e5c26bfb260daef556c2a0c78047aa9883965f4be9910a50c4df00a78316b4f81dcb4bfc6d45e0dd30612d43daf17f9bb9c808d4c3ad8bc5c58fbc11af4a8f89445d66d082c5fb77a39d7aeb6258550455438b97268aad2cfd19176c5d5cde3e93e0dd283ae6190c096dbfaa7027a1787db3742ada6f3295c6ad11e084215df330135f07828841654a319c2ddac9071bb9fbd95dc3a5e7fba871c5024d1629d2510cfd94e54f9fa2ad17c70c58f75b7e2c1c6d764ef421f1ba8c98f6f77ffe9a63162ca752b40b1b9e9be70c86a3f86033002a869cbda717bee6158ac325e75ac2c66af5c6592b6044ad6cd136875adfb3e5e31a3e8ac1edd63a52d57613c9c98feebafa41b0fdd695b696c0617809bdb1b3a1011d4b5dbdb948ab0e8125027d39e00f374d1309e315714e3ebee3fc8eaa772e7f4bf457e24d199020cbfa4c59a8c06f069cc42b0397d684943c7a65f7abe2555cc887bdf58fbcd98c6d318b7231557448064c1eafcc11b2d4a760154cc253e0f0d660292ee861a47ab24599cd17bde8cc54f05119d8107107b7b2fce1325d2c19f557109931ffffa08832b11a8cc757e14d65fc024650a55798ed555bf1218ca8d64a2d3612d1060ffd91777b8fd13bcf9e65966a715b3fc5926d3788c4428444ee85a1ed7c92e25d27e7b338f57ba36cf8dda13307982aac02a0034bf38c200b84e08a359278fae67f7261fa6a5cc7081fe52009e6a0e74cec05ba5ea300ea3826b49cb626591bddd5c4ba73571461704b4505635bfdbc92235c66b4f68602de5810393c2aebe34f914f6cb34bf631a9f0e481c35d5179b94ff0addccfb06cd5e3a6f2024aff982696729430f62427d8754bff10bd500ac7e04793f1852b7849f1e780cb1f7b10a7c9f2b2e5d0b094cbaf04ffb25401ba67e85608dfda38d9c7e72f8e2378d2fbd9938a328e2411a370e81d37892bc7d11b5248b2b3f0c880f58ca3e00132c3ffe797da6cb64818ca309ceeff87684a7a100829d4f03a2e7fafa111aa9eb2140706ad9dca8e5452103c9deac9b44c32dd1ef74265a73cac39cbdcedd800f43068b0f309881a0a7ce89690b66a74e56f070056700b84b242153d78dddfd3d698c6df11bf662a1d34a7c6489840761da38b0fae7e0787978d0fc75a70122fcf382e5ae5630ae5c5e717d1b0d1fc2c9a9e0d4b1839cb844ee72552df417d42a30250ef7f4d23769b85a551aa0b72693226a9c5df9137b8000f95b915d671d911aaae9baecd887efed651a35f5338df9093d2ce16eda6ff67254976a2a805d8df174a03580e9ccb811dcfb4237fb28e039020264d6b85942cc15739f367c5b407916b3d036aa07dfd21caa2817c1ba6103ba2ce8dfafbd64821f82b974acbcbf5b460383fb6324a7bd23fe1d3f53f24a7ec0270ee9723ebfdd76de84fe99ee0df8a011196f770450e154f1734741a921e22964b9427590926146db105012e3832c5ca83214d15a3b6a663b564aa17393b87e2ac90e3e7a445a0c9fd6bcf1bb66af03eae2f75e2af89a2a9886a4aca449db09d79b7eabf4697c351578514936e0bce403efd7dfc9fd0184eba376bebbcf4a38320e254b83d852e859e0a4db9b0ff173f819c244517e44ce85b905d6e2ff3898c3a25fa3dd395ca18d9b1ed7ddbbd7fe170e5b94ec1a0f06409fd380d1678bf77d7cb0e30b320b9df02e1c9bfe61c75d59fcbed90c89a0002869eb1e5b36f0f6a0ab6987410c84c9fb3f2a347627565df530ae8c1c604df5e24f5c4f2784833e870cb71d6490873e22458af75aa954c67dcf505ff5c4dbe6795c0fdc0b01b4b4f972d9d07888c5bea209834f6a07a2e44212c01e60491c7bb549157ba6da502a5e196ddbfc806b8b4a10ec17e166ad544054ac4de7ac2dc2fa9010f10e16b8d756fcb063ae6246da22a0bf38cfc474f43283349a6ea41e6996e56cbb04e57fc39db615622312647e85bcaab27e69db7cd4eae51e1397e16df71801b6aaf13e79a5dc991e02d3a3be84b9177670746e328e8137bd9f1cb298a242d15659f0fc1bd5178eb98001b34780589670b319a90a0ccff11ae5b3edfad029c30e6f516ccf614081241dcebea2e936676fdbdd87e03c6195a88e0eb6df573ae3e412e34ce22ed5fd61658adb40366f249e0e0ae7e5e1a9804ea6da9d5b7d634c219274cfdc8c501c28bc23b697761d8e16bf46968eb1841139a178a43c7731595303f9e65f8e969205d533d8012165d6ddfbc51404e910e3f36a36c65e8bc2ec1090934dbe25be9a502bfcf0be57cdbfcccd7cacaa0ff2cd8fad0e76307bb702c6539695ffa705a2c001e6baebd390e43407193338c998f68a8ef6feed3c24f201d920319fe84cc302b22ed7541ecefc434118893c94be0178d7e131338754f14e0c1e2eebd36c3f2650c37efb1b3fea8ae973fc9185b90ad541b3e68d84dc284411c93af91994395af75979a661b63782ff077804ed9d81482c594fe012100260bbd1a71f131e94cd133e8128e388bbd230cc40a13e3b10fd32fc60962bc0d18f6bdf304f7b44961934ec9c29a55b92497a97e24097f81ab894a27d5f6d227c011563e3b4521a98aedccc6c102714f5746f6e61ff81ad0cb7e5e7e678fea112f501a3076562a514bcb0ee870f23b9702239af3ca2607007c017d1e924e42ce7d6667902afc266043c5ec13c079b13840c257729e74accd54c08834437829c171674891926587c8f47d19977ba47a49aa7553bc5c303b1c32d4cab86f5dec5629d049494b0368e90a90753151951b011bf2fb77cbbffe8807f6c338b8d768640a4bf53e856e7ede79fd47603b0283adac738c9333c5d940548456a817cc1858fda2fbc36db7ff80ddf042ed195b95d6bfc0c232cc00417e082839fece07e459f21d3de272cf5e82946fa86c19b2de8c95bb608a23fd2c51fac37c813a341974da1a57541416c9a09129a4be5c4b5516520b5f9e4ec79d16d6974a4918b4552aed3efe88e30a43284a4235d1844bdd932ee46128470bfd02c3d7226b7c5e8e001cbaf3b7a4386bd1b94f5c817eaedaf87041241521ceca17a3b31727cf0746e2be5ad65ed3d8bfaa076cf1e8a8d02ff1262cf32c617b7f2993ea4db430f1dc4474eb97cf893f1f620793d9e3c3f796cff5a689025185d35c26884e2a54f8cc6c92bca797c93d3aabaf0e1bc03939f45803deaf4151ae4952d5fefdf1a43f2e37dcc87e870b3125c5b82af50da5ea7759a2feb5fdcee08bafe9b2a835f5accf84d7ffc3aba9fbe47190bc203aa2c2ae25174d0271e6d673ed055f8f776c227d0af6172f1aa9d7bfdb321e0497c87002b400b6171e1cc07a014dc05c8a02efda559fd83227a4e3ec6a81c0068397fb190882a661d8adb79e45f3269bb27cd5c9a64fc4e550080b06f6b6a84609f94ccf068e83bdf820d090189d6d5aabfdc558030e496e5d3186f8efd121f04e92f25de3f0a387a412e6a5a3c0a596bb9aeb4d8609292cc00725da9e721596c486fdca5756446ef8695a47860676f4fcd6b9afdfb8bab03a5f443a8a40761c7e64c8fe7e1cf48d94c04bfc4de8275ffe3aa4311d906b76b1e8293ea7ccdcfa69a438bfa307938a6d466a6406dfe9881fd946705d689aea28d24eb2223c8276fcc6aca57e60a77a77e8714ee8c5852bbfde2f2085149c97c6a233a6818ae03e90a8680b1924fc71a123972b9bbcad453834459db13413817bfb0f524614664e673f93ba819ab6deecd9850368f86c079f8f57d95e7032c89a2e9af22139dc5e9be729a05c139e9eedf1c7ee88342e316bcc717cb4088356f76c7fa27e10efe4170475c9b1fcfffed193e6682a0e0f3ddb67023e98512c16444f28a8bfcb9db01dbf00929c409b3f119d2e2efa889da038c72b8cc73f1b1c5249ff6304b2f5eabbe75eefe41d16be675c2beeb0c737c621ed7d811bf94bffa67c44835326c188af14a2399b8126161a7e1652d4a34c89b8efdbe1f599d4ab431311b71dea37e897b40bd76310b1feb55779967f1602e65e7f284e146b665f3411eab0e8e3960b2fabc62aaf4464f6fe73ccb8257bfca9d8808599f01b7cf385fe1b42356fdbf1a56a685a35c62ad7c2d762e81c669405a1f42a774271ff6cc8ed981185ae1fe8a4d7e8cda04eaab254cbea3cd5018845d880ddb2fdf3bd21041af61e62594cba2404538de985ff40964cdc702a6c1cdea92202730a7ab4cfb239cafabf32fb1f98e6f07f6e2e7004eef924698f4551348026bfc85111c6c280c730b5e30084fe0185ef6f23ccc7167fc17ebdb136e856e88386d9d33112266897a63e94ff1b7ad5bd0caf288f504f000c77ec8fa14f78ddf5d40160ff06c2eda2df77ce9b749f7aca4eb703d7e67e974b20c8a674af822d6df46cc90103e262b8db7e4591f4b530a7e3a4498497167f536b19c96a4fc44af14ae926a58f2985a09391d776834b76422f9ecbf1123fa8918d3e438843db35232622204f89d0002b11a285775f681421e5cf4acdd3a267e1d6c4da9bd46bd7f3209f2b58dbe4731f542974580c7348c67c601e64e09b4e3be1465fcb268cc3abd4d52d11e9c84d95900f4054ad8fdf73741ad07939c9892269943a447e1c642e4577077e949902ee8e6f39dd040c859d96cbdbe622c1d1621b6f75994a4b46b46cebe781af28de128e180bc636f8fc08fbcbf43f87a99e4b33552ed6261369012f6f466ea33d0ab208fc4b2f1e21c2c1e79b395d632325fe11630ade985cd0c9718eee3542fc66380f2b75516c467f0385e89644fa1b906915963cc68b2fcf89dedce4e30f1cb989d2c6531d2bddeff2fb723bdeda6565d5594314c3c108fb70af0e6ac4ce8f55f2443e60820e82df05af5a9ad47b7ef2ed81f4be9c834e340dbd62ce8fc7ef743c46acac5c3cd135a1e392bd8c82d4fc83d52d1e24277ff9648b8f0099310dccd1470f44fe17a6d5a4adb773d8f5e26d3d41941ee52179e15252e5a9f12b93b7a76687686384c1ab0a8cd5551f938a14a7856a4e48fabf8b64736e33244bc0a364139f4c00f2373c8abec434ed6ade7fee501583b89e4375bcc308e5dda35fa44141102ea61cee8acd846ea6431c70a7394016a077756e3889f472f6380659db8791f1a3a08c2c1b38713bc202c2f0233c6974f33f40553dca862ad969d5de00421a81df59fe8fea5ff22fee0e633c436e4d83d42bc3fa81e5c7084a5a41edf2132dcc7d5dd8c66aabaeb46d6f87412781a1a59e947b979e65a5d522669fd5418457be7c9f519a8e886b400e620f2d16946a87a82761aa4b5522bc1369653dce57f8c39f84b1b53ac2af50da388f92543266f581a2ce2d1858340e8500faf4d5445514232a4255a4cb5e7c87d742fc81e7117671c0521b64ccbc34dff6d34e1b4aa4249f519515f5f657278df7e69f1e2dd3cf8aa19c1c07ecb5f6df728a735a56a3ef5f849eb79741fc0b2054ff975b7f732a1f95f0809d35f244c9a866ef217c047bc2f7c6822513080a5c7f3c4ddefe3a92573cc3165bdc20313aac0d413812af1603d2d4b3892e4d0a420e29502c5d40d7cd7db9afbe645b0e82a625ab0247002f939aadf0891d804a96bdc254cc6d636090186f6f28ae44991bc7520e8304289c028b894a177b5791c0649470ca6c27f53f2da02c9347c4fd0d943c463c25393c7b7d66f559f47dbd0f9020786a39cc6d77cd040d8a00c981e5352b57aec0eda1cfe257a609b896c96eda339743c6752263316879744e22d662eb491bfb65c5b849851c5c855a236485237c317cd5ff9b11b461dac4174bef09828822d3642aed9db32504551aeb1a7e9e8b6ad3490e130cedd0634b37dad9d11b744164b97605fe2659d2724b67","title":"260. 只出现一次的数字 III","link":"https://leetcode-cn.com/problems/single-number-iii/","question_id":260,"issue_number":74},"72":{"day":72,"pres":["位运算","回溯"],"tags":["回溯","位运算"],"whys":null,"difficulty":"- 中等","description":"```\n给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。\n\n解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。\n\n \n\n示例 1:\n\n输入:nums = [1,2,3]\n输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]\n示例 2:\n\n输入:nums = [0]\n输出:[[],[0]]\n \n\n提示:\n\n1 <= nums.length <= 10\n-10 <= nums[i] <= 10\nnums 中的所有元素 互不相同\n```","content":"0961361ed7da89d7d9328cf909b1643f65529601cd9d2cf27f683e5476b6ecbd9e38e25a6b8bbe107d7e843ead282c9c6da1e6341df5f0587fc873d662630fc974e48cea47384528e3a6066c0c4d8cf9cf2bf95e7425d454b064c84638532b43aea715fde64153a7ebc9849f48914d66a45e8ae7beb81f4696163a45a16dc349ffb42e24404b4e4c7fab4fb041fd1eb54445098d77252d5dcffe0d79f082fd0e4d7a303069d2c32b4566c1170bdcd80009c989db21b795aa375a974a37a90499901716a6650e927aadd75c876de7b3b5f0019436496d2109c2eeea9720503aa33141729a50ae759ffd100cf59df684e828006dc35e79e5a2476cb8664d2b4bf1d9e16b54790bae5f99e8de870cbec9b8115b69a57be634c152160fd27f028f72d1ec38459f506334c552a9dea97aefe52dc534279fc84bceaa7de4c74a66cc7a958a0f941511507b9faf53fcc9d84d8edaf1d2c99ceea546d275eef170d48715146a9c2f94de08d133065f6b0860e7ea1ec6cc17a0490ff75a66ce3fb0cddc1e26e4252ccd36bfc1190bd02d57cb042a9b3127c199bc71bb804904ff5e58474ff08f191d6a53e52ca382047acde9be04f6c281c6cb3aef6d26074d58e003e1a4e86e9f67ec12af637ba3fa0845063201449d42c1d2c0aa818a558cde516750ba1fdb357303dd8c2bc1cad320712b4608cee1bb70dfd369cfc14bb4565fc949eac45e3e6b638c63d23e817ef45f67b05e8f2cc0d1c33a54deb29a8c929f5256927ec696d8d7e583bfb599835a396723c2cfe7ed9b803682c6d6147f1d18a1552299a0eb7f444a737285bbc0d4904ce5f68f3da24bf48d4bf55f63f7e04714d685277dc0d500606a070f520263e0e43d07c6116ba29ec05236602aa57128797f4c38c6d3685ab40c1348f0adc98008f4afb6547676caba198b3ff1151caf329c88e363511fc8114934bd8be50c8ccce9b84f92f956bb02612855f830c24504eb5e4db245b68ee62f922b7a90b23eab71435baf8dec8350d0a5731680b518497b938b28e96b14350b83ed6450074d42945e2adf905fa220655202ccb32ddc4be357a9fb993c1594fc09bd6b8bb81efb3b70cee13a059f032d77c7c7d48c3e5ab686bd2a7908724cba5875e907e16b5bf15b4790eb26a85805fed9ffa67f4c3a62646a483a6e54c7819b077f6694e08603f55b3c1b3327d5e361b78437a330bd1be9aaf5e68687feb203f842d3f0cda67cdbc492fc0e65fc81089773a130c73023ec55a4ab1cfb3d1aa6ba7ae19ebb5926608391b38b576642c4f09ceecc89c88885d215aadb415de05a821718bb8e009a89f744f1183fa0fc83c7a171f4147de555b27f15c460e181425f1ec993afaeb1a5d1878a4022a49bc7d78f64fc112c5eddf4f19fdf4feafff5ebc46a73ff9213c29452f097d86c2858e49b416bc5fe120aafe4feb2431ccff062ef65b933a43ec33f425b01de3068aefd07b72ee4ce4b5035e2046e8ad5d92eb8201efbc34a506856acb8ff9ccccc9e4c810b483766d3e8ee4d84bcded39b47d8794dd798d841d330090e55ab127000f1256df4a9812eacece89d48b3e27c435567e2f10ae44638c62c0b67d65347813b69492c9cccc659eb63640a5932c19af6c25faea68b4c4919ea7fd90fb6ac97a80b5190761bb4670341646a1156bafe7498adb83b390a3597e569fb89727b5d021adaafbe7993ac4b108efe5e9d4c717c02cb936ebd587eae6192ea3b08eff5ffaddc64be5edde3f16c44e11d5fd7f3f1a6fd87392c87759001acf69e53ddf0b01ce78f3b891abdb2f36f7aaf846b4288c93caa87c4244490254d05424182d1c1c218191c7e072f751833fd6d04e916944d2a014ba2fd5e8a5164024986c939f9d2a26b292361b66eab240d34bcceaeb0d4ea8767a6f4e2b34db271c1543ea40a79f6a98880bc8a7047ca5e88b09d797147339f156b943d9a41cc704d91467132e4450275157e853668dfbee1888039d698e732e15b9fe24273e9d8c7a2941201e8d141a879ae289f1d221d8efcaf537be15f898aa27ae9c88776b324dc27c06063bf1b6460fbdf4d77721a2ece7db6b43656ef24c748e16b3320e71341d7a2e1e19cda92d99df8e08dabe644693200c3c1796f915fe1dff8fd0f600330f73878eca8a73fb50c1cbf82f531292e810cd128a15d672ec777318fe7450fd7df0c72c956cf8011ec536164074d9386d43ab64bf0010bece2fe3886dc4d090c3440266f8004d2ba923ee05bd025b0822879f2848aa5be6ffbe20ec04b0669e4460954cbdd47f6d1128c2b7619e665ddeb801b8dec62fbf156adf2765a67e989ec94f7d10b3ed924d62c561e20c293779002e086aaefaa56a1460e268a2012031af6791ea213441cc8b90e8a678e3a3800c60feedb6d70149310b83e20340dbb189a61589eace97eda21ea9586d55eeec0cbfe2e2c961033579a4694e6a1faccb8b8b90ed42918b4c53b064b8d89160332f72a4b5794b9a460f04e49a3d7ea54296ac38d01761be62bb272b9e9abea2542ed09cf7349e1b45028f22aafacfb2a1755d60475df2d1d105cfc08c7a09c164d6ddb4f400c372f7e72ccd7287ea49269cd82cb3c98119911efcc6da6b175ed122ed0b897c2e859dda396804e2494f0e258acbcf2568df323058706e05d70fdfe0f6a70c6294bb32ab232676c66020b6061ae0c7b1138e3ec5dffc398e1efd337f3fac0b58eae0927fea0d3cda767f5534c01a6502ad7780755f9acf04bc5bc715154a8f1ae22ef9013242edc9a674e46e4423d9d7e4b5c6a755e14bb8ea1ee7de03460d8deb13453764c27385dc95ecae25466b694f7eb02de320599bdb9d6d5dec80e027cd994016263bcb77db129ee1f64bd44706872ced7dae7f321caa172de728903cd7eee1ee33e6366030bfaf6f5fa8f08e64ad48c648bbd3b3e432ee77bd5cd56f5490602cf7e9f49239c88c68c6b3b1187e3507c04895091f5bffc91f222774a4419298ab9ab8bfd27288942f44a65b7fcfda3176ed5b7dadf9ffc938d82ca659624e245ff13bee55f7b0d9aa39580d6fb882987de626d3702c2e95c844a4ec525a96fbd2fa7866bc9b606d468199793843ac586c9c97d7b51c22db460c1fe57f42ddf60e7e46de8dd73c09cffd6ed87d5f9ee8975defb00d5c1d8e1f750ce08f1f5c91f838cab3555e70f275e4e8b2541d6494393f49db22eed20ebba43d467f0b3d6f867edc410a8caa3153bcbe44bda4cf0fc3f72757d0255b474725f021fae2e9c9343104c1648ca16819189d69ab33a569da00db4dad41330de5282c7a36684934957494b48e877952eb1df3341c4449292d1f15bdce5ced08e4d6409a36129b8dbb2dd9bc7b21c817158f72f0da9bc9878b9907d9a3b0659ceda818ce0e84a41a15f12974da6c1d7e8318f08099f97a2cd68d9f9265f7f2bbdad64298ac5279101503ecce8e08d815817ce6906c2ac2c9d9c4c55e342fe045422799b8c7103365ae10ab39049e5c2e6ba8e092de362bb3b58d1b12d1a6f625b12308e4227604b251d1b6d743e8e97285198be128b95ce3e70b30044501434a3e20c4eb69e4afc9e6e9fad4e6bd9f168c5955c196d7f1ed2a9800040b2788aa3cf4f6a8e7ce37c7fd0d57d44133551594f3763741da532376b427e5f4c51003649c35734bc3ab384fc23df8bdcf0155ab672af9a37fd8198d9cf6686e9a22610326ff49fac5468d228b90021dac68933b7cb920fca5eee6355980509cd9a51122cc239049b1c504f91cf3802a760703650e576eb66318e3107429343118f9bacbcf6a7a881b35d8852f90c4a6669ce72e877cd441a2f266cb5e0df1344fae5417a755acd0481141dac7c465aa1a417f4a9a0d6bd8ba09da869f55e600ce56f43f99c3e7e96a7c9b9d9dd89aa0b80354c428f136fe7cadcbbba92f5ba902051422b975c304a600d9cb12c00ed96829204bf03f424588c47ff4854de2c3af4867c73acc7daf26eea71c49052908c2e462a3e18fdca9335d946705d689aa366d00ba93921d077b598e3917e34bc5077e8714eae8ad72be1d22220ca0f80db83af32a4809f8370c4b6760b4b61af6a8b239773d4eead3b257243d49b165acf2ffb46525b143f1b3376dee7d2d9a7c3f0d49e6761e36c0c94c65ed952127b84df2e92fa6c788f159be17df6500dd2dfa2e4cee5ab1e2e316bcc717cb4088356f72a7db12d53a6b65f193fd8b7d6c5e5d1d9e6742a4014749e38334a98584345445228e6fa9c9df953eb7b80e15bb176579d2667fa8e9dee669537988e3b46151b12cf634ae7b8b9b2e705c5ce1d16be675c2beeb0c737922ff46ed25b8e40bee337018c55209bf3f874ab32b8ab26161a7e1652d4a34c89b8efdbe1f5c4acee106801ca1d942ae8deaf218a4910b1feb55779967f1602a3127e28371a3b330c7c6ea8f1aba89e5f26b0ec2afd01378def0ecc9b127bb5b2f2808599f04939a7d0f17f42672a88ea8f6a680870cf55d897fd70ed0f57946fd2f449652c69cf06a2edf27bbfa461f6aacbe8fdba48bc389c22c00b95079d5bc2fed7b1f2a0e66f2218e942364b29f43e6d1cc3bad1bb449e1f8f2464502d80ed774f720066efc8f73b8cebbf32fb1f98f2bc56693a7037bc9d7014c00a0e2a8806b3cf0527cedf9fba379ff31b84b340d6a46f678384167edd3ff3b736a15db8c2c5b8da31490c6897a63e85f91261d5c21ae6618f36320a0c77ec8fa109378ff590086bec52c3eda2df2b90d535d1338753a529dced379e4b7be2a632e0d02d24bd63870900f67ca0c1524599e5b52cbbe3ed408d974d0d1c3919b7774f8d60a544b973f6c721cba2968be07afe10242f67cab4b35b6bf5bd8d660cda1eec282336384b01dade507e42ea8d2356733e73acd52899acb26be1838a88869534aee80ac230729ba4337331717ed48897c07b90f0c9b13f19e8fd5ff655c10ca6073050d50a572d029e146dcbf88d40126aeab1c94c7913c489e4de02f3f3ead9e08383caa5bb4f1fb36f34227cd56a0697e3f8c2dfcc08ccd1e0dea6f934f48ec219aa56454435ae118e341c64ce58b3f8b97a677ba927602bd4f6d89e1fcff0f9cce7e7f38126a98036c046ccf4fac25d345b07f6d6bfcbf77498ebf32f1a904e5a8b6229fdb8749fc889e58236","title":"78. 子集","link":"https://leetcode-cn.com/problems/subsets/","question_id":78,"issue_number":75},"73":{"day":73,"pres":["树","Trie"],"tags":["前缀树"],"whys":null,"difficulty":"- 中等","description":"实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。\n\n示例:\n\nTrie trie = new Trie();\n\ntrie.insert(\"apple\");\ntrie.search(\"apple\"); // 返回 true\ntrie.search(\"app\"); // 返回 false\ntrie.startsWith(\"app\"); // 返回 true1\ntrie.insert(\"app\");\ntrie.search(\"app\"); // 返回 true\n说明:\n\n你可以假设所有的输入都是由小写字母 a-z 构成的。\n保证所有输入均为非空字符串。","content":"09613316c1d44c9fe745f0f1b39b136e2cd2338cc19428f2536e3f605695ec86933b242746cbf339110b985dee1b7838d176418710e7d15564ec7fe05c6233f374e783e141324e2fe5aa20660d44b5fae735f86c5c27e575b24bfd4a3f43285593a73fcee25579abd9df8e8268563259f714bca0d897761ba4607960f615d2269fb8445f650c205b1cfe4df508ed6ac84a166680104f333290c8410eee7c1fb1d9b0b3492ec18c657beec130081a716b4ef2ee903f2c958d349c2c3d4bad4e291b3df836c8029547add442876de7b3b5f039b2346865ce9f5f2b93af620b1fcf95d5b637c067837573ee8238e4cfec92146f37ebf868c188cab55cffa5978b623c8e04486e10ba498ea49fc50ab4d0f40e4d63ea74ed77d112124dd26108807bdaf5661e9e4c646ad054bf97ca08e1b27f49f3b57270c608cc50949f61c220957a02bac3a4825168a1ac65ccc9d8678cf7ef14085e6155d61d2be3be3706729ec7db5a7ca4b478ed51584b2490a46e03ff513db8678ecab6ccbf34f728a5a909be72c1c19fa14c1498c02ce824ea7561865e56c9d4e166d0ed747e80573fc2eaffa81e1e4e5c3a8b393fed9547754293262548606dbb3693e5d3bd3b8fc36f3c0bff6d3561cf0ce2966dbf9fbdabf5f09f04a929154d1c6c64a30016effdae5d8e38dfbf9c1c19d4024b4aacac87e0070ab2bf02bec71e4e0fdc7bbc7555841744ebd3e6a55de92190409f06254f5bc5a509085591617eb00935434864342f1fca21013417244c51ba9e9a5a4e3377f1d6e9bec7c349a11548a8b5ba4af17d5d596596276d0e4b6fd4fdef91ae53a0aaa1748b0c818371b4037283f7165288df1f7fe8814d20255c7a2d69f4347cf0826d1e766dcae5ccd9130a16e0dfa9f5fa4a0712e3b11a0b3919244d638d39c8ae8a4b7c4bd709ec68f523a5a76eb1b9b26d810903bd734867d18a999e291a5d35970218c650e8aae9a770f83b0d45fa194d65eb38455f8f558dc3535cc9cce6a7af1a025158f96173e5f11d66f88c1a8ec352f40b4a0662f8ef0a1c382b08b719a69dce75f47b6837937e759e70a40aba2e4c3df8a911f12fb6863c3bd9823e096b4a105bc04aacc0400c483c3f74bc6427a59699090ea712d155c25ae45be97b4692f0c90c3c5eddb6969b240a1b0c2d570e6d523fbca1f67a7e0ffff5e45efd1f4d345352ed833d9201378f1fbe2beeaae1c886a8fab217cc4af5f8c3a66edcc785fc1070fc8122987d9830fa0f21c87fa89b2ff20b1ca49358e0adb856226a81b78587586642f6e79ceed087f9a084e73aafd35251e46f801e0bbab1329b9ce749d234f86e0a0d13f528e6791cd629ec564798519ad94c2270fefcc992f2d4cce2e8514bfa8cbba2b115ae3152ee51fde29cd377c1f2f0e9c6704dfca004c38268f0bee56f1a6ee6a36aa42d009de430e7c6954e39f7fb66ee65bd1eae07ea33527403f81d6b81c104a638e5f37d5327e50b65b7143387ba0536f8ec5c5a5c5ca3a4cc9ff4ec9f68a906633464f6e823f856177caec552b81047a5fef0088000615156c74754438d32068e98ec779092b68f29f2f7371f4427aafa7d977f509f005a2dda3138bf550d6278f3d9aa33ff0617332549caf1b9f027dd94d01478508c75ae7093e1f6a95c1bb10c44ba335c7106dfebd24335b2e1b6d0a3cd94e6726d8d658b4a5e570722d6a49078acbd4a029bf559bd4f524501e39e6e9b6872a96690cf34087d031309131e923e9ad7ba2f648679669cabc8c1b8a0778415b20b8cafd7b9ef4c5d883a306977d236dadcf624278fe00b51f638f83b7aa07e4050b881edc997223f332a8ac096dbc7dff7ab801097e06ec771dedb83c7720627f3979fe4c5456b62c3f8b26b3923d074b62ad1c1b878463b76017727eb43684ea24df3249218b2779bc93f6305093d4f8ee529e52e7f01d5715633dd5a34c0f817d046ae9959b3ab00b0564d3995d903ebcf5c7b4e0718bc5191249243c35519c8ba3d1e395c19cd8d640f83288475e477ccb8cb7b732ea8f02eb6463954945e7448ea1f20cc27cd142388100a22bf8b49fe87faad7bf0715cdddd219325fd5aae9bb621a6d1137903770448db86c93f1329727bf9b5afc70c41d5fd4e9c637b1e7dcebe92e24bf6d9482409977b98c750297ef48cab48b777ed11f5a3b603f2912583204198a13c208a108bda5cb3282a3755409dcc9a7bb763e3474be5e3ee38919d8dcea8eff989e775f5580b37f954d317a93c8261793619276306e0fbbd414281bced05968188375d943e43f4736f2b13e96a8f4d6f8b007dcc396dfd245e8e9de15a01177f333df4b304d0997813d3b9487dc613ca610e6d632656e846cabb69a9d9f2dc53f650fc7d2b188139d87dea64e96c719b407b2bebf6e76c8443e5e0fa877d862fae9e1a1454c712ae6f5c315b976c78e1d42d61d990edda0d9470afc46b196f7432b4389d9772699a0621cc827de6ae5b5a1203dcf6ea22dc7a7ca1fed62b4d5489d05b5c78a96ff735b9e9ebaa6508fc0acc1543eef54134bd15a5a1e07e0d5fd9566dbd0f6e440eb516d5e287105c29be0648720143372198cb4130f0a37cc195bb6ddc07cc1df3cd7cf5a43cf1091af9a3f3bda50ad4a3cdaa6424d2bfb058a4f5bc6ec4e97704eb5fa8092594ac5b7878d13f5be16fae306024730b5e257fa56b3b5f288c8231b690ccfdf1db3ee8d0eab5c7e8092fb0ef97c1e770bd495404a64164b12f580bbde7fd4784f310145cfde4ae61bada012d1f99c93d1a40aa245b94544b5c6a755e14fdc1f3ee75a97a34d88daa36492303696b4fc940cdbc4f1fd5d3b9eb1ede774bdda6b9859cd7c9414c75c4cf650727f9b93ef960a25b36f80a0b5374cfc7c8cdf534dd87638425804f892dbd5ff9433609540b96bfbbb1ca4cd729add87895b532256904b53e819804bb49484d8b3b914c239bc69ac53b6f01d5c94d7c14920df2dfa3fcdfa73f7106441524cdafacdfb12b62cc4b8d1e24e5a8aed45e3a9dbfa98bcdb5ddcacbdc37db6aa30cf60ff9cf3c720d9ca3c6c991b5f57bcf860c327a6dc2a713c00f4ed825fb20f27bbcac41c9b606d46855dec0967bd6c285887d7a1cd856e01dd8fe7d972dc360b7b628ae942bced0bacaef8093b0a3d67ddbb95888c898e1dd50ce08f1f5c91fdea6813555ae49275600c433418c5f5994b88ba538b871bbe806927382e0bff066ff8f6ed0dafe5d7985e3699275b5fb08587b680e49e40a3a104c35ed62ddc010103f59049f42c88c8298e5e17456dba504a19f9c6c728d17d694ab35c1df0f5b494b52e1619c299b917c05814ad1da98bf1d8c8a80abde1f214fea393dafcaa3cafaddef18db6b559b611ffabaca1ceded579a3b0659ce87aba6faba1e18f11a089773aac6d6c113c61512a09be2c947e1b0690a317fbdb3643993ed25bb015063e6c2e08d810a02cf2c50c6b62d9dc2006fcd1dfe61067720f58f70083e4f9e6de09963e5c2e6ba8e4063b724b7260dccac71546024dd93ea0888fae1d8e59bd0e1ab902a5f82f35f1c8b4d2b6af8d85092bca795f83138b6910f2cc03a2bfeb5ad4e6bd9f168c5d35a0539364ec9a2e31d54b26bd4ab8c05ec07ba71b5b61d47e2a69cb094ddebffc9d6da07abf1d5e6b8f7b5d0ba9a847bfaef3c9a3d3758e0526f512fc9940cd77602ad211e08f3cf6686e9a22610321ba6d6e93a27966dc27d72cccc933aa797961181318a275dd650449ee1181b77a17c6ad458154798cf63288d60227303eb37bb3674c0750f528e480e8e9de0d8f6baa8cff60a8826f9005b5d74c437c1208813414566469f83af634499aa053f6f33a8118f005ee12c7c02c7e544a7a9d399f1def4d4e727a5570f3fff7841e4df395486bce3b98f98cafe44d229472dcc4720b58bbfa8c4ccabfae95f63483a8b40761c46018cbb64368ec6d6449d068406c5cd2df6a4211c97607ea6c33273223d06359a4ea94969c27847ef89cfa1e6750710851feec199f03766e20c8b5cd1a80ee9fc86eedb362fe97abe4fdd89142ed764e5d3aee8291ed4df0970ca2c660b02ab076ed58edcaf50b538b258ef782b29bce0ba9a433491d71afe3cbbda465b7d443f7c96a9d2170b46294620eec6686c44d7c61b9d5b7d35aef56ed2ba3c21db5dd4af03bb5f00c4cdf09895b7c47061752ed65b7cb4088312b22a329c5212a1b15f660ad0f99399b8d889cc682a0e0f7495337910dd4f2f4b071d7da8ae9c80f943c17b80e15bb13f119d7d6bb6ce93b625d048cbdb3f1b1c0649f5494ae7b8b9b2e705c59d585af8691f63a7fc8365836fa4268148ac28d5e3304891536dbcdafb4cb803b8ab26161a3a5314d4dc33c0f6a68f9e8a91d5ab5c2e08d037942ae8deaf21d76312b3fc9f5779967f1602a31245232d402227137d4bafb0b1acc3592fef877ebc0164d9bd5b8f926d29f0b2bac5d7dcfe317cf385a33142356fd9f3a740680870927f858cd763e8033bb057eebb7e2a752ca17ec1e8dc74b1b243a9c1b3e8aeef0aab388e718958c6049a4189f9dbb2faacee763807fe422c3a03f43e2e538de985b907d2668f39642b509bc777267f1c6deec8a475cdf6e833fc16cbb5be47687d7037e2b72446cf005200804af69b056a8f8cceee73cfa600d3b153c1f56f28d7c73c62c13fbdac36aa56efd1c2aa837408263ed8ef7aecb65c3281c24ee67c8d4f4d3b2677ec8fa14f78ddbbd7006bb84f8abefa937d8587339e7bad1dbe29d7e67e974b6687f432a3982d6dba25d04e1ff335c1c1544591f4b530a7e3a44984de50275f7119f9381b8d29bf4aa769e1ca27c6bf9294df61c657252f67cab4b35b6ba8978d660cda43c6282378774e0a879348625de6d7321113573bd1881f99d8b267f0b89782c3dc73d7f3209f2b58dbe473591b7b745f437e43c62f351d78bef44078a90f138f74c98dd0979d197de99a04d2d85b3f16e4dbdf753a1c8e163799db670adb6f0a2a1c6f3345662d7ed5997cf38e2613934b48c093d5848ea876c1da3a572d1aa9604b46b428aea181fc6d9f40cd50039573f6ba7ae69cf247c3a0846133552ed674563d547f23443fe2310af075d60b6f2c4ebcfec6d509126e203f8073664ac99d5dbe9f798fee2f45b2753c0f45744e6746232998e8d011b458c420408c659e807ad5958598a5c95c48a7e686c611547f90aea1aa2072879a3b55ff1b0c1dc0b908f33cea5a6a8acec211f0206b2dd10782842faf14d5907c37bba093e2b9daf3017b0cf262ce8f9ac55e3c46eea347239025a2e3ddee8cd8d9e79382464d6f3c55d3648bcc4fd7625985c502180ce3599291a8e4e90e8d908c2833449305a96d67e1484881a9be6d93f9f22bd46163dfebab0a8cd54e1cc7d74ea7850a0f46e0aeec2520253a2456dda3741a9f1e0be90869f7a3ba67a260805bad185ccfb980557ec7d205cc8cb222a43f5c1060bd64abdec5fc0aa60d0171b6625117f56b643a3da3b943f6784619f1e9b7c7d3f3bb220d293866a116cab833297518bc7351542b8cbc3d9c26ab974f0c1adaf509abcfa4149b35c40e633c433808b2c530c4b486f8935f0c095cebf00d2da261439ac276faf8a661698c137286efa5c8d77b8d9961b3dc7675f48141d703ff2ecb02d397953f5a4b62477516c338fbed6961fa191064f50d281d3dc61eb6979fcab1b56ed5aa588961f7d7127b3eef81f19a7f3258345cc054fa8ac85e495b507a074fa4891133cbb40ca881a3582071dd50087dccbc34dff6d34e1b4abd239258d008fdad56229df9b2d0033cadc68abc811c17e59fb090208a301256eaa15fd4ccb6985ea40d1649ff864055732a1f95f0809d7cfd0adee027a17328143e8cb588d061461d63143670098cbb74883b73911653956e653ae20d5b385cfa5b5089bbe7dc7c030a244f65036977409e8b7db1ebf7325b0882e862ce4602003293d4e2b4cc13c302dff18606c823663ed82b5e4528ae44991bc7525cc6507dce09c79440793e59c19221f73f9f2273f5212db006d34584a93afe015d756a7d79b4e1dcdf73e678a91091442e7d2e8f4d6ad65d44d954918fea7a7f5cbc95c7a9c6e20cd123e5d9ab0dc97d8526a322217d31f6a0c2a2c26f8d5bc0d459e9030cf9c678c74e96b8ab3f661262f71f315ded6a1fbf02f49563be421fef3bacbd4f5229c39b88f2ae3876abd13aab2a87ddcb2430b8dcf75d1f66b9d189a722bfedb4490a95340609156fbf2d38e09749a044890cc90fbc5ab42358ac0a36c0abe9eaa884bd1fb3991695ad69804dab490eee944f974672078118990bb55c4b3f933c0da73412526e154c5f29ee726b1db094ed83de79ab091ef155cf72387a3ff17f7b4721875d93f0671763610b4d81965c3a4be96c140b959b29a472d875106752f711564b27bcdc2274267dbfb5b3dd20fcbe3161f65ac226e6827c505abb4cb51fc5480c40f9e0461fcad67181d607e30171351040c8c0317249e880e072c87e445e0bf416dec9843f597949876d9422a871cdb2b3c67af5baa23476e241a55af55035b48de72d0e55798d844c15dbefc0f227fd9cb4834ac1a09b5e912eb1d203c19a81ea85ef8f423ff74f0532f9bc9c6f46cf84cc33b02a656317d8d03a9803cea86f36e906adbbd89854a1560a6480c3b7bc1a9e487bfd6e746cfd90ca95c3ad3f44620398da81676c58fd73b7da5082af9943c8de058b29c125ee176fee2ddb218de56fe50ea699428131f348eacdbcb9e8f500c86e0883c5e96c0dd657b8fe35a58e1faf4c99f8725746ed28a52c55c89ce76cd3c42dcddb20f9cdf7d9a9a75cf35f863ff65c5e9c4e0eecfc2b394af9caa798eba46bbf99b2b7f85cc7b94d1f044591b33a8085b00fbeb9dfe3a8077c59f982bcbe46e23cdb36167c083e070e6a3e0e1812a2e8970617e1a5142a8835aab962dbdb568eb3b0997bc7ba4219d54e0de29bfa6728d92647c8177bc3420feb6d7aff1b5c8aca8695b1ee5b5e07a4d48d8abab16ae492a907b8e5368f286d261de4fe0defab27a8c978acae083e4d143da4c867f2ffad89a622b3a31d7cbcde5655c84655fb66de32b79e361b49f8d0b85b218ebbc8b4d9e54a09a85c43cfd371a29747fb48ee9042fe65ce23fa54586bc4b3d453fec28cf5f7889a76dc94a2aa30df81e6801e9df926202abe87df555e33b0c69e1834695dfd984f263b29f14b86e4ec84172f6f7d7592cf37d23908c86c902facf12ea5cf9d239f80c699baf8724ff4ea07ea63360a1e18aa0052cb4305e297968a0dd5d1c93f33c4691ddfcee8b244a9e5dd2d790a2b4819227afd323e26524a4a6e696f5b9af4a385be07b0275cae7b4f1fe691b0ca2816019dae36ef0debfb3492d1106518ba511a24805fd015a8140571a93dcb720277abc83f1532a8e6b0db1dec3f6bb44502ad23cc0d5a60567daafa5c0a2c3c5f1ca7c0a0a5b3dec7e2072e42a50405fe6e19684064d9a54304cef0fb9befb6e6734f6e14a95fcc2e7180d600c78c1d8cb33fd2299776b7a3c00bfc72e57ae69ce94b0832407b383d21495972c1325ec8d1375912ae9b466a5f99017a48bea000b16fd62ef39f4d5ae74abc76629b1fff441306bfad2e239d7fe1282991d37aa0d6cba2a48328969509edbee56f2817c22039efd8d375a535adcb1f6499a43a324fb490ae0b200689e105fa9cae3e403de73c5d280e24d5635f066245d80ac5f5206c6a5cb752e34300072245f249b7533d281ba1041c441fbc45564854720cc34eb4df66b743150c8d9ad60418717b3146ad9ee1e78af273743cadfef931fc35e3640e2c882a2a986f8fb364364741dcfff1ab175ac738aaa1267ab1f966ab86e35d37d5c8d88f5b18e9b0ebaaa12563d20e476af9faadb35a3abc0574328c26ffbca96d6c4b49b8c89ffac26fcb19bb555dab15c7bf109e1573bb63bb446c2d52b4ab8b05a34def9199362abc0f07336fea525dedceb146118ec9f9a8370e2bc0b5e49f2f0d1d170b988e4ede2883a86dbda8f212a8d402d37bfc61b0ca956ff9c2a082ec15ee6ca0056c911caf5349128928800f282b888c97dc20f53c2a7f42c7ecc868ae0cacd7a5685300aae4dc96aeb805e1e3ffd8e3962d2df178f7db7a33f333101394fa05308a4792fe8428b855cda54bd502da1247c5054e720795473bc9f565a0da2b949204aaa3d3e3afe515d00b78ba4d949b57e99693c04bca702443153f73d855b8c073d81fa75553c60518703679c6dda8b8bfa8b29135dd563f0e0cc43253258205774342da969e176b54bb91651357373ca43de655852876ffc5bb799fd2ec62814f75ed2301994baab22d82bb3f9e1de61ff8c9ad861ec79361f97605f39820500fdd1ae4e83732cc82d7e708ce6b63ffa3ca7b49ed5503d21287c26c945f1f197d146933d886f28d8bebeb156a5422d855001d65f90ab11fdf3ff0ae36d80fef698e7187ef89288e82067ebef0ade3233425fbef2b141f88e36023769fa4ccb53b9b9373dafb5f0edac0e3d8fcaab06a71f9218839d26f0d9432491b181536bf9a420687e9f1eb8e2bb6497d50430a214fb8284b6a23786d703663da3734ce4f8fdf328be86592f5e9033a47ccc45f3a6cd17a6bb3a14cf4e491fdd500a0701275d8019222051f0688bd929b8411781d3c81c1f8040a3e4aff90253db93676d6603b32b8ba98c6aedf33ac8d32c6ca726e9435cf8c32c4a12642d1253aa09bb7e271e5838ed306cc3d372e6e024ee63511ceb72b11f14c075723fb09034f076cd24b639707509d9f5485c909fad93ec9893673f31abbb1e36ba204a67d1ab1f261cc09bedfdb3c2e5b1b1bc99407ca7bb2db54278c2df76960a9888c97a821369954818b30475f390b114c874106aa0984b6da20acd776f28d9f910658e91615b20ece9ab2543bb7219a0c948a0e8d0f78f0448b66479d4ad2b68d933e19afae0cb9e3001140d5e7c48fddab88e9aadfd3e6964b358b2c019c08d7cc77afc7860809d43711ab2d2ad765457b9596c2010bfa90172d62d94158e93d4dca2a94050bb12e86ef94cd218d33fcf65b1725ab5fd91b126a947788d05dc4989d62463efc9e8afb49b8b463b03c73cfe406815cea30931ef8b09ec793d9a4ae820413e0e614995ba910613aada0611180c38b8b61ed5788397833c997eeb7741820c43daf0f473850779c473023bf616ec4d7d9fe1a0965b3d6eef260c0bb662c0d140f056b6f5525274a9ae3c43eaf804ba0730142c2c42d785a99d379ffa8e9280a9fa20417e66c7ad07ce38efd60a89230531050c2b15cdd2b8f85cab32358ffe7b8b3dcf543f964f1f072d8474f09844beba8d424f8f604aa57a8a403e1774f7904744005f722da5a66c51e943f04a1368ee1756fc036c9db26922a3fbe4303abbb9ccab2503aee089abbe6038b8185dc97a9cf3a48481df1664ed367a588567b367e7ac447e00788a7a8b8cf0b3af5f20ca2a4368683fd4870bc06caf76c9a231304d5dbcbf0e59a0fd091a355a691afebc68ef0d7a285b091ed353d21b4459929733feabc754895e41f825d7dc7432a22b7974caa0b1f7994bbd4c12301971eaf1eeb301bf8b3c3ad63708b9ceba8620685da2e8d7c8700a110e6876c74c93cc17df355285f77cbbce27a463485ab16da9cc0a2bf0312d7275fc52214453008f1bdfa594cd5134500115e1fd55101e9477d84987cce0caf34870971cd94e1f9afd310d56f6d543fa161276b8e19cc52d72020268fb66af0272ef2441f619f06331c1d048a59adbe47c49ad84b3c3de3f3ba17b7da6055202237387de4d70fde5b532e9bb78439538e70247faca8d92a18987e3f9fb51339890f50cbc21bf2866b7c0c9f0f999a6cd3e409751724a8f442a4cee4c147d22a5e05252a61755109243d7b7cba5c2a753c0e20d56a0171ce3e562e967374e0f14b41ec1ba8da5c771964998c1e7dd82d2c222a10f1b3309674e1377ead82cd62831d254cc53b8801d847d5bbc9a8e364de9099983a1d685df305b417ae6e9c832d5c4ef6dfa52f90dddb5f1e11105375bb032efef6251380c0d728d0f53204f2c27fe712891ee176b8eb2567c81c6b0368307bd44910a1fe1543c206631516649aa95d984d3c14723468aefa3996879a416c7b8833dd436bdb07b242d6aa3d2d4b44eb9ab3f94c2fab8328de0917d7d46e322949fbf014aa32525bfd833c8c6008933d8f8a39dd1edf219cab7ffc4f3295b8f63e29f468e3d0297fbe66aa91424bd0f02c5b7d1e529b0f64eefc77bc086318d73459af3608dc2e7fe72c4a226b47029394f623e858ef29dd7ebf1e0bc1e286b4e8d79c275b46b4a728daeac9a8d09d57e790f01e37933451011757d880cf28d87b50cda2c3e28df6","title":"实现 Trie (前缀树","link":"https://leetcode-cn.com/problems/implement-trie-prefix-tree","question_id":208,"issue_number":76},"74":{"day":74,"pres":["哈希表","Trie","DFS"],"tags":["前缀树"],"whys":null,"difficulty":"- 中等","description":"实现一个 MapSum 类里的两个方法,insert 和 sum。\n\n对于方法 insert,你将得到一对(字符串,整数)的键值对。字符串表示键,整数表示值。如果键已经存在,那么原来的键值对将被替代成新的键值对。\n\n对于方法 sum,你将得到一个表示前缀的字符串,你需要返回所有以该前缀开头的键的值的总和。\n\n示例 1:\n\n输入: insert(\"apple\", 3), 输出: Null\n输入: sum(\"ap\"), 输出: 3\n输入: insert(\"app\", 2), 输出: Null\n输入: sum(\"ap\"), 输出: 5","content":"096221c37c5f85fac03c87f9e42ff6164f863d84cd9d3ffd50693f586f594225578280276ec8fe003803b457ee1471d664e68a0352afd90738fb28a96b0579fd0ab8838e1d261976e0ce4579691b9d8eb33e9b09484d857cf73dfc2660576408b0cf48d581335bdfacdec8fb7114407abd53a2fabf911344a70f344ba46ee044ff913a2a46474c4759ad718c4cc707b76a5a09856724187acdf2157bd5a7f22771740f24f04c61ebe6c42dbdaf185558a34443567a341260ab3fea744019a1b09e171b815603974c4073e6ad837c3d72b41220d9d0e80bea4d56e9b423520b9aded6d1914670e0293a6236bee4c6dd93304f34fbed68c188cab55cffa5978b623c8e04486e10ba498ea49fc50ab4d0f40e4d63ea74ed77d1121641d2201e987399f12a039e560b4d8305fa1801e82b5da3ca193090ec55222f17a2e61de276fe4d6ae1cb04a8f9a74f189e110d8756d3a6c2b8bbb68cd44e912ad299362c4b9ed4df9c2f9451f312b1cfafaf555f8c50e9562477c77fa5dd5b73e53fb2cedd1327e70635cdbc513094c6302770d908389e3202f79bb962b8817906db57586759f7b02c1f5d40e72d958f274ecde9ba07daf48ec8fd3aef6d221d4bbb7e45a387bd10b6feeb2aa06e55893d416f676f2307d56dab93decef2be3ed5ff271b7fda69eb5f36169acd1e8baed46617252a8ea8bc9e0ab2c82e8bcc1ce962f0c45be6c459086c78a363cb1b8647feb0e3ed181883c0effd377efb772bdfcbaae1b9ca46bdd1f6949180c1604f08a189bc952919515b5e27c56daed462352341ce6bb2c81e19eafbc1a0b848307b4b5e5dbab1bffe45f44d1cb021c3d64f728bc372069ee91b0094f8ae95fae8ac3ea1d7545ef1b1bed7a6bff5ab6f389070156e7f4c2e4c1ba5c008b1dbb541187cfc53fcd4d767192ccc68a66db6428ae417b1d3cf55e9522cd813493ab5adfbef12532e1ef657179f31ebcba2b02db224a1c757e1678992181933a13937768ad6412ebc8bd77708ea9e198fe61c0a81f04908ef5b4aaa51c3d28fa24951050b112b229ac42a755fa12a92000b0a91d3186a61f042a4d9b17e469630ac106488851ce324a241543ae70cb02c4fef154b75b78744fee422bef29cda22db5fd10dee6b56c74e4489c11682fecf0b5c74dd287d47006dfc8cf19bde731f1ceff2aa376f8a06c3592f09ef977c0edf3688f2dd27d646fbe28fdcc6eecbd39376804f99b881168bf7e1b507e33519dc03b665dc7a8c801ea44b118e3e9775d08f0cbc9bde1f35f96f2c0c4dda1827dcbdccfa5565bfb6f4ae08e7b36c01b859e1573bddda0feac0de328c0656dde1d999a6188f2f25a155f8120d8828f7f8197c54b0b4d4c699f18dbfc90317ebfccb88da42864e36d6dd18b8868211f38f94d0a3316f83e738becb6db9d6c229456ab4f2433991dd40649fa994a43775deba3fe23fd414eb67ff5222787883020be7c36dcf3a9192701958d4481587477f8ad07f30abb34a0e3155eadee7dc9afec911895eedeee13c09a71eaa1d46bbc56498125ab4fdf80b8a346b5154de4459498c1a2d8dafc6799484bea9371d72b5db1a2df68559f1e0be14d78bb8329a3a9167037f5ff8dcaf34fd191a091946d5d2b6ec18d0a0d8156f438e45ab7180e5fa99601bbb1f4b92055c70141a210fdae81e6c452febf08ce23ae74dc1884c74571b07d6bd957eaaa6a7b53fff4a884c737fc71e4ee409160caf07c5c77e9401742d0cdc489950e4e4f04140e7156dd9c5e8a6c1b93435ba769335aec280ed414b659c72366c8772e38087024ce4dd640af6f670d9b5a85848e54149623c7dce84fbae6e2d5924245210326c926664b501f929376c2a9883ec005e4a1b45b4e5fd717f77fba8e41ba336ce0c4a669b85c99b64093fc26a688a39ce64f1717ed1f0003eaaaae1c780c01363a22ab2c5718c251e7cc1dae738924b8649c1e41987b919ac6c4a329efb49bca40f284e6a04c608c4698869b9005b84f33a5b29132ff6c463088412a929bf41d4ac8b2f1e2effbf7cf24f390fed31380ee45220d127963d5bc155646dbf8b0fb081f0bb3ebf2506c1d739ce03d711ebc2ba21f0905f36560f044092c89d3f5a293c3ea5e8a1c3771690f37cce3a750479ccd3ecaa43ffc20c28449c21cdd172503bb8caa748e725a857bcfbbf509e912dcd6f05ddaf7f2b8c0981dc19e0536d520704938fd23ae502f10050eca8a6619695c4b3fbb7a8cfa76da33e021df954d317a93c826179365061634da5a2fd5d5285e0fa1e8884982d108a1751fd68732c4a8b2bdd2c3b834974cc346dfa6559f39dfc190007666749ade741ed937010d5fd281ca94ab74b0e6d632656e846cae962b2c8e5924eb551e6773a3c8231d11b8476ec62408d596845a6f9ee7e8522dca9e3fd28c62ff2f537694fed12c32e0c2d28c33e31af93212fff9afc911a8367d28b73166b641385129d977239cf446d859c57a1ef0b29474ed4ffea37b91439afbd997e03008296012678b46fb92dc4c383eb3640c11ede4514a5fc1851f259e0e0f354741a98042ea5525f5c15bf58c4ad991b0e24f955560a7f4b4475ca820f77f09c6bd1dcd56bd616cc05fdc530f5e216894655adb8d997a50a99e29da43471c0f8a91df5b0f26c85ec7e02c14fb3096cc99a712f37837b05f868ac3e776c324c112565fb2d3a2c27f4e17ff1909cafb49d77b0d9eaeea4840927fea0d384e933bc4e4c40b74b7f842c1744f9f9a525efa1714054b4edae6cfc92122a6aea80725340b8685cd827515c27340e1ab684aa9d30fd723dd1a7f8731d7651276b09880c9ef91d73f798fcb2108d230a8ff2eaf2d5cdce0d59279c8962106ab59d7db129ee1f64bd4470043b9d83c68ebd36c0b379d86c82528460fb4ef07968775c40d3e6b2aae0668a0387d87895b532772c50b2299bcd15ba1c4856d4549f0f6cced5e4980f2f518ec967761e57d475331e5e1a3de9e1ecae9ad97de7e9bad7632345c24483d22339790ed1d37772405950602989a4840b972825c853ca0773d2ea809ccdc60f293a45b12b0ac5d0fbac6f2ee6204a05807ca9a8078b631ee10f0396fe4258de0667a24d751904b783da2cf438874e2ae164eb70d22241e82e65fcc4f3f795a1d01424060bec3077e12d0e706633cd72ce497acd70d6c8813f5594062391d227b2a114d88950f4a1f7bb4e852c01cd1193772a6422e1206c3a93d6ae5db33f40ec0d8273538597a99131052b98b5d5e5982afe7d09a58ffac3825ce26af4edcfb3b3ffff3023d4521c07f758a714d597abf36162c7ccc62f37638c2df00053f4da4383091f1953fa16767f1f12e1ac961aa5ab6682b1cdd68921e74badcb2ea0e6720178a82b44f75c87af9d555f81d4a2e21edc6980cd3e8c280e2354e7629ed05319601fd13c41e9c3d3e21f2ea0b02002b52ac7f3ad094070491bac52e9374fc2eaad3812859a108671b89ba2df5e4d838ab29270df725cca48057a1a87c6b14fed56ea9c1b50acfcdeef8e9ea767aaa69bf3a4cbffa0f6bf482fa7942838d7241a06bfdc2fc9bc297b6da33a83ac0f2ee4fcd720cce81c3fd937de5c1580fea2aab252530e97a160f9772b469a804ead0ff5b67219c3f1134103100a37a7eda2609db8afd9fb97a6abc4a5da1dcb8465817a4964bf19702473c0df71c9169a49a8efddd907cc242e00bfd69ade30042092cb41ee19aeb6162c12f87d005de55f8b31e1fd7894dd362996f1e06683c73bbe7a42910ab79b63fa8c7350be7abbf0c259b39ca4099dee02501c526c0c6d11229507d76fd39af4a03972ce60d72b5aa9dbc35a2911acd8356caca1aad877826df39b7296a9b04022d8076e693d3645471177b933acea993fb4ca2a6b2420c4ee8cb948226efe2a9d6d5fc850ebe70e42535b6b4a411005dcb3d7d26aca90bae0e1613bdb946d7b4b45a312880fcfcf1de76dc3f91ab4973116edb66b254a688b2ef662119b711681b2a6cccd337b07d66dc8b7e7cc5e38c843c173a8f436a35674702de7a900d6b247c788063b13b03b50dbd040fd0048567da3445d4751bb5432cec8b986d65ba220947310752efca595c31a21343945e078c8d2e7d29b8ff5937f344e6bc69ab880d167a764c06dded916f323783bc4956fc4bb463bc354c8b229955211e4cbbdec9cd4ab1e2e316bb82335f166cc12b26c60ac620ff4d2211975d8aa8680bc9ddaa568474f5f07c07e714a9858436f445228e6fa9c9df901a434d4e146b17154ca2e5aa8c1d88838d16e8c876a651c1b49e53e60cdb8b9b2e755908c515ffd670a64a7f4c77e8872e169d51b8256ade9324ec24b289184b240ec7d92fd675a137e4d78fea34c89b8efdbe1f5edd4a755064e8e58947ead93ff21ca6342feb1e14c53967f1602a3122c6d225b3966577d5fbeb0a1e38b0b3fb0c663fd1d37c6aa57c28a7d35f2e6ba888c82f05277f88ca36a681f6fdbf1a56a680870927f858c9e76ad4729fb48f1fa69622160917ecde3c970b0ae45e3a3d8bacfbb02a674c87cc011d446b5159cb79eb0e9eca2285d55ba4b361003f43e2e538de985bb05d018ca74342513d38e3b0b630a66c7d7b22c82b5f73dfc339ff4b91a27702478e6b00d149b45126fd74a82c94c2fe1c390ff2296f82aaefe0185ef6f7b83951662c13fe9e97bfa56e883c2b69e611c6520deea7a94f31249ca8717e83fc70c1d70727fa586a14278dab49f393592788aedbfdf3b8bd57c8c05871dbe29d7e67e971f6585f63ca39f786aa0259a011bf663f0eb544591f4e81a8de3a44984c7436550705ab73e01d960a21fa42ed6db7bccb99cd8cb61c65f765d6ecaef99716ba8978d660cda43b27a6a7356450bccd0546e5cf2856a5f3a5b3cf89328b3ace02eb5d6d8c6869235aff328d6650cdbad73441b6b6f11453a1ac662671671b3e94077a408189f6e84cab0d49c6f5ce09a5ff8f25b3f16e4dbdf757453ca533980cf2261c07f092e1227660c3b432c90d707a3dc6355945c02c6d5d799bab22a88d8275a3c37c2673646a971eba9d4e364d7388e180bc636bafc76e6cbbd1587a99e4b61107a8326183d44660b6c15e2310af075d60b6f5e0be8ffd1d60a123a666b91767344dd9a46b6db6299a01d5be06432031d2e5f66427f62cce09918b455c4271bdf41d5ef7a82dad7dcbfc90f41dfe686c611547f90aea1e237728b98304fbb1f105ad8d645a335f1706a8acec04ed8206b2dd107d2d16de313d9d47079f2a084e1a69489017d06c8078aca9a8b117803e7e5535bba66eae394a08c8f96fc99cc6c1e3a7155ce649bd765fd6259cc83025b44e3519297a8a5d35c8a9aa6227942db18e53335ea4916eea7fd25dab5b679912f6af5ebab0a8cd51c5993821ce98525080abbbfc6243d2574711a91aa5e1a9f1e45a64c2cf7beba29ed24c555ee0340cefdd90d30f8d71eb9f2bb398e155c1060bd36ee8a90fc01f2161c7bf33f4715a02e30746ce7ec679f371357a5b6d881d3a0ef3e75576b11e842d2e2293a780af573424a2f99a665e16ec8d221435e9ff55281e7a616b135c40e633c0a765cc0c32bc4a89cb0931945c1892b72dbf266b395520cbd667c55e6916ad49951294f2454d3690c925218baaf714ddb41fe13bb03f1147a78af8ac1f0baa03c8471ada82761aa4b2170f5104878798365cb97dc82f8e37edebf53921b8f92543266f581a2ce594a1171328f10bf82c1444025232a4255a4cb5e7c879e0ca881e017753f8952177ff6a71edff6d34e1b4af36cd61dd015beb65a229fa5a5d14c758788cfeb816845acda989036cf084840def475849ef3de17fc173c14d5864055737735c8dac0dd75912097a2e26b91baa9d5072f405a8da5d59eec753667f4f33a5598e958a1c750eac8fc5faf9ea2da35c7ea1e5111418eeec2cc9cedc9855d34ccc238b12e739f9db5202db607c7efa6e92d2a87da841d46fd007475c048e9b0bb2df4b1dfae61d823dd68e0cb2681ee2fea0347b3fbc3d8565afb52d04da9a358f99002e909830b1fbcc7271016e38a91bfe0da33e506fd54f504cdddf9da1aff80101c2bcc19a981ea6422113c476f64606d9360a6223d458c1df011c15cb2bacef72d641e132cb305e8067ffe06ada03d359052a2642a4496efb8977fefec923888837f87695f9e7bb9c262e52752dffe29f09e84a029c6db341fd23ed96d5c21b2ae401a77eba7a915071d4ac62d25658ff144b4d3e181e420e29267e35faf52879404f92f924dbcb855c3eb0c3e1f1538191cd069609d527ee541956eeed6655d8e56c99ce50ead1ad248762fb848c0c41d988e859f80fa82a13a9fb5902a50377449d5158fe111c121d6bfe1f370ff8dcced7891172c8899f5a4a4a60f36f7f4991c027b3096a66ae56ad61b165050d9424b263db1b45d39262695d1fc9965fcd76366fc70c819e0ff353515ef0ab535c5064304ecbb4d00e6db35ec8a57c4066978026acef1315846e28aca72c27e645410f5448d9aca334879699d61d11ba867ccbaf38e50bcf4a260638d6bf108bc156bcbcfa1642d056e908c4515c9f2c7e53ce7d39ad74fc7bc9874da61e8be51cd8080b89dae980970e3296a73b7e1b66f4cc0aecc33b02a057c01d284218917ceed7c65fe08b0ac8bb263a1105f2ac397fef31dd0142cfd707416bc9285cc86fe6705640899ffce797652a131f2d8739985f50c9ade0dc8668f76fc587eee6ad46f8eaa74a11aa6d2738178f354a3c0f9e8e7f70ac26c2788b0e9775fda08e6a57bfee274e31fdce3585746ed28eb6311c4dafa64c9ce24d8ae20cc9f919dfbbf38a214c334bd4b438f526ff6bb267544bd99c597a8d976bf99b2adff45ceab4d421f6fbbbc308aafb005becb9ab7fd55664fb49bf4fd5ae335cd21537b207503193d7d11161287bcd6011eb5e0512d9d609efc7f8fdd528db3979f73d0805e5dc70f50b1b1842f6dd9610e9e5235c3125dae7f76ea457697c0d2b0acff075c02edc39a8cadb65fe88af059a9e8319411132e5eed9e52aaf833fdfa63ddc6477101517cea954df2f5a2a3dd7ffab34368afc5471aca5e4994688d66f6cc62483eb184f05b68cbb0cdf4d9fe5608b25c569fd571a98e11b407f59152bb68d36ce258677986e1901cfc8ac0b5f7889a3093c6a2a273cde59fd41edef969662aee81df5e4765ef87893229690bbc9d120c3328bf04c2a197c73e63227f3e8fc912d36b0a893dc33ee58e6bbee59d6dd0c4deb38df83c00b0ff29eb5264631e51b97e52985401e4818cb24ccdd6d9725bba664fbbc9a8b92bda8fad065343640c5c3850d7727e1243535f2a65675fc9f3e6bcbc4ee84941a5711b5fe691b09a7d544dd4ed6a8a5febf37da8d7596976e8154f3f8a559840e41b3b3ab10c95164523e3c074417dadedf2816af84705af6f02ad23cc02556093d517769da1e1c4ac7bf7cee3ed8ec0caf52c2f7dab4955ea2d187a654adfe9024b8fb1a8d9a7eab173527314e70a80623ee58400cfcd48d8fc3fd46a8d76f4eb8947ea3eb16cb4cfe9154654262b6c6f3a635972c13203e28c783675d4d8172b588f4c5e14b4ad49a601d439f4b2474bfb5ed53e23c97edf1e134ad1ef6a61d678ce7c4cc5c8508a869ee0e89741a6bf09edbee560221d900c23f3ded434bd39bade1174858627604ff5dbef5f361f8bba10ef85fc614065b94418260e2e876375066245ac08d9f2642c2907d41cb74353526f4d814faa55276f06f1181c5556901e1f561017488646bdc44cb743615e99f5924b5c347b6a09eace88b4d9e56e6f3bb695d366b367a7644762dc23659e27c2fa7e300e4dd2e2fbb4265a8e38b6f73961b0bf66bddbea4a2d9acfc4d51b4daef9b7eefa6131f87f6d6af9faadb35a3abc71267b800eb0f0b8282b4b47e68084f9c969957dea050fee538ee71edd1b7dbb02e70d70701db9ea9644f37fbdc88d363fc3434b3a45ea525dedceb14611c787ada87e406f85bfa1d67a1e531a1b84e563c50283a86dbda8f212a8d402873ef877b0df946bb191b3c4e611e35bad196d9a3f82080c04cd6ecd0429269e968a9a2db9645a7f5886a5f0248478fe9ee0061c44efb1ffa784b805e1e3ffd8e3c46879a42ae9db3376ee6e001393e60720ea24dcbac1709864cda54bd5028a400e9319303707d60b7a9aa66584857c98af3ca1b497b898cf41825e3da167949b1ea79fb9a9049f3e70571f3a7c62916452a50c883c99dd49d495b192e6232d2b1a6f3d0c7cbd75b2b0f1a854f888a4149fb8e5c51d0a3ed093bf3045ef86a7e644e775ee06d17a3fb1cbf57ad0d6e9279a3e5fed2301994baab259a4a033b53ced1ec6b4a7955693df77e47c1ff3980a500fdd1ae4e83770c582c9a241c13e7ee3d4c4330da1307b961b879946945f1f6d2f5d2c5d97c2b785cba5e43f091a669d0d000065b80abc1fd83db8e0528c0ff2699e6aadef89288e824f38bef8acb32e692efaea2302218fad396660a7facc932c86834fdbbf5c348485dbd8fcaab06a71f9218839d26f0d942b1a7157177fa1c40a098ae1d9e7db45f311004b690a214fb8284b6a75640b702b63ca2c1ece4fdd9a66deba2bcf8fe41d7314e6a1505437bb3a41","title":"677. 键值映射","link":"https://leetcode-cn.com/problems/map-sum-pairs","question_id":677,"issue_number":77},"75":{"day":75,"pres":["字符串匹配","Trie"],"tags":["前缀树"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个较长字符串 big 和一个包含较短字符串的数组 smalls,设计一个方法,根据 smalls 中的每一个较短字符串,对 big 进行搜索。输出 smalls 中的字符串在 big 里出现的所有位置 positions,其中 positions[i]为 smalls[i]出现的所有位置。\n\n示例:\n\n输入:\nbig = \"mississippi\"\nsmalls = [\"is\",\"ppi\",\"hi\",\"sis\",\"i\",\"ssippi\"]\n输出: [[1,4],[8],[],[3],[1,4,7,10],[5]]\n提示:\n\n0 <= len(big) <= 1000\n0 <= len(smalls[i]) <= 1000\nsmalls 的总字符数不会超过 100000。\n你可以认为 smalls 中没有重复字符串。\n所有出现的字符均为英文小写字母。\n```","content":"0961e8bb5b12c3efa0798f5f328c692d7297f600befb09b4097e4527731eec86933b242b61f6fd223609946bec12491a32dacd4f5adf9e13456cab79febbaa6175fa90e357154703f5a41667c0f7377723f06d95ceee439231bc31cde8a7a9c05a2c810a6eb8d43e3b3e0573afdcdbf273c3483d3207e0c57ff5b1833ee519a37f39a8eefec94f767ca560ada276a0722b7a62ea4a404576b948aebe6b22fc2144762909844c46e8215c66fa8576f2ec8a6d4e9f3d25781cb959835b39ac1b99b757927be2019673afd75169df44742db37394501a5e94e64259e9832b532f981b2938de50a2458bfe3322f4b9ec84f92d0a41e081ff48653d6ccd22414a08ebb453d3db97fb38b913204a6f49a8d0ba12537f67a404f20c83938e03e9d56dfa0c2badfc55c3b2d24f9a561703c92a4ba30ce5d2193f895b0516b4d51df642fc5a65e1cb2e6c0c6cd7f5689bb2cd02c5d8a298fac8b0821989428f9c699a9011006a9b2c83d03ced322d4768046fe3f018cbf707a27a15f7cdb13db764331b6126ac523a693092d41618e22c74e7091996f7d01819271cda852c65d9303378078288427370319c08d7d6121b9ffb16912033012924ba3d972a3b43b76f5da2bfacd569287bc356e29770a9b6a0de33295554b62156084b154bb8349646342cb24cbc2d1358f4e942f2a78c381a407286c9da829c51bb24d49f108536c3bbfc74c97b3366418a65f522689c1f324d4fdea74b4e060ab79926fbdb134727522f17a1391f2e52371f7ef9859d0b357873e997e9f395db02aa024af4f3e98062cbd1e0d794206c125e2eb7abc0f223c35a2155ab16c433814b9f427c9e91307dc2eb560ac6c877611b18093e24b06869f5887d6c7516170705366e1ba67309667f4c38a2ac3509a80c137fa59eeb0adf006311d2a4ea61d172e6199a057dcf18324d8741c4fd399a81fd095e222fa6c1f4a44382a713dc0222255cfa2496cabe5385ed3890113430b314f1d20038f34be6a4a81a1b5556cf66b54848c5e85b597caba4c59752525904ca9556106a6001c446b01b59a027f484c6b990ee10b6f322d155787a98bb51bd0dd521a1f155c27a20d384b08db8c5404aacb3e2f95e4ec60220ed061709079710d345c15fcc5ac1674985caca34375fd7bf9bb30f0b0f122e6921616e31515d1dffda89386c425dd9314f0e7b50d6a13dba2dd832837b44ebdb8fefc5e2dce77cf01486f9a603de132f7b7dcae3121aab5139804bbf1b6b52fda7872dfb0f15a59e59e38c82563a718295ab886c4742fdda9ee5ee89cebb8bd227afd56653c577803a0eb2831899a8cf49d2343d97e880cea872c91f73f36f771825b3ee99f3492272cef2ed82f1f2fce8d16f4bf997b88a8619bd0359e85efde29cdf4fcdfff1f2cb6154fcaa00ce8342f1a8db68226c0811282bdc9b5619f8bdefc01336ac975f841a9d6ac313ab6d6c1e69dd5d35b09746a8559af224093cb56a63e74a3becd50b52a5ee1c375b3ddfbebaeeca98fa6de772446017f9844ae63d6665d1937ed45c60dba1df4be02d083070ab2c7a01f30e6ee5948f099ae0f3be4885f4704b6f64c1e807c54638c6280675df5f6cb6387d632f8cc0c764f96c771d581be198d0e95fb5a1836a441cfc7ad904b8afabb308729a77339f652e64647b3e5b9ad97db8a8b839130b0ab5e469c7896775543a09db82907bb19b4b15bdfc6da14c7377bb4767a375da75aa6d9ed21d08d9eee2e81a1e813299cea02c46af7965bfabcfcdb98d4c698b39cd1cfa8a82a70a7f02d6615932a019bdbefd636e8e8e58618afc3ca9a3c42451a5277d14424284d0f8d118191c7d203d740f1af54b1a04a73d885c021bfadcd4640e4373179aadb9581d2ed41323a42bffa60a113992c3a6a5f4e5966ba0ddd167e226b779f43d88327ad78e858c848b4d5dca4483baaf73b5ce9346b4d6526f9115a26b0bf157f93da771477d1449873f79f0bed791810ecf548528870b8a9f1c58b89ec8d4ea2d45a3d115f063ee70a850753bf3b4b93917cd36d4b5ca02fcbde947da8e6ae142cfb559dfa2d85408ed0f003145b471ddc82d17b234a41fc5175f2eab6064bcf9e89acccf3f0e25b09f99e9be64166a3284994f0401ba753c173844614b65df530ad7d5ca12e25d02cdc5d6454830c47ff97fd56c0a7ec5205697696f718fe63a6806c7554e994c94c7dcc08d094665ae20861a89bf4e2679be536c0d7c345e201016e52985c4a5769253a661aa28a7eea7d6bbcfc3645635b3a401282888416509ca9712e68973b781ecdb19e44180ff1be9b054bea44ffa9c5c183ae6ef9b9dac8e1c5e843366f8ce4975c3c62aab45a480cea59ada20dc4174bb4a580c5c887b9a7bb6ebd145dc578737f03f97cf6380e1cc78713397d643b12c2928b514966d4797a0cd55dd32c398acfd51d4f7244dbbeb0e796d4fc70ebb424fa3c8fccbb16cb23fbd72699706e7797091681193d5bfcc404c2cc639f8900f7b25d7c4ba261df5d9be0dd03fe73e0a4837a39f379a24d9cf0565030fa010a5e06ae6d3d504a8e94196d98af23aed3d2474e0c6e21ac3acc2edffbbe5006188856f12b40e1976bf5ecd789b222afe4a34f33fea93220d1e1c1acc6c2c0932eeec1b5d2dc4007969a00208c7de51eb7589dd5219fbe9a12bb3f51aed5ad3f3e5e1cbf2b1f11ec6fad1e962309b7e0f70386174fa727e2d010667bcb83b0f564172a93380a9874ea0ed43e2deee6d2e04ab0601d384cc2e2934ca7c6bd9eefc061190b4c742ead134e08ef4fab0d18d385b4728c006bc90674577dedbdff1e2e4904d962a3eee913b4b122d9e79b8d77160113458020ac0a6fa1d54ae8ddf34b713fe6dab1fa025c9b6b2ab5801784a25d54b7ebd8c05ed4f41bc04d85eb9ee83f621bc7d1d03ca8b3e8b416dd753118dede6a922e04f0bd644632c0fcfbb19ada8533dce866d2a5285e388cd965dcc67dfa3fcd2a7aabfdecfd7cc08687e5465ceea00fc19fef471495265b3d11d387719215855257b4bdf3a2c9e06b64a6145b4580d9caec60030184487200ad7e2fb87472dc4098ce765e315c67a950343e679729e46a7c972097193416a1d06bfa8d921fe3aa76c2ae172ea64f4214ae82e77d9080968412f7f1f200105fc1a74c41a0d694b32f85ecd7e6c0c856a60349a9343b0efd1e34ccda04587a21b4a733ec650ce7337867aa115725070a10c28a9505553f2bb1948ee3db9717d999d89b58ba440e594b688ad4da6454ad48bba9fbb2f86507e02410774b6d0597cd23a4f1083f526d25b236cb94718b5ff8facbd639835f1166ff7d9568225041e6ff51b7346190fd7a1930ca89241474c3e531640965ac09c03eb975c60149e7d29cd3cfdb9e90a420b49770ada8063de903ae4622a462fd502c1f3e4aabed0506b4f8a96dda87934ccec1856e3298095a16920662c4691d55afe8b4e43c5582feaea04e83189f8fbde1b04acd73e60e60ea599a77d4f232318cfbf62e248c09c197da2dbeaee98a2a6579ea4bdd960030d21285dd697efeb3c78a724536a81b86ff8c5a3f34a893daa87bfe603b99ea6182e8bcd4a37de5c1592e3471c1d98e744c9823bbf6e81a9cda80af62e91eb5e71a1d88af3c2ec898fec7469f77b726b85c4fbcd9083fbe741919e39fc693833b973101a3292d10ebb3d0ee05e365c4369a21f56649e9ff7e2435820d2ac4aba7caceb462177bf544b1add22d43c8b985be7831267dcf7b72d959d52b9fd8b0870fd9c0fa5aceac553847d95e705dd9f11ad6c32055309534d276e0c379a04de6fd3b2f4bc2db40cab58fdefa9dec99fe8c213445f1c9cf9fcc528d86d92f64de8f7bc2571d0620e495f4c5b304a5ce271828fd226ebb035169cf1593b657c33100f4eea15b29707a72a50b5120d46270e537d58c6d5acd106bf96d9a1c90d70e8d90b571217877af61fa194228220f69263a9ff6420b4fc60400c4ae75ee4c4b56aaddfe6a3faa2ce400b0f9c1ce0e399f03a6ac72b8176c1a83ecb3966194be6c060fdda2ec7d7681962ed0f18a7ce11983636034ddc2d4136099e328242061950ae38e409bd3394aee77a737526c5d75f40d27b88401e1340664f7d3f85d1f8d1b6c3ec98cc603eb938429fe1189d4c3829cb907a92e76c36ca429b8f66bc56499e85dac6c7fe811e7e642980383fb441cd028c11499e2d16bab45f50069deb8496b6d9e0b23a63404874d77a3e4f98703d170d1c6f9d879cceb412a737d3e85bea153b9d2e2efa889de677dc65d08e3f4f011b1aa82206abebb7fea24b829a550d94675c2beeb0c737c62eab3b44bb4cc7780bb9a574c7f67b4e0cb56b92348126161a7e1652d4a320c0ebbbc788bbcdc3a9553a1fb1609478ad8daf3cd72d55e6fed91e2ac204587fb8382c6d64146b665f3457a5e2e0aad85f2fe2c637fd113796ef47ccda3835b5a9f2c98e92f9317cf385a33142356fdbf1a56a3a4d23e936f88cca30e30a2abe64f3a66b730465867894b3ba32eedd4ba0eb99e8aeef0ae072c8b45b8c53c1793f81aa9efebca0ee21311ae8437f5e57f4772e4e8df985a005994c9339376611d78b24417d0a66fbc8bf6e8cbfb477a778cbfcf013277d247fa7b77014cf0b0f6fd21efec8482bc3c087c163e2ef00cdf71aafc56f7b83951662c13ffbe364a21fbbd796bad32c1236688ca677c6aa5c70c88540aa39c10a1b592e7ef78fe84473d4aeb26e2eb8528aedbfdf3b8bd57cd141c859fb2983ab2e9756209ae97db4cb070ef42587014db72febc1544591b2fa62afaaea1d84dd163a1c7019ac77058d7cf108a061abc36ccbb08f90933a9819750e6cc3ef995b6ba8978d660cda43c6282336380a4f86dfc4b3bc6708cf9ad49cb7370dca162924b62712405cd6863fbbba785891fc1d51dc9fbfc4bc9ea11006c632355337fab14e3be1465fcb268c8aeddc812907e7d94c9b941f6d53aaa09d3c335d891b789be87661de3344731c636f420a0763c89932a6c26a1af7040c859d96cbdbe622c1d127573c3083604b46b42eb9a2c0e433f4388e180bc636bafc76e6cbbd1587a99e4b67187ed6695669192d2f055dab7d4ea23098702d174ce6e8dcda0873736e75dd3b2e4a99930887841af6ee660bb221744a45201c2e032d0398e89957bc0c897054916fb98a28c6d3fddcbfc90f1cf5cc86c611547f90aea1b07226deca2c0aac22171fdc9d41b741e41b2ecec6891ae9206b2dd10782842faf5a9ad4396a8ca0c0a7f59cfd53341e8c48ce8f9ac55e3c46e1ea08b90fd22f582a641623512e435ed9dda8a7f1f9648bcc4fd76259ccca4c0f3f9e6ca0c5fae8f30ededf86286a079202b1527bd97d2fb083946d93f9f22bd4616399a4f902c59b4859da8201e9956c550afaebda256e2521241fd6a87d41b53445a64c2cf7beba29ed24c555bc1541f8b4af102dbcdf08e6a6fb6cf0440e5533c67f9384c3e71ee34b4748e8463858a025303a23a3a969dc78465fbefffac89df4ef295f606b01e85982fa6070390cf5277a4f13c4b920db7bd5df540c50d1fe0081cda616b135c40e633c433808c0806491b48dffe85f377242deb54268f06d43e1ca45adbfb47a33821a20e2eff180927bd9cb28abf6083db5d5418457be7ccd1487958e251219735b2b3c8471ada87a4b804b5522bc05747e6b874af397c985f8eb3ac5b44ecc63f19a276634bccfe5ce7a570a7050c01db4dec80d5f0652006855a4cb5e7c879e0cc6cee71d202590020a62e6ee7b90a2c864314af36cd61dd015fdb85c3cd3beaecb4c2187db8aac9a1c5ee583f6883dd837541ae6a118d0d6fbd70cfc5e3742f6dd6a7f732a1f95f0809d35bb0a9da86ea934285927ccf68ed66947416512046b028cba34d15932c377079d276c3aef0d5c795b875b4dc6fefddc620103680e29502c5d409e8b7db1ebf7325b0882bc61d10c044866dfdeffb5c766d705c4f9cc17c52c4f1cc45e3d4c28a3449e5ac02f0e9e0466d910c7b440793e5f98db4ebe70ca6c27f53f2da02c9305c4d75dc472401671746c753e2ebc15e26aac14b939376e38817a70de4a25905c9ed3a4342b12b2dcbabae5e257fb23e58de344c759fd69ec76216031adfd8dc5cf7aee22b8910187031bf9fb64c14edfc6f83f271235b84d7509e97445b946a0c026f752568c7ea2974f050389cbc9a0ef363ab1d13df90d86ded3243cdda4b3771f6cb9b1dbe218a5fbbf322cc33807040401ed6279d1c91be901875c9b40e857af3544ac45318eb1ffcfb3d6e404dfcc58d6f920cf03ab0817f5c642da5d03078118d54ee15c0570872c4ff67d051a490906486ea8262b1d9a94abcc8c79a34a51bf069b72383239fb3b7e4d3dc34993e50840630f444082ed462d78bd025170d6e620a43c9731551c11c3423c042ea5c71574603cf3a8b9824ffca3312fb91e875da5ff677a13ff11821fd51d6904bcee0f4caf9835dce107b753242d2137bf9b5b186cc887ca19af0e1c311fe104dadbd237353a518e7bc775946cc5e7aedc35f2f4f94a14a741f108ec4079d2c4ae2d274b6ca4b87a6880f1c1ec3afaa8acc24fcdbad707c576f8fc16848c9dffc7efa75422f14d0708cae1e5220d8ce2eb68f934411945978475cc5a9eed282bf83c8283ed981be4435f37c3d9bba454d70e78c96f7d21b192d6dfcae86c036203acf2f22e093da97ab7817a82afdf60d38d59d40fc122ff5069bc7c9d628ff83dbc07e8873f8150a11ae2d2d0f8baef5392237adb92ca6c5f9303edac7ba58e11b11fd4aa160346a428f66301969cb36c818b3ac5e12fc885d395ecb4318d179d6dfa0300c7005588996f7c44b099c2d6afa476a284c1b7f840cce56711522ef7f03097afe348ff87d6e4861c4f11d3e1fabe12aa79897316355b3e4609753e51040da7a492465bf0a3167e946feafc7f929307d3b3b8e71095ee1119820759aa9bae2f6dd9610e9e0070906914d32b2ea75b33ddc0cfbbb5d4744417bfa5dedee8f824a3cfa957eaa070c670472654abd00be3b127bf9c52f7ec477101517cea954df2f5ff89d270fae6132cee91021a9c1f0ab168c62ba6e662483eb184f05b3c8efd9dfad3ff573d9b5c05dad960e4c31fb00df4b143e331db70e35d5d74c3fab136aacb8caedd889a3093c6a2a23ade9bb58c1ec3f9796a2ab7d58713077093ecc53234695dfdd109263328bf538ae8db826a2e372f2cc6d82cdb3702cc6e843effd327a5c99b6d89c49f99f4b57d4cfca130ec506a745610fe2352903b6ab6c2c4c40d81839c7a28ee3406f58ea8bb28838eef143e6727441d6a31837a266f11070744796e5b85ebadb2a40fa72847e267464dccca9ab07d544dd4ed2cc50debfb34e683592076f5155f24d2179347ce507e63bf40d0580277abc87d5a7de4e6f9886aa33424a47428ad23cc02556093d5173fdba1e990e936fac0e5e994c98efc434b06e00c0ce46e503b372b8be14b428fbca8dee6ed85354f664da941cc3e3ee58400cfcd48d8fc3fd46a8d76f4eb8947b87be539e681e905047e112b222a6237222bc13f03f3f137593884d80a2b0cca010e1af7e500ea45867cbac90c4bee03d35c629b1f8b165a43d1e26a66977fb36766c5c8508a869ee0e8926087a423edbee560221dc24977a68c9a34e97cf7d33517d6f168320bf5c4ef0b7352dbb446aec9b53d407dfb6e053b0e7d9708134a6c09e916cbe4606d630e9d09c96900072245f21bf81c692806a14a59131fc8171f0d633d558608f89c18cc1a1501d0a1811f32717b3e4ca79e88a9d9b721206fadbff966b367a7271230d2246e882f92b33d645d4993b3b7aa711f897ffebf613afce205e5d5a60f63dd9b8cdd1256aeb0bce5f33c40d2556d6af9faadb35a3abc717b51e348b0f8ec6d661b49a5c8cdb5df7e8348d8285db61589fa479e1a72bd18f0506b774efdb0d40dfd7fa6ff903671960f07336fea525ded88fe1411cfcee3fc7e0a6f98edf4992f061d060bcd8a1abe4bfea621f8e6b546e0cf029970be2e9ac2943ff4dce3caa559aa17e94b28d444801f1a39cd4bb80d1c67d1f79dc736be23122b578dab96158478fe9ee0061c44efecd58d84fb50b3edbc94a6d77f25f8638ddb6733a33e0e50dcee635ef10edcbac170c54eb5e01f8050941215800b7f580795473b94df4ff0d735dd9126a7bddea0b2ac0fd62540a120d1cf39ac93ede2389e226d02583523eb44b8d073d845a7473fec515035362e898fecf1b8afb2927bc00267502690601a608c057d4c2194c2e56a2955b18531400f7620a222ee4f9f2e44e1c3ef7a95d2e665cd5111aa77499142d7a907dce976db73a95bbdc9e1994cda9b7af86d51a1b217501ec61aade82b32da8cd1b345dd7039fce6c5261df212588d1bce924d9d5f443357146933d886f28dc2a5bf152353209d05504131ec4fee51d63dbff44eb95be72087719af28978cfd61b7decb6a2f0666b34d2f26f1a6dc8ad7f4c04e2adcce77ecfc62194fb194f9693a6c398efe83e0ab05c8824d2250d9f62581d32453ba1d90a4fcbad8aa2c06ff311004b23012a5492284b6a232547703663da3734934f98d6359bba70b88fe41d7314bb8b0d7e77fb7a6bb3a111de99d9b49945af725275b444d677515755d8b580cf950b73413ac9c9f9651f7859f6c76b72fd667ecc342a28b3b48fdca6c852accd3a9bc30b3ad5679bdf3293e8720ad17172e59bf0ab27a0cdc4834989353b2e34790ee91211dfca307994034b5770af48511b541b9b1f2b9f540486901aca9918fcc83dd29f3130e071e9d0b763e80da66073e3eb65f612bfc895383d134749fa8f40d76991db0f0da62df76960efc7de97a06063cd1b81ca305d5f69591a4f964d74e32faeabda6aacdc76e396b5910658a05841b24780def70c3baa21db0c998a09860368c16e8b66479d4ad2b68d933e19e6e80cb1e20d365e96af8dc399d0c1a7ee9a8bc6b54b67ce7854ce46d7d71cc994c31323d43711ab7f6f8330173595d8d75942e1ea1a332191553ef06c44c42efb777baa6ec7b9d5cde737a73901cad8b903986d93d7f075f74c14ca04340daab8bf7d124567e092c309ad6713a4f207eb269578d5923f1d1134656743533aacf87314f0da22c67bf7e261a85c4516125f09ff0ad87c98bcdd21021d5df6eeea03e2648a93e6c4c438d5af967afbe8073e35804b791e08612a7e845463e2cf8efead89bfbde1ead0ce7e1452ab79c571b56e0c25bdd63e43799ddf793a6136bfc33a0df9ee67b68346fa79cdac5da0c1391996a760fa038fad5f734a57e38165427715541ad97fab6d0cfb36e782fd65d94844119f6d228701d83a39c50e93caaed3e3d3fc77c530c9b27ed14198c925b2137cc9a849ac006cb257aee12cace820661a5d678bb00ba841071c8879600d1250270885a7cfa839e9e315ce054db2bdf1cc8d4e8f3682317f226a249ad76a3f910c7f8b134272879f06970c4fe39a277c0c10567c373b5995107e1bd13c5471019b4b142c3e71600c10b5d2ac038215afb58a7ab5718b35059454a4fc16b1a6833250f10aceb6d45327292cb29952ae03d95194de1c485f229de148707a459c91196be828cf6aae06d47a3da9db71ae0ca97cb08a98bf312d3ecc83ff3e47ae55544f367a85b01199e300e6edd6bcc7717d6880d41a9db8aa9fabc355b9c26ae6830e4590448f1baf4debe61d476a3d0a0d926ca9cdd3f702fce3f736dc60ad579886a97370a5719304d5918ee156bbb1dba7a04ce12278ef755f40d3fbcb397141f86a4dd590ad92f8a4d1236c9b18f5d6ab657a4cc5920cccf3fe5c310a9fa15ce6b55637abfd11a5977f198a2345fabac70394015ebf317395d2d1861e1adf180a7d7e8e71b7c58395eddae1998e86fac18a3093fdf9e498f94da9839c6a774b2eac6275e188515cfe5e66608ca8aed85f24afb864a5e4eaf7866812b07f8c24ddcc763a52bf11d6e0f67ca651fe67930e733d6268a70d1d0c0eb7aac89041a5708f05a1002f7e080fa48ba41d8af2da22a2e1c995db1684e61031c2cd1c562ce77350dc9c5f04c768d73bb2a270afa43468c55dfcace1efc87a8eab39668fc501a6c13f6e2bc434a85c88f9c0e485ca3579d213490eacc8e18832ed4676d806b47cd6ae2d2e7069262a3dd3357d2471bed3213ed7dd7b311176fbf721a133549b090e9736a5c62d561352ae31cd1b7fac34d171394f88dc870942966fa4981a15e070c7eb7929aaf34532507b15a96117d98825a57e3b2c3df11b9e7e7bcd7838f06c091f0a0021c4ced4639377899859b63b4d4afca1f4b7bc9584732354f6f232b9b1fe057b0ea12b2452dbe23e365d00164af080ce1ed85a79c7a7cc2e2f6c92964218baafcbb80952ec3cb3ab14312f23f2561d3c63925b48460d27122419f954f290aca3ac91c7039ec3474d50918cf7aeb30fbf2ab6ec04777f575ec745c93dce18eaa3941259fe8686732fe13297e18bff393c98e7a40f19982243be1b05d7bde38dfa3609fe52989af0bb4b7db67ece11a77ffeb757edaa25f306e0273f3834ad54b97116f288b5b85eee5a678f09b0d8bee7478f2e45bdd6a5a0b750165b66af81fc92fd1feb8925eefe2db5c1","title":"面试题 17.17 多次搜索","link":"https://leetcode-cn.com/problems/multi-search-lcci","question_id":1000024,"issue_number":78},"76":{"day":76,"pres":null,"tags":["并查集"],"whys":null,"difficulty":"- 中等","description":"```\n有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。\n\n省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。\n\n给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。\n\n返回矩阵中 省份 的数量。\n\n示例 1:\n```\n\n![](https://p.ipic.vip/0aybb1.jpg)\n\n```\n\n输入:isConnected = [[1,1,0],[1,1,0],[0,0,1]]\n输出:2\n示例 2:\n```\n\n![](https://p.ipic.vip/94y5lf.jpg)\n\n```\n输入:isConnected = [[1,0,0],[0,1,0],[0,0,1]]\n输出:3\n \n\n提示:\n\n1 <= n <= 200\nn == isConnected.length\nn == isConnected[i].length\nisConnected[i][j] 为 1 或 0\nisConnected[i][i] == 1\nisConnected[i][j] == isConnected[j][i]\n\n```","content":"096221c37c5f85fac03c87f9e42ff6164f9a33419dab438a4a074246202662680898e16664879d34704a893c930b2c884fa0fb0f10fac65745e3ba12fad6b71dba02202514082975c4e747616d1aa8bab20aa6024c428846fe3ce839687f450285ce47e98d3d44d7a0d0f4f668294d6daf50bce60700cf8a42ad8ec1fc35f226bb974769590e3c731ecc76f710ff69ea6416429a197c2a35a8c0ae976b21355d5a147402304c61e5e50172abce605d0f32c8647cbc9ebf6e8d01e96e7719a1be9dd34ab60f4ba4e0405ae8ad8e6608728235cf4f432eb683c7fb3a18a39770b6baafea0496d267ee9d048b1a0b2e1501d89ceb64462daee7d6a247ebb380c7237e880e51220fac43c1ab94861af4d3ae135d69fa35e77c8f4d094fd464038e7bc7ae4160cf0621ae02be3d6a0d964349e59326b5723385482f1490f1da02e6fe4d40e0ec206d0c44d0f76799a8d603d0e2a18cdcc8b2ab1388728c9e745d69c08ff5ed7ca4b478ee7259630f54779b962882af08ce1a346f5663c23888c2de231ce72b3c084ab1a6493664a9ecb1540bdb483c94c685d53f292e79d731336d0783b44c456e38bc0dd7d30b19bddbd359cd600a7da96ddd015a092aea68cb2527e66eada1860fc51040f66573263f5b786dd721f5bf81b8e8f569eb53a0ae2f8472be28195bc5eb840d0e81122341418dcdc1b87ee4c263eef9a4043ee3a012c59ce5461b6bcb32c95fd97a91ced9947020c0afe390495eb31c0e84b5bdb0e3e427cff7b8ed84da9d590352a5fee1877c784e3b0f3e8e18858d022c7e19d80f0a631d2adaf8e096b661177a624f98564a37a97b9b29231ace94eb3328a1861e0efab5234e0c3c664c72612863deda3e26e4d8c1f802332b7fe7fa58f1cea8f59482471a89cc1187d7ab6dd0aa1bf508245f8bfabe358519bf4ef14f1cd2057e19c9811638bf525769fe9b5f6fa619712e972d19c66ef3aad6bc71fb1a0d4ef787d52990232d32a730f0dc043ac563e5838a1a124e51cc6d7df9f4d5b1182af04548aa109b97d8d00c2cb6dfdfee9800ce2ad38b65a13c525123f8be3dd5a53bba2e6a27f9b811fe1b886489881ae41c926b8f8f9b57b8572dd58682846c109921b0ed00120811bdd79879a024de0e905a2eedfbaea8ba5dc38a9a8b1dce936a745ca6e28ed351375cc48dab733b16c82386879ca5992074bc7685a451de749127350a2152280e25fe55a7651c4b69f93993b7874a6cbdd634ebb6739538c2aa3d94357ec93d8ab0185cd828261a8ec0df3e3e035fd6cefa6d0e4b796f43674931437bf7c82632e52cd92aa757d826c5c0d9264aac3786e26e167af46095b51c907f92d755be0c53d2e8887b733a48746f1f6e1dc8967563685d5adf79ddd17ddd183e705bfda8a4e38da67b3ca594f3556f99795e30e8d68b663bfda42229c5ad202e467987c77a38eb4eb36fa010b263e6ecc9b83ab265b6ec04ae08efca5186ba9142f80917189abb3c0ef2ea60b5deeb65066159125d46c921dcfdb68a2141f742fa9b89744c845393814b7e018003d983d0be26a8afc654b7ab01532afe5b663476d9721cc392a2ac23048d18b4bf70cd9d8929d4b262bd91a9ae4c097e8729d7df68041a6d4c7f9e3ea30054faa989299251f67128677b89a576cff85dde9bd6bfdf90b95c27d16b4a32e6fe99f77e598a103498a79283ab13446ede454ac3fd7c6e8055f3a3acbc0466832390fa76eb7c71b208c9dad88730da38955cad965516b532d735aac7cfb9887a6bb237cf38d48b868308611ed54f6c308d3bbca0e66f7983855c4784f81baa99f62d708c2877264240a0dceee515032e7d180a7a2c26ff7b16ea15aa4e0b0b4185d9b31a332e2a16c8f487207208ae91856d8150ac1f2c34a2ffa09ee2e59371adf6f566d50ab657f933b3187bfe9f8f9d98874a76c77d87b88678b7e0aa4986ce51448216994906de4431e841f1a2c71579ac3942f3bfd68d8323eb569e368524969e244ab7bdf2d6ff0649b6c414f049e6588c5b4a201f1ee77909b957e7f1891fbcfada2da5840a9f426015a726abf15706d6090e0667bf75d1c9153fb2339712d5375c0db5607f96fac2bcc2f8210e3eac9f81ffbf711a6b158f9a550bc95084b1caa249597c6edc4804f0dec43bd05f26decbf9774a38fd74d74f3bdf6438fd7202980bfaa41a27d4a75fe6e5a214fd9addd1c28a294b4a9a219a3d87a84e2441a1594026763452210e02e62e85c7877f904faf6c992aa7c98adeb3e1c97c57369ea00d130388716b09cd881dffb0738b89e2f238ed5d8bf30dd9b054ae6dac2c0abac9b91e80ce84f4f2323fe92e108bd61d23e69077940dfa83a4c28b9346e005278b2e020915ee4cdb08a7a8a352b62abf6b9c2ce6926c25246f2c1506e879947570184ae52beb3155176389519867cef1f4f5316672266e89e73c766f76c409a9604299fafefb946b8a375fedf95299860b57fc0332f79da997195e7aaa3a9eff131451d4a1c7204289d5e561ed7ca1326e2e04c322865c8d5a0a696e80bc72f8caca6ae5dddd18a5e84188dbbcfd33c42888a353642ce147dcc487336e75d0840f1ada976ec89a86089748e653b68959b9fa3ce21605b0f49cd2f1499be788a4276a94b9a645b9a8e53a88e1395ef605f25f2dc7f3096667d75155a700e07d34176e1652583668dc999adc0d6d8d1ebaccf7fef114e7dfead5c2ed0964b1e49699ba67b4524c6afb0e20e0781d599d8fcd25c5ab712004f5bfef21ba860e7f2fdb9172617384154a9d13615c60753e46b895a6bc3ba9217a8dc0ba364f2b7b276106a25adfab5473b69dfd88578c340798c8ecc89c8486435c3b9a9b62072dbcbf10b829b53564bd073f4a68c98390c7ee3cdba3738c71892ed67ffb47f0787f6c1903cdbff7f4840bde4b9dd8159bf9776b2e50af7b88c458b3004a4ec76e961446ce888280716f438bb04d6114824bf2f5a3ba90f56f2c084d086784edfe90ed7523cb4bc24a33feafb4f7522adbfb9f91d8a8db96cbc56e9525ea0fd50fa2e5163b4b9cabc79fd8e6c87dc38719344321c2b276844a4ec525a939f47ceed22e8dcd4fa96848ded1cb1e84c28dc1332e58d705f554c1fe57de2ddf60e7e43fad8e78cb87d584a8d4dbe580cd7dcf9853819a869fa2028008a3b09a04f48c813513b241640a07c43904c65a42d5bdc6f726dc0aebba43927588eef4f462f9ee70d88ef74d6f85ae288908d8e8591d7b7a164df620701b473ced39f7c010103f5904d604c8d68eccb1ae2756d7e44ef4da86103bde5e82d1ef4e8ba20f5d4f0570de6de14fd1a23a419f6e9292d1f359decfce86c71e2d5de62548a6ffe2859b98fc7bd26b589b665efdc79570bee51d93202c59ceda818cfae73418f11a08ca0bef92deb900dd711da49ec6b37fe585675f1c64f9e84e03c88765f140067fe6abacccd25952ee2a4ad2b621d2cf4c75b44efe15546e30d98c7d0e3e5dfa13e0df2aab8685f3dc4a61a64aa12450cbb63e2f125068122b9c6f2f6b0d25100b212a1d8ecc025198be128b95ce3e7fef90b9ad94f80139b9a50213e5d69e6e9fad4e6bd9f1218b8713056d2b1ed2b4e31d4fb27a8cffc64e2aca77f8767891c74d6e133551594f37637b126db3bfacc6e49ab69dc4a4fa17e88665a258457eae17560a7eecdd7eec15b027e7ab98d9cf6686abed695c772ebae4d1543e9b7bf05437cb84c776ad80845fd854ef6b18971e3fd09c034525e839049b1c504fd8816c02e42f773d57eb2abb266fea750f11c60142cacfaa993f0605441dfb4efb0b8fa29afc3ad67f8d30abc2cd4c469f83af634499aa43703d78ae0a955417fc316c09f6e50da7b5d3d7eadebddfec2eae2f4a5cb02d0fb0df245b99624f1b4926763bd961ecb3aa09f88e704e37337c0d2d066abd919aa64d90f1abab865759b18008105918c407e367d18441df04a6cc54ea8c6441c6d722352f36bb77a358722ddddf201563645df5cc875c96133e09a01c02a32ccefba2f22eae65407317caa515d6bf77c88a360012941952f9d642e604455952a151764a69a35628cfc397b438e93be600e11c6032f292bac4193cd18f2d51fb0f5246142f003330d13f4b6e73537d0e26a6ad48c0c3072f9065a8fce019189436d06c788f159be129f81341979eb9aacfffd7577d783f893507fd758a0ddd6c32e32d5beff80b1975d8aad6d5fed1d7a03b22475c17da7d3706db572c0148527eafa9d5c9bc17e77bc9e8409b3f119d2e2efa889de677952b848e714f5f541cab3741eca393b2e705c5ce1d16be675c2beeeded37c621a43b8113f15fd5a07c09c2006dc888e04cf67cc0e52655552b5806cf894c89b8ef86cbdf9986ee1038548851dd69e888e068936354f7adbd1e37c2046b79de12653e075b25281a7745aff4e4e3d44460e7836bb37a4a8db9479f8f6c3ef1bef2c9cbcdf05275a8afa33142356fdbf1a52c275a78db31d18c9d30b04f6da505ebf4362a217fb663c6e3f778a1b20faea7dca6e9bb42f47d827acb1fce6bc81581aa9efebca0ee217755f30d3e59509771601dc8aad1fe41ab05f2422e565086da775e31492ebc9da13cdfbfeb39ea298181f9480d7d247fa7b7701486455c2a804af69b056580495218ec215fc7087248405dc3bc0f195ca659b57813986fce57442d6b1baeace9f43b6eb15270e49c4559f822e7038bf79ee3c7404b39efbc457f5ff88f7cc9172a057bf41779ba7b8542931def5741b619dbe4503cf77742e5aa6bec308f852888c1c1544591f4b530a7e3a449849716271c6f50e43e1bc8248a009426b88f7dd7a29ec3b13383193f0567cab4b35b6ba8978d660cd54c018cb5f388a4881257c7b09c643af299c18ab61e24c51520aaea2d5c1d792811e25f349b07e3c76523c9fddec4dad494982cc632355337fab14e3be1465fcb268cc3ef92866c1ebaf94b9c961e7c42a19fd375221a991a6d8ccd2e69de335f541c642e4577077ed5997cf38e7b39dd040c859d96cbdbbb08c1d12757611ade4a0b06f446c197d8fb60915c8e7b4482737560cccce1fd55c7f9c76170196f8527564e1b3174125cad7f10da75d60b6f1a4eaeabd2d21456442f6d97776624cb9f07a9da7c9ae26642e1423b040b655f7a46691998849942e023a869098c47878b2effa7dedcb2d70f55bb989cec11547f90aea1b0720cdeca7e4fff594352c8d64ef378ac0962c3c7da39f20a6b2dd10782842faf5a9a827064eff485e3fbddb9173c0aaf62ce8f9ac55e3c46eee508719020a5b194ea8cc6d8b585d9220a2a3419962a83851cb42d1782c6410f01a76c94b8a1a4bd24c3dfc86d3d07db4ce52935a40652aba9f72b93b3f2659b356396a5ab5cc586550dd6c61ca8cb284e43e088896b6e6079701399d83d67e45438bb513ded94ba29ed24c555ee501583fdd21030bc914db1a6b266e26c545a699736ee8a90ae44a6434e35f36c1258a025303a23a38369dc784619f1adf2d79af3a6371a396b0ce811c7e46865135eb07301066ecaf535c773d7de014f5f89f514abdd8c16b135c40e633c437e4792802d91af86abc157044e4dabf91a26aa6143f9cc76edbdb27a7e8c1a32d2c5f180927bd9cb28f6dc223db59c07841ebe32d005d389926b440265466453c06b87a82761aa4b5522bc5526373dc61eb697db8ce2a77385d01d8931a592543266f581a2ce2d1858340c921bacc386075e5c09215f448ecb5e7c879e0ca881a3582071f7520a7fe6bc34dff6810b4f1fa122d64d825aabb75d2d9ea4cadf0c28adec80b64498ba2322541ae80cb6f2f06551ef8e94d91a8c781772493b1eda92cca3d62d6580f0357cb0396da368f9ecbbb46217ecb52803d597cab68bd91b7a9754acd1548cd55af2df3e8d05153158d056501c77294099d9cfc6a3efed8e98da1844e10bef983a150186c2068201476249e0b087f38a1e808c36000ac3024737b822fab0dd8267f91bdd67efc6148bef0ddc034693fedbf55558c95cef6daa9749f8b922eb29a102358951c2ecd2bd94f9ddd0a04dd660af789f58e8bca0c44a9c905084e80cf47b1c1cb6ee8c6c1e5d270b7eef3e864d4e43e65dc746ad76d8e7c8806966554d06e263e9621acf79c5a9496a9f39cc5f443eb2a5dda91488cedd62a9cf349f3f1a9236160fe02da250c1efef307e0f1547b2d85747f76fa55b1b5098ce312103b2b2cb7a1179c85ce9bcf9499558f888cde96f95e3ac49249b48c733d35dec49da7cc0629a2e55ceb8ecf2afaef65ea7cc1e9fb764ac4af90215e4a85ed346342dc74d9b0db5154a3ed77160b3341d302746014228f2727061f9c7e298c93da35751de54c93322721db933694634971c9aa50b5e2f2d0314ce8d7e3b05ea6d057084a373a42197214e36118a5204052fb5c759216328fafbe1991e81b81b2fb958c80fa5f72b3f0ebb589f02c5165804f5ee134cc29679c48540e31b3f7042619ed21b036ce28aca728b3836135ef70dc3d3d0335b0254b221942ecd2389b2fa957aeabdf1296ae2058a41c115269e9cf6076e0538dfc50147c5ef9fab7599dbe9831d8ef28e21d471f4bc01d19d9cb082e6cf2a70b803402e9dcbb66f4cc0f9f028b52a6b3b14c2c1208954d2a82f22f80ff6f8cbb249a1105f2ac3d4b1bd07ca406fe76e307dfd8fd094d3e82c177e0297dd873c383da97ab7817a82e9905e9ad6418d328f3cba0a2cfe799d6bdab63dcc09ea8726c665bb53a3c1b7bae0bb14a62b73c0b8e06c5f934aabac73e69d0ce31ec1fe581d46eb2eeb0e6acec9a811e6c11488a66584d78b90fab3229c1bfd27ce010b952a0ea2b36f7c44b099c2d6fef133f7c1bcb3ff5acaaa2d4b0445bbbc308aafb005becb9ae1b4067b5ebc8f81f46faa6489620d1f5b3e4640333e59571dcce8de4817b5ed0c00dc67e3fc3fa593178799e3cd68d0ba444bcc070befc8b50530c24b4ede121fe9d6c62a2b7da7d1ee1007397c28179c1f27a448647a2d7ca3665f06944a025aec7d47e0a07257e83e3af65741c55529ddf7cecdc6eefa45bcfca689df703d6f89e55905c79e31d9b81cad17e03950d84c51b9caf95f16a4fe9efa5f28958059d98224271ecedd1cf448667fbb73f25c0984d88ca70d5513d9335d4a11584121965557006ad22406156edb765fa0c1852a4d10d5a2fb7c6068f784c1945d73cdbe9ee020a3063b3104ca84a987810201e95996c4409c63a2317aeb194758dd78011a0f604298c82f08bb21b5e9b893d079ba9756a4842e62005ca6492228b38854f1ae53470f5da9392269c5f3afd19c9995c312ddf1a5b1b8306eef868d0d3a103751cb3dc68725a2e38264207401f191e56928ab6ec8474d34a8839db8fc3db4ebed2aa65df44299d9cc70dc7c9d84d56d76c19ee560226102ae39f7e917e0c4118809adfeaf0f79de9d586570382ca601050533023c2662f0f7c540aec962cc96858bee3b498edb19783175234461b7d4d8d032d309b9a5081faf0a71c01c649f10f207b048404ce813be5991221b4fcac1d2c589efaba3cb91d375fba3584984d5f12377ceb3860cb49ede6f48c476ff43d3020ca0b86dcc3ab3d21dda23af92e2652bcadc52d715aec16a0cc800402b702c56d14918a6edaf26c08037e88ef9114a098126e04da43530d634c08fce726f29bce59d471883325334e4febc02d4dd8ea8e77de69b9ef845ef17d9fe7c657707f05caf064e40760dd816f871084363ac393c6713c8d28fabfcb2e742de370ce61584b795170a58044830297b02f39e4e057e729191aa08293fda3faf3def6d6fdc0343a243c6b3f5fd98c26d7a321f9b9f5fa06270cdf54545e871576993cf1b0c1718b8d6662733206dc5af7cfeaaf670d0a0b32f54d51e48739144b0a1e547661b44a50d4b174b856c3bc9595df21c022eae5ac9922cd31fc1a1d9d92c60548844cb06735faadd5e90b3f6d454785dedc3b183976541131476186385b4ed47bef2d980a55b57e400b22f6de00d6149b46748ae16eb13e3284650a77e196e7a6ce20cd259e3ed4dd21dc6e501cb638d136c6ae6fade54d810a3ccd797581648841078bdd1b548486ec5efd68e847c9e62247f79c9bce9b672bf277aa1872cf8a2f1132ff3749b7d13266d009c1aafea05d9689b4406ef720e0107f6087f8c3af94afd1f9d8133afa2bdb5f3b741c41773e504ddc914a58ed7bf06ca6d240a4a7b30fe59a3db219e21ae1c4eec515079737a89cca3edb8afb2c57bb00c3b0e42d734527ba6057d002d8e96ce567b5eba8936400f760fb527af5fdf3c6dfecfb343d98ee52ad11c57a47744d447aafb63b2ac2ed273b445bd80e9925b829a289c3951aee744135b9455aae8717bc4898dbf098f651db0a38b6100fc1a59c65ad5dc08c00c64410014742ec586aa84c2fe9515231a669d0d524531ed58f21f8065ddb51cd80fb2438e7187efdb6ddad71d76bef0fcf27c6f28e7f51c0819c1b0242067ace9c4b73f9d836fc0a86217eb9aafd8fcaab0375bd321887f87214ec02b0648181075e896444793a18afbc96fa83b004b690a6809b8200d236d614f283f63c72a29ce0994d422d6e3229ba5bf377314bb8b0d7e25be2e3ee1ef0af4ce91fdd55d857a1875aa148725121f01db8f84da821c731b2afad0d6794b6d13af86382ab3626ce3391261d7bacc94e7953cf801eb160eb9b01cdc3d1a823b2dc2a214e8e42a075c629c06083e2b923ceb7e7b712844e91f118df87e1dea0e464c5aaf480c317e1b9b5964cd540c83934ec28059b59c689bd17673b430d6bfaf2eec43f23575e3f22fa94ffac1f1367e5b065dd48948962cdd8f546d8c30f72060e4c7cf8ca02a63d11becb1792051251c1a4d9a5114aa18a5bdd320f7fd76f28d9f910611e65849df3cc9a38c4646a3218026998a09cc0863da4484694758cc7070332ffa81622c943b26ca86982a06455d001f5d0b2b0a365310fea27ed09157d0fd8a36e394c31323d4625fe26264df2c497bdf9f892b16fac01a3321cc2214ad4604d944d15d2b802e86efc68875d861b2ab325870e50bc2314f71ec729cc525a0e890645b34a9b4e9b40dfd26d5570d73a5e406912fea79d59a2f4e580f5706142847acb5621de2932efc73ebe87ddf5019171e5d08f348df3294b1b0753e1b5df48fbd03b129cbdfaa97cd6bcbc9fa74aba9553235803019652e28623b9e5438add3cbe0ad89bfe9c8f8d3c877504fac68aa3ff23a4458c6ab253a16d19977694425a9973b64f99008f1c614e43dcbbf0fe6957713dba325d717d1ec4f16192eb79d7b4a7e0e7e309039ab3e0ff822e9daf579c806596acb10329d1c91733fef5dde8be29fb0ddb0328b779da9209d4e9d926de00d18b7d300d10071b204ebde3ef0e7276f5e06798fb001a60c461d8076783a0856675f9e8de5a839e9e3159c4019aea9bfc48d46823cc06f7235612d9ae42b4bbb3b628b034b3699f32cd44301addf64280443133071651c8f67372cd83b7e3f44cc4b5d626a0a4f1802fa87e50f8247e0fade05ff719635159e56b6bb1eadaddc1019f806cee5911f617a40d1d716a649d07b94de55060b22ceb540642e7e97864d09a138d55dae549b3569d6916bd344e030f58a90eb63787bc583f75121e85b07066c3f85bd0c99f22aafa382bc8e3525689dd458d4ace19aa38940a0ff69a08438569347d764b564aaa9497c612a5769f24683e790bb43afb0f745932cb145d1c1ae2d02a56c8e049cc5c1cb10f2ff9fc4e91ea26e3d8120124880bec52d3800fa2204b0dee3d7bbf09467769b74bc85bc4b440bd782338df4ee794518b5ac42e6fc1863b1d711a5977f4ade6217e0d39e5bd85910fe3c78f6969fd940738b5d4e74548e71b798a9bfeddab4df8e9bfab4be7d8e8f9a9998e44de7c6cb6a784a28d76820fac80247e555292cf9fd8dc27524afb864a5e4acb8d4681af977977697866b730ca443ddaead39fc5aa406f0597d712726e05955170efda1c3996ba570c643a1497c1d4741eaceb50c9ccde816a4d0fee8dc3cc7b3423f8588485e66ee687af69c5f04c768d73be7a72bbee5396ac55ffaaca1f8e2308781393ba5ef01a6c13f6e2bc434a85c88fec3b9cda93216b8134964ace8810ce00180a835876be0392ccba88e936d7656d37b31a3957b1ae5e55e0c82bee39a3e368d6eafee9f3653bb70878c29d0c1aa6bd21291a3427de832b3b2694f7faecd7c84176accac78b4523496ae5129c3cba0f79304f388464dbf23b1a78053b89372f1fc78fafd16baadeae087d1185f0ba15e9b6efc34ef7391e966684323791129b5eb90333df27630444f5151d2574656959825d8c59ad0e3504672b75bb9b20e0a28a6d3dc1e3ce0df10100f6ca48971fc6f11f9febca034b8a7164954e7c48081a612504bb057bd0634182c5d2bc44f709cf0ff4e161b6133a3368a2e6290fdb3d38228cb5ff84181ead7c65b1cfe403adaeb7bdd14442673c2f91f276e82d56aa89b6997e00031223622afb32af1180641188fe436b152bd63e47b72e7436cb168c154affae8ef6b9e4effde11464a2d9a3accbb1fad766d2e21ea01e9de0e101b0478ccbacedc2d496c10389b6c4cab7831b149c1173f06ea83fcad52c08a3395d890163cbd31215202a1817cfbffc38ee58ca7d0fb786de897e73be1bcbc674e081ba73f6782ecc5703c26dad5e6743525efe757f07345aebd81bfc1fbde373c57261308ce970ee02651939852662d99736fa792ef769a14e44abb67d16432a381677404fdca8fa174c7b5c107f869ec3f2f5a8c97e38725fcf8d6b025f99e46b1165ba12460fa779b92b752beca46825c548ab332b02f1e3c5d4d4b237f8ede6f14084a18e6d9e3afa5b7b5c6c900729f4c03b20557de6cfb9b45331b1b3fdd566a39e89f7e58bd2b6b3fde3ed39cb062a1c59a9c1b6fae41991b2d5666d354087c529ff0cd9bb0dd445883b6bf77f107f6891d8c2f4499c158df322b5f68966e4b8371c92193beab52e1494e0b6b5b53595ff1d464ea3eb73e56cd1364f603fe6d749553b5102dea679908c0b29816dca0f82ae63cb8b430f51f8afa9f98bea87c63918e4a364b77dff5141afdab72f4903b541c422e29780ffc5d3b8482aa8e1c0cecc64b608109695f294e2d2a57127321ae84a3d1ce376e5181b1113133fceddf2bca4b8f4f96ff81e4e1e0f6119ecdc5bd86a32a81422be03e8a15bbefdf28931eb4da2e2f2c0967bc4ee2a5fbd8e4d2733d8e4335e093abcfad35318854a2780599b2a81e8fe21572d39ebdf217a87d24581e6582865060aca59d06e33ed4b9884f56cf3aad6826b2b41e841aaf3dcffa6da2ca080101b7a61355b742493905a4eb787a67b496c6d17a8ea437a34a17a82283268ffa55f27a210ea81a9a375eb779554d28b70f5c4ce9798e283f9c3c7e80c88e6ba225e4030754193332ff9fa016a62a4c6bd213e41b22de65489e49a811a5d0e5be2a88639658750b4363dea94120b5368091a9ce38dccc3284d46fd8d7c084fd9df3a61eeb0b783c5ed7b5c9ecc3245f8154078f9d8bf82e1689accbd027a27b60d46fbc94099d074b48ea4fe13432ecc93569340759611ce79a8defa57c8d991d0b02b0ad25b8a85d7565e665fbe77a0efa24d163de59e7237ab973bd6b432a03edc1cf1385007a6dee087f51daa2b50ffee45d97a5b1b18d6da3950f89433e0bc7ea1f7716967be64585a1907bdd0df788168ad53a10dcd0f75b1d2cc8e4d257d90642e2f61302f0","title":"547. 省份数量","link":"https://leetcode-cn.com/problems/number-of-provinces/","question_id":547,"issue_number":79},"77":{"day":77,"pres":null,"tags":["并查集","DFS"],"whys":null,"difficulty":"- 中等","description":"```\n在节点网络中,只有当 graph[i][j] = 1 时,每个节点 i 能够直接连接到另一个节点 j。\n\n一些节点 initial 最初被恶意软件感染。只要两个节点直接连接,且其中至少一个节点受到恶意软件的感染,那么两个节点都将被恶意软件感染。这种恶意软件的传播将继续,直到没有更多的节点可以被这种方式感染。\n\n假设 M(initial) 是在恶意软件停止传播之后,整个网络中感染恶意软件的最终节点数。\n\n我们可以从初始列表中删除一个节点。如果移除这一节点将最小化 M(initial), 则返回该节点。如果有多个节点满足条件,就返回索引最小的节点。\n\n请注意,如果某个节点已从受感染节点的列表 initial 中删除,它以后可能仍然因恶意软件传播而受到感染。\n\n\n示例 1:\n\n输入:graph = [[1,1,0],[1,1,0],[0,0,1]], initial = [0,1]\n输出:0\n示例 2:\n\n输入:graph = [[1,0,0],[0,1,0],[0,0,1]], initial = [0,2]\n输出:0\n示例 3:\n\n输入:graph = [[1,1,1],[1,1,1],[1,1,1]], initial = [1,2]\n输出:1\n\n\n提示:\n\n1 < graph.length = graph[0].length <= 300\n0 <= graph[i][j] == graph[j][i] <= 1\ngraph[i][i] == 1\n1 <= initial.length < graph.length\n0 <= initial[i] < graph.length\n```","content":"096221c37c5f85fac03c87f9e42ff6164f9a3341b691438d470b7d69202662651280e3596d89ab027c50b434b5032d8f5da1f70810c5ff5565c173cc736e24c977c5bee375114e2ff6a50d500e56a2f9cf2bf87d4428f640bb65c94621422b6f80ab32cbe4786baaf1dc8187655e144214bc076a7bcc3327f92a6ce119a45a25af85445278003250f16fed57ee2f8758edd0cfe46c7e466c8e48aeb068e6ad161d3e1aa5846548e82c4653fab3511d7a19abf3f6700117be258b22f434a3167a3ab8179c67039d7bacf87d6be34b7828b67f91651451afe7536ee8bd20582ba3314139cd0437a43d35a4ce756432021acc8afc28076fa8edcfee58fdb9cfc8283d984e516411b741cabd94c604bad1ac1f4d69a56bf868c75c1f2aa82e4ecdf71619acf142c38ec848996afba910aca607c90a1790d967cfa74bebc56b8b7d861152a89c1204514995ad77f5c8dd74482837552c445359ab6ea43713ed9ac35881ddc57ca4b47bce5b59632558478297189a69fd67152c6a5b78c33c93f4dd0b3be90a3e0b5b9aa67904a1476ab15405da6f1899f48512dfb0e98880573fc2eafcb4241e4a4ce80bb18c1d45023c58883b2909316d33cf64200f52ba4840a086b7139dc8e0178d6f43a83c69566548020cf447a9b8cecfc09135d1d7253661d476d95015079af21088a0cd6d283929a68fb5bc1abfe4148bfe18ea61d2c971cdc47531677caf6ef1128a74f4b2efcb1b0ab1c2fdc9386be3742fecc6b8f7b8c176b2e9d9948ea0c3447f019595b3813a1a7257530bcf6c96c26f101845cc5051414653e399938cf538082b1e4ff221797df542ce4f258f22ecc3494c9ece452f9df61602ade4a0b0dde7b52ba0e56f5ed7b5bdf182bcca916d24b073167b774b0f471a89ce0f85d69b701671c950fbc3d7752d2ff47ba54c9742afc315bae7cd66c6532bfd1e4f25ba88e6e121702f12cb572bac30f5d0a2af05b436af2edd86ec049d121df7529a7e29d9a822a76e311214357f5bec4973f8ce135ce4812284c274c50a73206dc8d309092228378d1ab3b0cf5dc87754397fe1e259e8eb648a58162883d20cb466b413d0896a821f2e87e3bfe70f8c2d71fcc8f1983f68a16b2b8274196e4d824e99769421cb3c73d74786eac8191c5fe89f9a8e330a190b2d4e31674938beb5ea77712bfff7cf5dd81c412a7153f18431ad013ab22cbc23ffafe8c186a0e6b307e04ac8c7c29057dbc490f01769f0b30a965db933e72a22c477a4ab22f83b06634ac16d795fcaf4920926c0d276de42c9cc93eacb8acd8a84e636a1d14152dd7a863017b8990099bafb4bf6173d9ee280ceb07ce01d73c574b14102c978cc8f60661ceeaca59d9ba4d9b685583ba481c3d68853f61123b24b92bba0b410da9e98e2a13951a0ed1aa426fcff9fe26d1146e49f4f6bc5fe112792e4e8b84d03daf062c86bb80eac00f633774a01dc366887e807ad2de6e9585d3ad10570ba160d8eb91023f5f7529fbdb42c4e3518105d9e4cac0b452669d6c525c3561754b4c751981372b1feea01873f505371c34545508c112b8ea1df77b187b9a802f3c32e1f4322a9f34e97405b9f2b792fce0a3a8341035359f4e0a1d6498018280644f3f67f495989ba6efa2844f918ba3dfbf789799f9f6ffa8309a3e0b0b3d3909f0509be5f1570b2b1ddcf3659d3615fdecbefe3ba134473f45e4dccf43f27c56a98e5c0ba67d337ba151dac0ecac8a1226a38316984723b8493f78cc2f4ea234edac9cdafe1aab7fc7ee1408c764c4153ddf0b21ce48ff86ea6770b4ebb9c2f3ad4c15c5ea8104663e2a56ea881ecc79508085910cc8d84c5a2532c026f9d4d6fb23720a25d2d1efad9dfa084242a362a41f1776177cebcec389cb83dfedeb43d5b6942353230d0657933ae36b27dc158ea4997c67c26510d2532a8c303ac6036559c301a3392150085f418ad222350ea025ed33aa4b86cfafb20364aecbcca9d8a0ac1bb0e83438f001cd6b22e56615f15c7ca7909d070d666be45c8a2f9254920b3fa32b51b710fa269745bfa0f0adc27d17d718607253db3b500cdb3f4957bf06c0ed5c034d847ac10d3e0ff5ca6cd0e3f5d0f4312d398d5441354143294aeb2930c4cffbb01d23a751b76c9ad8feb0ff18e0d2345c83a98807a442cb5dce346fb32a356a1eb9c5ab48d30cd264b94fb36298f2786f519e1533a2a4654db819e7fab45e30728aca3a312bcdf89b36e5259413eaf933eca82409d72a460be3aa7d3abd1b6e2c2785b3796ad01223f8b674209d9901cd4b673809fecf01bee758af224e65ee62563faa3d96a5b51d44f1b667a1defbb0dbe1e96f41c12ca9242880cf0aca5c2929f48fc0f13812f3a18f65cf81e76bfccd07ccd55a92af234a80a8541603bb1fcee61d6ea1b4a742ce44e93211aadc58b75b26af7d6f9fa23a5d85b1185895f73071bc16afd5332facfbfbba125da3735b5cb03ce83431ad9766ac3f7d4bb533167d855bf91602135bbb8804643dab2e004a879e9556d5963dc8c69ec049d92273a9fd73ac6592436f496bb2ccd8e4fc2b5b6955bf755587497a4cf70a48a9188def3bd2203c3bb3673914e6f66088b4ccc942736f17b38f90ccc901d331f2b0cce4c030932eee13c4d27df077458980302eede51eb7ba8d85d10e1ea9f25b2f202e57cdbf2c5e5c7edb5fe0fd4fbffc96300977f3763396956f642722d171768bcb7381c73416d8932babc855997ef65f7d8c5552c38ad031fcd86e81d282ad67e45cae2c32d1d80a0cb57cede3ad183f6c8b2fc8d3b746328c909bfb0624264dfd5e9e5e2d0b74dbc153fe89c396f192e8e71b3d37660392259313bc08ede1165898fc1259d5775b144d7fb2d8cefa3fc1528031e2cb33769f125f241ee30e41aa43b968beaf3a45e201c7642e7459f2b1de103738da0a0bf41be51449151dfcfa26dbb2fa7aa6716066491a6b17426e5dadd35ff1b5501d6f5a46c248093dfa04d4cc9ba39f5a045cb7f8cd1383a5102d8f26fdda9100350e3d49fc42ad02089248f03c8a4403327b6c9b5c9f2fac56c495fd857146882a916d760188477a922f461cac7279ef754911b058c85917084df8d8766605fc51fb253c8ed3a8c6c8f28ebe424a6942789ddb38da88ff1b8aa8e32dce107818e829fbf159c08ecf5a84d8ce7d83b13b5406a5609d93654ca1011d5a2c3f734ff0af6a4439d33c1c4fcb861f8a0798cdab81374c3ad66d100e3ef15031f3d4205ed697c104463ed7fc0dd10567e0d4cda10b388bac5b0e810569de448f2dad50326d8459894fd2eebdf0f5b495837a5249c34dd9e67098116e9c4acf344de89879eca452248f72976bef9b4e59292cd51d26b58c9230aa8959f36abac03d27e542298a79aa6faba4332f11a4ec26facc6cadc13c60e13ad91a2914da8d37f567f7097ad6429888e63bb09167782ace8d5880a53807806c1ab26d9891527974ea53f543e659bc0340b7f40fc02b2e23b98c2fbbac84063a72cad6043a8f86a546f763f126292264a2543261c0d646658cbc3281898a3129b8ece7770fc5541511030ebf1407085f31eb4856ed6a64562d9aa42c5d3134b2b794c9befcc1755fc75cfb6831a3f8678b62d2c9e8e263e5b4e4124417b263a5af17a2c6b0875540c175b1441d25728a03ab3cbfc2d988ad4e71328ff0ec9d05aeeabc3f3cf6686e9a22610323abad6e31a609b24b94a7b94aeda76e3c5d35fc731a0275dd60d6e9ee145450fe8394dd5550406d0833651e832767b0baa3bbb747dc068111187014fca8dac8ddc8da881ff18dc52e8064b7d6fd372a732d93c1b3f2e48cdc6eb3607dca20d7e2c33eb4482010cf02c2557a9a01caea9ce87f185ded4e727f5490f08b07f40ff8b244996e180f7cb9083b0009771131ce64720b5d6dcb3ee84eafb80366843218c5b45152515e2fe7e1ca4d8d6cd41fc36f32644d13aa47f54ce3710f4867c73b8a38ef220ea2d879d7c8f906f411e6f56eee9881fd94622183ccff128860fa92e75a86bfc8bbb8f253dae615dc2714ee2cf832be5d23274985dd5c38fb82faa9ef8da438b82680b5561a871e26cc23d80eeb03b285d42c0d2505ad522e025784614664e7a6b97ba9efbb6c3ecc8906429a8640fc98657c417383dcd916a9aac6571a5159be129f6550ec5fbb1af8ff689577a7426c07135fa4cc60efb6c73b17f52efe515192ef2aad6d5fed193af2e2a064e26c73d300ddc46312a025a61b2bfd194f94ef66680a009e3315ddc7d7a93c6d9a32ffa6d8cc7250a511240e53860e7b8b9b2e705c5ce5450be6f1f64bbfe9337db3cb93b8c7abf44b6ee355d9b00319488f146f767c6f85d5f4e3b5b2fd4bd4ccaf7ba95b5fc99ddc4106801ca1d942ae8deaf73923010acfefc1930c236574ed85b6229214c167d753411eab0e8e3960b2fab8565a84f638df20e8f896d35e1e189c9d1dcbd6667d985a33142356fdbf1f840680870927f85d1fd30ad4f7de30cbade002a687e9078ddfffc3ba7b218bbc1c4f384af4aaf57e2019942dd0e8615e2e5dabb733c540b5d15fa0b664929b7726f00dee9f0f54c9f02e9702a6f4ab1c7774f310b6dfa9c880ac5b8f628d12dc3afb55f61743e55a7b7701486455c2ad30fbadd0b2cced89cff789ffe00dfa32b85ef6f7b83951662927af1ea38f91fafc696eed36a4f0c4297a63ec6f21974818407a838871e0a5d607becd7a85552ddf598442eb8528abefa937d85933d8567c24fb07a92b23ad20d619dea66e8882124ac2cad014db72febc15445d8b2b568a7e2b949d7d25a61127f58e33f0adf1ba937f30ca58f2985f7dbd89b3383193f562286f2bd1d2afcdfc83477823ec63523657d46098796496555aad632132e1a35eddc4adcfe9b76c8dff2c686d47afdf3209f791d8fb121171b28315d4a344087667d166581e93311cb465fcb26c886edd4802a1ea6d40c819d17791ae483d3752d5ad07939c9892269943a443844682e032e0763d5ca39bfc82855944a488dc59fc7dbb5678d972911757ec768124f9e6cebe781af28de12c75e0b9573f6ba78b582e75089fadb1f77106897211a695c3b794a15f3380aec75854e231805bbe2cede544162327b917d621fd28607bcc63cdcff6f119821744a45201c2e032d0398e88354f81eca661b8c748b9701c482aadca2c94945dfcc86c611547f90aea1b072268d8f3209f10a0a08c9e84eaa41ea51778a9d855fb40438648b42f9c277d2709ad43937a6a0c0a7b0d0b4153405fe48cf929a8307266ceee508719066eae394a08c8fc5f09bde620b2e681d9636f08a16aa6244ccc55a7144e317ddc5a8ada70ec3dfc83e784b9d42b6606fe17d14f3d4be668ef9a16e98276d8ca2f14ff7934524b9a85fa5c43f1d0ac0a48a70746c756a4cf7a3741a9f5a00e04c61bef0d768a1738407ab2345d1b8935438efd401f7aab265f67e0c587abd5aa7d9c4d528ef101a4eba224625dd2930736deafd209d345c199de4a1d5a8e9a13722746b1cf642cbfe3476135eb07301066ecaf530d33c9c973a425395bb6fe283e21eb81fee0e633c433808c08022deb4c8e2935f04095ae2fb182daa6455d48b7ff1b9a16632c10911c8eff180927bd9cb28f6dc227bfa8741ce57f7329f03928e9b2e1a023a0f7c53ca79eafa6631e2425c38965526373dc61eb6979fcab1af3a8cfa1dc077a5d5067336bdfaebb35652252e76c054fa8ac8441b0f092a4255a4cb5e7c879e0ca8d4e556753f941d4477afb03495fff9641b4af36cd61dd015b4b05a3a92b6ac911f27d59282b5ab1c17e59ff6df728a3e1b0edcbc16dedbffde5eb2537911f386061c73371f85fc809024b70ae6d50def3c7c1477c2b5c6dc6b57133d5c3c730192bb79c6583cdf455dd12b237bb7410f7c15b90f5892b0e780044d0a420e29502c5d06d1d97df8a5be665b41cce865cf4b13496edf8087f0891d804a96bdc2548d6d1d3bd958351578eb0add13921400c54d66d84f8e944669725ebbc0649470ca6c27f53f2da02cd04b90f856dd09500758443c706066e473a638e95ac26e783c3ac06b38d6180d8a54859bea7e6e1dbf9e89a986ac1eaf6aa4c1ea4d8059d769ec76216031adfdd9889f3de1718c9007b8454f82e64be90bdaece9250d1235b84d755da4244bf002a0dd26be160ee930f6de010d6c89cbc9a0ef7576f0826ef963c9d3d02432b180e03e4529c2f792993f97c2fa57518e3a17321b0ce5622de0e31be901875c9b40e815e07a08e9047fc3b9f4c7afcdfa5af5d15883bf2e9c4af10422e78f70d73b54078118d54ee15c0570d7790dba34461a270f0c4923f9266d37f9dae298c538ef3118c22cb1727b7a70b77f2c08218600c6f903172a2f4f419f961d7d05ef6615358ee621b93c9a2055595dd9544b0232a89341356a06af86d6d925bc891b4cc96e873eeabb2260709151df5f8656132effa24e1ffc9840e7e15c9d0561335f25c7c7521612fc8a9a33903b784f44a16ec6dfc722502b018666c06be774ccfbbddd2ea7f4882970f341b247e95b6f858dc77d3b477496861b15aabc94a06ec6bde1ca53daf2917dbb24b1b251dfe4d4b8cbefd40070b8450f21bfa8f83b4c89b3a87af92677330b8c843cc75197c76165ac47fff89098128b105f2ac397fef3549e402cb26c7132b890d1dfd6f8710c490990cac43d6a1eb27a9d817a82afdf0c9ade0dc8668f21ff5e6ba63693718ff975de45e781238920fa53a3a1bcb1e9bb4f8c2b739d92e06c5f9303edac7be6870bad4bdcfe58195ded02eb63118dc1d06c9d8b69a2a06384d68b96e0be768c11cf22fd004280540eebbf6f350ae49988df85a476a284e9c9aa0982a267421f6ff2f2648afff157fb85cedefd48324cb085beb65ba362895916355b3e4640333e101914e6b89f1a52fbb93b2ac167a5b52ccb9b5dd3a8e3e73a95ee1119820759e3dda67f2c8b2440ca3b35c20f5dfe6a61e25b22e0c9acf5e1af091f4aa48f85f4e8f824a3cfa957eaa070c6700e601fb3db16edb72681d739a5a90925682c7cf6951ab7bce5eb860baaa74169a0c56867953505be688d66f6cc62483eb184ab713c8efd9dfa9ab10346e65c4b9f8134e48e5ea50dee8b7deb248166e0487845cafc9b4ceb99c9e089e28130b9c6a2a27390cfb5d41edef969662aeed5cd565e2cf192be62753b18b385635b3323a20495e4de802272147f7194df2bc850339220e96ab7db2ea5cf9d6dd0c48399a7f83c00e7ea35ee56795b4e59a56f1c9f783dabd2c4df0dab839c7a28ee3406f58ea8f26e8386ad5d3a26314208385dda697e4c111a1a442a231ac9a7a3f1ec13df4913ea3e4f44cc91b09a7d540898be69ef0debfb34e683592076f5155f7fa01c985ce4507e63bf40d0580277abc87d0a3cb6a3b7dc11f32c7dea2156c75ecc1f5530d28752718fc8f290c336a7c0a0a5c78c8ea7696106e00c0ce43915727063df9a1b03ddf9e68a8f90cc78526e43ec168b6663b4d4419d88068c9642cf6aa776f4eb8947b87be539e681e9055d7e0c7c29267d2b0d09917351a7c278194599c8112b26ca010e1af7e500ea45867cbac90c0ea213d9232ccf12860d5a69d1e26a66977fb36766c5c850d7ac9ee0e8ca6b8cbf09b094e560221d9f6377a68c9a7da728f7c8567392f9217c5ff58de6217352dbb41d84c9fc7b4075a26e18714667960c57562317e916d8cb61186b1ad45bc94300072245f21bf847432806a14a59131fc8171f0d3a6d09d403f39037fe3e1511d0e0bd565d3f2f451ce6cccde78dcc685d12b6bfd366b367a7644762dc652acc2783b32d645e4580bab5f04613ba23aadd6933f5f92fe5d5a65249dd9b8cdd1256aeb0eea0a734389c552471f9d0adb35a3ae15b267bc948f9b6b86d215e1dd28d84f2c56fd87adf015de21cedbf109e5367c363b30539791db4eac340a057ef9b906134df484f6714a32f46ede4b14611c7da87a87e406fafb0ff82050f515b58cccf3a8a4ed6fc24f2e6f2498284579137fc64aae8943ff4dcaa84f159e75ea72669981393080c31d4648606256f9ab29dc62be278013a1c93eddf23e736aa80fe001c03bdad85c588b853a4a0ab97b18a6463a566a1db2e7dea6a471190ba492fdb0edcbac170c54ee78f4bd502da1247c558111407c001338ea724a09f3b8e8829a0f99eeaa9e56b825e3da167949b57af84ebe20284242405022568aa59f09566c40df7541b95180a703e27928fa5b3fdf298d87bdd02774b0c903b30608c057d4c68da969e17291bb29237485b383ae73ff34fda6b24b1c8a72e97d2e93bc96f16902d52d011efba24ede93cd078a071bdc9a7d61eda9333b63951e8e920500fdd1ae4e837328acd85e7008f3e37f9e583261bfb4a19ed52fae20ce95635197d146933d886f28dc2a5bf15231a669d0d55466bed44f5509676beb91c9206f4438e7187ef89288e824f38bef8f1992e2a66b3a66750649c8724662ee2adcce77ee5c62194fb194f9693f38d99f8f42f23bc65f774933f11dd2c1d0a180c75f5c70a1d8eeec5f08474d911004b690a214fb87b0438772d0e3e7f37937678c00d98dd2f90b2229ea5ad533a40f2ca417032b53e63baa80adee491fdd500af7a1875e30a9277031e01c9b8b1dd961c7e1b17ceccee04566008ffed6a6ffd363f98606f3cb2e8c4dda9ce33b1d86389ca6826d52ed59666daa93e04823828a093f9b027e9c6858a7e897b7e76600244e9443bceb72b53be034b5770af4851521a4f9b4d64d0006a80925fc2d40cee923ec99f7b7be17ef2e5aa2aee7fef0067f8bb248846fa9adb367e5b061b9bdb48cc25db940663f77fb8263481889ad2dd6b68d63181ca305d5f6959540ace190fe314a6e49f63e3853289dfd0de5236ef1c04cf5a9dcffe263baa21db0c998a09cc0863da1fa166479d4ad2b68d933e19e6e80cb1e2504811c2eec1a6df9684e4baf4c4dfda4b6cd37801884890cf6294d18a546b803f43e4627eb92a013e9c8d922b16fac01a3321910814ad4604d944d15d76aa0486ef94900b8d33fcab711725ab16974f12278f7cb2d0428a85a05e67048ad5f2e063b8e949ed2759e5a40f8f22c068dc8f7c00556b2a1c142847acb52658a49317cc68ade867f42f58594b0a4eb6549172daf5fa3c11181de2dccd46b920d0dfe39cc631a485bc7afbe807777b8f1a04657561783bd7547ee281cbe0e394f1bbd5f6c9e17d1c44a528806ab434021188ef2d201dd48b307b4104a5ea2f7fb79022f1c614e4798ef90fa0dc391e95f832de1292be4264514bf8c915053a4b032dc46ea2474ab464e78ab42b8d480d118236189c01913a25c55dde8be29fb0ddb0328b3ed3ae65944ed5876fe62619a7ed49b10038fd03efde1db8e72b624e60658eb947a55c5209cb7f6915366e2732d6d9edfa76a6b77b814108f2e0f1eede03ce7ace3f33672463ce9f623691112bcd0b0e349af06fc36200a7df3b31455e38297a6036c66b3766d121543f44cc4b5d626a0a1d0c67aef8ac038215afb58a7ab5718b3546db1af0b558a9aad67605bc0ad3b69115613145ccf71dea46c2518fde7f060b22ceb509222e2cd8c91976e838d440ae06d42878fddb6cf90dae79a1c3d1a7183106de838e146dae55544f367a85b01199e300afa3df968e3525689dd458d4ffa4d6e5da3ae1ad2ceed04304dc08831bfc5ce6e70c042e650316b86ca9cdd3f702fcb8dd36dc60e411988ee03728a56c8e04d880ce8d5eeffe8fe6ec29a7643dac21310f97be8977344dfa3f09aadda4b8f8a4d1236c9b18f5d6e830284284d6489f90ba043811b5a15ce6b55637abfd11a5977f4ade625ae79ded0ed91c43f62164c1989df243769a5b5e1331ca34ac9883bfeddae1998e86fac1d875c086b09998e44de7c6992f6a05679e6f69e7cf4359df521372f19984d85f24afb864a5e4acb8d4681af931850e97cc6b3a42a4119ce0ea7cf449871cda737d712726e0047f170efda1c3996ba522ca51f452617e5a4af090f672d989935f8481e98eec5687f36815efc91e1f660dcf35b2d9452eed28977bf8a073bc803468c14ffda49bbbae2fdae27675a5b42ba6c13f3c449061fa12d8fec7fbd7a3681adc070969cf8c860cfa17c1993fb07ea85647cfe08797785b6a82457da594694adea6121098a3d7a93e24e927fba7de2a0ff967e4cf29998ffe6b945b96a97534f471e2f7404873f6cc3c9c2959f08530e62b57d9e01f6c809fe5c6fc04fde44650bf6df4f0802697d568f8a952e7fd5fe9cea5aec9d2145946ac1e832bfb6eab20c3df28730a28721829eeb4f63368b4762d44011406d2226611899977bc919a9afe194d63ac57eaae15486ae38edc0c16fddf000b0f25a49571b27411b0f5b7a97da585511b15b78cfbc8db691a36ad0ce35d344b4f137fc4057081f0ef551651612fa378912e289bf6ef95d7578516b70f89a3db8c5207d4403adaeb7b9452442e3a919a506920c7cb14eddf12de9d7b7b5f363fb2b366d2185d6b188fe436b10f9763e47b72e7436cb1218f00d487bdea2a9e4ee291424e4d64cd708cee61d63810350bea01e9de0e101b043e83e89bbf631d6c5e77df2956ab317ff840a256730fead8d6ad529da03395d890163cbd31305803ba8749aeec8bc6ff8bb99dae1d29ad9e9a6dc0a796674e5849ee6926d6f4ef2368678e9ca5747620e0e004b14870b3ebbab3c1ba90644f1e7c1f5b97fd68ca7610c1dd1c3236b33520f59aa638ce14e34bab22982d21a8d3193d45b1c38ffa5ec7e59445b420af3f5a3c84dee49d71b2a399a45bf98346e45055e76d2ebe7fd58db245f29f38824154c4f665b066506826037f7e5dcd913a5a5c314aa996b7d2b8f9ed958c5b459f0218980557de6cfb9b45331b1b3fdd596b3fe8d46244bb586b65863ede87e56daf9edf867326bd0f9a40624218da4f227c529ff0cd9bb0dd445883b6bf27b055fa8141b4336bcbaf11cc6c1f1e26c51d02d934c021c894ab0fcb494e0b6b5b53595facfe64ea3eb73e56cd527af032fb7e728859ae167fdf678d09d3d1d642dcf8f12abd16b8b430f51f8afa9f98bea87c7597941b3d043bcaaf6c5fb3ff09aced3b55014276207854d65d66ae82aa8e1c0cecc64b608109695f714e306f4b006464a996d0cae67e1622c8eb54312ee1ed9e6599389b3fd3ff87e2e1aeb955dbcdd9bd95a82ddd103eca66913fbbefdf28931eb4da73052c0967bc4ee2a5bac6e28d713b89067885daefcff87b78c71aaa314bcdb2f0128ff67126d3c7b4f24c827d24581e65dfac5060aca59d4fa53e81d5c10112c762a46827e6f2508c1ab8288bfe75ab91792b01b7a61355b742493905a4eb393434f9999f852ff0df71ea0453a07a8a5b8fe755f27c3d42e90dc72c3af83d105728fe411518a038c2213fc7162dc992cb66af3ece030754193332ff9fe158f52a0c41bf52b0532c932c06cb2de755e0dcf9da24ab38fc185f2149691b2dece608944556050b907a0a8c34de65afd7041f799dbda6da73c3fad7824c435cade0778311f0c20b1a4e6881d5030ee1fa2aff97d742a60b438058f9def53dec7be9d77073f2dda5c3c3cf91326b320f3aeb78439cdff06f1f857f2ff0b1f95ea01e1fe1e92fec15a5418258ccd412b421e28cb6aa085d63d63e80bce06a9e9d855f5c62ca0f2f936349202b45a03b54258d2c36458ba558391f92b846b7eefed5f20097233fcc0a06979f2f26498fe6f87e5ed638d1484be635b3a0daeafb601e4d91dcff219cb686b1aed527e9962fef72077522616520332165d1ebb3c42221b3c1096d9bb3fc49078913394c503ee536ea14871eebd74e5795c4337b1b3d76be051899e92730acaec3baa46426097dec22937b41277f27a699ef57503dc3684577ae35b15843a6920e8bfbf1d6c28e9eaa56739934bec5c45a41d232002a8d0765df11519a720fefe78a7c82482f35cfc76be4f17967d97d924234918a630ae45850a5e13ffe6e5c09ac00a90cda13ac9ee15d6a281c1edf574e21b09de2a9d2ab8b0c01bd019593599b25f0d72c339ed03c6c8feccf7719d7a393f0304b99b2325a5f689b62f4989ef9ecf104508b794ff1985193cdbea444f1eb59ea9333ba8caa7c9c2e7817045e6509fe4a0b5698eebd3946960a8b36fda71a6774e80330f25840e920543088c4c7a512998a90ff31ff1360bb02802f284ae8f5f5f958b5cb0a85db1fdbc773aa7996b4f227d7d467d5610df0350ede564d25d536c10c0d2f968271ab39cd658cbf835501ee549b3d55f61b9adeef6f898424f3f068caaa262695aa527e47e444faa97519962aabec1da6449c22be15d8b4861a0f930d84748b746ddd5b4ea9dfa211381f465fa9688d89fc74249a566f2d90ef4f179badbfdd06d56eb46bd5e1b57f1d50b7924b0b16d3b9b22de1f8fffbdab7a8a028caae8209d6302ea08a0e463d074cd9a599e84db2066e2cf0cbc9e02399d98ee1e95ff7133342068d5790667474832173c8864a8ba00f6ee18c2cad247d24365de9d7d2176ed1394193a6d864a4c94680fb209ce7cc25b2681d1c70965fd6a4c92d3a5d6fb1940ebcc237707517b97e8052ae5af9c74882f46f587baf9735cef9e9e4d486953b71a8aa266922eb67cc4f2d4a0a98b9209a69ed5a0d4115c86abee09d419635dfd1d6fab8fdaeb8e5bcc6167d94cfe0c3293a567b9c20c3050e87c7a6856d30a83fd2b71439180f5138dfd0a9e1db19ce8d518791c767b6110a38a22e115ae83ce94eefeb11790659a80be78be36ac5f668dfdf055a587061c3f05dce2a431964316479003820db42c7dc8ea218f77b351250f770867bd76661f0771ed6a1af14d5d88b2d241c0e49630df953447264e14d05b6d9f44ce9aff4ce0ee3f43aa265f42019c2835365ae187493ebedd0a31d38e6d4b604bfb8b5cee509b9ac3148260fcad41b4e18d0418b825b9f1628bbd7bcdfdfedc101427c476c8dcd14c2e7d7a1b48a19b179f5665bf7d7a0e1d313d445d357177d7996d3c03a0b8923d38da30b1eeb19f0b8675af343e74a1daf4a5845ee9ffa66a4ae9cbe06ac001d85dd1828212e4d41e4417b0ae6db8ad4775075bc347933aae100d7ce54466faf4eba1ae854e2cb6531d304991d3672b63ced1d865deeaff81413cf6bd7bc1e725658ba6b43117af352ffcb708ffcf1a21959c920776b520d255694b946db2ae6656012f69f6520359b77164004aa90cbf9d11e93a71e0a616b14013b8ee5b0ef29e9416bebe8d865713c726c49fb20c8ddc1534d6fc22270b7cc7d022b47af5e972377bd534707a2a9dd11df3c80c91fa8cea4f3c58545f6d87108ecd181e8ff0826fcdb0eed0274990b9b20efd8cc434c3c58a326dcea7d6d51c237a46ed2fd0203c832453bcd9797b1b928a22cb0838258697ccbc6a6b0c64728597f7ae37e1c3e2289c2c2a7a94811c5e1251d3b0f4b780aa980e847a1e026e663a8219273afe16c6c36db7bcfdefb47c90be52af62b95ea2cc82e0e6b4146a407dcee589dd5eb05a7b4b8c59cf693a409e7ba4650b1a7f96449d4df3ce4b75654f71d1a37bee88d574a70418f58680e964c0a23b76fc8537a8d62346e29180d74b153bc721faa4529848d9ace478330f575c902e37d9508681f7a827e761d55f3279e1ed1e901539933af88dfa0ae166e71425f88bf496c06f5af11f6eeaace5c958bed794c99e51fccbb9ecb718220974019e18cbc539d2d97518c7f424bdfdccc9cc4a2529012a58600459def7374eae032814fc4ef2f02fe724d359aaf71a0f2e307d06c404be625c8a4e4904ea95dbda6ebfd2ddcc119256e447d57d1498fcf1243654a374e1e0812084074d3c05e975dff726a86fecb2d6eb5abb312eddf7a5e74e1a0e5db2ddbc85788931438f9a1cf3b713127cc64be1b755c79980de770ac7e15fa85cd77a80a5f787ab0bf3fc6004d645343084cbd5de0c2a2717b1b05b37398c8c70650bedb86c45f5542208dfbacd72df491726115b787dbd724cf3c4afbc120b166d8e283ddf0df214cae863a4b10444edaf351905d55a829c8f74e596a800acb83ad1ede9e2add5e803afb3eeb7272fba0d253e1753b0a77544521c2df1c9632bcac348c736a9b8f73350c4d618bda9e4daad94739c686e5bc76f2ef23f8b40133d8c49e269a8cce6f4b82c29552724ca9954303ee7d4ea9db324473fffa2e1f0903e8e0c808434a715d82a985e28184c717c9a8688fca0cbd1a1965ecdf39e351b69c57c17665e179771258ef86dd1db9c74c37bf109c66cd9a8529d22d203948e8c295684648960555410e826bba16fdcba81f253af423cdc25bc47f212a2c15c52bd2f852c87d132d1458acc7fe29fa088ea38688f64bb518f2a59eaf1c39cb5f85c97f43a29e740aff560bd47ccbf5daaa888129c6bcc99bd6338df359b37a819f9f07bd78a9c9c8b49ae905457b455705126a55f0ccfca358a9c660e71dd9c948e44e720e4f547fa00b07aa07d84cbd591f515df5a34b584a9eb7f97a5ffa9ab18961a1b427ca9bb9278af9dd1737a1839020d825614b466e2374224cfc47e1e317a51531c8117de5e1fb91b626aa8a98c61f75513e0f09d0dca138e2d8af189b17da786c9426559efc63886d324358f0d34e731e2fb648e9489adff9bcb038fcea9e1de2d591af59677a0eaffaf5a176db64070c8c7d8bbe586b67681ab86c592c4d8e0043d229ae65686a0d789f0c7f992ae2dc75cd4f6f85b867f0b2357350eb13839b333f1b00e16eea5a8159f171524f0b5cf8cebd175cd4de24d0a1d49da36e458c7510fdc55c86a436a453a61ea1f5f23f9dd53b02ae72dd21bbf80653394ce814084e7aa0460867f9aaa257f0d629739a988e4f6cc89500f04ddab53a1fb584ae6d2f6d5d0a85f9717216d43c9730338b3bb895a27b74509792ddde4934d690c0af9b011291599f01dd8abd2710d8518d77f9cdb67490303af224bd657d81eae17c027cfbbd8ea03a4812c31e6d5fed1f790f8978f2317a005d95482ad35b80b24545d8436d0ff7d5a19b90549abc27fa8db78d15e7173d0f61a13ea13017f86f93ae5f6f3784efa29ce41cc74bedbc1df8e0d425a474376f989ec513cce25d0f8b6f398239b824660904a0ae5b2794e165bb41f642d73524a876064388f2cb31fede14a1cee22c138cd5dcd76044285c2516f534dd294fc14e65812433174178182a7372cbc5b8d790a1b050e3e053b0541713b962b861eaba1f3ea8fb3b1aae501d2ae101b8eed37d77c1d940adae43dd81d7efd04055bcf624bdeba958c5b35a9c62150d32f62e2c267f0c41a7d9df449a41d346b0af982f9e071f5a3c3ad07ce5c8f2ee37612d52cc3d7cb15dd84cf63d3105d75623b6f225b596cac87882a60e2ea4195048be8c53641c317a792d59b3594819e6445c0b366a6908a88f37d1808d10bf05d41c657a8d54e629f878c8f2f7037a4118325ad1549f4d0a3cef90deacc825fc9395ed542417361d60b6296d23de0b3b577375ec9fb63144e399fcdbadb43d466d8b12e8a4c235fd081c1d02ccb238b06f756fdf486181887fdb1a213c988ff5472847dc0f76e0334d50055d3182c48a2f16c20bf0c48cef10d56bb415591a2282ddb2723f47215cf4a435d09ce8d682f0c56bf0d8380605dd879ada4d599d4e832b4decb813fa82cccd8b17d20e1c5d2d838605e10974ea82b27b224a67569c2471d9a400d10f98cf4d3b1f95c6e45c1c3efc5e1ad425df22852e9eef4adaae29a4a45dbb86abc6ee090e1369de0e1851ace79806dfe47f98674d018418a230c6a884ed2e17b0204cceb35f2353814873ce89c976efca54f8091fe98ac33e1bed7d75f52b9bdda8374e6a93ec09cacf871282f6b646124ad3f1e84959bba486decce4b2380b4834b2677cec88fc173c29ad6a5c662de88138cf246133519b3a150181a88180e8255714be3fc2b76bacd293e949fae46076b000014235b5b326d7b24c60479108ca72f360dc2f32325a8fb3a834828fde0fe6899f91c672cda2b52aec384a43a843f52d97ac3aa280f0a59d932a67e2bf7a9520df61db8a41bbf940fb157a81aadd1be3fcc47fc0d69c61f45d0a689ff1fd03b69ee281136537fa3013d3d3b9ffa9ba4ac1b92b46e82dc33f6e9fa888d0b85c77eeeefbc9db3aa73faae15f1653ff6c767b06a8b7a04559ad6fd5d0255cd50531a7b4cb7008aeb84d17b4b47f9b14f1e40bd0f5305fb11de6428cc670266530773633107d575a0b80594c023373c4ceec3d45f0d8ba4c95fb588b1eb4cb7049af3650e88f95b5bbfaf9ed25bab6e2bbf67b8fe66383533d58c2fac143e47473b104232161fa8825468e05f2dc3d66a2bf0f91088071b00b89064017974fdf7e1c997efa1be223641eeec512ac35d3c0e1a3353c99a2940c4bf3e61c74c09853f7b3b7b3fc4af0212762bc33984d74e3ef79f794e7f44bda5e6ce44c75503a2c1a1c35cc0e890066c9ce3c1bf6671014783aa55261cf57","title":"924. 尽量减少恶意软件的传播","link":"https://leetcode-cn.com/problems/minimize-malware-spread","question_id":960,"issue_number":80},"78":{"day":78,"pres":null,"tags":["并查集"],"whys":null,"difficulty":"- 中等","description":"```\n用以太网线缆将 n 台计算机连接成一个网络,计算机的编号从 0 到 n-1。线缆用 connections 表示,其中 connections[i] = [a, b] 连接了计算机 a 和 b。\n\n网络中的任何一台计算机都可以通过网络直接或者间接访问同一个网络中其他任意一台计算机。\n\n给你这个计算机网络的初始布线 connections,你可以拔开任意两台直连计算机之间的线缆,并用它连接一对未直连的计算机。请你计算并返回使所有计算机都连通所需的最少操作次数。如果不可能,则返回 -1 。\n\n\n\n示例 1:\n\n\n\n输入:n = 4, connections = [[0,1],[0,2],[1,2]]\n输出:1\n解释:拔下计算机 1 和 2 之间的线缆,并将它插到计算机 1 和 3 上。\n示例 2:\n\n\n\n输入:n = 6, connections = [[0,1],[0,2],[0,3],[1,2],[1,3]]\n输出:2\n示例 3:\n\n输入:n = 6, connections = [[0,1],[0,2],[0,3],[1,2]]\n输出:-1\n解释:线缆数量不足。\n示例 4:\n\n输入:n = 5, connections = [[0,1],[0,2],[3,4],[2,3]]\n输出:0\n\n\n提示:\n\n1 <= n <= 10^5\n1 <= connections.length <= min(n*(n-1)/2, 10^5)\nconnections[i].length == 2\n0 <= connections[i][0], connections[i][1] < n\nconnections[i][0] != connections[i][1]\n没有重复的连接。\n两台计算机不会通过多条线缆连接。\n```","content":"096221c0597d8bd7f7d11d52235efeaaa328b64dbf9baf1fcccdf9295d02033616120eefe38aa2147f4181d103acea1232e5f7406ee4922d6da907ce3f361570a36f332bdb5c1e0d80c33822546cdaa4cb6387621252e11ae945a3022625595dd6fe26630bbd8f3a39225d30e5ddcdb86ad54b2d3e07f0ce30e4bd863cf908af745fc7a0aec6c7a39620a8618513eb7fa1838a7f97b4cab9463189e9272f78da91f6bec1eb321ca7b78fe67e47919683ca3a0b12b0b795a4349fe57649f4303d5bb87df3575627e02a19ab8780503871a23ecf77592c96920874b1c83131729abd6b3f9995c867efb42a45be96a0fdcf40504fade7e42d0a3225900f32150eaaed7a8687919062a04b69500cc74c5b47c4d8960cff348c47b2ccc419834ddd3e5109fb4a820830a420a43d4b1c977040eab83e9f1b3c8b46409178119502b53a1d4bad940a325b7ab3ae6ecac9d84a482c2a5a32496b449f5aa01968b9e7d245471112bf385ac0413c0245693e68e4ca1ccbe735a053383122667cba28a5a909be6356206fdf35a44c25a37350b15428d94d3695c5bc11e09c2d5ae332327808b6ad435467319c3bdae82219adfad25aeaa9e8c7a56ad403781628e9760cddb3e77bbca1803cca0b7df74d592f0d727941cb2cdb9981b7eaf469e99779242c816dbc0c0b5ac5c441eb988c3e01437493ccde8f72e3dc65e1cb46a078988f6198bd7f4303462580ae03fb1acbf585cd67619e8d9dd77f0dfb054dff94e2e5cd9d7bc994c7f6efb7b83e4b65cca1d9e42341ebbcd8dd05ed4d1ceef5f4d1a15534264616b690d4cae57b6f166c2ec1492069aa1ffc2645a86096df1a2b87921209e4b93545cbfcd1d2ceb5ec3dcfb74e0daaabddaa98e5bf800e7b8a1848652617360043abaa7c8eadf54e5527d03682e588080560b77af63eac34c2db76d0f0890ec72076c44c0e0ed0dfd0b16240696cdc13708d4194f6f2d829c353b6ba33ded265fc3c454b965ab9e65772dc209ea2db71103801ee0815e39e7c5882f51fccbc4b957372593bf4977e38667339c652abddbf7da5186a503ff6b023cca53bba2c7e3cf7b509f63cbc69be8f11db0a7dfaf9102283032a4ac8256116d313853674b417b3dd45bc6d75e92ec8a300ea3824ab949038de9a5a104a19b68dcdeba6a3cff687dc354e5da2f0d8407f4e890d90f383f98514288e2487e065f35149f8df8dc4d9e9d8cfa87645c8dfc28e79dcc793f2247dfc81039971a131f93b22c44d612a8df8251c6335c9e0aebd570a478295ab89404140fdd394e9d38aefa289f915acf54053d051803825b59123988af04bf624f80b5881e496b459bf70ff47b47a212b29dbd31979737528a59d8d4b630d670f11d2ffd894d34d89c39669f724723058982e74150b57b7bc777dba1b0cad4c0079baffc2592becb6245eafb13c312b08f0ad6626874ed803a078df12dc284676823f37e7c37b1bb8e7d271510ed8c2c1ec4d0d0056700a8eb37f1a3b66df547c445c4b56d46281a3e8e52c15a310b481da0a03b166c6ce0e4649f55f90dfeae61592edd534a6d0590c5bcc6802b9ab3ef2ff221443186250e997677493236425fa203bbd6102704cf1f59335c4051b343148fbcebcf8343fc7c04a2444e1dd0b77a8d1191405408c7726916c0771ecdf9c930078b2674b32edf88ee6736d8d3e4fcfdae9e5a61f1c40b1711481aa4236be0284fdaccb3609a51aadc71c09c8c174af377337170af311bc9ac4862f5ab87261a54662717d0cedae71b114916b5d2a56d9d6b310e8eff456f9355407e8b56a0e8a9e421efc237c3baaec3cfcd5e8cf97005b5363928c87b18789beb1bb2aa9b527a773c7d4e7c17d133defd9b8cdc57d6575ac9cf53f7123b93bff7d959efc215b697a016d72842a3c07ed03f00a99298024e6b16d690f4f7a0a969b4aaa602c7a9c0c2d22f2156794b6209347a5801c84ad00ba76510699ac71e0985c7a530706d935df61d117da4f15d788376314022da34bbfc016d17fe84ba95d6e2ff28e8a3720c234e1bccc1ed65e8c729be563b705eef006dbd3ab47548d28657a74c124d1b45a0dd24d8b6d9c131a71bb39168f9984baba863c4d5e9ff8032f3ba984858d0f5d130abc06b0fa781248667f63c14705c0c0c702fc5126e4c7e6544b09d170cd49d4493370fc2d549145ab9f7366c8e60ade774eb3609becf9c8983f4b4a97228c3689a242277a90505c1d7c345e231418e722a8c4bd62904fad6f802ba8dabedc8fc5ce4a5934ac9f0c2d108b714809f89a1ceda47eac9be2cd10e44180fe2cc3bc4a95ab52d49d68113af3d19780a38e3b4b86256af8ce5677e9f3299e7aa693dca593c62ffd4474bb4a592a438b68a9758cfad25afb56ac1ff1379ec253b1e0cf5f72158910911c2c2e32bb07ae6f6a8dacea7bd720d199a1ca51d4f724448be93f746e68f403b87c4ca3e63baf861ba59d50c8cd5c8aa00a6ac70f0ef99c83a1197b5aab0e8fff1a2d50d9acc5274d85f8c66cff66ae2b4c2d3bc7cd17c14ac1876554b7b252e3254808b7f9b55fbe8a33b28dd9fb53970e4e16ceaca516b2daf891869f87516ceef55f58ea135512961042a835cf89ff5d0ff403e390342e1f2820c36f050236c8ec0b492bff007a5d8a003eccdc72d975b6e95d0bfde7b000bdc618e940d51e46780145e1ad2da7b2fe598c6caa35574c5c376fb12e7c4b7a12146354313c7ff4b067bd4f56533b9886a03941183675120fa6d1016a7ede9eae0ff59905e5fe23fe0a5a4ebf2244b7714156407554149d91b2bc34e47a6f96d8b53158240c27252388069e990474ad92f4eb459022069fe3ebfee1e2fb5809369681650d20e8fe32ff7ac41f6ebd2422416fc8d1888ee63bdaab75c93ed4658427b534a87f7f23194addfad8fe8402cf40d39d3c95a832633c4aa42f9c8218f541480ecf3dd041228bcb9a8c6a2142c7e3165614925fd7f56b636161c1a144465ca2627d242468a687338379d9a0274d341fb7a65316da919ff1939ccb4ae507eb70cb389304cf167244daa3ce8adefbcf6cc5972b32707bcca519ca0d1a8d25b56ff32faa867ac0b65dfe6855dec08271d097df8f33230d8a7cfd1d95cf7dde22d0602f6aec2f53c4083d4b4d086e1e100c04da3d7dcf2d0e7f6b32c061ce42580d8262600db493529fe2cedf4dcf8b478cb715557b3edd4ccf431c8a7395135d627e892829807c557bdcb23074029508f9a34158737c164da8723a0d4c54bf309c991e566d16499719c8928282f7e7724c9daa48afd6874e2481179f9dab28dfdf4652522f1da568d9609b9c7c148a10928fd1bd42f4cfce96c11f6401e02e7da2c7a1ccd2c6a9519d2d58d82910b3829262a4a219c9320602e4da818cfaef5051be5400992fe1d1ccdd13831809ad91a2900e8ed326025501bdad366cdc9277f501137199a6b48d8c0a43864f2c87e22ec8cf0f7ad701b01512772bdfc862443e4f9e47e09963ac84e6b2c84879ab61a6120efff86b49722b431b62942660254360535f222f40c6d27a2acec312969588773ea45d40420528e6ad7763b6bd51d69e6e9fad1341d9f168c581561f3864509ba1c10649b96db4fdfe110e8632eb1b06d9dc213b5d7605100079632153ec7d79631a725f5c1e00656bd25728a073bc8df4639696d1bf035ab672af8727a1e2d69dc73f8fe0a27d3a326ff49fac542b9d7df7547f829ff076e3c5d35f9a5de1731593023fd8a8562b2db030799b015009d8817c0afe69395903eb37bb3674cf7a0fd967b58b6a75603e506e0f2e75e818970ce6daab9baa72ba329e33706f661bb5deb44904d9ea2f151f29b30c8e1a5e9f63285cf7cf6ee7e993c9a8f4b798a674a6053913fc785bf9906a4ebca7c9b98fdc8fb8449f685142af086efb93d6a1abc8e3e98639551d6e8d1538556b1ac4fe3d53ea9693cf56f602ef3a11852bed3100a54073a7d2073aabddf38f29ea61dade4e938b3a3f63645df5c3881fd9143f123c9abe66fd07ea2b21d06bb5d6fec17e32e63430ad7900a7f7fd01b7976174855d9c8d82a920eb94ca847a98f861113324fc71a1239773d4eead3b256344cfd75b13d17bfa1252145b6054486fa3e1f8d1b6c3ecc89e2968f86c079f8f57d9096a34cb8b55c2876c658f47d4ae7d83410ed8ca8bbcba83ab1e2e316bcc717cb4088356f76c32e32d0befe50b4b3a97fead8583fbb9e6682a0e0f749533794398033b0010077aa8faccb7d353eb7b80e15bb13f55d8682eafc6d4a9399d7b888e2046063149e5634ae7b8b9b2e705c5ce4f59f133276da7fe833f9628d93b9c13b74bb1e47458cb2a47c888b209a22992ab6e574c3b164fd4b36689b8efdbe1f59986a85f3a018952da64ad9daf68996353feb0fb123ac236594cf008066d64146b665f3411eab0e8e3d7072fe9c637fd4278c3a14b8fec387bb5b2f2808599f01b7cf3cce531047c219ff9e46368096d9239ccc29338ef46679405a1f42a2a682cd52c88adb23bf5f74bf5a5d0a7e0e74be37d8a78ea169541c81581aa9efebca0ee643b06ff511c1003f43e2e538de985bb05d04c8f39646311cd8277442c4f3996b6f7758cf6bf7cae528fb5b655582f6b30f3b76d14d50008228960f69b056a8f8cd4ba6cd0b100cdfe48cbef3d3acdd2536a8f36a78636aa56f58396f3d331122668d3ef7880c90e7dce9640a738cb4509586833e4c6a84652f7f598442eb8528aeded9a6fde8732d163c253b66d9ea038e8196f87f23be0dd2d35f46cc10105f679aec14a5891b8f07eafa7ed0fc2e84468536d10b77a4f9c60b406ba63a58238afdd9b98db19a9737e5326cad7fc1f2eb2bda7264c9a09877e621c7b460eda8300585eeed02316275a73f7a20299ace07ee094948fc5d433b3a720d26a139e873c17553e3745497e0e8f7c615379f6b10775b53d22b05b8c80e49a9b2114bdd34b9c8b523f4dcedbdf757453ca533980cf2261da3a497e0d6430453448309bdc3fa7c7695d8e0a40c0d3d19f93ef229afb27573c3083604b46b46cebe7d3ea7c8b40c01806d72d90fc76e6cbbd1587a9c36133552ed674563d54086f0f5aac5743be31d65e211744a6cdddd51e123a6671916c233fd09b40b4f97992aa6e45bb3a5e4a45201c2e032d03dea78211bc118a7421a53c8d8a34cc9f9488f686411cefccc5895f1a3ad3fae8ff3c75d7ca2565ff5943528c9308f33cea5a6adf80895cbc6c22639509d7ca66e01492977679e8e583f3bcd3b328243eaa488dc0d48b1b7f12a7aa460a811be3f8bea08c8f96b5d7986c10453c55d3648bcc4fd7301c98d6501544b659948ae6cbee4087d18b236907d64cf4321fa40652abf4944793f9f22b972d228cb8ab7fc29c5317f5cb52ad8537640ab3ebc62520253a74039fef3d599f570bf24c6fb9eaa103ed24c555ee501583ad87527cf5d24df8e8e659d93f0c5132f878bad98b846ea6434e35f36c1258f07072766ae0a91c9231095797e4bcc5dbe9a1375f336211b36882b0606c395eb07301066ecaa12ddc6f8fd401581ac7f547b0e7a616b135c40e633c433808c0d42cd8b5c6fbd2440f475cf0b54268ec6d479aca76f783bf5320e2133bc8eff180927bd9cb28f69a6d6fb5dd08ca03be359f4cd3d0c76b5b4b2a0f7e0d8438a6a32e61f1615522bc5526373dc61eb6979fcab1af3adcbb4fcc7ff1c12f7b1bf59ca287363258345cc054fa8ac8441b0f09776855a4cb5e7c879e0cf5ab89582071dd520a7fe6ec619dba9a0d1b1cbc25921d855bb4b15d6692b9b49f1464878fc4e881451ee5c4dcdf728a735a56a3ef5f849ef39759a8176436adc90f0173371fd3b9ced93de303868227ef3c7c1477c2b5c69f25035a6e087f65328cb175c6116e91501adb2a6d63eb1671385cfa5b50dbfeb3892e4d0a0b482958742212d1c429b1eaea320277d0a763d50b475b05939aadf0891d804a96bdc2548d6d1d7dd318204825b56e991bc7520e8304289c47c7da52177b5791c0649470ca6c27f53f7de17ed64b90d06bcc0d0f596a6d417b6066ac26f477a60ed944783c7c8f39389f1819ee7ed7daa4392b15f3db97f48dae1eb823acc3b744dc3a992de43f6f3431f5f4d9d3b574a771cfde53c30306f9af36dd4dc4e4a03f3a0f35e80c2718ea70188b5addd426e53c4da67ea2974f5829a3cbc9a0ef7576f0d02bad369bd4967c7cdd8eb3771f6cb9b1dbe276eabfa76351c37b4f4d4845bf2737cae34ba853c212cf13934d9d7a15e94236c0bca4e8bdd6e551a19f238e8429d429ab4159a1c60b9e46292d8118870bb509573ed7294ce871084e743d1a707d8b267037b094abcc8c24894a51bf06c65826505af73f6c2259a024e3ab2e582724112eedd6147b46f6787b2382b475e7689744331c4aa0114b4b7cb19541226729fae1d69965fca3676afa4ac80fb9b6292e44bb41de4d8048171fbcc40f4caf987ccf9f07f41c713e5f71bfdb1b5846b2df883e8b3d2c1b75a144909a84761f7937cf289475e72389b28ff372f5baf66070ae6bf108bc153b9e8ded76440538dfc5011580bc94a06eb39da6d115c7bc8b74d839a1a951cdd2d4f6d0ef9d0b7bb1294073b7e1b66f4cc0aeb861f96f6b3345c7c5278914cae33130ff0f80bad1db02a9595631c3bdfef3549e402cb23c3060fddec69ed3e376442b4b9f928f1f2317a97ab7817a82f2f50c9ade0dc8668f76ec5865aa62c86f93e573a94ee89668c83df301eddfbcfbe0914f8c2b73c0b8e06c04b903edac7ba5c85ee31fdce3581e08b928bb2243c8d2ae059d9669cee92dc0de94d0b2d076d95f866db3080bce000ea2fa212844e0d89093e1f01ca299b2a5e347c6aa2d4b046f91bc308aafb005becb9ab7fd557b4cf19bbbec57e42de07317285b6e071276700d3d49cce8de4817b5ed512adc67e3fc39a59317dab3e3cd3a95ee1119825718f8dee07b1689205cdb1c61aa6f5db32b63e64733c494eceee185091f4aa48fdedee8f824a3cfa957eaa033892509721ae9855f80ff72fa8778f7ec477101517cb7bf4df2f5a2a3d270fabb392cee91021a9c1f0594688d66f6cc62483ef8caa45b7ac7b3d9f2d3ff5746af55619f8134e4de1ff748fbf506bb65d323ae1c1138cae19b4be282c0ebd5d8db62d688f6d93aedcfb4c91e97f043662aeed59a13176bb9c6c5326f435dfdd109263328bf04c2a197c76a266f7f7194df2bc84207f420de6ae79a7ce081c9168085d1dce9ac4749cdd267a9342d201e18f72a52cb1140b6c2c4c40d81ca9c6728be7554b0c0fc8927fe9dad777969640c5c3850d7727e66114730442a231ac9a7a3f1ec4ef54941af6a1a168291f9817d7e4dd4ed2cc50debfb69cc83592076f5155f24c352cc5cb7192426b749fa580277abc87d5a7dbfccf9886aa36d2faf6f02ad23cc501034c687593f98eebcdebd2da7eaa0a5c78c8ea769615bca0c0ce46e503b372ba1bc5042a5ffe49fb5becc00002241fd1683603794ae509a8f0491bf25fe6a8d76f4a2c713b836a472a3e2a64b133b4f7f292b322a1726c17c0fe2da69306ccb8a167d4989554148ebac4ebe5b987aba8a4340ec15d5222bd451d81f5a18fbe26a66977fb36766efc8508a869ee0e8ca6483bf09aafbab25705c960c77f2dedf71e77cb6c05b3d82a32d770bdfc4ef0b7352dbb446a1c6fc7b033aec205d655a6795070c062c10e11ac9e2282c3907d35ff258002d2245f21bf81c69284fe7421a5c5186525c59737206d548ee8d16f24b1c109ebded0d187e743e05f49ec1e489f8727326eff3bc68b34da7644762dc652acc27cab330364b5087adb5a4304bdc3880f76933f5f92fe5d58c0f63dd9b8cdd1256dbd6bcb0b56924db4e6d40f9faadb35a3abc7160349b40f9b6b86d2f0659bec884a98d789f7ddf101eff5c88f143900075b326bb0c227954bfe1982ff402bdd590367196542d336fea525dedceb14611c787f8ee701521cca2aa8a6c0353544edc9b008a4cd0d324c0d3e26fa4d4419c35fb62f396dd70ba8f9883d822bb6ae05028fe44d25a49428436c31a4b67ccf7de9264b0647d7f5fc7a28d3fae78acdbb4534e0aefb99383d7f15fa4ebf6d5f28d2d07f178a7db6733a33e2450dcb34929db53c79081308564cdaf41108677d4fa679dfef4c23de1fd77456ffafd1f195af7e5a79726097b8638fafa03fe5321f32d53332cfe5abfb8e0dbaccc6f807d53991984299dd248e69689ace9332b28207c3d0748b87da05d610190a6adf645b2e989ec775023b5ec817212f9fad5c2ff23ef40c24adffb2a277fb34f471ce3458ef925b48e5cd50e77835d2eea52bc35f778722710935e56831efcc87e7692fec9629f2241a9f43d5b4c50944aba9a761e29a4d33cdec90c1be8910adb184710b8a6c533b78ebec285fcb6dabfb63e9dc8b2ac65e10a79b77ebb5f3ed840952ad926b41e794db02044f0bd78513274948ea03f27a1e5f4020d864c23e26a457db77852e41056dff234563c4519360a6e1ef177813d11cfafbe","title":"1319. 连通网络的操作次数","link":"https://leetcode-cn.com/problems/number-of-operations-to-make-network-connected/","question_id":1442,"issue_number":81},"79":{"day":79,"pres":["二叉树","递归"],"tags":["剪枝"],"whys":null,"difficulty":"- 中等","description":"```\n给定二叉树根结点 root ,此外树的每个结点的值要么是 0,要么是 1。\n\n返回移除了所有不包含 1 的子树的原二叉树。\n\n( 节点 X 的子树为 X 本身,以及所有 X 的后代。)\n\n示例1:\n输入: [1,null,0,0,1]\n输出: [1,null,0,null,1]\n\n示例2:\n输入: [1,0,1,0,0,0,1]\n输出: [1,null,1,null,1]\n\n示例3:\n输入: [1,1,0,1,1,0,1,0]\n输出: [1,1,0,1,1,null,1]\n\n说明:\n\n给定的二叉树最多有 100 个节点。\n每个节点的值只会为 0 或 1\n```","content":"096221c0597d8bd7f7d11d52235eceb6a3298eae2e3e8635067467257d1aec869d38e07a6e89b73092e62bf8296a4c9732c7e64065cc90256c46907ffeaa78c83ab8949812343b76d1fb4b46541ba5b0b22ba40f74538943c63fe53f624a660285ce49f581307ef6accfecf850354d6daf50bce6beb10d46a428316b9161fa4cfe8c3b245c7a407463a77da24ee422b46e6200b17a280d7fccff0478f5a0fd0a5b761f3966e8cf206a622e948219667ba3444d55bf543d1ff024a2314da34e0e3dd84e93d0d719caaec34768e84d7635887ea3791555b6ec53470425e5c3e35a48717e961c22b27379e4c6752c250f5bcb80bc641933a4e0cea445fcf9cfcd2331991811790dbb498eb7839e07b2d3bc74352fab3861b83adae08e4482e205a1048b410a8c450ba01bbf3f5f3994764ae8a31f59d8c203889c15b7eb1dee7f3a87856a078e67084ad9e64f9989f601c8dea2aed8caa7bf128d648d88435d70c180d0f776988475c7555962075655af50aaccf518af5b2e330754ba43a7600a661e83bfaa056aaba66a2aa36f77bc7521da6d3497f78713c1802d5aee32314d0588a784cbd0309a05d6c60f1a82c4d17bcba5e6c2a96fdf014a0e29f27b08c6850bff3167e020a06c7aa7fab5e9644d150ad955aa97f5c3deaaf13153271267d446f0582b3299d2018ba1e2631e2729b4a37a58b6bcc6048beb20ea62dcc276fc08cfaa6460956ef73353c47cbdd3e11b00831d5522efc63be7c70f0235746c56f10879b5cc99daa261d6ce7228766dec92a7f3879f05fd4204ababc7a8440e1c781f08d82d4124b6601a787d6e47e99fe33dc954988d20e8437c9ae02d7bf05ec4c27e639668666f632366f12832f588615f2c214e766961829ed13017382e7b9192aced9707d4b6b6fad098599a566601c2a8e661cd72fa2286151cf8d0e0bb0cee0daa78addca2631b4f2ab7d1f8a81cc7fb4ffa40124e3a7ef802cbbc5959678992073a32b128f0dd3438f14ae797bb140d4158ec6170dde21344e249ae1b16ef9757585401e7966f0c614e272a18a5b4ce75ec7062377ef6ef5acac566b775141cb5d208836488361626d982160e41563a6fd243c3c0690c4bf95079c6313eed0336040586fd75ce0426f1329c5228e8dbbda89d9a8eb0ecd02b7ca88febe58c646e2eb38ad295da6ba4d68600fa550a2b3038e6e24dba4c7caf49c73ea0e1cba5e78980ec109b37eb9eab9516bad1ef8a320b98a46ccb59ef6adb4943e21ffe8249a51d79e19f0e9e93d206261bc38ecae0651b3ce1b3e3fab9ece5fcc2e076edfc261be924f5367dfa9c6dc3a88228dc7b76a49eece7fe2fc67903e228ef42479c7198fd552062d1ffdaa5f0e6e4e1fd7b48f5b8ba9fab17a03853d161f7f08ede65ccf2cff1ca7c44fdb416c3a37ff190c46e1c66e7984f6bc5fe1c3e89e6ce8e423ed2fd5dee6b9c25ad0ade327b5400ee126b86f604ac1a2046eb522ad7075f9317379bb32438f5e9635a646ba0a8d09ff4ec9e4fad0b442c66c1e823f857175ebacb4d9e106aa9f3e52b8b04605245e14a606a812d2881bdf7748db0b6a416f3c42414430eaafa43996d73921b772efe1035a546025862f1fd8638f90c172b1f46dde1b8cc14d289de19574e8f6fb37d9de1f580701ba11a46a40b526b001c21313f5e7aab90b8391b081f90e747e4886e715a010fdaac8e7488bc4808b8f559bd4c71710fe5976f89617d8c659ff009ce1533633aab1da33b98f190217e907860adabf2c4b28c5c689700c003ff88a288086409d65c4331b40cbd9af3637e9a86436085d001aa81cb27449d25483a4f79bad0c4d91b3b327028387a081bf24807e9059b470613ae144a7469115d7329a8ae96631a12c8f19a15e350e5793255f9dec9fdd6a9fa41f0afd5118a01e817ee5ff21b0cababc9cea8f513778ce53e7fc94ac59388311535c1b446d0cc73639f7f7649e538cae26414b14e2dc3c28a9fcf5ed133e330dab90d5b4155d3d6cfb098303ce8ee5aab6a88289c382e1abff2ae6678e741889b967bc6d88d7d99e563b409f8f505cdeea854588c3d787642d92ad3975528d14e8f6695322173840e14bda48b99af85054e5890ccece2cb21040d49aec413128e0b97f394800ff9d665df5304f0e2c735f85e32d3cce258491bce72df54d6401a72d21f579048a099716ad0fb06f3594d944d9bd7dac0a60a4a629622b211809e40e326be341a340f6d65624c06b371bea0da5bcd1ab434f92bebbf98b0e3f9a0256b62cba96c7715f31a655ca1827c829837e5b3859726861b8f9e46efe10f94cfd06859350e479fe3e4ecabe36e65d176499b91531b9ccb56da4cd7cbc8cbe0fe59825137e248067253d7309e2afef5a505d308f6149269b58c098299a965046bb258e718627c12d14e89041a92f08a42816be2ecf7db26a8e76f1184a559480411db64f37237fbc0bdba963cd71027b4e92bcf825117d5476bf2d0d4915d3270ca5ca295661f1abb93914773c4b0ce24a977f15458586dc7916ae7019d920033bbf436c05f2828df969813c1877fc1b3b99f5cfab8c814c7a4a52896d6f08d8589915054e6f7787ceb167810ac018474e07a23a43d28bd66e1cf683e7b533da11d037f6ff996534a469c373f35ba6563d7bbc165b00a6c502bd8e8b722517f69b163b0b4cdbdb6cae39a0fafaee519e7fe70790c608da88f76a79e252922c47a0dd4ca92d2a833964f5c053b9890e0525719b9a3ff59848b211516f8a4ed6cce8f056f0cd690651a5ead3d59d80a19192f7d2a46b8849da131ec7a6697c2ac7a1d2d7b0d6b09880cd7bf543dad9cf6bf1ec36a4b93f3f5c995b386050975d9cf2b4831f9e328e367ee5131f1086b2e119d83c68eef3ac0b239c029cf1b8430ba4eac6b63662059d3fab3e38503de0dcb9d3ec1bc290f6904e77b878219a147544b8836cb0f71ced89c906b2a659ca6087446dd1f8cfbf1b598ef3b2d5f227667cdede3c2b83a76d005de182af8a8f3f55622d5aac7df8ffc958bcbde2ad178e418ba49f6e50b6f0dd2f68a8591b38729d48c2d29307a8bae14d04a53d825e73af163a7996b87e34a98684fde929f7bd0d9a79c196e5cd17cd76d91b1359163df03a8a0282741c9eab6bfc4e8848292e9813cc1e153f2878f9ea3198146f9ba8b559be5d53c4fcd0f275e4ecf3242824c4388ba8a832fb34fe3e906987cd6eeaef768f9e720f293f75d7485e428954cf0a0151b7a731644a46e697f0270e52c928455192573049f42c8dec7ccb0b33a569dad0ef294c81272c35892d1b135939a5b0e1b4b1dc365d067def53341c4449292d1f359decfce9ccb0b3009be6170a3ccb6d9d2c7b43e9c2e50d5291ab8c99d73abb95eb03b0659ceda818cfaba1e18f14841d069bb929e931e891509a597a2ca7aea962e11306ff8a33660cf8f71b22b503ecce8e08d810a529d6506cea468d3ce182ed20bb8414e3e2bd48471437251f213e084638b8da8ffa4092de324f4695882f86a546f6253122c805860770a271b0b7e6e5ac1d36d5fcaf755c3c1ce23708e1a48467b60a3ff0c35cbb44afc9e6e9fff0b3f8ca326c59d5c0f283848daab804f1cfc2ecfe4d10a68c374e231638bdc3527547d0573653763741da532376b103b0b50454e3e139d187ca073bc8dbf6a918cd4fe1500d93df79275a8e4ccd0cf23cabae7267e7d21b1b5ec1428f802d37372eccb9e332c596975b05be06717857a4b94eb326f2fe85d41dd551e06c586774ca7266d2103aa37f97f3a812756119253078fcfebd9b2e2a6abb3578814fe075d6772cf3cba46cc2b1f012902da8bf9220895aa497a2924eb44931d19b4786519b6cf44ada9d399f1dea09cae74fb530b10b0300fb88965188bbad4ecc1dc8fb80d9c6c5e07d34730b5cc95a3afc0e290c37f13116ec30f6c546c1dc6b23b5af0d8cb8c0af308e73d16985af12c109b6a73bac33873fa89c0a76ca66cdede4b9899741c496457f5c3881fd91238143b94f12fc106be6d738263ae9ff0c72a7dba6722a6350be8c3996ef3977e74cb08d0c1c6f666b99bc4826a998268011979d671ab2cbd7cdee4873b2f346cd6da4c52cc7ba07b000351414f777a83fb809ef997c6c8942908aa2953cadd19d9524c29c19a40ddbe2925a51591ee03f71c41ec8efca292b2cd123e3d7bc061019e5ec204f73c60b6631e9baa4e5c75c5aa9080b092c7af27640e0726da7c2d4a9858434544147da8b9c8d4b61deb3fc6b253e3705ec9272ea1a29de6779562c28e794e4e5406b16a4ab5fdede7b54bc5de063cbe675c2badff89649221e83b9c13b544aca82e468d546384cdf45dab32b8ab26161a3d591c87f74cdbb8f2dba5b3ca8ebc5f2755c44fdd6da08aa63afd6310b1fefc11799e33161fbe123c64644624290b3a5daff6bce38b0b61fe8a66e62b378def0e85803873e7b2ef9d8589f91b2ebccaf73f107c2893a5a577684625de339ea6d730ad4f2ffb51f4a6642a3a639a7886fbf377f5fc4beceb92e8fcf420ef7d955bc016d40f9b159caad0bbeba09a733210d40472550bf92f2748a7e985fa4b8342c37c227f5086c725007e1b33969cf731caa5b73de001c2e7da13272f612bf2e53e14c70b0f24cc0fb0cf1e40d297fefa6adfc92a8ef4c40142a9c621508ce404971b6a881a5cffa9bcfed3f69bbca12032fb421b9a8f2307d460b313f78983a7b1502668cdc518712e83a7229b3d797b42a44c61f41eb32bd805a9116bfa50c2ba0111a6255480e24987429bcb72bf7a07ecca585407f53a5162c92c50ac83da85b972f3c84bf7608f73a0a1e021edfedf17079f46bca9c1ff47b4db5bad10184be6bd13c87eeb83941220428916b7bdd81511b2dbc5d2ce0e4d981f637c94736a78033b7bbc5e56e539be9d4b75b5e194bdddb1ca86af0e989794956378eda624efd50d88250731721af8fb2c21841455dff9a1721268e1b1d76795846b4cb8ef5282cb7a736c404c73c8e2795cd9654abe9edd6a0c4325190d5b57ea6b73e0f5a5f739c48fde3eaa5e77420f8af4","title":"814 二叉树剪枝","link":"https://leetcode-cn.com/problems/binary-tree-pruning","question_id":832,"issue_number":82},"80":{"day":80,"pres":["剪枝","回溯"],"tags":["剪枝","回溯"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。\n\ncandidates 中的数字可以无限制重复被选取。\n\n说明:\n\n所有数字(包括 target)都是正整数。\n解集不能包含重复的组合。\n示例 1:\n\n输入:candidates = [2,3,6,7], target = 7,\n所求解集为:\n[\n[7],\n[2,2,3]\n]\n示例 2:\n\n输入:candidates = [2,3,5], target = 8,\n所求解集为:\n[\n [2,2,2,2],\n [2,3,3],\n [3,5]\n]\n\n\n提示:\n\n1 <= candidates.length <= 30\n1 <= candidates[i] <= 200\ncandidate 中的每个元素都是独一无二的。\n1 <= target <= 500\n\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d84c39b3af36d673d7a41596f265686992559eaff043a04b97aec035fdd67cb892950aecf3a3bd13fab6c0a78e61bb9969a1d190274f3c7474c431ba3825db633c6115af218ee76a234032a6e75ded9018c9e6f1dd2e5b8e4a2232d2835b837c1c0f1cc0d3df13b5e03ac109c58b9d639533b53063161c629ab289835f826736cea7479a9dc0b61847be885f21644999982aea3e262237a561705df1d7d37a8d4d995b7bca43756966a34a90d99b71ad2ff504bca47c373c1ae44e47937817cb17d16579be6724ee1930584ae0adcf0d55ce0cf3187a16e309ceefae87fa287a53f1932f1ad8dad4deaa2cecb2935c60252231cb1418cb783840bb7d8b60d106fe775ea73cc5c0f49cd63409e6bd9ae4160cf0621ae02be3d6a0d964349e59326b5723385482f15b7e11fc25cfe4d6ae1cb046e2366d6cc669989ed02edcca280fccb92b410a07e8d88549a9119092e1af7794cf812f4584903547580942289ae0fe91b0f505849ecfb7c2149e2fb75954f5159d9ca4f51c372ec368deb5abed6100a62867ded714f855e3d2e7c91e92b55146ca5658ed4796992b09b76aad2e4b9f56f7390a4f5a8379ecba19d8512a2c3ed3aaa68789cd0e7aae2b9f58610a43852170782a87c8ee945685e8c19f6207231d28d1fcbc8ff257e3e5fcda2ece911d6b924e3930ca530ffa813f1b7262001ce2562e60c8466f8bad1e8f48fc0aef59f4263b3071b868392b7e0f225d9f6bbf9a61f51ba9e894c6db5bf10174862512bc46e83cb610f2e44db595b4279bcbbb8d8c7c5586d257523fe74215e941ce80248974996f4272b86a21d0dfeb40b6ccfd2c43eb5abb260fad5f988a28dc34728b2e6af6d11937b1146f391cccccf6148e0544033fdd0985a9a546607c2ae977cc136b761cd4035d2057e1fc5635119d8105c0cba90dcef1d7b2d3cc85d2bb9dc2a451f07cb7bbc7616fb5141b028b6feddf816ada30e576bf4eda4a8f8a73800e30410dc9749420808f14f4fab129b97cfab5851b687aefd8915a3261b5eac34ff8dc1b94976857c4b65be4917229dde13ba69ab0ad2ae438b22026b3c3a2f9278fbe678035930eba90d86b02ac7a1c0992cc422cf2ee26be54af194537171a8bab081bfeed232544d3952cca6b3ce8f661d1efebee7722b03cc35cf86dfb0d92e70bd3597ef189d6bab776c547e4365053bfd15c90e084e7aa85a26292892c92a09b87bbc61b833c5a03983243b49a51a77d9830fab98d2063716e08cc8da5a1724fcb3e3fab8e4faf0d4c975defb270fd324ff3476ddbd884e045b904aeab9481f01023aa857bfa177fd5df0c341ae7563dee4d8b093c7c6aaef8e98c80f00c710571c1c149a0750ca4a187330de6cdefccac729d4f03a2e7ca6b11ea09f5f814a41b9fe6e0890d06c6eac8e9f823d79cf9c32e529d508fd6acf5528617481240dedd158cf2a9390480655db521599757fadff7d32aeb06c06327bcdd5e0f595fcf7118f682b1330a8da4e9066731e8aa50ca55907b08a8220df54522e2fde2e255ee96e33c2c5ec12d2bcf1fd2eaa9f0c531915ef887aef267bdb4b5246ae0545e2514a29589c89a251a604796f3c224777b9ca17dcb4fd1f7c76837cb87d9cfb3378828c3f771d9e6435446a580256b3e776bca9b8391b0a089eed5fc1897a6b56053adbaab77aae924a029bff55804c756b01ee886ca1407c867d91e633c731146e16a41fa11995cb842d4390757a9ca9eef3b28c59688928ce1fde8f9a8a086402d46c7832a50abc8ec06c6c95867148479709c5f2cf402b9a45100c0c1fb6a89cc453450d3d4d1f35742ebd110f9e44bb305d2733f8d4c16622437122a7ae8a6f1112c91309639d67ab200f3986f8afa3c1e58a58affbfb67c924b45ec23fad2474ceb7849999866c63c45191bb9b73beca9f48aeef52568f1490410ac14d3cf24bfe98f2144a893765fdb4d2bd6fbc3bd164d802c54171d4a63c52265050e5c47e15cc019f72b818f1a4d670736bada162f20c7642fc3d3a09be566f8254982d79881b301686ce0af186faa13fac254bc19e75c141835afadae466e3851a3f170f2e4092c89d53137a3b6785e7fcda10349bfe448962274c2680ab83f943e2c20628559c13cace3b5a12bddfff54a97fe40adfa3b64ab4fd649e3b19b4e12b2d84199d9619b11a2e2c071993c1976de56efe0149a9a78f71c58896ada0fbffa3a920b914405cba1f8745e87fc9692b734a2b634aa9a8a7020687f3e00996898d315d894914ef60796215f522c6063b8349749e7139af3717f3cfb9095478751963f6af03f29f7f568dff1a13ec518b224539316715a34ea6f274b281db951da202da773a538534c32fb036fe6759c00f4526b6e1b3449876f4aff6dc638b63e08c49654fa45cfa14213118d6223ca8906c7bd387a4d4148861ccc86b05327f6285389d977269d34021c49c029eae475a020af6f6ea6c933e39afbdcb3b5755d0955b5c52a96ff768da85eba2265dfe5f93440abdfc0320d873e0e0ae7e5e1a98047cb054135118b850dca7875f6224f94d561c470a647584d5497cb9847a81d9ce089842cc53bc8939f5eb79f71307e3a3f397a50ad4fee780642494f0a417febcfa738af47750eb52b3197794f95b3337c03a1be963a4366029280c096078e9347a4473efa33abf9097d7dbdb3ee8d0eab58eae456eadf4ddc5ad77fd43590eb04d6e8b2c520a82a0c306de8b714054b4edae6cba9f016929cd86615945f73a52ce724b1023260a18fd82b2a031e03e758cc8ab7f1d3504756b04884fdfb7107cbb92edae4da53e36d4bd93859c9986050975d983621b37b2e538fc66b85a6cf10d235035ceca9ccbb57c8feb379d659265842dba1ea3147009144bd695917456ec4f9f271de73670ad86afab57bf4f499969e5c1997cb821b3a96139096bb5a9834f2bd2dbd13ccb17690f394f33aab4c8c7c0cb045a6d597fd6e71bf41bd4cd7047696b90cc1a2b761a0f6d5535444acd2fe871d8399d2323aadbc832380f6e3c7a1d85404cd6b8b88ac2fb9318e65c0ab9057cbdea152a6bdb799a787b9a426cc2344c5d3406b483d532cb39817220f066e863e8237ec32f46c00622434d13721f202702e13e7bf1020c5a6331f060cc685d0cb5606330b79a7bb0e1f6ff4fec8845a7851b5a4a32f26fcd7009856a8613555a7d8936279d75564fe6bb195bed309e7068ab9dab9585be79e8bdb2899a5ca57350df8c939c8b0685536d01720c7a81f0584ad33b7d2a83f620d16b366eaf471aa0d48d9db061b932f12e75fcdd688d3011156af118677f1415c1a1a62ca5ab41474d175f1262946ee39e2bda99694519a94a2adf31ff9ed40b4a104a5010d7bf5cdf8c3ae655364b14de03f2d72270455ca4261cbae055017830d7ee2c51e0148e94a549c2ca8081ccfa2ca19d0b27c71245d7ab5be14fd2faaea3146ff2c1bfdd14f52504d12377767d15ade440b932d1d74663c491ebbfdcb3cf0aa2c6e2f9c49cc3c8ab8d1851bad05e02bb4e1a57f7f17a909cac99ff18378d990f2fd13803db5614feae7167a7597fdae9eef287332128e3c567b30b332ecfa20ef726a0e5606ca2c685f1c9f98bafc8bd9c3ff7adc48de2f3c398b4fbc770573b6fa65699fce04f495018d19b15ee7422a8e7b857456372862d3a8bd891f2322723547c1db41513b12f26f07be30c71dc5cb311e3c65a99e42c2485dde2529dc22c8a95ef2809b7ad61eca3b6ac61ff18abb17cfdca8c75c4eb67081f32323a05462ed34dcc0b8cae9dfd2bed75ae32aac2c2a3d60e4a0efc813c07c1a5c9b878fd06d3f33a9becdc774a8128351b3e65194e702e8058c0cef1768eaa7579b1900c010c01345b6a5c6edf29dcaf7d83bb3913297d2b23497c76e5d789e306a995d8b9ce0d5bfbd83c78121488bf1dee3ac419eb62dfd116a2aa311bc9b6783a4b5b8d2ef169199a531c80b749695d335000d97de9bfc1d25f18e642d670a9f622af645c722adda733fab247fe8a350f1e8c1a52e5d940d9264b4a6da9777e4671be5625eccdb19538ea2d23c73c87ee6ba9a4f193235398b247f454c9dec7dd8fb2f6a26cf0c31e2a6f296714e0d148a9af094bcf74cc97cd4046855753c1bf35b15e448a3f87c1520e6129426342be8c1b41cf727c7093009177cd18c9e9c06c3f8bb8b36c2510795f1e0f5c68404f59355aafd533c157210a0a9db44a90efb7d313ab3bcaa00df01541c86c62b3cb9d8a3ec67f98e2381c480720ab370fa0fdebacf90586815054f7291d7fa7ff8944936cac72cf478a7fffe33d4786492989dcf75aae29dbe572164e3f441591f74589e3c5f1e1f5998682593b55d671dd79bcc2c66f832657f4acab4979c43a4502be12622833140a340d754886f9bbb78a1527a2dd00fd01378d83479f922412fbe6b7c7c0cbee1b30bad6f7315f35219ea6a50621463bd73be9c58464b15175b71e8bf42a2a686e946fc3f9e07ab6bc43f2aecae4aea343bc29c4718357db058151c0fedbadb0a0ba602512ff1f3a1013fd2504538de985e9408419dd77647915c8dc5d121b6578e9debb3ccff6e933e716cbbeb1506c29763ee4fc7878cf160836ec03a5cf1903c1d891fd6fcdfd1e84ac44d6e36f17cac6427ea871e9e971ef04eb83daba80651e2621d9f245bbb61f73cf8607a23ddb081c1d263ea2dba10c2d8ff9980d60ec52daa2ecd63bd0ff56d12f871df76fd7ee3dc21920d4a622e9fa2d24f42587014db77dae950117dfef9f1aa7e3a449cdd1162f5f6c4bb76a528d70f84ab20c8f8f2985f7dbd89b33d15c6c0b268ef0bb152eff97e12f42910682446a656c1651819c497845ab8c6c75681473ac880299acb26be1838a889dfe7afdf320c20172dbe473595d34261104734892327c532afae10168fa4616cb3a8c80ea9a912d13a8ce4181d6177a58a38f976e741ac15830c9d20843943a447e1c642e453b4e2d81973db7ca2e509c4a48ccd9d79f9eb55988ac2e4c163083604b46b46ceba5c0ec638a40cf5b40ce64ffaf7ae687f446d3a59e08721b6a9f301769112e2d4656b7630afd75954a211a42aceac0de09696e1b33d4722a51b4d20ffa9f30dcee6647fb7220441765516155680bd4a18345ba0b8d7a1fd035cec87a93d3ccf6bfc90f1ca8e6dbec51143fba84d1e9266e91847e2cb01d069d102922d97caa1a3ad3e4835fb359382da248ced17be615d4ce1337a6a0c0e3b0dafd107b0ee40180cece8c117235bba80022d52aacef94e3cdc1d2fc93d938083c2655bf2dd898349e2c0db18f020f05b1509891b2adee4097d6c8602307b705b67d4ec84f01ffd2f723c7848f31fe6163dfebab0a8cd5581cd5825ea8c6271a58f2a88d2d616b69280298ee2476d64d11aa4c6fb6f0fe60a9659110bd5c15d1b89f5179f29d4de2f2f370f036463a60bd36ee8a90ae44a6434e35ba2a120ae56871736da3b569cc62464bb4f9a7d39d8aef635f7d6b11e84282b0606c7c12f93501542b87b42cdb3c9c8a4f1c00daa74cff98f458b1748a5d6d7d13684d8ec46cc5a385fbff5f195d06e0fa0f31aa21199a8038666857e79840d6936e27760355f243029f62199295704cd741ff2eba3fca175d6faca8effe88b3d10deb641fb34baa4b5522bc5526373dc61eb6949f0c0f15fe1464db2091632efdf6fd7081ebcee980c2f1c060917d210ffebfc6aaa287fd0203d9ff401796613637722071dd520a7fe6bc34dff6d3085418f325d6549e15afbf5d299effb3cb0d3ad3ca8af0c4521fa6deb89b3bce320e13f0e6569eb4f3de17fc173c49ff864055732a1f95f0d4d878eb66d4fb73e17d2c44328cf1cedc644d5769183e68088d8573ef1859911653956e653ae20d5b385cfa5b50dbbcf2ca651958034d62586d1313928b29f4a6a75e125bd6e42cc243094466d7dbf9b5da118018d3f0831dc36d107dd3173a0161ea05cd5e942947fe0828d54ec4da0ffbcec7544dd351df45a8bc70f68a0de917a8001e8f53c6d53c25393c7b7d66f559a638e95ac26e783c28ca7468f35117905a8795f431223fd9dbc7a1cfe257fb23a4c3b0448773ac14f75c216031adfdd9889f36e632848a0182404df1ee78c707c4978533275174f6093c19e5700ea30ea08967ec5108f272a287464303a3cbc9a0ef7576f0d02bad369bd4966529a49599375f2c939bb1917689f0be0c4be9510f0d080fec0d719fad58bd48c8129b02a956ab2e5aa8473486b4e5eba888a04bb08108bab0739b0fab0f0cec95079e146c60c0519b42e10f5131852d04ba6f6c1a270f040d6ef3633d76f9daabd08c69aa4a03fa52ce2035615ab77f6944208654daed4d1f312446458ed8542618bb284179d6b465f069c57f555058d945451b29b28f000f2873b1afb9d43590ea627bc4179c77a5ff213508bb19d35a91060a04a1ee5c18eeca619acb4eb74f243e5e27c6d5571d08a5de8269c2373d1056a11fba9a84761f2d588278f83cb47787e2afc632b4baf72d6ddc088c01a73f3b9e8ded6f2f46738b974056cbb4d8e93de7d7e9d758c3a2b33dc270bdb21fd18387b4cbbd914d31f14d407eb7afe3221fbbe7c56df926622845988b750aef0e28ecd269e8703c0b1d8006bd9aae6e53636c932ac806b23c3060a99bc881eae47110381b9ed9873c383da97aeaab27a8a0d506b0de07c806df37e85661ee39d37497e878f37cdb9f68c270bd0ceacffde5ace8658c2173a0e8a13e1ede03b6e22ee88a1bb142dcb7190501a87cc1631b8dfca829c9de3bc6a038ca83909beca80da424fb30990801c12a58e3e16f3f0bfddb8b98eef03fedcac1b6e7099fa22117512ceff57fc4afb846ff85defeb914664faac7faea53f83ecc271f35001446407071170414e6a4971b43b5f05151a17cc9fc62cdd25491e7b18c79dee63b19820759e6d2fd7b61f3610e9e524ebe1e77ae2b33a75637c484cfb1a0fb4c4c44f7c08c8ae0f065afcfeb5eeabd6ec631472b17a6975380ff72fa872cb6be0034555d56ea954df2e588a3d279e1cc132cbcd4564fce5105f221de32ede63f5314f1c4b0711648552c3e013dc7dd4398d03a48b6591b9b418d0856c10fed17b908d889980e79111cfa84dfae182738f626566d3edf555f241190723ef7c8ed54715fba9dad176f01a892a0fa50148d8bfbaf3cc76203bdedafbbdce8945055f930fdd623e85cfa7f5cad60690eab665d45180f3d938f780ce16cb1a7e6a6973180f802b6ed73466903b7254b1bf9ed47bec05b276c68c84c1a019bc1e6a1bcdaf0cf6fb7d1e9d5819f83b1a4dd522a6658668169e5d5658a8ac26e571f2ab8fde01376840380693d845a44cda2b969aa989133db03e521d4f9a631d616f8bfbf0b6bb8effb27465ba240a967ea2bc2c410810998d3a53b73d1816babe3bac33ba70617330e3b1a62edccc05daec97ee89fa78de3046482c037783073205543b6d1c6d12cc2098691093ab00051e41e548e10f207b26e714cef1ebd5b89203966c3e1dec996c3a999c69cd454fd9f4e48b5ccfd1449cc93830c938fdc4b4cc471de42e10f0ca58464ee2bb0d50d1be41e343d8ab62b34d03ae7686688811ed78f9aec2d6ffd482784edd0e5a6958b07e9ce6f2c33f25cec3015bbfa6c55a18794305e69c4effe96fd08ae0f4bed86c032a98382cb8b798ecb86a4f90c9d1c1fedc5f6c801feb70252406711fd56b15269ec9f1e8fc982d97098d6ad88f8d534803d6c8b0de7d3b070757883dee6eafbd6215d280bf39d2c20a8242530d127a223c981df7ea0b04ae85609f9c4bcc14f4d33349e9d73b06c77c1f44f5de6504a6395e51903211896d16a2a12e1a7203895103965b4b3e3b795a610b496d70fff263f58e5a281e76d465d70108e18a41e90c30fd1583ed63fdcfb53c7b349702a49b423249a31983b110989b50ea2c2b7e82ec8f3edcae5074380c2f9a73309218122782eeaf79ddc861b08c05fcb343ca8390534af0a119855bf2dbdb0c6fb37a09db18de00da55aa00521d06e","title":"39 组合总和","link":"https://leetcode-cn.com/problems/combination-sum/","question_id":39,"issue_number":83},"81":{"day":81,"pres":["剪枝","数组","回溯"],"tags":["剪枝","回溯"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。\n\ncandidates 中的每个数字在每个组合中只能使用一次。\n\n说明:\n\n所有数字(包括目标数)都是正整数。\n解集不能包含重复的组合。\n示例 1:\n\n输入: candidates = [10,1,2,7,6,1,5], target = 8,\n所求解集为:\n[\n[1, 7],\n[1, 2, 5],\n[2, 6],\n[1, 1, 6]\n]\n示例 2:\n\n输入: candidates = [2,5,2,1,2], target = 5,\n所求解集为:\n[\n [1,2,2],\n [5]\n]\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d409c9741ad6f077b58202662640f83ed5a758993317750843eaf0d2fac47a3d33d11f0f15565c67ef650633fd97fe286e25339442dc7a529560c4ca8fbef04f95e7f25d15eb065df4a3e4b2351a648a54a22f51deeceb6caa1c0bb85fdfb3f8eafc5b7998d3e624975f533d5ca1c1081ed3473173341e4c719855c69ea63144284fcca80f508ab0605af99bb5e662376320ea9d740f1d4ebfa937b1d7621a8eecd79282fa75ef6e3685819a1fbc9438268d2c902862f1cbfee08a0f5b87af504b09ca604739da16c43e8dae40558243cdb1929b67373e4cc3d72330c58c186fe416362e8a24b63b0684d0342c2df03de8c0775be4cc3cd1650f03e13419a878c6ca022fc378d9c9b262d0e8c70d0e82f0b9840726745b456151bf0287ea7cb0d119ef362ceb0422c0c9b1ea17f81caeacf226e3d78dacc515c4e01890c26215528497b10128d638cba505c6ef182c5dc77a39d79dc6b5b4e3f5560979508afad2cfddddbb6ccbb39af28a7a10179ba31457d5ddcc373be4eabad3b88ec5ab6c6140d2711e5a42e78e731124704a0a6426f4032ad16d6f7371a8ddad259e5a7d3d9a845db007d2a2add4003c5bae548a6a09c02c63378f8764c2a03559be59c6af8d1fca989ac4b637927074bda60d251020e98c4338192e0601b2229a386bd9b38bdfc0788ee1ee165f6c875c3c75d0f65698c6cdc0c846bc6b6edf0f46d81849ce2580eed1f43e093e0d4d99f50fe9adaffef9ba83c766acea2dee60976285f35b98c2c948c3911ba9374e3b22a4525b69ade147ebde8f39ca219a8b0b762d94589fa21f45f6186fe3011d6805660b7d1717e6640337d6fe1307ee499751d53ababdabe8d0a7c9137444716141a129c0f729e6a023fe0c79e44bc3c7b1dceabe670d41ffa19f1176dd20e0304e33286bc78c7c1ae646a755b8c1a6d3e960c1c03e44b454ed828c453a881ed430ee21bd8cab37ec6723490e16b9d303407de9ffc8f5cd3c8555881b9190efa5f06f253dadeb66decf10b04002602831791bdce75fca2e2ee935476e6616db11bfbacbf15169442b56d866b1c9904fe926b44132f57aa442df7818c837c1c8e0a9a00b1b30923aa11e17e2eef6b58ec6d46b5ff268f905ffcae988f39e4a8a6ebe64a02735bec92779535268caaca3bb91e305c693baf9377f22f64dd0afc44e8fa81c0dee3e5cf71c32a8bc6ad29c00a94b598475681dd30db36a24eb3155bbc4fccf237a35000c5ef4ea7f88a327571caea81f41c6608a9f3fab2cbc7b084f0ae27ebbf7933b07fe95917fedb3bf7c3fb268e2658dec0ef93962e8f173fa25df0151fbbc47544ddf4c175fef28cf1d4d9e0d66349d6bab4b6b114b72053d154f5eab0d44bcc2e4048c54b63feb51ec2945bf2bffa632153e487496dfeff11259de7f3a74c28eaf75ae0891fac78bb6f32787801df12688dfc069d12e5f964510bf60566ab1700aaba0d04fbfa5b506856710a7c9dc4fd9e4cab0b480567fbc12ff0701a798ac47e95125abffdc90f65b604115cab274900e11b6fd38c8c3592e0d6a14a8dfc7e6b6365fbc30bc04730d22f0b4ff05f72993b77402eafeac764c36e47265502d59bedd950a9a98165651fce57da3cb3aea4b00549827d1fb865316166472b578dd476bc8eb52105080da0e542cd8b4a70573436d795b774b3b44810a9f559bd4d794001f5946f867f7cba4090c20dcf393e6d01bd10893e99db982f59b97965bfa8d5cdb28c5c66a008ce0cfc88a595047303d46c52308d3cbebfe16c75a3846b478be631a9a1c92674802759244945a4d2e5c0181a157f083a989bea7a97ea6fdb71a2cafcc6720e37a0fba2e5d81c0770ba86ae027777e161ba3da190fc7e09247b076d7d95202700d118ee79991aaf4fe6bd2e6b0e457d0b949b46b6227f489b255667ce473cd1ac03d053c1e459c7f94999715129ccbd43a3b14012005300d13ec33a8c43c1450884ee7e502a4450e8df7f0089019f72b81886e28b2e1e2effbf7c9e066a5ba21d3a1caf58659e39cd2c3892016470fb800ce7c8d2a135a6344afedb26dc13c952a7809c21a6d1137709695405c0c0cf7a09256f37a0fdfb820c1e94e445876334067dd3f5c6fe02ad850d390e9c62918750037ef48cf90de322bf5ff5f1f319afbb70e7455588ed3321805c99c750b953353d4b54d6ddda56ac51e3536ea5b0b724ff92def6efb7b697b720eb515111f9389a44fd20eb2f2d735e623118e0b7ba5d52c8b2e7038bb6b1655b9b0b50f2656a7115f227dd6575d74937996661fa2c17a79dac151c5b2868638cfa41bed67510dbb81002be13d6611e64492656e846cabb27e6cff2881ba450a8134416c2719178e836a4615f9e0f3472e5a5a62d8d089be8b38e7d8b2fa9df4f2c1ce353ea2b547f1ec06c14a89a666ad2b8e18709da2bc4c777046f7630b4389d9772699a0621cc8d1298fb09140929dcf6ea6cce1413afbd997e454fd0db483f36fd6fbe688ec3bbe53613ac168e450aeeb44d3fbb1da1b4eb2d5056dd4a69a14f061015f7539be28b75246db70613582b43376dd198153eb1936a8093946cdc0b8812e8cc6a8ef041aa5d7f8491f0beaa05d4666212a18822355ed0682459f37922bf86528732a5a92532712f37837b55ad2ae03f71202b47172d64eb333e5f3feffb65ba908fbcbf9f77ac91bef0dda20964abf2d389e970b44e5c09b0457e8f2b6c1084e5be46c5aa71515dafc7ae6cbadd402a62999869495af13a52d0311d1962391747a9cfa0a72fec723dd880f862146d7b276b098851b4a47e75bf9393c1d84cf6826a28700724561aa9cfda690bb1ccac201bb81e9829b1f478ebd8cd8f24475c287ed52d25972eaf29ed478d18dd5e9cee83f6cc0d0c7d0f768812a34064d35a299ee3c9aa23e27d05c94d8fbaab06d932cae8634f7461eaf3bd084bfcb88c3f96607a6a5f426ed69481a0ca679da2b09039f48546d27685f90dd6d7ae17a87d061e4413352a3d0e24f359964e54af40f1e5d3dd875a1b4900280544811007f8dbfb8d612ec8048fe95fe207ff7a950343ce6173b67aa1d444054a9b4b5e210687bfd80bf8fd0ed1e5bb69ad16c74a21e94518d6635b6b046748777d114dbb1f36962e470b4a5b936eaadbf8c9da622e4689fee71b3791d227b28220daaf6132735eb451a72e3eee119f79296838e83142f37a103ee4c4404cbe50ad162181d8f09ad8c243b0f391d6f077cd185081d4a7f4cc3cdf0d4e6105171effd2302ccf711f2eccb7148513330bf6617d255649c1850eed21b65d7693894bd055287535ef47095d6548f5ebcf13ddf478002600164c7fc915dfd05cdcfa38694aff4a4090178dc1ec4b151d36d0901e18fc1acd32892a022555e8529fc56e185909d23f77e0f1cdee3830a1b327ed25bb0c50fb7060263d3dcdc61faa9a2fa62ece4ed08756d159d2dc95a1034dfbd192dc1fc22816e62067457d1a89e8518831c0f54660ca90f7a1d0b7c10898e0e2f8f894d2cda188225e8ad25c27ba4e2e4efae87a90afae95f8033b94bf0e11e93b0aee5904fdae5d65af7f77dbcceeffbd062217c0c66790091b3fcc8d26f7389dea5669a3f4b5facdf58a8ce3b29021f4a5ea87e1facd91a1fbfd5a91981cf2653438bd551d30149cc736b7283ce87b075e6c6a66d6a8f1753a182fb4dfe6153e9302f0467287cdda68e396871ec84fa0215bd61305d0a5512b64bc7c57e0552d4f8cd23841e62e663a47aa63fe650f89750211d77c4be0cfa596f6e4e7cfe714c607ee5234737bc05890fa01d79ceff18037326bf8c85c3a94f9c5da2ee36c91da51ebd6bd2562c760326a5c5854314d75e252a58ec616eeaf12f50e5795a70d220c5f4a5f6ef8ed81840bc78173621a33422d2426791f52472f0c93946c7c1a80b130d33874bcff289527e03f4a8524eb2611c40610b4c63c39a4dfcfd870bf2e889744ddb36946377831bc90dc03b00824182fdff178984ea92223c022b297e3c6312ed42f3afa7907e0deac56b7d4203ac114d8cc92a935e7d2ca846a90fc29595e61a878a178bd59d4eead3b44665ec7c24d1dd234a95b5a055561447a7b9faf9782bfd8c6c89e2968942554cb933b905a6c67ed917ad7bd292a910b9bb36cab135c97d0b5bbc79fd34c6f6807852228a8168b5fec4632e32d5b83b1584d69b1e48290b994c1f86866475c20952e790ddd5469290d1c63a3bef0d4aa07f76588e8409b3f119d2e66bfc4cda3259d79c1dd7d4f50521ab16f4ab3f9ebf5a251c9ce5e57f023156fafe48264ca21b4329a39f102ffa02e4c96553f8688e04cf132b8f60c3c4a2b541e9de04cdff7a69fe1bddccabe553a09a654c77ef4b2e672837f79ffaaf0103cc4610802f1577f61647822350b2878a4e4ada4d35931ab8a63ae553b8da64098c66c3ae7f5b7d48999b9552888f8a372037b2b92b5e43e2d5b7c9236cbd8d763f90e2fea0ca1af0000682cd52cc1ebb233a1b619e7aecde8b3f20aff74c82aea169541c81581aa9eacf9f3e0603311b20573470398776018c8ade9f25684509131286203cfce7e541b4f28bc9cf7758cf6ed39fa0799b2eb39277d247ffa9d5a1486455c6ccf18f6934c24db8c9dba379fb054c5ac559eef267b9f9555238f7bf4e877fe13a68ddab69d76466e7397ef35cdbf5c69abe84ee67c8f4d4f11263eaa8fa91b398fb2dd102eb552c9acf19b72cf9428947cfc54c329c9fb7e874220938c18e0d02d24f42587014db72feb88124599bdb52ea7b0f008d6c316211a395af6390bc424b01eac75dec65485eac6d8d872cd5d7641269ef1e02022a89a8d7771d369c6282336380a4f89d0002b11a285775f2b5b3df8c14ccce9fb049fd6d8c686d47afdf3209f2b5897ad200d153a305504794788767c1776aef41d40a83b56d00c8cc3abd4d56457e99a04d2d8137a5ab49e8d7d2616995f3985c0713d983a103f4e236b11770a7e96d832b7c7625289415ffed4ebc7dba5638f956e137d64c6334746fd6ce0e790a633f4128e180bc636bafc76e6cbbd59cefaca4561106399221335183472121bb17850b57ddf0b625e1ae1b0be9b5a1227663fd43b7e609ed20ffac21a81c4264bf20b5e3a1c7454614d2d60d7ac95de28e2ee0a1a987c9e9c50c196968fecc97c53b999d28f5e1a65baaea1b072629b8c7e0cb014011bc2d25cba73a4293fc7dcc840b7462d21d144c3ca6be61edb807c64aaa094e6a7dbb8073d598c48ce8f9ac55e3c46a2a04612d128eafe94ecc9c19ef696d628042b7d01963782e64fd76259cc83025b0da5179180e6cee640c3c2d56d2d1df14ce52935a40652aba9be6d93abb77f81332ddf90d6208cd51c5993821ce9c62d004efaaf877165763477198ff77c13b51e45a64c2cf7beba79ac708d55f3506efed7d21030bc914db1a6e067f73f41101bc01cee8a90ae44a6434e66b6205456e264737177f1e82a97700558bfe9bbc592f4aa30537d3f50ba05c7e46c6c751bfe10404862cae569952c8d971f4d4e92f909f988f51f9b35c40e633c43380892c530c4b486abc153192322a3b55f68e66d569ac179e0b3a57c7a8b58339baabdc69e7b9a9e7a959d6c79fc9100d012ed709f0592929b2e464736437558e730e3a42722ff192677f159267e73827cf3d0d684bdaf6acdae558531f7d7073b7cdf81a2ce2d1858345cc054fa8acb44dc94a1eccfd76276dfb81c0826a881a3582071dd520a7fe6bc7d99f6901b4939a621d600cd15a9bf41299ea3fab54c6887c68abc811c17e59ff6df728a730813f0e11ed4ceb69053f4477d1db788031a2373179cf9aa9d35bb0a9da827ef3c7c147784fa949f6c4d5765047f7503deac7bdc5636995f1dd10c207dab43573810bf15339ab0ba93044d0a420e29502c5d409e8b7db1ebf732154ddabc5fd44f471d2fd0cfff83dc50804196fe9706ee2c5339d91235116dfd3fd055831756fe2e289c47c7da0f3d7b5791c0649470ca6c24f5fa8a0fea2db80230bd50efe13c25393c7b7d66f559a638e95ac26e783c35c93976da4010b7019adaba397f54a19c82f5d5c857fb23e58de3449a73d769ec76216031adfdd988dd26e23084f453c30306f9af36940bc4ecf83f271235bb4dbcfd1eecd457c70772e000ab8407e16732e2918e0e0e4d0d27f2f53738ca3cc4535d38b44df78eb3771f6cb9b1dbe276eabffa49518a3d4f040601fa7f37d4e352a745e519dc09a615a1344ce9472adc9bedf6b8cde45ea1890badb06e8b46f34c48dcc61683466a78d37b9400a5154131833c5ec17d085e621e3f174ca1267037b094abcc8c79a34a51bf069b727b7a70f430625c3a8d01d6814d1763610b04c796543b05a6285170d6b661f0749970054c54c455430829b3a4493a6234fbbaa8dc3687ea7f6bfc46fa548fff677a5abb119f1fc5064304bcee0f4cac98f2355ac32dfde1d5a8ad015bdef7cc2a2957b576f6f283ff67c8115518dad9d0bd0bb3113ca967ebf7bddc34bce9a22970e304a903ad3f3b9e8ded2d6e0538dfc5011580bc94a03df697af8d5fcfb19420c365f2f959c79b86db8aa1904934f9570520bbe1e22e1e87ebec6df9232e7d26d6ca79cc14dbb53516f90af3f8d9d60de448543bcf97aeb200d64c2ce0796369d7de85d186ad2244364bd1898f352317a92af6d5328cff905c92d727e226cf36903d469d62fe6e9eef278b2de68228cb62d90ef6c5ffe5a0f4018c693283f3b43e1ed048e5e032f69c52e34b99ae083b0fbe7ce7635fd8d1a9609dd92cc5e12acadadd8afdbb248d56863699080b87460eaae12a3105f9d7c2caafb47fa2d6f7b7ff5bccb94d421f2af7ef758ae6f605b699dffabc1c7c0ae4d6e7be02a379db3642600970460c7a6d0d5910b3bb96406cbbe35f7e992ab3902bdcc76ad3a8c9cd3ad3a143198a4b1cfe9be72f70d9325adf0061d81214ae3733e9403bd9cecab0afe85d5751a4c6d5d5e1f87f89cfa957eae936c6780e2609e4cd0bebad26fa817ef7a2123c522a35979550eff5ecf69f2381af1321ee807f139c5c4af03cc428a389794831be84a31075defdd9afcafd4a05a7080eccab34e4de1fa30ded8f6af236872dfe494270c2afce51f9b0c5d3d493b03093c6a2e032d384e1865f9db2612a63bd819613432ef496a97b673d51fd9f5c6b6024bf5687ecd68e2426622f7e93d736e7703385208a6abcdb3facd49d62dfc4ca99acf82dc42b2cb42896e9b8b3dd58a596509489116f0140a0442b15bd9c66fb9a598ee1f2aa180565dcf1afd19c99b5e712ddf1a28a9fd3e387e69e64633e6e2bfa7d6313ea3e4f1089dce0f6340719dabd639505e2e01ee683040a2bdf1a552ea01c925c84003f31fe0dd0034c22e68a38080699bbf9cb2bed2966eb2e56e870e6025f60f385566d9aece9cba763ea82e5f79a8cdae63b2643b4260cee6e3069727fdeb30542d4f2fd93a4a89e08321569f475cc2438e5d2419dcd0b97b17d9d24cc22bda4c734ed36f739fb81af50133d586223213a6b1a338f764aa6cd78366b88d85e6a5e8d445a13f7be2aea45c533f49a580eee19c52262861ff06b4169d1e22827d434e73527868358a0869ee0e88622dfeb05c7bee5602266bf455da68c9a34aa3db9ca567997a52d6105a68bbd5f7b5a9ab846ecc0fc665e75e36e15264c27d6635f066245f819def76d31662d9d52e343102d2245fb00d21c697a43f51f0b5d1f845e4c592117159d6cfd840c9d69d0a35f785f99ded9caf9f6035a132a1e3780e5c6277843c276fe31a0dfcf1adda50a9b6a77acdcc1987e3a7f23f8d451fd0578ada87031886f1d27a3a571324b7895900e0d74727ca5f55c93d9f33a5a0f997030b6b4a2d60ff5123d76eba3b3ef63767dbf8711fa3e9193ea3ddc702bd51afefa54c1769fbfb6810e2f2d8d32be1d102d99b62cabc190ca2ff4c829561a898d6b411838b9dbcb4175694595e8db95a45b57c303b71361ce206c6abf6f6f9a16cb19e82c6e528a641b786e61c127d140ebee68ed14efd9853e9206f5cda3545a1604c178fbf07f0b86f0ca7afab7623229a49f80764413022b7c9d6b265a7b2402adeb4dd16e7bcef61192cac8717ae9dd3596587d46dd00e1686de848cd46be835df8a1d79650d7aa0f49ccf0d327a38f7722763a2a124c8729d7f23dcb5134ff2c70392ed350b68cfddbaeff6c9f4351b936883f96dc66f8969ebfe11523e6b23047121dff67087d82b030a89cc18c6a750261da5124b3efac6214d2d412263bb43deec379eaf82a317d906c4430e642b4fd2898815fc62e76b5562dee51b43bec7a7c2211a47e558420f0e67c778efdc960b82172b1f612674252ac4ba6adb0a7e46927b0082ff8128356da389aba8fb98ce433b68634354d630a85e481c254b89fc5ff3ec91cbd1ec56370b658cb77ec48f11b28338c4b06e2fe035a6929a8ecc21c62fef9a05900e1e2a92d316023e6620387393eb1e9502d160076089a407cf9e601a31bd89951e6e4c0a5e7fe3b5fc5d371642a1005f241d990e8aebea98938808cd087ecf2eff3f95cf3ac638a591da244142fc6e4b65a3640b4c644307334e6c77611bd1879073a61886be0b6bd24d403eae299c207314a3f14c6bc89d80e4f11a04b3c5aac936aa648a9fa02e6abe3427e5439221eb43c5fdd92ce757b8720de8b3ddea13c0e1eedde2020706daa240a07199d3eefbbf2cdc4f94bda8b4873b3c9be07245f24ee1a165e0014d6566596502e","title":"40 组合总数 II","link":"https://leetcode-cn.com/problems/combination-sum-ii/","question_id":40,"issue_number":84},"82":{"day":82,"pres":["回溯","数组","剪枝"],"tags":["回溯","剪枝"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个可包含重复数字的序列,返回所有不重复的全排列。\n\n示例:\n\n输入: [1,1,2]\n输出:\n[\n[1,1,2],\n[1,2,1],\n[2,1,1]\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d42bcb540b146077b582027486b2a9cec7d5887820f7750843e86172d885da1f20611f1c15560ec72f1486e21db74e782ea472bab994a608223497adab2e98e17cbd424f760b263eaa4aae3296493a431f40bdfd86d69b8fda12f0b0ed7149b04ade387740d978dd8c830a993628ed439633875193366c222af2048ba722b7647eb7852465ebf62edd4a7be9cb1f0fbe7dbfe3551e7ea88ae785c9c9782cc630d18b1def0ea38cf7ebbb37fcefece18827e9a8b589e2b0da2e209b7bdfc70b420d9d0e80bea4d56e9b4235118a5d3f4e1b37a27b767106c1989e4e8fb91106f35f3c3a4442d474dad6a46064dcadd0ec5b1ebea6ec90e501671ed3e07549bb79b67a404f21da99ebb3cebe46df82808afd261cc86ca4582571639f42943a5ca182d9ddb72cba57006721dc87cfe4b613f79a4600a55dace4e460d3bd6447e69060126e08e65d049d009dae1f823566642bf2a65b16b8f8cf7bd9cfc5d5c90787bb876d19e8ab4bc3cbb024a18a6bee43c2d0a6891a46e11ac674a5fe6a81e3229ef98bd5a5724e904f6675a73641221841f797de61fae6195df0175d061d2a8dff247dfb661736261cc0254dfe3b95ff0e5904f981f10b17f085b0ff7a5d95ae5a9b2ccc1e88234e1e4240f51d953e251382a92d5288bb5c8612f1def1c1c7ae504d77cb4595b4b9c559aa87b9a996145276dc810cd9851c799e9e146cea5c399fd9e4552b12e1784b481b7e0f6f46353b4d092da817c09409fffc68a7c7b7f3701108f31b18d08357e19eb0c36791331f9facc9fbb5f137e784977c32c7db410da31468a409af23229a5941f08f2b63564c9dfd3dbee83ed34f5b84116a59ff0abaacbb0821b71b12e4b5510163e2142bda47db6bef6647d24f23282cf99081758b569d539af26c1f948dce5a80dd03f75dd5e0b00c0d2f7916f61496cd433729f6c99ffc7d42eda5faaa932c7e06cc930464cbf56affd5553e42e81a5d762063622f90812f49d51558eec1ccc926f906f705903e39773256d723f2af4271bcf73d17d60057eeed25bffce678f631416b7d03a8b65b81bdf954482063786f381e927932e71cecbd3b13f7da16a0c8379166f4db457997da024c32e9e4725eac3b8441f358388d4d0136d4531682323280b34e1daf32f343b9ba9ce19bf0024564e17afa971f0395edd27d645fee88de7cae3dac27dc4208bc4abef538494b5984a6695d108fd3bb85bbf2f79bd79faf2348d5218f5ee48bef28c31724fede6aed11f7b2aa4dcd1b3d1e6b39bc3a132c5b36416b07fec5f29d1d600dcc0de258c1649dec3c893aa25830314af6bd61e1ba12ac7c315797db090e3c782f18ebce9c7d9286934451c178e085fd568f7db9dd270cdffd4e5c7636cfe9a32c3a975f084f568226c0836e061dff0103c85e7f89f421bc7f340e66c8e16ae07f9336e6600f5346b90d7048d1be7ec4f5109cc074c8b141485b32438f8f078594a46a0b7c99ec6d29d60a9cebee3f46f8442e63f5677d1be68d84c44d7a4e247c4240e3748448fe102d10162f5828e3fb5eddc8045b8cc7c437f66f7ea07c76430dd290b43ec5c528e3762412fb3edcb7be06d65085a36f498e3f75989ba81714712c443d90da4ad9eb00b66b0c99218b297d9df101d3bddeb0beda3d0652e45749e8d0bebee15412b580383caa619cfa1257e9188008b272c776a4d5fef5a1f269feb5672bc08e3e9e6fe61904696417636a68b6fee86566c45606c6df0a839b15ec538056e5385fcaf10e58f3b890c511a42abe1ebce410acbff7fce9eaa4479e6595a611a61cdb0f1ae733753171b542e1d6ea24964b607f7063a6c298b83ea0b526606439cc7fe655e76f399e73cac39c70e4a67b182f2978bb4ba04c1f88b0dde65c95f54eafb07117ce5dcad26804963cb7a97b88678b7f5964ab3ee5240851490460bf6483ce643ffb8d91f4da6355edcbfd69d800bc8548c02841f8c9f1e5fba86e51341894b9ad715cd6fee70a85f660ef1ac8e3b27f6f25e39ca29e6b3d345d89444ef52c7b55bf3abf15708c4330f0570be42dcc10e3eb015bc11f21f5f2dad624abdf8c0a9c0da3e0c05b55a386fbe750e6a09a79a6f0ec779b1b0f2818c3c691c84734e8cf7ae58ea125acf93ba6d336ed826b1559ef5ede307e7ea3db07214dd67e0d005ce4e4fad759be2dfc8983f485ebc20b21f89bf6d2778ae594026751d5720112de4219e020c36c87f0666a02e7379f3b6ada79a5a3e7eb6c25c1968f05acddd65dc42cfd71b83012550ac2b937976d0323db13470e76517a6d0af210652253358dbfa47b8d63d0092e31a03975aca6c0e7c1ee9ca526ccabb27e65528658a6e947baed1d14efd55a90ef12b8fc253a8eff4617319b413be1e2d1b34b80eb26e6485ace040dd32c398a9f65ff3df245097e711576173f705956ea11454387ffd34915a17d343b0c2ba4f18d76d68efd5d4af7d3976d6f97f6fee97b3144256c3db23393cec75dd42d383abe0245eed75de0c48e1bc407b9e10b3b4b2121749cc1847bb53585719ae468ce2801a5c20e252562d650a6674ddc3087ea4ac53889e806fcb4bcc0896a339f5b93ccf0f06f9a4b5def65ec8ca83fe2163d1a2fc46aceeb769c4bd7757ae18b3683ec6f102437ed02f49b322e96c1e467b0245257fe8603a1126ebfb31ab8dccb3a49772e88cb6b5c0fb4474f0ec96caae67bd00055df41423e0781759f9e9be0fc5f3341401e6a3ae3eff8e5b004899d4201a4cb0275bd83f05271775085dae88a7ab31a9673496c8af735f391e6b2e48c677d0ac1966f19ffca5598a3f36c68cb9859c99e7575b34809c251b2ceee375ff7ca34c6da66e70043b9dc780ddb53bdaab64806cdb0ad721ba50bb692d420659d7e6d7f89918966ac98c3dd2f0603b610deb7b838405bc1d4346c665b5256cce88ce97603b449cad4d2e51c14bf2a889d68ff22d680d4b5c3182a4a790b928708a02901e1ecafcb3f65a3dd9b7b696cca88fe182df318245a400ba48e7b7086c0dcee695c591d9c87ad2df0b336a6d85ac0e9a4a1a8875a56fff60e8ca2e88f87da9680397939960c18684c16804369156fd1d81a37dd6799230e9b724b2987bc99ce299a89a8ef5f9c331d7fc14d580cacbac7ae408f1f5c91fdea6816710b401661a0a833941d51c708fa68eae11bf59bfb217996ad3e7e79227adee3ad893f75d26c0b07dc746aecc1558353d1f2fc7203a104c73a230ddc8595e6b594d9f5fc8cedcccf9b32656d3b105a1d4cb033cca439e8fab7ccad4065b122f37a5249c349bdf33418d02929a98f347dedfced6884d2a5cee3248a5ffe2858689a9049f3823d26653fdd6ac36ebeb57cc7255109a9fc5f7b3ba1318e06701bd21ef9283935dc65b5de4deecda5aea876f112a6ea6874e2988c725bb01503ec3e7a2ccc24106cf2445ccab26daab4c2e9e4efe15543e2cddc03c4c685de70eb4dc279e8b9bb38e5207c924f4695882f86a546f2b151234865f297106242816196e098ec37a04dda5388b95ce3e70e05506035160a3ab4165c5f50eb89620cae01d10908c61def9134b6d361e9be7805201fc3f8bedd0026ad37fe53d2c8b99346213611c094337353d4eec66722f4b65750517003e41d25728a03afa8daa6c8c91c1f21f28ff0eb28727a1ead48a8a7dace9a22610326ff49fac5468d27cf4507cddc19739b580db0bd74bae74148c154c97e1156f34e1222e9b1c504f91cf3802fa4a227303eb6a916b5e80354f3bec6b31caacead2b3bd82abf31dc818f863586675c326f37dd06e182e250dcbd1ee200f91e64c6c3b7ce70a94190df02c385ca0b528eefa8795f188bd87ae73b041435ceb070fb09662549ef38cf4dff483ad10dc655f498b1368b5cb88e8eec2bef7907b5f5420845b7015251c8daa2b4eead89ac551eb43f13c58cd4fdf6c5ad0787fb9d6103ab6ddf3fb3bc06cc498488fdf285926305dbcc3951fc95d70146886a328d303b96322c725bb82ff947e29ac717ee82a64ae8ad72bfed1617cd314cfc492a922909bfec33ed3e7265f506aa934ba099773d4eea234256245d5d24a56c500b20f5f46055200f6b1473d6a62735c710f2bac42f86c079fc611d901717b9adf3e92fc6a78c140d6b252b16e418a83edec89abcc4d55786bc1716dc9088550f73a7bb0640faabc705075d5aac7a8f7d1d0a9267e474121d028536998036945121b7bafaed9d9821a967b9de10fe36a5486042efa889db232d87be8c7221b124b1cb62b42a9edf4e19c4cb8c7063cbe675c2bacf1847c9273e578ca1bbd4bacf470098c55209b84b25de764c2c76f454e7216049df005ddfdabd2fadf9986ee103e489954c06faca5e65cd77e10f7bff9043c8d551602a31278282944072f0c601fbaffb8eb9f1005abc677d75c1d82e504e6c6327bd5e2b3d2c4d4f04032a6c8e174104e1286f1eb3f255b5a927585ec8575f91a2ff005faba7f672a698757f5d6cf66dff741afc1cfa9fcef5aaa2f85249453e00f8144d4ef9ee3bce6bb6f3401f30478100bba6b630084e9de9105d00fc077377f50d78e241b315228c7e1ec5f8cf6fd3ded199faeb1506c750e7fa7b77058cf160826aa4af69b0524dac187b479d0b1548cf64089ef2d7283880862803fb0ac74a35adf8396f3d34a6f2a4297a63ec6cd211881c247fd568f4d1d547222bec1a103318ea1836e73a378caadfff511fb8c289960c91ddd6693a364bd616088e662b9fa6e68b576d4013ef863be951d0adfee9f30a7e3a40dc1d116655d7a52e3250ece2bf904bc6be7ca7bd6fbdb88c9768a03150567cab4b35b6ba8d9c228409500876423647d596589d0002b11a28577162e143fe9c60ad7f9ad6cf0848bcf86c867fde23ab52b58dbe473591b7b74110c3a5483613b1267aaf4007fe9160d8e2687c3e581982612bbc90df8d85b3f16e4dbdf757453ca536b8cdd773bda10447e1c642e457707389acb7cb8cb7f1fdd524dc9c8d3cb92a822849f721a7962c2340e4efa39a6a5c4fd7bd708a4180bc636bafc76e6cbbd1587e0d84b651462833156731b29210f5be27f5fbd3793593c2511a3eecde6403827663fd43b234a9ed20ffa9f30dcee6649f3623f1e17615f650b6356d5aa9543e723de6b1f8141cece7acc8f9a9efa9b5c67be89dfc61a546e8ad3adb022749bc10519be151617f19a22d93cea5a6ad88b9313ef0a1050fb0782842fe61c9a9a7663a6ec85e9fdd2a81e674abc489ccace900c7246959822719066eaa1d5e3c7dbc4f494d364033a7106df64f0b146fd6259cc83501e10b64593c5fae8f424e99f882d172dd14620ad9862bbf06e3338a83b5f3495646b69f5c1a60a4a628a902416d96d28aaf3a8767140eabc9ffd90c71939dadd2b8f45f0057fbeeabaef58b402ce4a97af273b7c97f51407892c3977bc13f9d3bfa91d842b17226adc0685c2b435fb839d3aa33d2bec3f05ac67f8809475645233163d5da4e5d9ada67e8b3524a5e894980dd1c49ce80c4dea91528b9f210c17dae400abc7a618bf3bc404632d47fc917f45f4002070249779426709a3bf5f27f22042dfd031aafc3eb2970db6ad0c777c80fc7b1f73a73069b2fa2e718831c87be6199e4f6c933b128d85a2f48b38b4003be1d9258dedaa79d1afffb252d90c339f98f4fc34cdbe5989f62b2591bfd6323b06089a8e9183c805d0574c75e6de958fe9e2f78ee1537c4017966136379da4dc1befa8ba7c3afb434cd7211324f366d673d11cf9318fc213574357f5d941731a7b1ab8178b9f3247f84eebf79f04429a0033367bb43b83bc86632a86dadcee8735341817f315b85800902a91fc1018cadbcf9bea9fbfe5f9eefaf177fe5493d5eb1bd0fd27abcd8d21adf912","title":"47 全排列 II","link":"https://leetcode-cn.com/problems/permutations-ii/","question_id":47},"83":{"day":83,"pres":["滑动窗口","字符串","Hash 运算"],"tags":["字符串"],"whys":null,"difficulty":"- 简单","description":"```\n实现 strStr() 函数。\n\n给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回  -1。\n\n示例 1:\n\n输入: haystack = \"hello\", needle = \"ll\"\n输出: 2\n示例 2:\n\n输入: haystack = \"aaaaa\", needle = \"bba\"\n输出: -1\n说明:\n\n当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。\n\n对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d84c1b032f243483d7875596a35599d892b54c0f31b000bb354ec0a71d663ea883d71adcc3e38c922a16c067bdd3cb8a6a41f0c327acbdb467d64159b9eb1359f0043708944f236f9226f654d0b88c049e78d3374efacdcd4fa451ea2ef3096c0f1dbc33138fa3f760e9213957c9ad53e613b45083e5dc32ba22a9929f52b5d59ea626883946e62410fc42247f0da772b0b69e1e62e535d2daebddfb9a5a3444d55bf5b3f00f012b2dedb3e8b7610a015b74e0295584073e8ae472d0a2bfc218cd9f9e60be4414eeba218bd9d09186bb81be8a04ca9ff1712f59cc68ec920dde96b8cef55652c7108fca2dff73922c3481ce9c6550ce181d7b922fb5a74f9d0b001128272d6490b53982242817bd1f5280588402c24ce08b99ece5fbcb4624efada1520ca414882601d9709a86ed8997101ddfcc6e93541c85f0d8945f0a8de9abaa387d84985c46053b0daf89dc9d4941da8fa3d12a0cf88fbc2e529b23ac6ce29a1681f343e5e56d1effba260309b51186d3187e933142ca9b52698e45dbc9294d39012f1af2d5ad1322f4404a08c40425af76ee4560ff39902b09b76a8ecceb9f567bc58496253faca83277e72817824638ac7266ff9764b2d3b657557d923c58981a0dc30bf0c16a5e2ae1c19f6207012db8d1cdccbef3f70297fcfb0dee73af7b838ee9f16a43dc2ac11c38fe588677fa1baac04e21bd1de44917e07c381f79f4076b12a2686839dbdc0d22fe9ffb8fa93d79a4f0975b7dbfa23b4cf285f35b9616f8ad2632411827fd3b2c81308c0fafe8b64fee1fc81b809a8a7b931c4588bc975a81f3f88e03c489fd31e3dfec4117264583e2d026cfacd3c3ef70b797f28bdfc866c2abdb49fe69afa4a1635e0ac310b137ba189b01cd7042111d3b9e8318023b7728809619c5d3b4c850c97ad78d48fec331575ee386e2c03c888b70ee77ba7eb8470cf38172edd86d010b71ccdb27ad67b22727cad5eadff9b48487d29974d339dc0473efcdf7097aa29fb7e16072780cb79503f5d4d9f6aefa0b429fd180c0c1191d601b5d021d8756e7ba0af52812fd434b6f241ce7b04c98eadad5a8c5c2ef2828ea2511184317790187a7b04e955e700a44041b49c7218eac1a2442c168e92e6dd16624a2d4829100e0b0ec8ffddf1b5e67f23077af05a301c321ef3e178824c7e9e4ae313a0dbdea5eb9780ee359917fb99969a1b8cefec8f31c928196bf15de869ce487cd6b4a9b400f51f10a49d6dc6b745caef80117d0747385e43faf09edad54f1c751a2874d3df011536ad01d5ed1259aa56e6c748c4043c83f183eda273c63977c74f5d9ac341c4754adee71ddc97ad9cb9a6f6a28548294b107011da4a82483cfc30b8c9f5b4544a37508d8e4934b5a87e9e9efc3a101dead18622f37f149edc638b1a2155044d06fef150f965811941886cf5e3d803e72565bfd0eb235aafd3221728b67d48e56d3beee41251ade71c277b3fe8adbbd5da99c246e462746f05c2885dd1335062d0b96ed87347d68ccd41d330043743a61d5802d12062cab88e0bb1eddf8a488cd87c426067f1e904d14032f7310176ca5e6487366d60ea5c2d73fa11c1df6b1237abceca9d318fc7ea402566c214a23afce486fa5553f80827dd212a0c0c7846288db13dbdcce20079501cf5be6fa8f4521c1f1a728ba0f401aacc0b19f7a562d4204f1967eede26b6162da704ccf47e9401790427d3659b5edacaf04672e4127cd7e3cda7f3a7363d8a74b716adf0b6ed616f67bf7b3154b77ef49f8b2959e4c96908d2dc7ffeb3a94643e47975611e72cfaffdae6011500e115e22206c825865b028f5240360219383ec3252443944a3f6fc6d6876f3b3e428a03adf174874bc83f5968abbae06d3cc8b2ffd67e9429b67985d15dceedb8df1e05f06bf45e6f9a01deee2f634abbc1874ce48a82d42d80255d03c9dafbb7861cf5a5a9bc1eac3d83bbc0caa57ee00c5f40b30debc4539538a8e2d854bee11a14d2eb22e19b6f3ae5e79c87d8995ae71e8ce489a4674846883737dc13f253bbac249d3b8cec2519d285adadd3b9b0fb415eade79bd1cfb397f0c655419c680d271706a233abafdaffd431180fe4881696f783880f9c6ee06b9c21b3950ef26ca94294632b280ab00f62ebe45b4e0fd46b4df68882b4998a66542c35ccf8819fd537d7a0506b98fd23ae502b74f02f6b7ba68d3dcc2f2f1a1b0c8ea6ba3145149ab7ed317a93c8261793603733a56a5fbbd4b4380feeb57df9e983732da4514bb212b2550bb7989756bc65374857a39d06559f39dfc5a4f522a314b8cfa41bed63c56dbb01f12a272c66142282d4456f54686fe69eed5f6851da25ff072671ac23dd47fa678e9674e804a2045e5b5af2dd622b1e8fac87dc560fddf512c018f08846f5c315b976c78e1d42d2f9686ed8008947bcc9b14573b7f39af129d973b2f9a4a6482bd57d2ae171f5c62c6dcea6c933e39afbd997e0300828905222dfb21f76582e9c1aa6508ac5f8e590aebba517bbb59a9aeae2c1f54df4126b94253715cf158dea79e3d0e66b7171a420143372198cb4130f0d72e88d09c64980a8d0aefdd78b6f247ea5c1cadb3d9dbe044b6decdb77924dab5a71ce0f9e810c4a07719eb4fb3096c94b05b2f37837b07e87eb5257a6c3228452536ae60325f73f4ed65e3c282fdfcca14a890aa9fa4c44871bfa0b0cbad76ef2a3200b444608b2e5673baa5ff5c96a1020f18e1b9e723f4dd1b006299d4204a5bbd245ede7e02123e750d40afb2a7bc7dda2e6691c3bf73553708743f48cb4792f92761ad9af7ac1e90320e99eafc8c9cc2ac050975d9cf2b4863f5f17db967ab5a20f1017019269dcd93c2f175d3ba37c229cc0bc868b457ad5b607300529eb6b2b191668a0387d87895b532256956a22f809f18f5591d28cf7e9f0f6cce88ce980f4511cee34d7c14925091bbf7fc92a772240c49053499aca0dbf32266cc0c8a026dbee7d7a3176ed5b7dadf9fb5ddd9cbc265832ca411ba4beea0183e48d2e4928199bc9a0386c3627d3e28c2e915c24a468825b56ff326a7dd41c9b606d46855dec0d03484c2df84677b4edf56f00cd3cf7dde2ddf60e7e46db5f759c09cff84a8d4dbb8ec822f92ba1acf9cc382ea40d508b8e9d452d3e89a351cec042e5e15a17704821c11ddf4cff77df60a98ee119d749deeafed65deba68d88ef71535dcb77cd44bfee8460d776e1657a46e7d180539ed2bddcb105e36422e9f42c8dec7ccb0b33a569de401b4da8f1527cf6482c6a570908a4e171a0d53e061d878ded63a419f6e9292d1f359decfced08e4d6409a36133bec7b6cdc9c7e718c941589b665efdc7d136eded579a662c59ceda818cfaba1e45db30089721ef9283935d941e09b18ca29918b5c80c5f7f2bbdf04e74a28765fb2b7a5dbc98e0eece4e17874f2cc7a228ded11c04dd02bf46073e16d48c6119775bfa47bbb333b080aaf3cd1307e324f46911ccac6a073b79664630c75f34770a2e145f2c2f4dddc36912d3b212d8c19c773ea75548461424efba0535909e4afc9e6e9fad4e6b90b768cd9b52123e625fd8ac8e1e44b2789be38b03249a32f874699d9022605f701f1e1b7f6b7d14a5691d6b427e5f0517003e41d25728f27faed8ae6bdfd584ac7153b673b29a27e7abc5f3cf6686e9a22610322ab8cce95433f828b900728f84da76e3c5d35fdc54f227559f1e109ea8057f3ee87018d35d091cc58e7b49a92c673d44bf7fb33f798e304a558a444c868aebd1a2efa088b84c9352e242153a3bdb58ba329e6e5a6f66469f83af630ddfaa0d772e29b410801715f27f395bbeb116afe0df99bf9bb190ab62fb490f12f77947b8d62d548bbac9f7cadd8eb201db294842981272fbd6dceec48cebbac37513116e9e25381c254ec8fe7e1cf69d82d950f14dac7810af47a46254de2c3af4db5673e5898eaf0ab777ee9e479df50a1f69a1d9580535bd1cdcf698c03c65d83644e047444ae562192b35bbfe02bfdb71b8eb034e4fb97e22feb01dc798e3c223fa47140b4bfb0c07ac938be064e3689608b74c74a956211e268b9bd8a417b24c9b97c2b9e9bd91fa447dc8d1b2ace4a6944461fc460a9f48de43c08fef415b835447cebd1593547d93fc7c498697f4c6edfd821e5c5aa450d9ba2fb246fc7fa9814be8c3433797b05ff2a9d5d6fe17335ba0bd81255e5dacc0870089aecbf394bb533e05223fef42bf18419f29b5d7129ae6642b587bf55dba0549cbebd9abe420eefd282411747cbf006495d30dcf99b3427f5b9e05810611abda77b43a05d4cf6ab1a9530474a30829dcee6352563b1695602b4cc1f9bc93e13217312883ddc9449c53a45f1a378111ef91744d1d92e13abab69e6c8e80abca91affef4f2ac6f7640525290a36c7c8e3abab94b6fa90956a9bd0d3d373c0d99b85a25a0d1e2720935ab437c63c3f6cdd802bb1d2c13a82787e200c23a79efa7d8e84dbe4c302dfe6b408e057d5c5b062a9243b868ed048f2a87709a81e4dbbbf8ecab21bfdb3b8cb8a7c653a4e8ee082e3f1fc063e44aa1c8eef00704d7ed1b65ef080d33ef22f6f73df7019fbdb35827b896d3a7f93551c209192a46f6565e81d04a235e7c9636e31292fec51d65aaf634529ae40ea311698d2a907807505b62f589aaad3829fa5d339b8609c25cf07c47d2f4d48ee124101a8ad04b3204f2e938f3494d1df5114d5ac814a9251df660d723ee068cbc7e61b24114b5bef437910131bd2fe38e060199f3fd37aee3a949cbc5522f1b781ebe7e4f8660be18ad2ea2c62e8cf7d6d8d461c711384460c37b2ff76b600834a39c4b857ea7e59e89ced40517ba8fd4112db2c7c4d3fd1b4e912c6f408c9ffc1c5c2812c2723bbf26efc0512dc4d7d2f9ccd4a3b5c25db7f1cea83d05c6fd7af79a61ae4b491c117ae791541fcc555b9e9985277b7db0d1c40ece8a0f34a7a11bae8be2a64e044877c2db7d51f27249a8a418a396402f3acb95a367859d6257f5851ca5d1c070f44b2f263bef64b64baba303ae1639d67a0421b94330218ea3c4e86efb56751524721254a17a71ea39934567104eadefd8de536f27a18570fe90e25b4aa33f3fac1f4ec421bf21b3eed3e5ac80c585b25c735cd808f80ca6fb1fbb5500d00a1d5d6b7a668cd369604049be92f31169262bb78c560ee6ef39d9df912c31083ba3539cea1d0b73bb3792c7e8719b461f8a66e63a1cbf9663076f625b0738c4b28738cf0908010ce7b8816452cdde13a150475100104a24191237ff89f1bb9254ff4e69ca10e8ee092c819cfe47d27d596d0034cb6c500bcd9f2dd64c23b28f61acda633619aa1b52378465a6cd4f2e18a2494db09c331ed95b296c004ff6af8a6020e28080936e0bb18233dbe53a88b457761dbd22b8699d61c4d33b5317b5a6793ec279052fe41cb09888c079ae644c0d12811acb898f57ab9fec66a498f5bf0b6ce464bdfa91362f6247611e28d9fbb8c49e20e11f7ffcc0fcf323b79982aa527fa10d914427e3c9976d32852d093e8474866ccbfb9087a0a80600f35e7a61640fba8ca1b9672ed3ad0485d62623ff385037ad9b0e86900c7751461efa1d51843e7c87fb0d5a8434d179c707965e691fcbb08eb0adf6a838b61630e0ec038efd9b74dab2f18568d81f095a62216ba02a358125f61e06929ce33d1e160b96a69b94feea59fa4f60d4ddb3a9eff2fb6d68c3ba151fca142865f1beb475c2c5e34a799c663e4cfadef14d6cdb0c13b55fd439a655762711fbad346e4f242dd9b779565665b712eb9dec072afe3e58606bd26c86faf17042d8ffba979d524a245aa90dcd1d09e159a5ba95df0d296a5a83aed68adcbba4e71876bb5689d3558ed952fae5fc579d9898fed0719844477711a48a9ec2c89cc0e9d2d95905ca777842f4d68b4569a247a2c0c6bd125c11594d861b8e0b0807c91ca8aed05fcad881b50882219402dd97448a9f5ad4721cba95bcf93605f905b579c1e26b97e824ab50a56646ab14b4d0920f132d757da26ddd62a0639f71c6bda4d04ba1985998d30bc87b1c0c88ef8e7f1358190b7eed3e8d7e4b5fe45de87f69af3e64237aad39412859f826b26f7c79d10d0631308f50934e294b97e28a997fc3c29b37918e76a066639a7bbec960c82f50e6c1ec0b400c0e46b0f86341ce5ba5753a5399c8312d16b2b9f97f187b24ca437840ed944ecc88c1ce8127b5f2794bde71ad42fb0186559029d9952fbcf04a600c7e7c1367a55103c47a31bf76c733cb9f1650ce3effec9f2dde69da26c885b76dddcb00a083b09c8ec58ea03293b680265d1c5849fd0e8cec1dc301f4bcc1e872cf80cbd361900a148887f2a7b38b0f19c0feb60eedc9dc11689762af22f8f5b5d512bc8ecee12e5ba4bcb9c57b63515ce35e658bbb7cb43c9e055dafe5e37f8820d97d898b9b052a97c66816824758b270e980b6b7ca505f9c9dda484d41fd01de943175a247939a40ed9cbe9d6e02beb17ca04e325b53ce33320ec1f13bfbf162fd437a928d9d743a4d7791d62b3feafdc2e16ed094adc607a4d89f34d16ef0e410ae8d98f998bcd4733ff456143af8afb63466eaaeb861f926256745c7d63c811f9eed7c65bd54e4f89f97496588ffee5b1d3967d458f5bc983c3060fd97cb8586e922593659c792a51f2317a97ae7d438cee69c0cd39059c835db24c9437ee611c97393e47aa14fe79b3bd570b003af8bcfe5bbf201cb2b3d85fda4201a9a03b686518fc85ee31fdce358570fab20a52654c9d0bf62d8da3cc9ec308cd4dfd0a0fa249c0bd33ffd081bd52a0ea2b36f7c44b0998b90a7ec37fbd7e6a2e9428ce736175e23e8b43288a6b059e2cbd2f6a406664bba80f4f257e43edd3b1e3c5b22460e767b1d1b05e8a49b0650e1a55923d567b1b936dac159dabef2d610bfee1119820759aa9be76139d92f0e83527d824b0efa6a70ec1b3acf8ec1a1a9a7000460a48fdedee8f824a386e703eaed70db70096352a0d21aa4b337b4c02cbfe44e6a2b7b7cea954df2f5a2a39e3fb4a1137c86d05152ea5e49be758d2fb88536207fe2ccf81579cbb9d1bf9abd030bef47619f8134e4de1ff748ec9048fc65874bef4f594e8bad9b01aa82c2e789e0db63dbceeae32ac39bf49755def5692b23f5ffb013176bb9c6c532342f12afd940686728f604dfa187c77126262f2cdb9a2b91744e92208a61bcd2758fcf9d6dd0c48399a7f83c00b0e63aa1572d3e1e08f72c54cb5840aadfc48a0d8c83d17a21b51e06f58ea8f26e8386ad5d7969640c5c3804bf332d2e675b56443723488ce6e0b0a026b41a5be2760e1d9fc5f1d9365441d4a421d40de7fb7de688596d76f8045f288a48f01db7180822f340dc584f7eb0e27d5a7de4e6f9886aa36d2faf3228ad23cc02556093d5173fdba1a0d6e166cf81f3edb1cdc2a7747c06b4644db726267a7b2b8de74b0bdcd9f98ba7a19f7b072f4dfa0b8d6d7ccf880081880d9cb07ad4668d3ffde2d26db87be539e681e9055d7e0c2b6c6f3a630b37956751ac8c65681284d80a2b0cca010e1af7e500b76f867cbac90c0ea250cb5c629b1f8b165a43d1b02f32c22dfd676bd4d37aa0869ee0e89741a6bf09edbeb53560518b0a77eac3d473e935b9c74b5597a2203a78a196a64534528ff11efac9f07b093bf66e5d684a2781635f066245ac588cb0642a24409d1aa21048516309f206f80c72022ca14a59131fc8171f4b756f40cf08e9c405b75e151cd0abfc4d186d7b7b02e39e93a990bc2a293487bff966b367a7644762dc652a846699fb66254204d9e2fbac691f9f6ca4b42172a7987bed9caf0f6edd9ccdda1b5caeddfdb1bb6f3a9d02652ef9f6adf6147eb1382b6ac0539af8ec6d661b49a5c8909f8d3bd03391555dab5d86ec58c81270e966ae05692b54f9af8a2ff402bdd5903671965d42673ab81c5da58fe20e4786cbb6827e406f85b0cea82f4c1d1a5bca8d058c4183e422f3eff240ed95419237dd66e38a9c4ca08eaa84e259fe52b11f28d8449b141d42eb7a872e2f2389afde9e64f92a037f1182f5e471ea3da69eec4a530aa8ec9dccd7f053a0afffd4e3df6379f128e68f3376f170621592f41d3cf855f6bac170c54ee7a54b994d9455478b1d331a46c60f3bd4f56db89666959732a9f19ae3b2ed15c70669af24dcda05889fb185078e196a085a6d7aaa1dec92609145a71615ce591c7a7869808781f9a2b3bc88348a0a334b0090305b34d8402f02049fd8d9436116e5d46c4017763eb53ca343d87a36b188bb6ad08ba863d55107b92d42d10af8d379fea7338c1ae71ff891aed613da9472b1304ac2b20a500fdd1ae4e86577de98d7a9008f7072e7cbca3201ba1f51c649ced4038f751f197d143419f286f28dc2f5ea576f53259d4f4f4f29fd4bf21f912d92e4499943bc61fd25d5a6c76f8ed60a60eaf8a0b35d7e34fae820503480f970237cacadc0e737819221c0884d0ec4c7af98fcaab06a71f92188399b21599427074218583bf5aa5e0e99f98aa9c03fb245540e3b442f03fd660c3e6b2d4e6b1c63da3734ce4fdd9a2f90ee2bc2d6b05c2140bb960d6e6cd1506bb3a111dece91fd8248e6365d7dfe37923605055594f491d594506665798188ab044b7013ffc76a6fb4703790342a22a9b48fdca6c852accd27e19e6068816e9bd23294a97503d1706fe593a0ea73f488dccd5aca333f2401564cb96c458fe57f5abe0e4b5031a84158407e1b9b1f2b9f5404cfd61ac2c959a89c78d2946b26fa7ebbf7a227f141bd576ee3bb24a246fa9adb367e5b5b31b1db489e6098db54278c2df769349c939fc5f46b68d63181ca305d5f6959540ace190ffa21faf78874a7dc6dd88d9f910658a05841ef6d80def70c3baa21db5edcde5c9e46638e16de235cb74ad2b68dce1444ccc24cf1a27a369a0d2c4a433817490a2a07375318c8ae69d29056e613129d2c086fd58b65ff8e12ea9e5fa1ddf195878210163d7abef4b511cea13d83800eab41f2b230a249733809bc2bf54424b4aca56fc743dd9ddf01b96340b3025d61a7daf95f7b16578d20448e59af916b3a815cf808a53e1ef89a97e69dd9b88a811209e3cf2154d928fe3d0bed3db0d6f0d3d9d1478e29b45c3a0fbdc0dcd5143b5ea318ec64696d2d69fb2e2796508bb1533f349a2304063a253d21fd7e3ea2c19bf08783bda8c9ea9dfc7d1454f17ccf71e8104458c6ab612c159d8c2d687e2bbe9f7521fbfc2ef18e55bd2adab84cebc6390487a26c9b1f98a94253461eb7ce2f18770e732ed936e539509e64e78ab42b8d480d58c46d7cd3559172649c0e8acaa1d4b09cfe768b39d2ae659f4dd68660f7527ce3a849ac006cb257ae9278fef32b754f5c64caec6da85c074fc5382c41086d6e3bd1d9e5e078b0b0418f4606fbb4a3c492468072867e6a3470228dd46b368d112ece4d433c99f068db4946f9b0277c0c10567c37691cc66b37349475016d0acc464c486a0a1d574daef8ac4ac415e1fade7afb34ce710a9e00dab558e4e3981850f10aceb6d401622053cad752be29d95194de55060b2286f45a6a517a9985196be828fe40ae06d47a3da9db25b816a775a18a8deb73527bc583a4146dae55041d7f37c0b00c99f210be8982bc8e3525689dd41e9bada49fe5ce5ee1ff6da097060c904dcd13b458f3e71d6f6d2e0a1fa246a9cdd3f702fce3f736dc60e458de8ea93734a520cb4ad0cec28e12f7f4d2bd8a4ce12278ef755f40d3fb896b3400b3712fbec3e5edaee59d23719b50b485a04f7e03c8d642c4a8ac043311bdee0ea2bd1e76f2ae45e4d43431971f1eaede8314c65856f434299cd0fb970530df180a7d7e8e71b798a9bfeddaa9d8ddce85979939c083ad99c8b604aa83e16a3e057ad72120b3860215a41b6e69f1e7c58a1861fbb879a5b0edea932d4ef93bd83681cc603a4aeb43d8e8a439b150e159a13a0078272be016075306ffe0c190628f708f05a1002f7e080fa48bf658d989930b98f9f3d09216c2ae426fd7c1051b4cee687af69c5f04c768d73bb2a469aeef6d0e801caea4e8f4e27a8eab393ba5ef01a6897e6f26ef37bb5e88b685bfb4e068539253092486c2eb4db64080cb7ac32efa134ecabb86a67a615bf9357dea897a5e9ee2530085a3ed977516ee6ea2eed32348f1728b8a6dd5caf7169d5bd2e76e66fe79fdb605133ba68e32d86405a1d172f7015f95a55164cedaa0f7d641a1a24b4dae2ab1ae8553a18f6fbcf771cdfd5fe9cea5aec9945b0b4ee550d72bb27abb318ad170684823715e7bf196be7231e7226c074a6f4faf2b2053dbde6cb6cd9891e1594f58b71df6e00e0261e887dc573cfddf000b4764f7dd0ee4355db0f0aaa964b1c45b0c7ee7c48081a612504bb011f2547d56655a7fda1870cdb5a15d5814246bef3d982e259be7ba929746cb17b912c9958187171ce35d3a8eaa29d317102e7bdfde5021619ec56aac9c59a5d476371a7837fcf67ebc541862139efe7fba43c063f96672a90629f524844e85fabda965cb00b6915f4e03219a70c5a067e822387c6fea48e9d30e5c5e4a7082ffd6b2610c6510339b7d66ab7831b114eb173f54afd7a9ff1c9db033dc9e905e7dee790c4117b8d32fe6aad1c1e482b8c1e01323ac97af2792efe8260d1332a7646a93e7cd6d2d22cad0e07d7d78b4fd0fe17b23b3fbabf184be9a7b7957631615dfec7ef15c3a819d5c181cb979aa233f29cb38d137822acf24ebd65690475e2e3544116ee87d200ae0718c36f6ff9140463f1a902d354e710b979a892dba9d29a5a566d85f5a64c46316db37de905c6c61dd627a422b03f08fc34769fbd18ce7de5b7b2635232b60264898cf57aa945ea6f21bca6e5dfdbc1f7437b31b4862ec58abba2f9782fa7e9106351ced1b4d5f78bba974ff568a8dcbcc449b94d096076acd9fdfd5295889b6d12eb496136563fa66fe10469121bdc4dbc550d3e946eb4fee0f04af60c358470f41715953973345ad52a8bd347ce71e346be22fe18713df75faea02be11f34d3d7fdc1a5151ec01bf7d18a93cba273c37287b02c3f36363c2eee6b8123a89c30cd5","title":"28 实现 strStr(","link":" 之 BF&RK 篇)\n\nhttps://leetcode-cn.com/problems/implement-strstr/","question_id":28},"84":{"day":84,"pres":["滑动窗口","字符串","Hash 运算"],"tags":["字符串"],"whys":null,"difficulty":"- 简单","description":"```\n实现 strStr() 函数。\n\n给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回  -1。\n\n示例 1:\n\n输入: haystack = \"hello\", needle = \"ll\"\n输出: 2\n示例 2:\n\n输入: haystack = \"aaaaa\", needle = \"bba\"\n输出: -1\n说明:\n\n当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。\n\n对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d41898a42b9490a617222305f653595ed556d87b8217f57873e8c372d8a76a0f52312f1f85458f475f25c6c01ed76f2abe143274831f1a71a48015bbcf9e606fb514524d658bb65c94621422a5cbba421e5e75a5aabc4e2829065bba2ef30529cc9b2880b44a623376a8966c64cf0af0e2b714841707aa47c914dd82ab7604508995ee0e89b7862420bf1e4a62edad2d0a5846548e823444cfa8541f2ec846e8bdb085a3321f307bededb3088b354ad4cfe524027e067592c23e7211d00139109f0d322899b0855a0ca110772b7bba4ed31427ff7e2b415459eb1661201dabca5394168eb661b4a08c49bfd84aaff6c8e808475d444d7b3819853f492b71b5a78eb77ec7f8f5e150ec16200c26ec6ee290689487268c94baa9dc61da9a87901e5cb0a20915a0af8065bd94c2fb86d0d9edd48073b2e80fbe1764d008762aaebaabba2b8f25646ba1860a4c8da51a5ea9614a5de08d1373d5985ba2abbe97f8dd370ff7d4b6f141efcb3693948f1ff62de800878a8a45d12a0707eb07e09da6f3295c6add5336cac860fb29d2d4d8feb085c146fb26e8fe77a608a755e8036331c3c2ebe7301681028fe4c0ffeb5e54db4a18114c70c423eb488ace7bbf4cf9168dbd0c88182a8638cf47b69458c1bc1337012d18d1ceecad02f731a42cf97f420bebfe70e5e9e128e3cd8aadf9da147452546c914d55cda7393f8f597622dc99bf99c5673bd2d3f86b59b9afc5aed6490ddf00035c27f560a97927a32a3f4c13709208e0d8b52a7f2fbdb3d9dd9a190966e3f59463bb2e5f2dae75da7a1b775951d899c30e61f3c88c6f4986953fdeba1c41e58a190e8ebb60f646ce3b347d9e7dec7dffd06a8fc57eddea8f193c9889b250bf5505272a1d2ef48d8022f5582fcea6dc160b471cb074b1a86cdcd6ed38db075c7e766fd83999e08c7c38e970f04e1761f2a2154fa32748dc24fcc8a2acf590e40f81eb1a3086ead51b4f78e7e4b582f945a399cc2613dd6fa7794b22ae87116070b81c86550027240b15ce587b525f9010e2d3690ee3db4f929d255597a82945cb615d4349bf347ec7b3ddc80aa8b5bb46723e8b7889c5bfe2b693fb37829624c9c5b9641bc2acb32917521e1c7a0470d29a5901050f38acee00a664a1a4154f28798324764b7e98600e25a3f05333fd8e06eb94e68ac4be632aef3fca6f8984465b99f2ded949490178bf54afc0044f0910896458414f7dfb02a84356985347530a7bc4ce198bc9ed792136ec8f47e3c07283b1f302720303c458b33acf55951e64a822b2dba93249ca4e5a70afeb8307247553a71e31273fa63b06506c961f963f7ead8b3a1dbc49de98eadfa0220e2107011d95c844a1af233aaec1a16d7087b030003366c89e934b126fc3413756e2a68e485508e739a5b24f9a0eec13426ac8876863bb869fb33a94e6f1d48f05f21ae9b599b578ccf22303dba755cea530fedc61c5198f313287c35f9b6b5f9f595c56de556676f22d78650fb3f7c65d2b84ad94f7ddaa5ed49c13c083a5fa11e4d02d10a63e08c49da78587747e6379f366c1931da8464c52759ca417262af277eef71702872ba87b958aa286e6b3227aae6e79d198cc8da732447e4128314f1d0b3f8405afb2a2edd1f3b03247e490cb2b11a82ccdc0078420dfcb552a8d554150e3273bc87f401aacc0b19f99469d727681948c8dc27be16298304e9e877b42179063edf76b455fcc9fe675beb3f45d8e4e5a5e39e363db777ac23afd49aec545765aa5037488570cd83873b70e5f94b08d2f77cc1a2a64741e47947602956c0b6c4ae583b5220025c3e376f8a7f66a60cf514356d1cac80ce045266064898f9f6757e74c388e73faa3ac03547409d8eef9886bc8804d2d6892ec167e9709277b55e11f4e3e5acf2e7650aa95ae9c5a511ecfbf4129bbe396bcf7f87286efbedd343fff09dc619699c3f79e6b3ed9a8026fd54aa2c843d909d3b76b8b7f1d5f9294b91e815c14fe849a95e4232f09e913805d836d294c823fabbd455152ae60dce637105cee7aa7b6f639a0c256bbc6dd0c8261db324ae18c614f1f777e71e8f933c7c5008dd868ef0c6850508263203ed7c2dff806b8f7134525bcfbd8365df45e8622d42dc38d9ca3b293db8cdf81bb704a25da0f7ff05fa9176e76f05ddaf2f3d811086cb19b41d29785450c1fc8668ed71e31d4ba2a4e370d785d9e7e9b1af85a953ed464b53be549d52ec78ce247036420d4906e0fbf30e06c4b2e70bdfc582205d9e0951b56d6e6b17f563d5253b9e5474dc3d47fa6559f39dfc5a4f52283349f4bf15eb847256cbab797dec13ca610e6d63261fa612caf227fb9da7d04ebc1eae397e0de85b9131ae36ac220acc46673b9ec8af63937ae5e8ae8e3ace7bc79a453d47a357eb2b1074528c4652e1d42d2f96d4a8d40a8e7c80ce3e5f727f25af5adcce213ddb456ac2931282e90f121a0adcf0ec6cd93e25aff3dc3b474cc7d50c3336ee3bbf609acaebf14f22ac5f8e590aadf5037bf259e0a9e87e5652d95d7da1465e5b52bf10d3b0b10b0624be060e452b0d7264dc87043eb39f6fdab1812ad24bc553e7a313f5b93ca34655adb8d997a50ad4a3cdaa2d2f9febc858acbcf23ac4a07719eb4fb3096c94b011243c985155ad2ae077346c7b02452536f360771320e3a86a9cbaccfdf1db3ee8d0eab58eae0927fea0d3cdaf33fd4a185ef41423e0781759f9e9be0fc5a1714054b4edae6cbadd402a2899c920544ba73c6cd77e465c7b08453efdc1f3ee75a97a34d88df8731d7651272e45db49b4f95435ffd3b9eb1ede774bdda6b9859c998605093cd2c4306263bcb77db129ee1f64bd44705911b783c68ebd758fe6378c6c894fcd6bba16b43e303e5445d3fafffd8f42c646c99f2cddbd3b2c4304e77bd5cd56f5490602cf7e9f0f6cceda8b91703d5fceaa4d7114d84bf2f5a3fcdfa76f244455764dcdede390fd6e2382199b1e30e5b2fdae0675ffb7dadf9fa1b9a7cb8c659e7cbf16b346e1e55f3c59e7dec68ed4e1ef6cde976a0e6a7a8ba71b841a0f9171ec3df326a7dd41e3b606d46855dec0d07dca96f6bc336059c902fd00c8ab38892d962eb39f3da9892785ceb18ae49195fffe85759bcf48abe2c3cbf750ce08f1f580518aa6cb3548e71f3c744e8b7704821c11ddb280a57dfe43a5ee439d3ac7eeeda327e4ee26d8c3b60920c0b6669b44f0a8520c7d354b1eed69311b4535b648f7c010103f59049f42c8dec7ccf9f53a5ecda51ca69fd5087cce5f97c6ca61c996065b54181df565c860de8d7d4f870cd3c0b0a75194c6c7fa8e4d6409a36133ec82e2989b89e751d2251dc33225b4bad12bede65cd0202c59ceda818cfaba1e18f11a08d26dbcd783c877ec5b5de4deec9915a4d3265f7f2bbdad647ec08e69fe015874ccf6e09d810c549d3547d3b62dcfcf426dd60fac7400362f92c035503e44f513b4dc31abcca5f2cf5b4cb72cbd6051a8f86a546f2b151262cf0c60254360535f646e148edd284c98f057d3c1b57470ed55177e4a4a89ff0c35cbb44afc9e6e9fad4e6bd9f1688c9513433d774acfa2d21c0fbf778ef9e25e2ccf3bb62c31d98c263a4770031741742b354fc4663f214b77750517003e41d25728a03afa8dfc25dfd895b75b53f836eace5caed698c4cf6d8da3b90c10326ff49fac5468d228b9002fa584da76e3c5d35f9a468a0d5dd650449ee1186f77ad6d51c9525001d4976c198d60227303b61de61c348035253bb658168280eb85f6c4e7c5f647a278eb095e6362aa31f673cd3d5a1c290acad7e62c0a8380053f6f70a30187540da87e1f4dbfed17e2e59595f196b58db473b4460146b07e5be2d3241ad3e28df5ca82caad1080201a0ad24769fb828fdfee8cebbac375131120cf0f751c384e84bb3014ec998fdf56fe0eea6007850be12c5c90697fb0ca397acf898ef220ea6cc4de4e9bdf6e5a376413b086cc539c5c700f2dcef634c84efa476e826bfcd6b78f7e29e17a3ae86f4ee090d779f2c33426cb5d919cecc666ebd283ca3e90a86b0bdebf68b70ba753eb742a35b1757558d2de4c5d46c15f41171e40e9b5a3f8455ff8d1b6c3ecc89e2968bc29419fe43aa9677d23d0d760d7bf2834ca1c81cb29f81341979ef0ecc7fe811e607433987161b473ed19b9294fe3275ba3bd45113b9def9299bbd8b9e6682a0e0f749533794398032345595238ccfa9c9df953eb7b80e15bb13f57d27c2eb388d4a877c76acac934470d1749a92604eff6fcf7a34980c7140c94675c2beeb0c737c621a43b8113f102fff734408e456d86cdf74dee6ce9e25b161b63161c91e608c5fd94919cefb386ee106801ca1d942ae8deaf21d76310b1feb55730d07f5c02bd123c774e146b665f3411eab0e8e3960b2fabc62afd01378def0eccc6727ba8b2bcc5ddcd8b517cfe85b24c68356fdbf1a56a680870927f858cd730ad4f7dbe05e4b8796f7206d52c88adb23bf5f74ba0eb99e8aeef0aef7dc871c01695418650d9fee5b7c1a0f321677fba4b361003f43e2e538de985bb05d04c8f39642b509bc7770d630a69f7b6f7758cf6bf7cae52cbfcf013277d247feef1705ac3001866c531bfe60577928c9aff6fdbaf45ffb47c9fc56f7b83951662c13fbdac36aa56f58396f3d331126c689cbb3ed79c5c3281c24ee67c8f4d4f112677ec8fa14f78ddf5d60176ec29c390bfc23bc1ff7cd12f871dbe29d7e67e974b728df267b29e2d6ab17dd32b67b72febc1544591f4fb75ffb7a45484fc7b57727c41e37f01c825b506ac2f8f8f2985f7dbd89b33ca153f4f67d7b4a3576bb8bda7660cda43c62823366f4206c595006211be85395f295a37acc20285acad349fd6d8c686d47afdf3209f2b5892a273115a2227454d794dbd7b48532ae7b1007ea402138e5dc6beb1fed56457e99a04d2d85b3f16e4dbdf75741aca5824c9980869943a447e1c642e4577077ed5997cf3c42618c0041daf9d96cbdbe622c1d127573c30c62c1803ae46ebe781af28de128e180bc636bafc76e682fb15cda9804b234f04d674563d547d214615e2310af075d60b6f5e0be8e194865a5c623e6baf7123479ec372d09f30dcee660bb221744a45201c2e032d46d4bb950b9e58c4205ad83ccec57a82dad7dcbfc90f1cf5cc868f115f6290bf8bb07226deca7e4fff5943528cda4ef376ea47778a83da39f20a6b2dd10782842faf5a9ad43937a6f285f3a0ceb3537d43ab4884a5b0c55e3c46eee50871c223beb6c6ee8c82879ffdd82c0d45163fa064e8830b92adc576a9281b04a35d8eeffeecf50e908b9a1e6955db51e56f60ea4506e2e6f06d9bb1b3728735229ca0a70ac290591ddfc715e9de464e0afaadc62d6e607f601a98ad385fd15911ee4c31eaa3ba39e4249710ba0547cdfdc20b1a96914df2e9fc71f03f12107dbd7eafd3c3fa05e5084079b622550ce8291a3a23a3a924dc654657b4e8b6cd96aea326113a3f59f36882b02323770de473520673caf765973c8a97074d4389a148e886bd3cb13587412d6f173858c09d6493e6caab9816044c4de7f91a73882810d9cc76f0acf1607e90473bd5efbfc5c57bb8997ab7852a70b5de41955eb03ad61d9fc8cc6209611c0f3050cb23ada06b24fe4b1c22a155343b3d8c1eab978fd1b1e63a90e71dc42aa5db5f396ff5da88ce2d185863148918bf8ac00e1b11093a4253a2cb0e07cee30ca99ca3085b3bdd590a6e9bb53495f6ce4e550fab38ad57ad0ed7fe136edbbea69f4438fc8ff7bc9c0117b5e4bcdf798a62275fa3a5548f85d9de17fc17720ca7d23b1c0e2a0295ba9bb735bb57b78227ef7a334677caf983cb254a133d5c6e304d94fe27920168915f5389736574f90d123357f35b0bf1feb3892e1a420b426c50241740808b6db1edf1320873cb952c801f475054d99aa6f09860894adcbddf54c3284529eb1c095e02ae44991b8e140e8b5753d53ac7c7123d2b2cdbc06f9461b76527bf3426bb069305c48359d272555c2524217b306ff50be36cbc088c6e313c718f7423b51844997ed7daf67c7f40a195c7acdef97da638cfcda304b059b4199c76422f75e8e7f3a2df34e7329f8e79804f47aafc36e74488b9ac76685c35e3672508e66802b3188add26be1604e82aa2c41b0a5af799c1f3bb273fbec56eb12290c9c26524bc82b3244b3ef0ff9ce238affabe0514ca7b14674845bf2737cae31ba04fd35cd540f515a83b51ba503ecdb3a2ebb5dee517fcc0589bf93dcf4dee041ded8305cd0f73688911ce64e15c0570d7790dba7d001a2f0b42107ba1367937ebbeabcc8c79a34a51bf069b727b2835e32a7e4673d34fb9ab4d1763610b04c7cb7e3b05a6285170d6e676e17fc37e070058c445554b2ca8cf457d3d57bffbfc9965fca33169f64c8755ecb1337a13bb0c9f0ec9060904a1ee1f57afd1359dcb4aac536d7b00639580315846e28aca72c27e361b5fa113d8d3c8331f7157cf369465e7258fb2b4d03ff8b8e71b77da41f015bc5b7edbc9a168154f45d6c55a3f80bc94a06eb3dbe9831d8ef2df749124fbb24c849e9dc381efd90061c5186a73b7e1b66f4cc0aeb861f96f361945978475cc5a9eed6165ac47b6be909007e4551b6686ecb78e54835d2cfc797524b19bfe9bfba4221f1c4bd1898f352317a97ab7817a82afdf0cd0d506d34c8f76ba172cee629d21daaa3dfc2da6c2688131f348a38bbcb1e9eb06f7620ec0a5e02644b903edac7ba5c85ee342f6e3585746ed28eb6357c2cefa64d4c53d88e96399d6cdd5a9b076c45f9676b3410bd20040b9b326774fb99999fcafa476a284b2e3aa0982a267155726f7f93082e5b01bbedb9ab1fb557a4ba098aeff51e102c00e1634463e0805767a15123bac95d7484c9fed512adc67e3fc628f9317dab3e3cd3adfee0c19d24e22e09ba32f7ca47a249e5235c3125dae2b33a71576d7ea86f5e1af091f4aa48fdedee8b162a3c7e116b3f32487330c5d5e999e42b7ff3cbfc23cbba93c3b7c587cb1bf4df2f5a2a3d270fae6132cee91021a9c550eb573a766f6cc62483eb184f05b3c8ea0b7fa9ab10346e65c4b9f8134e49759f740eadf1ba6659e2aae473b38cae19b1caacb8caedd889a3093c6a2f036c49ae79a1e97f9646667eede9a020c41b9c6c53234695dfdd1092633759504c2a197c76a266f721ac69a659c394e8920912fe38e7cebcf907ccbee8399a7f8612aedb45683346d605e32dd20580e95ed707f660197074634dcee50840cffa4823ae01d4931e7bcf7c1c9f0a19972dfbafe83d3afdbeebb80cdc9a73e70e233c1922fa2e08054037402ef9df84b29b45f0986ff1ecc45eeb6bf42819aa027da25fe21caf8ac23fafa720f77c9aeb2c6c7e089f1e607aa6905a26f70c6ec50b89dcb16d55f7e88e9e9d6bc78e494e9ea898c4707c0a6bc44c99b6aa1cc97f28d1926c1e34a3812117a4109dbf6a8a8099a7181f1770b04c7a325d1f8f048c649ee542321cb7ed840fc40142fbdd27a63230264576a5d58cc32688ffce3ef8280b7024507a7080a30dd2289708c31e87f4da1c81ff253ece45483313c704ed1800ca90bc5b7086ed4c154a08b9e928305f736bb66e5afec640810c2221ad643068eed13ffe31639fc","title":"28 实现 strStr(","link":" 之 KMP 篇)\n\nhttps://leetcode-cn.com/problems/implement-strstr/","question_id":28},"85":{"day":85,"pres":["堆","排序"],"tags":["堆"],"whys":null,"difficulty":"- 中等","description":"```\n\n在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。\n\n示例 1:\n\n输入: [3,2,1,5,6,4] 和 k = 2\n输出: 5\n示例 2:\n\n输入: [3,2,3,1,2,4,5,5,6] 和 k = 4\n输出: 4\n说明:\n\n你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。\n\n```","content":"096221c37c5f85fac03c87f9e42ff6164f9a33439f9240905709756ce7f7c66808b2e25e438bbe1eb009b854206a4cb13cf3cf4e62e49e134546b76e352a1ba807f0e3a76351243680d40acfe3de1e3fb1249a01597f66f479f9a00e01c9c6ce1a6246f3bf3041e8435b4a3f2e09053ab33f2e437809b349bc1f3570bd6ce670f3ae22e5efd89cf8dba458a34fc709b6765e089772270f7a08098479f0a8f3277a7637086bc3e82f7144e21722978c92d93d5459b0d1fae263dc63b0b43ec8fd93549d76c7965f852815aee014ebfbe171b646b281ac4e709be36b43e8daf2444f6638d75d26b92a7bf9d07178696b7f8bccf1a2cbd92c190c27a7003e1214475a8b015c07753bb00b216d418f552f3ec4b0eb129c6e8f12dac0a446b5c00b970a64c3da0b89ad67cb063e4909965046e8883158e2d700ada615b8d819ec44f25a5de3c0066e3049d0f7679890c00ef4cfad92ddca818e11af4a8cab7f5c67c880f1f77596aa78db5b584b0157578497368f69ff6719177d5840dc3eace7dc1f1ae430230a619fac4d38ac4840b15408d84f1d96d2abd536292d5ac9330545058880436074328502d4df3f1fa2d73ceba8e4d2b9f35e73d5ff8dc5ba5478a382a4cf391c3b8610a7c932efc1ffafe3cccf9157c0170f075b30e3639b7f1d2ebb466197a2b49acd1e8a90e3a5a59dc522c2e49373def9ba4e209d22eb5312da4f0df78cb7e81aa67c9454a356b0fffedeee061a554dd402eb014ee4943f78687028fac7bbea84052fd1085389fcd5ac7d456e3a363483269048ecba7c22f50f206d1d2adaf9eea6b9440d724447997150f220d99a200530af53b223683cc06f069dea1f03b6d6afa1edeab222a7de5bb34751392d28507b1fa871bf194a613e173d0d4eaaaf9e3b1e33255045629b47acbf7c7c70dfeb48f5308acde651deedbd0dd137b0b74a6568dca59abc0912750d78b8b400f551a9c4ad7ee019272e32dde564ee084b709d558dc3587be820b18dd7421c3626df062ee09e60688cd21bcda85d96557d5337e999522c646e12c64f88d38d6ea13444d5d214b319f7a619b32f6423f08a38fc30816b9b9f1dde107ef9c8d4b43cc67945afa7dbf97d53c70202ef392e09108f10e567c257fb59c2594694ffcb0e1cda4f5e537ebf8e4735472136060826eb1d55f1f06583e0842de05b1337322dcded40aa4e689e41e728a5ccea49693844b024ef4aebcacfb453d7c296f12046fc822d95648e33f30b21d047a4ab22fb3902a6bd66ebabba591945809fa189614a41cff09edac988fab84c22b3ade36956df416fba71e3b467d9a68811f094d25a18047c41a746adb876e162d6950dfa2245ddacd8683a782b1da6c5ab895f2fa7b7f81f1c17861d51ef53f4d082de4dcff5ccf229fe882822a80a1fda231c60a794b3eda74c8e9ede5865aa8e90890eb26af253dc649e20a43ec7b8ed930adb3168b8f006b336e6e37bbf903dcf993ec5bb2a32edd96e0dcee2e9ef6512bbd5d04f9f50a609570266dad125c353f89a5743e037d5c11c3b8115cc5b4d36c044467a458e2a0a8eb4c677b989bea9375d19ee9a103ec3319a0ba8b814970176caf98c57d4ef86ab6101039f2cee9a63003a47773f18d65f411291ca99069c4ceb34006776a19f6df5c647f7fe87e792c4dd4107fd76507cf897e7b23a22c33d1a9096dbddb65a4369bd4c4dc3fc546e8d5dc9bb96821e4fbb0199f462ba2b72ff5de0efa7ad53976f96176236b3f408bdfd1f6c48607d1091fc6df051df651f757a98f4ec45b9a1fd0e9c7b1a42abe12341c49f0906ec3f756facb96db2aeebd3945b1b152e92c6c2f08896b2fad721fda02e8d30d5b0f4ae7e07348abd9befd8482477fad2d1247d666bba454595cebc7d1630130d6f7d923a683ded01f625991bb52eb1bd6d2a40457109d5894aab6a14559d1d1761c85028c0f0599544adc25989ac04a622021199825e8bac122f330b45dd61916ddc179a00569af337503b097a898d2d41d06dd621bf4dc2af82283462baf174bc1a745cb75e7448ea1f20cc27cd2e248c066a3eb49c1db8c194e87bed710e929275da4a830ffcd5b66ff39c40441f6c5e0592c59d7427032f3ba98485ed7c2dd5c94e8a626f7812c0b986e913afe84b244cdf3ecdd83f0362bdc3f81ce532ac5ceb89b503fad261982b40ddb3292d800880da07d779282b4e4ad48f9c7ba847e41f43afa6e36bc298919982b1a8c8fa73b9674d51ac009a58e73cd94b29635b6b2a45fad1f30e06c4fbe019df8b852b5cb1115cd760796215f27fd57a7ec01d3b9e2824b43147f39bb20f0201243300e8ae41f5df3c0df1b05357ec13ca610e242d7256bb0f90fe27fb9df98903a510e0703453ca788a1bae36ac220acc0f293caae7fb259467f6a1fd8633de62fad611690aa356a621097c089e6563cbd42d2f96d4a8d45d947098de6c193b316ce241e6c43b33df062ccc942ad7845b5a120381dcb777b91413effdd95429c6354d89c1ec6cdd5baf1a59221df1cd28f248e4a8686f85be5def25463dbac4b45eaa9c309db2d7d24b9e015716e382a52d8dd0f889691d229bcb89b77311bd3d144f8e984fcc962c26f0742ff923e09a3110b1d2e45a1b3f64804e2797f3e29e0c013aad4b8a5ddc44c07792e9532bcfe99d07bfcd0dee78fdf1e8fcc7d58af236fa72343361129573006334704dfb68762529226b89813721454251bc33bcb88564abef6fdbd0cd792622a3003cc285d4122a14c8fa8e09702799ca20714effafad39b8fccaafd5e7db616d3646f560c3b01d0d5eba9ce09482c8ce1c8c90d3929c74151644da46d7827c0b7f300c5e1da1c6e9750997e8a60c19b8318f279ef278d4e1c28312444a02fd1ecf23b30bab33eb418819d96abeee83f60b51042f7764c9429c331dc32b769287432e23e57e08d057869ab8e57fe447298fd8b3cd6d3b459eb057731bc25e91a5eabfd1f126744b431d3599f9f49eb73e648b61f482fa0e395835d2e06b724a4e59441c45451ea107852ecc72c90d55d3da9d5b1962c39b703ab3434dd8b8be8ec8e39a2eea8b52a26acf1f058d8568cab6c24feb925e61fa1e405f120687a6d436dc38854e22c77aeb6af02149e32f46c006225b470876f1926e56fe5532f2477c4c0d5bf101944b9f88499f691d9936977f2b5e3ed2234ccd5202d19ebcdd579c4bbdfb43b7759eabe6920dedae7a92d2a11c5ec6a869c65bb5955a1460690b4aa320613a6635ed62dd9045527310479f0b868ac78af9fd7e3dc9ac24b388c00321d91f9fdaff4ebcdf410e045611a56dd2609b943a419f6eb892d1f359decfced0fe1f2d46f12867b5f3b7ddceccfb389c3f1ddc230ce3c78167edf057d47e5159be88c8c3a8f34a41804f4dc264f38c8b9a46ec715de4deec9915a4d360102d2bb5e42a7d888970f6014a3e82bdadde880a09b74f0687e2689d814c2e9e4efe151d7865939065436d5dee02e89063f9c2adb3a4092de324f4695882f86a546f2b1512629f5d6e6a0526160d6c2041c39e337b98be128b95ce3e70e0550603142cf0ba0c7c8db442accf60cfe80b20d1f868d9d35d1e203f1ec0cdaa5201fc3fcfab830a248632b6312cd9dc373f1d651e15033f6a6f37a532376b427e5f0517003e41d25728a06aab83b363999dc7bf1506fb7aa9b027e7ab98d9cf6686e9a226106f45f49fac5468d228b95d58a584da76e3c5d35f9a49e57308841e44ceb0163f60ad720c92077a4f91cf385f8d3d083343ab1d91552490756c5e824458e0e5e5d6b6e4f8d1991ec413f81a1e4074cc27ee7bd1205a344c16cac1e32a078380053f6f70ae0a955418b5622872b9ad28e6fb94dca28afc82a264a14a1840f9635baed9241ac3ea9ab58fd184aa4499201a5ce66d20b5d695f5ee8cebea913c5c43279756474d700b9dbb6255ea8cda8c54fa0ef52659990eea364ad22c76b1d52f6facc7daec3eea2e8d9978959a6145784e5df5c3881fd946701b27c8ab2fc81aea246e9f6beccdb7c67e7ca73422a52240fdc38d6ebf9e7a748e56d584ecec66ebd283ca3e90a8680b1966b536de6bd23284e0fd6e767c04c8ce5340fa328606496c3e2f00333fdefbd2d1f08cbec0d7673cf82507828f47c209717b98df659feb7778841ed2e803f81341979ef0ecc7fe811e2e73228b0e34f149d358a72362eb2440c5f80b1975d8aad6d5ac94c7b33a640e4d3dd24c3106d95367110b0220efe1b69df953eb26aabc409b1551dd6e04d0f8c4b23fda65978e1200585e53cf490aa7f8e9ebcd2f8c834d59ec335c63abf19766ec62e87ad240f171b0ec295d8b4f23d2a2b209a229d6ee60165c375816bff704e5f9bd9ca4a6cd8ebd552447c61dda7fa58db521bb2a43e585fc192deb731649b9126523301d6b6b413458a4e4f2c9960b2fabc62afd0164c4b54bccdb3837f0fcfaced0d4a31256d985a33142356fdbf1ed6a75080bef55858cd730ad4f7dbe43eea62a632668907488e4fc3ba7b605e7ae91a3a7f520ef7dc871c0169541c81581aa9dfef4e5af71265573d08ed88d70fbbec24b510a7e957f850eafa1abf6b1c7774f314f28bc9cf7758cf6f739ef029af2b856662d742af4ff785c8a45127fcd198dd24b2ecad4a9b300b5e30084fe0185ef6f3dccc7162b8f7bf8f436e318f5d1d7bd94741a6d6497f5779cf35528abc24ee67c8f4d4f112677ec8fe8097893a0d51755f11ccea8e7a23b95d534aa3ffa079429d7e67e974b20c8a632e0d02d24f425cf440ce77ee5891104c1a6f060eba2e70c8cdf1a27526c54e40c06c324b412942f8f8f2985f7dbd89b33d15c6b503584b4fb207bd5bda7264c9a69ec4250365b450bccca2a0151e2c53d0c424232fe8844d0e2a445e19eb487d4933faea720822b1e8eaa300d52343a110474538b6139537cf3b11511e1461c8468df97ab8484644ae9d44185d83676589489963a261a9e0a489ccc772c9c335f541c6467456a076eceb37cf3d96e5a91410c8dd496d7dba8778c82291b797ec434034fb437c1e781af288e43805d459763ffa933eec9e5178ba9d01e7e06559f095f267e7d214615ab770af82587053c1751ada39d9b44126c6f3f846a2d0edb835abfca75d4e77d21b221744a0c2b1735292d03c5c2d011e61d907508963c9e9474c69f8689fa9c4a14fcb78496431d30c2e7f5e9705bc5e02354d5190312a6b9ce5a972ce8df4f407ed45c9aa88d732da840b42c9d1a75ff8329666c063a0047397515e7875223f9b52e166c84a45e309005a5a7d16f1035bc9f97d82c072e6a14f927c78d1c84622a83cf570f0dac59dd9e8287a70ec3df812369079803b06761a41b52bbb2944793f9f22b84342193a2e80ac59b4859d5cb52adee380666f2b981607371326d1889d8091ad14b08f5402cbef0ee29a62dc50ec47a1583fdd21030bc9104fff2c95fa477195130bd2beec4d5f944ef0d1a4eb86c1958b1582b1023a3a969dc784619b7e2a081dbe9a1375f333e5cf242cce52d3f3074b07301066ecaf565953c81970e485ed2bd4cea9daa16ff60890263774a2322c0806491e6c8ab93440f5d5df1fb5f20e76940e19245b8d2f12e3bc84e11e2eff180922b8c8964bf9f226bfa9c058416fa3897189d94a7161203734e601a8438e3fc2724e60e182ebc1c68633d8d17b6ccb5e0b1af3a8cfa1d8931ecd4543a25bad4ec9a2d05453417c052fc8a80015a5f723b3f55bad65e39cbdb41a1aba3582071dd520a7fe6bc34dfa4961a4e18bd77fc37d015fdfe136edbf7a9d94c60c489dff2d51c0af89fbddf748c731213e2bf2495e3f3c217b95b7904f6861b7f592a1f95f0809d35bb0a9da827a7793d440cd3c8c682254b56610c047f028bb06e9f1c0e8a3c53956e653ae20d5b385cfa5b0392b8e7ed611a444a466c117c5140d5877da0e2ec185b0882e82c8102475d05b99aadf0891d804a96f58715dd161676d319210b7cd344841b821e4bce1f029c47c7da0f3d7b57c28922c0059a646fb07e7dac2cd04a91cd449d69771625393c26574cf559a638b90f8022317f7cd97671db18178d1283aff431625ba7a0baa187a716ab2fe5c4ad109a3a992da92e28606a87d7d9889f74a771cfde048b4a4abcaf3edd4580a9a03f391224b84b735dec610aa079e99362fb4e30a662bf97071d68f3b080eeab302ef08d6eeb1ec09acd0e4df78eb3771f6cb9b1dbe276eafaa20a19cb330a0c1849bf6e798ea643e501ce12df05b015ef7a1ae01f558ef8acb8fc84a01ff5cc58d6b06e8b46f34156bcc619856c292d8118d54ee15c585ad7790dba696c302746420d36f4643c7ef394fd83c53da31918f952ff3d2c3478fe3178730ec31cd6ea1d1b63284550c7dd583b4ce87c513998a265fc35976a7f36118a114b4b7ce1c75f3c6f31fafbf4d02bb8e6692fb31e955db9e2673153bb4ab535c5064304bcee0f4caf9835818249e3536e70166adc955f1d1ee280ca60d9541c1b5fa144909a84761f791dcf61d275ef6989aefade7abaf2a2287be6118a42c115259ec5a86c3e7e72dfce0104fdb5bea06eb3dbe9831d8ef2df749124b1b251cec5dfa3e1c5d40070b8034073b7e1b66f4c89e8b869b12a2a633edeca318902e3ed7d65e402bea8ebd234a83a5f2ac397fef3549e402cb23c3060fddec783c3ec695f1c61d1898f352317a97ab7817a82ea874fd2d6458d27df7aba5e62aa27c52ddae034ba2da6c2688131f348a38bbcb1e9f201c86e2bc0a5e02644b903edac7ba5c85ee342f6e3585746b002c163118d9caa39dfc720cba035cb9f99d9eca2359157cf23e77376ce484be3e3637c0dfecdc28ea3a43fecd0b2baa309d9884d421f6fbbbc308aaff94beacbcef2b0053217f983bfff42d121f4683c355b3e4640333e591f05a7b8a5106ab5f051629926b3873bf2883ddab3e3cd3a95ee1151c74609d1c2d32f70d9354bd3022ee9125dae2b6e8d485cca80c6dfcbcc796f4ac7c09a9b27649e89e5e917aae320965a046a56b7cd5fd9b03eafd331b8a2472a2b0129a8d904b1ef88a3d270fab05c65aa914f5bc47740ff38c420afc4340d7de5cba24775c0a983fc9af00f46af121f9fc838e49751a348e89a47eb169a79eb151163e0e19b1caacb8caeddc1d464938aa2bf73d9cfbfd40cdef2697726ee879a0e1722b9ccc52034625defdd096a727af84191f597da6a6f740530c69a659c394e8969856abf972eb9cfd5289194f0d0fdbd3c06b6af3dd25250200018b6511e8a4307f39190b90481d8b67a28ee3406f58ea8f26e8386e11c2b2e215f08384dd73e654c111a1a442a231ac9fa89f1ec4ef54913ea3e0602cc99e29a61540591ac7cb644b1be34e08559610da7685f3a8a5de310a5023926ec14ad51022c81c87d5a7de4e6f9886aa36d2fe32e50ea669f56557d93870c15dba1e990e936a7c0fd8fc78c8ea7696106e0454ae4661c7a656cceb21f428ea1a897efed97594f6e14a95fcc2e37cf8400cf9e1f99ac379511c40bf8ebc83cf43ab77ea3d2bd785465262b6c6f3a635972c13203e28c613260ec9d4b7b458c58065bfbe54cab17c139e99d000eea15d72611d245ce1f4169d1e26a66977fb3673befc8508a86c3cac2ca6b8cbf5fa2f7a16060488b0533cbcdc25cac3da786497895a5276017bc8abb1575529ab846e787a87b0830e33e6b6f546bd349042c6245ac588cb028652c48cf52eb0a4e53220cf206f8542c6956d20303561fc7170d163a7448985bbdd457b74e1845d9b0a72e18717b3e4ca79e88a9d9b7216d2ef5d7bc27e32ee13d4f23d06563c02782f671347d4d88baf2bf175ac738aaf76933f5a405e5d5a60f3ef7b18cdd1256e7fee8e5b52824963e392295bbfff41f69e879703e8a1cffaaf024284f57a3c883e0c068dc33d81b09ab5ecebf4bb4533ce963b305397954fabe914db143eda6d96c349612077d3aa70153be87eb0319ce9c87a87e406f85ede4826d1954564ff28e11ad47c2f865f3fdbf41a4d44a963ae554f998d136eff6e3caa559aa17e94b6e9b16d252000cd0368a477c6782a293c16ae32d0d3a57cea2803fbf63fed7e0180144a1b998de8aeb4cbba6f7d1e39b2d66f173a7ca7c33ae334759dce86374f10edcbac170c54ee7a54b86559b424f8b0d29217c853a37c9bb30bd844e94bc7afedb97e3b2e541825e3da167949b5ae483fcab1bb9397e09041f73aa10ec9521964ca71c15c61c116d5e6bc8dfa5feaff3fc8d368e0e775b0090285f21dc7634162dd38db417291bf4dd6540122b44e775ee06d17a3fb1d0fe7a85d2e66bcf4112be5811e45080b22df6e92bf12eb2719789e79634f09939708ec721059e958b70dc594af2a80cc78f289c357e58b8ed8b6b49f65516dd12879546da5f564a7d553b6199dff2c187ebf8416b5a4cb7070ac7ec22c30b8b1dfa5a73a17aca75ef847b48733368e18a0431fed286ad2ee2f10c60c9e2a15b02e3ddb624227828e26302ba113c90d55f2432057b2876dde730961cfa72cd27be614a06dee5a06642b965e1bc84a207d467d7aeceafa4938a22878ef48be2c9d0f3ce6ff8a8628b403ca06635ed25332daae7d13f26cbc3d53ee0ed7b3eb61745293e75a2856816756fc460b8cbf93dcdb584544cf0f9d7e2490e0ac2f3ffdb7966adf469f0951ca4f7da392246948c9af67c42b60265e68071a20b70fb127eb78a77beee495d5920e10f624a1bf440dad3b0d5928372bbde521bedef1ec6fbf9b52fee989ac2de3ebcec0bd4c16245dc7a469f013cbe1173fcd30af6073d2bff2ac03ed7a85b34e32bdc332d4ff0d3d9c0ac0d12ff0aa338797e","title":"215. 数组中的第 K 个最大元素","link":"https://leetcode-cn.com/problems/kth-largest-element-in-an-array/","question_id":215},"86":{"day":86,"pres":["堆"],"tags":["堆"],"whys":null,"difficulty":"- 简单","description":"```java\n有一堆石头,每块石头的重量都是正整数。\n\n每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:\n\n如果 x == y,那么两块石头都会被完全粉碎;\n如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。\n最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回 0。\n\n \n\n示例:\n\n输入:[2,7,4,1,8,1]\n输出:1\n解释:\n先选出 7 和 8,得到 1,所以数组转换为 [2,4,1,1,1],\n再选出 2 和 4,得到 2,所以数组转换为 [2,1,1,1],\n接着是 2 和 1,得到 1,所以数组转换为 [1,1,1],\n最后选出 1 和 1,得到 0,最终数组转换为 [1],这就是最后剩下那块石头的重量。\n \n\n提示:\n\n1 <= stones.length <= 30\n1 <= stones[i] <= 1000\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d84c0a525fc6e7d305a79595c2a57b684274efbfd231c09a85de02d51d540e9801b79afd31638e22ca84d2f7afa13b9b1861d3d2a995b6d822d5664d49ec46dbf7e1c42d11bea51a00b3a26505dddff3c8e8f651eeecfb6fd9be09b4d57b650a4c8710075119c614c6af609c6279f8a454f640a2954f148ee30889a2dd5295e5107fced833388c4ae976b213552602d7615284c61e5e503659dcd726deca36d4d56761f07608c11e94861f63613528b7a2ad8d21bc4ace54b68f74a742d997eb744145498e64b7ae9b5095e10a7d2ccde56cccedd0d72ffd660727c4e5ac48ab43f0a2eafe78fa246a1b5c2c96220990e5e611ab35f8cab90981df6ceaf115169a56fed73c5550f0fa8074ece3e5d23d38d778be7c82fce6541a97aaca66d46f7c9195903b4ac16b4f81fcc40fd6a59e0d71a67084ad9e46499b0f700f7fca090e8cb92b41fb24383b45f5371c581d2dc75b59b7bf4605b4e3f534d827a90c5e61ba3452f322542b94b80af87097aba3b445578d6c37851c37228ed4860a3409297e2871cda842e78e7f75a5753fda810154c5be705858e0f72c7e5b004e1c38ce6e131eb642d3278b55862a1a58f1699c5ed2ba56356a03d727a66732508ee41a5b0e9cee19f34e1f5240660d844e17537c65d8c36e2ecc8fc781b43cc92cec236237cbc535bd7ed59fdc874ddc57c286476a66deb368564f2b0e2dd16069bc0ceea3874c9770de1cabdd3b3c65a5f79b8d488d9bb472e4e5139673eb98724633b5ae92bcad10f7e2206ab742f256405b6bbcfc7dd636d216223df62217c9d1cfd0146a24d94f22423a0bdf053dcd37d7ab090e64c722e35a43db16535a4b3faa99bd2b1bb057db11b49642a3202d064a5ce0eb5d48c731567dc53d7ccd552032ffe6da753bb4d97c8159ad0c755e55f10d41f6a03bbb0f0e23e470b240b7037c44cf5a8db8373f302cbb2678aea0e9c3b2c33a708d5e7c9f13325829a381431505be06f7ac5f41344eb8c3bb1c340d90b4e266eecd8090d092a1da01b97accd52f57d4c017af4d455efd566ac57173ebbd12baa659438d18c7d8d191588e0bfec32a12c6cc8c9f5803f46806a0c837b0c5f4fa4439a6a8d26f33596612debcb9d4a0f2e82abe015a60d2207c2cc6e22e4b9bc99c77b6e08f4f3f8b25a5416203032eceb698ff0e0149977956a7d447b4f37395f71c23e8afb91e64fa94a03fc084af1be029e639adcb2294cb177c8fe2aa797a763e27b88370e51217f80b1b88b724e8770bac7d9b9e6d6f0d7ec75dceb240edb2bd81c73d09d66c79e47f658b2ec1649484736a5377028cbc7b27c2ec84ef68c7a7dd8673aafb39b615de8d16b4aff8db8b98cd121420ad8319bdef48052a68fc08f985a3ba4a27cab8e12af8a75d090c23337f1a8482f1b3d9c0890aa0e7bd7943cfa2c12be6b67dd5ae0c90adb3468b6e804a102204724093cb56b72e74a32ecc92853a6d21202783cc898b8c1c65d21c52ddfe1b7dda0dd46753c6e7ad2b364d4766bda9cdf8e5e9c0825466e932e5ae56f35ffc5e1211538bea921f1e4181c440aa9f453987b539219422ccb1838bf64c597fb4a8f9f50ab3566690c11abe5f09e2ab5c5f47e2573c3198713fdc9b0fb7069f80d10d1270f0c187b4834b8bd158bc7dc01972f32100805c2ff155e08512aa92717ac0a1890b86c6e8a5fcdbadf8b0855ee5d98ba2adc5661a122bcbcb7b01a8a6fd9122e6593975fbde1026c59706d00daee7ff122a6684f3aed6551658d7a354b907ef4bc6881ec2384446b6678ba6e3ba94251e8765a8fac11878e9ce5704814004f203c7405b5133bab489f395d0714f1dbd86617737313a3ad8166143dc4ffaf25e350d978316ff8c2fdfcce85f859e4aef2028404dc17ee5ff00339a9b2cac68bdc104b972db1c4c954dd91a126d2f93a37967ccd6d6c9f79458e4eacc4d35514844e22f2eb88a9f753e13ee122ed5c9cf74361d7d9edbd953923eafb74aa69b229800c232598f2986f79d3408a9c8a78c1e48f71bbef508b08c8c808e9c4a57d6f8c16657864fa2bdfbc5708da4baf759f151b70ac221e8f9388bda98928565b9cc9ecc7eb2f011d4ba9d8100281079ef197bc2d3f7b0886654481ce9f58ea029c364c399a8c6cf213b26db73603148e2c0ae54bcec3502ab6e24799492add65f8b2e4bd2eb982d2fc4fa870f091296777fe28784f372f3b651f6ca01fdb9eb593158556a9f519d9b1b89de2f3a9297a65cb86627d32e116716cacbf7780b202e7a491983f881895b34cd5dde6396d3ceaf635117d9fe0e4ed94d36353ec7a4eb892433a9ccb44d663ccc8c2d32605a11c8f798e638f7840e73e8108f1efba07d915f718bb63bea604a4aca64218668a79e50a70763ed144b3051ab5d08947a96bf3fffec73ba9c86711859653440e1dfa6bfc6b24fbc0b5ba9c2ad71d31b1c9382c2ccc1aca7f6bdbfcd69b51334fcf54aab96b2534b6959382c940b2e023aa5fd15662576ce88a69c61891951930b8c535e2782534ca99812bc29049c4bdb276d65b91e214c48daa37a73972efd8b4e6186a87847f1182291f4998f2039a1273159585e068eb091bbe77453bcf79fe89a7eb32659493ad1ce9736e80ee8a3759ab05f25f2dbef3176e64d07b26e266b5237d2335021e0f1cae60325f23f3ea7dffd3ccb4bf8f3ea491b9e1fdfa4669bbd796cdae7ba108510ea07f57ca2b4316b7aced06c5fa5b6a54b4edae6cbadd405a30d09b72535aa61942d82b0e40033b0a51ba84a1f075f92b34c58db6364a7621752246da45caa02560ba86fcf700d67f13d1a6e08c9c9498055075d4cf734178969d7db129ee1f64bd44364b699d8b8fc0e975c6e62d8c3fdd00ca68e917d43e2d23540b96bfbbb1ca4c8a53d6d637d3f37777614dee60ffe756f5490602cf7e9f582487c48bc52d3f40c0b00426519a59d8ebbefccdae6f7f6e225c67cdede390fd6e23824bde032be3fca5a30a6e85e6d48fd0b0df85c2974f9e2cea54ff0fa2e516720d9cea889d91ec8134869333736e678ea5548d5164ef25a96fbd2fa7866bc9b606d42113dec888349ac2d4c8192e1c9156fd1dc8e57dde2ddf60e7e46db88c7d8fdab9c1fadc83b8a7cd249ba97981c8c3cbf750ce08acdfe31fdea6813555e70f751b1ade254a824c40d3a786ad38fe03eba75ed42bdaf1fce876a3be7f9dd8ff54749fe4388e22b5e6155868171f2fad607a3a6645b436958f5e033f3a4bdb0707427de69af37a16cdbd62b196c615218d6499d8fe618890414163051da524d871dddf7f009710e1c69ebd1ca98a8797c6196c5ae62d75e082b1ccd4c7a202c86b34d2350a868e9f6290e45797250610808e9ba6faba1e18f11a089769ef8f83e850950f12aa9becdf5af6d3750b3065f8ad2d67889471f44f156db1c2e08d810a529d6506cfa729cdd04266db0fae5c12676dd3c91e673e14b447e09963e595aef3c24c2daf61ba61108bf874547e313f1262cf0c60254360535f646e5582976a5185be5aced49e6f7ea8104753012ff3f7443cc7b402b9df3ecea3062e98a1388a831b03641c1e9be7805201fc3fcfab830a6dc032f7312dc4dc2574393551594f3763741da532376b427e5f055f457f11835960e57baadda97697d0ddbb5b12b67eb2d82ecdab98d9cf6686e9a27455663aa6d1ac5920a938c4003bc9849276a689801a9a0b8a0d77961004b4cb721c258b7640de067a65d18f7848f44a743251eb7bfa6520b321405f8376078388edc2f6baa8c7e613cb06e206503333d326f57cdb3d536f3d6c9f83ec2c0acafe056f3e70fa448f1109fc412d419db70de8fb9acda8afa191b262fd0c5176b02d49ff8d245cd5e887eadb9899aa0b9c6c1a488a4773e199dbb0bd85ebe1e97513116e935e36596b1f9dbb2b59acda8e8e0ebf1ef52645c04ebf4854de7110de867c24adc0c2b720e23c95d0549485651d6a6443f5d2811f826c705d689ae029c81dbe6d2f8276fc86e6813a25f62f32bd3446a7f1d57be5de2e26cc09c58fbbf74cebd283ca7ddfe63b5f1966fc6ca173c67d90abfc6e6061498e926511d129b240000f4076024e24f4fbd2d1b68aaac8966868e66c45968f0cf309387b84df2ec2ab623dc144cea47cbd1b43cf9cfcec86fe8c1e6c3870e6717cb408de7cf76c6fc92d5bbdbd5f4c2796aa8684f098c083257a5a567c9c33664388037345140326a2bfcdc8bc06ae73899a59e16d58d27c67aed19f9b6cbf769fa4310f5c3163ef698f63157f0f45c05f48d8be18a1e29be4baed1d02ba20fc3e8034866b64e48304b5fd0c102809a64796810c1b1ab8a1c41d14d84c3c421d5c575c1c68dff4bbce729c44a491e84fde673a9bf3b590f00cb6a196669681abd9b6aefcd9fb8d50b487ebf8022b81","title":"1046.最后一块石头的重量","link":"https://leetcode-cn.com/problems/last-stone-weight/","question_id":1127},"87":{"day":87,"pres":["堆","链表","分而治之"],"tags":["链表"],"whys":null,"difficulty":"- 分治","description":"```java\n给你一个链表数组,每个链表都已经按升序排列。\n\n请你将所有链表合并到一个升序链表中,返回合并后的链表。\n\n \n\n示例 1:\n\n输入:lists = [[1,4,5],[1,3,4],[2,6]]\n输出:[1,1,2,3,4,4,5,6]\n解释:链表数组如下:\n[\n 1->4->5,\n 1->3->4,\n 2->6\n]\n将它们合并到一个有序链表中得到。\n1->1->2->3->4->4->5->6\n示例 2:\n\n输入:lists = []\n输出:[]\n示例 3:\n\n输入:lists = [[]]\n输出:[]\n \n\n提示:\n\nk == lists.length\n0 <= k <= 10^4\n0 <= lists[i].length <= 500\n-10^4 <= lists[i][j] <= 10^4\nlists[i] 按 升序 排列\nlists[i].length 的总和不超过 10^4\n```","content":"096221c37c5f85fac03c87f9e42ff6164f9a3341809041ac4f074a7e2f1d4e6f309a0eefe389a13a7c55a83e810921b257a1dd1c11f3fc5647c87fd16a6c01ed76de97e378074213eb49a8e6cadddbbfd063b058fecb41debd4afb46266bc6e71a618f809b6b1ef4ef5b6d32ea54205bf8049f435109b080f7254a0c88279f5ca6d63f4d325521e4c86c2883209934e4eeb8cfe94e6a4558baa71e12a191ab535b3b7c13074c61a0b190bb6e12d0d78acc2b1a15f0d9faaa74d122b7be7e84e3cf5890778d8b5ec5271cb9ea02e9fbb86af458a796af066f86bd7a5ca2bd9d09186bb81be8a04ca9fc042df8bef66b7fc88fb1210837aa88457ab16b6b0d40f5d00fd996e4ec60c4026f177ed93c065f9183806eb707fe1a9792b31ce5cc45f7373caedd5ec2bac846aa53142ef7297c82ca182d9ddb72cba570067212c371fe484ae0c3286e3d46d9d76295bede0fc9e7a0a4d4c9b18613bd7e8e8b505e4ad282c7f476a2b774f26a557a275475ad9f26afa12bd31834495b4cd43eb1f6de1510e62f24044681ab501ca7484e5fe6479eddb896dabd11e382e9d38c6b27c2eaf0b2371f7572ef3da907f68f562616dc6f1b336c61e17fd198ab9463c6d86a335cd94275249c7fd6f2f6647e2c046d7e53ee9e7d1b550b543ce24547edbae709d06dea9d56daca4de9a487390d4e5c96c2fba870ceec67d5ff4ba85b9b997d919d5faad8ce0faa78955cca5b6b585ef4a506165847edc76ba687690e256a7144f65f2e5797bab9c0756f0a92b5bf93111b7269523bdb6c96e863223044d2605d78745fc0a1938ff63a31301d75ea2c4c62f279faa3903dfa427d94fe3118c99b4465b6da187f78017f313e8ea3fa635df3ba797fcde6c236827c88074859351f1e32ca6c5ae042132ee0ab9e625ed9d9d4692325ec7b198b194d81fb1686d508da860b0a52fc0530c1d2faa3694153e81bc1e350f64c6f1f6bcb0abcc59a4486ea399a00398c42b8d5e7bad6ad4992ff9648426c247aebfe5945c8f80700ec5f55e11f8a9cdbff0d7bdd95bef3854bde36060afc76c6dcbfa9546a80702dea44bd82c8766b9a75e55eeb427ed958a3b8545700059f12f9947e0f5721f99848ffe479c7fab1f16aaa5fdf19e27a8e27e9ab62125fd6c3e10e6d5ed31a678260454149386193bdb3ef7a581411230bcb24cff3da88992561bb72dfba1849c125a0ccd3a6f18a80ed14941bea94948ed3024b5720a5897859827bfc23f6b22549bf4aeffc32b85f3fc50de32937d31e1bf9482fc6fd441606e95f5675bae7d0fcecc575fbe0270cd4c96f93b67dd902e2ccd00260943095dd8dd48271ef2971e953b24a12c756d08c6d4f1decacae99b3a5d1ad8b7b26a4a0d2d8af4ffb0c1eb34d96b6afa01ed8ac99ff8d377181e126aac84e9ad9cf35457e84f367279af27665a8899fb90978f19f3dd90ed70beb65e85b266e5c810b18e0d842cc34b399772fba59c8d8e5672eecef0d50a5d615034e3cdf8eb9f3e75750fe0b06721f67e8ec2ce9631449a2c576bd134782fde61d800061527aff4459498c0f038eabd674b2b2b78808f3c03c1f4728aaf16b9a79619518622fd63239be6803445af3d8a338fb201a0a3145c3c6b9f309d198e41478508f78897cafddf484691b8f1a468d3554570e193d33d2ef1ae1b4d466245b76a2b807f5ef1467135d16b12717b700c23b21f9a970d512451e5bf7de29afdab01ceb90d122c03c3d6f35ba1da33d93f79a2e518d7b719eaaf0efbbac59ae54b1cc14e18a968f054e0ad57b6b318f02bca0e6634b8186665484cd02a5bac3246394294b0643409ed3f0f519260c7e343b772105f54b0ce823b54f270942a9dcb10a172f2e2cc4f3b32f6422ae9c8063b27fa720353a80c3a6a5e2e5844eadf0e364f52cb76cfd3c96027acfb385a29b8a7c62c77d8eba855cb6ec9748aae8517c9e198a5301c56b3fe144fc99f11765823565fab3d1bc8d17d7578b208636859e365fbbb6efdae90d4882ce14f653e462ba5f4412315b26b3f03b99463dca3ad9b2f548daba4ae46dc25beb5864a86b6849dbc87a70f124c2905a13fd4fb5735ae6def765a61488a589a5a28f0e605498f7ecc9c22f211b4692fe10138901bbdc7835803c691c865858483b43d0725e20dac6ee5b4b11ec7fdd4fd6573a73d32254bd6baaa04baf312d9b08cf40b35f94dfe1c2a1164a529ccf0fb78a9f5f26639e515510741256223e3fe519adcd8155926fb76ea72aa8caa8d1a6ebc27944369e970c2d108b714809e0851edfb2910b212f983e901494ad8e8fc255f2fe4fa1c15a5260e08acf9af6d030f04b94fcfbea7074c9f12aa95ea4a4d6a590cf2ed57f7fbe4d580772816ab27581e1d25adc578921f303adce578aecc7437d0f8110b02a2c2a25b217836d4799add769d71ec799a8cd58f0d42645b6eb0a486e61cd01ae684ea3e5fee6af69bc2f52e8c6559a9e0450c0091ef79f9f85186d66a434b4f12e115cf0bdc72c4b88f9fd6fd96eae00762e33f3cd04f948e7ba685299bd45cf276934bbdab75eb98c309d9bd3fc5e72b8e1d35fcaf634c193f9016934229bcb87866911bd3d144d8257de6439fddf783a2595896c15edf893d6f34bfee081eb37779483ad14f9e8bb758aa02c33c14fb3096cc4e519637ec07b39e479b4197b283e02086064e92559333af5fc62befc85aea5b571ac9591c88ee24074aaf3da84b219df001840f4042aca785e1ff9e1f24696f5224049a9ede039f69140763e999869495aac665bd8300c0822754309fdd1fac475a97a34d88df8731d765127394cdc59ccb7547baa9ff5f034f4774bdda6b9859c99ea4c5a21b7806f0d63eef22eb134ee5131f1086b2e119d83c68ebd758fe671c33e8947cd63ee1eb73e3023441096f6bbadca00c350d38b76d9f07c623d4cfc7b9cc65dfc630602cf7e9f0f6cce88cec5253d549de3507c59d7029fb0d7ab90cb2677105b543588beef90b12770d618a50318bee7d789176ed5b7dadf9ffcc1c89fd937d02cb811ac1488e516720dc189ecc991b58179d3812e347d28aea00fd024018160a922f87de0c31f9ef96a9d3b018dc8bc7dd796e38e776b1cdd47f11da4ac2e8a439024a2e421fad4739bb6d584a8d4dbb8aacd7ddbf4538984d2cbea4dce46a4b9851f82fa817947e7123a5e00de3b488b3611ddf4cff77df60aebba43d4689fbaa9ea69ada22bd88eea5d3ad0a8649517b5aa07582f3d0e14f60a10104c35ed62ddc0107c760a50f10d8c9bc78af1f87f1ed8a50cf2c7870837da17baddf861af904b1e411514a924c879cbdf2e418205d9d799b6189ad4e4fa8e4d6409a36133ecd5aad1d7cce7599e7a589a7b5eb3929d7aedeb519a771459cfc781c2aff65211f14122bd21ef9283935dc65b5de4deecd053a4db6a4e717dfce16435888b37b5571172c5e8bba7ab0a529d650687e2689d814c2e9e4efe15127f2ede88710c7a1afa02b8cd63f8c2aaab95232de324f4695882f86a546f2b151262cf4071255e601f4e6a2051d6c3337b98be128b95ce3e70e05506030c60e6b35f70cbef60d69e6e9fad4e6bd9f168c5d3134b6d361edda6cb1749b97e8ba5cd4f7cd232ab3160cbc74d6e133551594f3763741da532376b427e1317171d3e0dc05966e562ae96d625dfd895b75b53b673b29a27ba81b2d9cf6686e9a22610326ff49fea15239760fc41368f99da30a28e9617df5ae4291393081085cb186f25e839049b1c0d65bbcf3802a760227303ad76f0733c85344b1f88441a9ecfb896bab6a880ae5dc607e7051e2c3bcc63ba289e2248744c469f83af634499aa577a3b25b50ac10013ac22225cb5b15f8da9d399f183de89cd67b5456076b32e0cb01992cd50347c7d15340562ecb8684c4603db899ffcd5b5aec6aaec825f505d2f905c386f6a029daa3753ead88da628bf4da1695bd005e82b17de4073a7d2123ca1cc8ebf65b82b81b56b948c74466b0814a697e6509d030b2068d6ea35d21de36d35a841fcd6b78f7e60a77a07ba3801fcc38372c6c22421c041f0c495b808a496c6d43ec1fd2d5e5c24e171ef66c073a4bce474777d58dfea4b56d43ee7115a4e583e0c3373ccf2d2dca8c3a0d9907f29b46c0a9fc345d75f79378dc40492fa6c788f159be145b14015f9d1b4a9c7b8c0556b592e8d357ca908cd13a06c5eaa7e0f81b74f5c7dc8a3cdfffed193e6682a0e0f18dc602d2dd7472c45101765b6fa819dbf12a03ee8a41af5243bb72e2efa889de677956dcbdc714770521ab10d05a3fdb9faa24481d41d5af7340878e79ac737c621a43b8113f102ffa0354fc208258dc9f609a33492e5735a56773c52d4a34c89b8efdbe1f59986ee1068019b48d17fadd0e067912642b9b6f0163d9f643c28a3122c6d64146b66087c58a6f5e8eb975a7aee936ff34864e8a25e989f3072bcb2a9aaaf99f01b7cf385a33142356fdb9dec393c663fd63a85cf8262ff4f60be54f4b17f6f667c9a60c4a5bb20dfdd4ba0eb99e8aeef0aef7dc871895095498b40d3f890b0f9f8ba217648ba05635c4ffd142e538de985bb05d04c8f39642b509bc7261a741a6db2d3b133c9a4b73ffb0099f2be567f292d648d9d701486455c2a804af69b056adbc999ea24d1a658d0fe1c85ac3a29d18e3c62c13fbdac36aa56f58396f387745f76688aa66a83fb0c3ccf8716b267a54d4f112677ec8fa11252ddf598442eb8528abffa8b6ed99b7c976ecc58d66c96a270d90e789cbd18e0d02d24a90fda2b0df76fc1eb5e4f547018f61a4161d30252be81da87a9bd7d65a7a87fd426ba1f49a62a31665952801dd1be8d63a4b077c3e1603d2fa1ae438c5a84e693a90e248d16bdaa3b8843c0c9a1a3e7690caf5f1142eb2f50175a3cfe50f0f3e625bf9d715fbcc5a1bcf89dc8a2a600beb496875274d7ade1141a9826457634d0bb60987532c17a659eb8bd217769bae8fa05cf950e05aead0e9682f29da0b6df731510d156e05f4abd961b8988420c0d0d756ee47d71e0cc94f507cd8dfb16a971614537b2da7d86101acd24b1f278e8c0d61cfba3f04237482ab97c2a7b063c621d1d893a1bf909dc60320519b5d79ef55316e8fa9313b68a8e0545cb603134b3e60d75e93329364f4e152a2920035d6876de28e2c04f52b340c4ab068896989bd4c00b36df0b0f5cd8e3eb552a0c76cf841b50f88063e369788193ce49a82ff0d145527a179d027a24d52d8f84ea2ffc55488333c9a8abaef1b6","title":"23.合并 K 个排序链表","link":"https://leetcode-cn.com/problems/merge-k-sorted-lists/","question_id":23},"88":{"day":88,"pres":["排序算法","堆","哈希表"],"tags":["链表","堆"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个字符串,请将字符串里的字符按照出现的频率降序排列。\n\n示例 1:\n\n输入:\n\"tree\"\n\n输出:\n\"eert\"\n\n解释:\n'e'出现两次,'r'和't'都只出现一次。\n因此'e'必须出现在'r'和't'之前。此外,\"eetr\"也是一个有效的答案。\n示例 2:\n\n输入:\n\"cccaaa\"\n\n输出:\n\"cccaaa\"\n\n解释:\n'c'和'a'都出现三次。此外,\"aaaccc\"也是有效的答案。\n注意\"cacaca\"是不正确的,因为相同的字母必须放在一起。\n示例 3:\n\n输入:\n\"Aabb\"\n\n输出:\n\"bbAa\"\n\n解释:\n此外,\"bbaA\"也是一个有效的答案,但\"Aabb\"是不正确的。\n注意'A'和'a'被认为是两种不同的字符。\n```","content":"096221c37c5f85fac03c87f9e42ff6164f9a3341809041ac4f0b4a4822046a6411b00ec8e04d3a5f386bef76b785c31ffbaefc191debdfbbf06c7fee56809762b37ee39f45511b3563498fe50d4590f8fa0d17ecd7e24c17f641a2352926505ddcdf2f86bd5dcf7b787181bf73572573fb1bb3aef78c7627a4605c5bfa2beb2798b444434f0c135914fe4419a214f926be80d522d9acc6b35c21cbf92d2f76d5d4f0fcc2a13619a7a788ae705bd08b89db3a4315f7dcede674cb69a6a23ec9ea9051807e999348842900e4ee08a9fdf077ef59fcf9c10820cf27acb76a2c39ccb4c4b906c04ddd677aeba8f7badf84db320b69cb8df961670f56cf2370491cffbf57edd4a2c83b9c25225c7c8e771b3fc68de50f946f8026d8d6b745a1cb0b923d66cecd09a2bba02e963d6b27996e57eaa21156e1de0092aa1482ea1fe451f975680f79492c0e2281c0cb4d176aed80f1d6d1d989323ad441bc0f56f2b0f890d9d99614a2029743b1d8a9fb92c70a983d80a013cdc7a5f0dbfbb95cb2a7b5357ab911464174d0ff7d9336ef29c760a24af05bf2c3e27af7ec4e5884590d2c5898ea085b1357828bd6f03f1a8ff1118468a5d7d8a474e801423d28dc5a0edaaf26873ea29a2605ffdffa63662c0a5a726ff623e1938183f0ff6de551a4ebbf4edebf0e0858e5c640d6ae8c3d3d4153a1cccf8871c1d867c3ef48af519ca17474c6611a677aa4aa7b8268f49eebfe977b201c2d571abd8934f3ca41240fb0e2e925d2c96778285c46b88d8f483b50097159683630395182090ba07f082e69889f2b780bb698c1c9d06e6d25712dd1682752931fd50d44b4529cec26ee7d479bd51932b90095cda0acfde9940da2cb515ed7b5bee0b6bcf9b46b14b49e4b6f38162627846648f7505072e2165bc752dfc7d7433a2df14fa54c974599cd17a3fecc51d3500be0137d02b5adfbe32b6a2f2bff5728a63fd0f4a2a428b22a85c06fe38536c25f23551555b3fd5462c0e6312238f8456e2d9564304372d7990a0bfd092cc59b5161590cdf4be797e0ace441dc0031c26ae5716f3fa37eb010f4a427a1264d1f3d54d678c112688f891ffc317cd9e7d4b718c55543acbae3fb4370c62104ec3d1b03168c13c26506832adc1bff4796d4c81a3d5cca939994380938012b462e880800f3dbf910f7c23caaf03477dd8f5b771ca1aa71f11368de36f445fee88fe4eee2dcd87cec2188e6afec5ea49ca5b24c699a33e811bf0adc748fe4bd7eccfc10b3500fe6ef46821d3c93bd15eb9dcad4751909d6b3c8c0554276f1cccf99647b2626d726dd3c7dfc97887507448d8c0861dccbf192a2144a780ff32bd95f45af5c9ad372cdf276396901f1c1f4efda48a54bffc28bda6dbf4518e432afcbf58b46a682df8f98413bb7af7f8bbb11bb96b133080897ab2f38f597720cf688fcc01336ac816a840da068f328aa6c4f1d55d65d02a79b5a8c5dbcfa223237b4765ae6621fefe4145cbcfe1d25503cd383b9c5f398d76ce46c65602fc08572d53f5f6dd08f4cda6c66da9cdf49e10c0b1b6ba8377109d5066cec968c01bbe1d19c4b9cd17c435564c1f306c54f30d4330879d3595c85d4efe1eaf0f48b39d0021a343048ecd5b8c329dd8ec5166f758e45957db9dcf4b24b19851646b3395c6532190d12d3c1220e097c65116474b58d07f5c5175725593a95c89a27cdaa1d7f859e039d092f6457858b0ace6432f35be5b716956b093b658562f317f0ad985a1bb812d7126c8df0dbd65e1cfa2ba749dbe2fd9268392fa7337e72dd29c0d2c3072788dd0263c978936e386ce228bb62122527f322d1c2e81b01377e3c14741d0bf54b1a5ed464c0d5e797f1dbd8a0fdaae0cdcff7958aa2c2411353fd72b720f19dfc5e092d7c81bf86eb43280ee21dfa25981bb51ed8f12c7913014700999a57ac61311bff7156338f513ed2f84c824dba9b1c89ba1086775029d8824fbca3507b1d1d45c52fc32d924e8d0008d0a16434451350898d2d41d06d9268af5098f7826e6904ffbf7cf24f390fbe323b1aea5c68cc6e836022db7f646dfbce49b0c8bee87bed714adbd121f34c9f27ae86b665ef9247310b605048d180913f4a206f70e9bf85a40c5dd5aa01ce27750479ccaac6b743ac8d1a3947d87adcd5395770bdd8ee05e47fe41df5e8f313a9dd6c802d419caf2768d95c97f308805f7d2a4252d6dd817ff876e51a47e5c9c93896dc8ab3a8f2e4dbec73b909021ffb7ef917a93c8261793619612c54e0b0ff0e50c4fbe04d898c803602f04514bb212b2550a12bdd2c3bd10c27cc3f70fa2e59f99daa706552283349a6fa41be8479028ee21d57be56994b4e2d230c7c82079cfa2785d2f399816aa499132e56823bd067ef1cef6e4b9f5c291caaf9fa799f6dffe8e8a4578b2fa9df4d3c0da15bed6f2f6509de223fe1927f6ac781ed9a1e9f4683d96a5f482b6be65cda9721609a5d0be6df57ccae5b5a1203b1b7ba70f07678fdfcda2a46528edb29382cec28b23a8dc3a8e53046f81adc5917adbb462cf231a1b3e6131f4a841a26fc1c373a5cfc5892e2d05f0e2bf8541350620d6321d1cb5c30e0cc2ec1d0c922cb4c8016f2ce6dbdb135b8461ca6b3d0bda50ad4a3cdaa642494f0e258eff3a77490e52517bb1ae7013f9af3136e65e22f5de423ec7777232e4c116064a027770b1cf4cc74f0d199b1a5d36de693a2f4dccf5d2fb7a9df84f93af50b1851fd1f00e0781759f9e9be0fc5cd381300a880ef3cb4b80e7e30c0c843524fad2954c93b19506a1c1040b886b6bc6bb77a7891deac7300761f623c09e95eccb80d59b680edf700d6340488e8edc0ce97c34b5d2780bc6e1c6bb5be669b03ee1f64bd4470043bfecc8ac2f836dbaf78c23f871ccb7fee16b2777e77580bd8faecb1a903c753c68a39c1fa60390445b775b08302a7101a61873fcd4e2f9acd9cc925065f9aa60a39468c4ed0fca3a7f58d6f2444085c67cdede390fd6e43ed1d9b1837feb8b889176ed5b7dadf9ffc938dcb8c35cb6ea61dbc0febab42724ed3ee9688c3f08944c7936c18707c90b040e7020f9764ea3bf87dab860287e243932d07c0c09f2588c2e080632079df02af44d486359f7f9e23b3a13fe4dd1a8ec8bac3ed86c5b8e5df7492e979abc8c3cbf750ce08f1f5c91fdea6813555b54a730b1cc5774b90125698a0b9b631a34fe3b343d93a95fff2ff62f9987b94c6b2557d9ece289508b5e61558353d4205ed7d10104c35ed62ddc0104d36422eb542c8dec7ccb0b33a25c9b601bc9de5133bc15393c6ab67848c0f46494b58f224ef60c9967d06a611dbde95b60bd6c6d5faa44d6409a36133ec82a4d7c989ef3c933b56fe280aaf9ecd55a5ac05db78521c9cd681e5b4ee5b5fb448169764a1c6d1ca5ddc5b11ad8db8903fa4d3265f7f2bbdad642988c763f453503685a6b48dc80a4f9d751d87ab6881810960ca1ca71b137b31ed8178187b1cbd5ce0d068eecbccba8e092de324f4695882f86a546f2b1540279c02217513251d1b6c2b5adac5715fdffb46e0d0973679e94e2c295160a3ff0c35cbb418b9ca3bcde34e399ca266919c601f3f7f50dcef89492bfc3fcfabde2079ac18f6716cf3f6041e633532160b72ace8a78f18772b023d0f553d437200810428d375b6d8a86c909695ec7103e331fed364fd8198d9cf66d5bdf06f5e756fb2cde9053d9766fa5901c0d68e7eb0918116d45ca07454d60b6e9ee1186f25e83904ce521f1dd58a6a47e31f6f3253f774f37726cc75465f921f42879fbebcf6a7a881b35d8852e2074a3377c53cfd66d66e476f3548d3c6e12410d1a20c244570e744c1545efc2c2a56bfe54ce6fc87d6f1d8b79ce73df556435ceb070fb0df245496a7c9b98f98cab314a96a527ac74c3b9fd695f5ee8cebbac32839116ec30f381c254e9ebb3d48eb8acadc43f61fbd2a43c415a8621d907824ea862a36a692a4f220ea6cc4de07dd996f47636c1ca097c71fdf0f245d729aee368f4eb1476e826bfcd6b78f7e60a77a77be340da0cf9a7bfbd62231fa1fddce8de42fbfdb98e03e90a8680b1924fc2c8b239773d4eead3b256743d4cf1645c438f54d17015d61083a33dead9792b886a28c962064f8177a97cc18975a6c7bd49e67c0e62f30ce4797e160b6475f9798b1e0c7bdce507d656b9c3035e614c01eb63e3ee36415bbe60b1f37d1aa8dfffed193e6682a0e0f7495337911dd573c170a5269e8a9d9deb61daf7b9ee119bf6c54de6160be93b7e677952b848e714f411252cf634ae7b8b9b2e705969a4f5ff0205c79abe4dc1dc621a43b8113f102b9ef2e09ca41389cc7b20fd96adaa726584f336b52cea31accfbe6dbbadf9986ee106801ca1d942ae8dee96e856318f8b0e1573096621612b812656d78142533122f11a3bbe3ea965005abc62afd01378def0eccc6387bb5b2f2d2c0cdfe4b29a0cddc73037624d3b2ed63732270927f858cd730ad4f7dbe05fcde2a2a682cd52c88adef11f5f74ba0eb99e8aebd4fbb289a3fc044d015d33f81aa9efee18ab33a5d7ffa0b763a29fe34ebd7202f3819c04aca4a91c2edee2bcd7d651b87a622989971486e25b923e50c7076d7bff7e2ca3778ecb8822e58ee18d033359ea3282111379d586f8640668b435aff51a99816a476a9741ba26fd258452b5116ab94e9f42da251ced85759cd8d098d758b674211e1fe764616dbbd59585ef98c7dc80c222365fc3041ba7faa41b30cec4d49b10bf124a7ae59e9d4070efe2f4f9ef67e977ddb5e4f91320dbf6253228c2b18d2bc99fc9709b0e11d649e42a72dee862d43404d112ca7469d92c3da687129ddae191542faa41cec76efa7acf796f54f5196edbf1040edf0a788da86a2019aac26982c104b73424ed6fdfe205aabfe1d4ac19c81d45e3b0f3905c6f495eeff6d3e641127e6e203b10307337a13f7e22d02a41640fbf7b1701443d9b0cb679ba66e41bdd05d9de8ba84c9ead8e8c0ca5d5ce6404781bf15a3864005100c6142e46f63e2cd93f323c283e618aa53684908a21b851fdea26df31c45b368757abb176a3ee9197feb73e392a0e7baaff1d37184c56ccffc217e500b2e1d045ec188e3fe9f10a3a98f1a55c67b09f55c484c19bc21b1d4cfe7b2a1c6a0b45f6456d52cca0bbcf61dac6803d3221c6b757a6cacdb614c43639491ff3684b2be72e37643b9fb779cc7d545129e36bc4c9dd02e0860943a9ee3e24dab470bb66ada3c1ca68c6e216c625a2a34d2a28c3ae00b112d00f6ac815441cec91fa36754532c0a4b0e271300e188c8a6927df4424efe10ccfe0a3fa292cf5bd067616d2010c94f5907f1942dcf42e5ef9e38c0fc2e6c33da547574ef4cf3ac434762ad211098f4550f99200fe84e19b3e6c63120e281b0937533b19a39dadd3c8ba56d94902aee27c59175d3d2035cf83af427128a310774962bf9f0b1af218c84cbc6ef6e8c290f63b26c7117e460ffa6998983299c380c58a7ecd8c29fe1bc305f0e245dbd16cbff2e6c62749a7301066e9aa027d975c2973c584893bb4eab8bf453e0608140206530775a948817c5b481e5d416190008f89f7568a228109a8338a395b07e27ab5b7a9aaeb2d4d729d5cb41b888677af0875f841aff2c9f4cd38e993c1223775c787bc521a5a13c4baa4b5522bc5526374d9457f9c5d69ee8de6fc9af589552edd3067325a1c4f0d02d48093441c01abfddc834494646780b01fdba0b39d2db10b689ab192c719f5b0a72f8bc799ea6dd095e1efb2edf1ddd15b0bf43609cb2b4970d618edda096811c17e59ff6df72cc3c0856aba611d09ebade0afc072749b6865c55202453d0bec7c97db30386a86ee437753e77c2b5c69f250313205c7f3c009fae34c2442799455dd62624688359537155f65b1d9aaebdce6b1965106a6c166d080cca832ebfa8bf730969d6e065880e4710269391ade18006aa6096bdc2548d6d1d7dd619264520ed0cd849c71146831e28d10697d444782224d4946c9d79e06c27f53f2da02c9305c48310c4235359637f79297525bd50bd12c35ac26e783c7c8f394bcb4a0d8a13b58fed756f50a1db95e49ce24afb6da0dae337ce219e27ab1474297de9b88b80966f8d5bcfde53c30306f9af61dc4288a9f03e77433bf11e1010f47012f80ba9860c94164da67ea2974f5829a3cbc9e3a73424f0c16ee46399cb987428bbc2bb7e0446b9b1dbe276eabffa4951c37b06031c45fc686284b71bf401ca1dcb4eaf50b4724be01f55a4f8acb8fc84a01ff5cc58d6f9668051ab4910ef920bd746342d9103d507e1400533982c43ee2f46532c4d4b2766a1267037b094abcc8c79a34a51bf06c937287431e72f694637cb179ab0673d63610b04c796543b588c025170d6e620a43c9763104844d85f4b1939b2c95c3b5529edb2b2de6df5b81b2fb91e87008fa24d3a1afb3bb515cfc3c7a97a53ad89351ef0296dc109e32e7a21405d55855c28e64e52e807f381dcd32780081042c38fb681632cff7123bb1377540eb31b5967ed8960cd77cc249ffd2b1dc7076305fe6853c8a21479100da80e792c199b416e6570fe2cdfb93ac88193d3c2ebfe2a7db8c4c9e97e5622aac86d6805c33cf5edfcd92d801ac43197e94b","title":"451 根据字符出现频率排序","link":"https://leetcode-cn.com/problems/sort-characters-by-frequency/comments/"},"89":{"day":89,"pres":["二分查找","堆"],"tags":null,"whys":null,"difficulty":null,"description":"```\n给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。\n请注意,它是排序后的第 k 小元素,而不是第 k 个不同的元素。\n\n \n\n示例:\n\nmatrix = [\n [ 1, 5, 9],\n [10, 11, 13],\n [12, 13, 15]\n],\nk = 8,\n\n返回 13。\n \n\n提示:\n你可以假设 k 的值永远是有效的,1 ≤ k ≤ n2 。\n\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d84c3b1093584ce3c64605a7e2355b8822559eafe011808b071ec3141d560c88a224daded3538f60ea9442272fd1cbb8ab91e0a3676cde4476b5f1bb393b10bbc024d4a8f7ed6d34f8da4e3254fa1a534c7e4494babd4d14f2cfd8986fdf82aadace1a5743fb76e4a5ef731d727ba9f8286fd0c19591cd849f62dff6ae66edae5079eb4d7a65b788bb2246770cf99fcf7caa32505e6a68ba632588d9784c52b0305b0d6ebef3acc61b5bd7fcee0c91a97778d8b48843e54a2e34aa5bde676e95eb697e646629bbc6757a2bd9d09186bb81be8a04ca9fc042df8bef66b7fc88fb1418efa52670c5bcc3756491ce7924b0f1c755fb0ee03206e4280430834c2b3e90dae6ca20fdbd4af4aace1088c3867e4e509ad96a225a53d4503955141eba01f5af5d40092aa1482ea1fd649f54966e3fa106d3c76d8d44295b5d503d0e2a298f00c63101385418da9545f77fb80fed37098ba97897b0a3d3c182b84ff759fc571e97e494f113ad249edfab4600e8f523a693293efd1df642d7cda0900bd3006d191bb79b5894506db5a5b504fffa008da9bf7e439998f2771c7c5ba06d5c48dd8ce32e74426074d58e029e60d0b12bdfdec14a9644484d0e7a4e2a3e3860ce571173f2d4630f13253f0a2eb1cc97797b7872045ae4e0e48dea697e3081b6b2cb66a6fdd42718e2ef92410c45201f493afe41ebf14b23fd27c3e4d4fdebd0a2d7f91617eb00935431f36bbdcf8ca97d35778ecb0b53c4854c6a5c0097d436b3a381c8f338b8d061d720cf0c9d3e21c2cd7fafb92b86e317547579b516b348d709e3c29f75ef7bf16402d06183fde71f0c4cedbe2143c3dca24a7de5bb34751392d28507b1fa871bf194a613e173d0d4eaaaf9e3b1e33244a4f8d3ee1acae4b7f43eeeb6ff6f60aa34bf81b7d080cec1b75d74ee7847f17969e39144e08789fb7cb53cfa7ea9f9c7a96c889408be7017fb680f43f5497da586be4cc08feaa4c4a540897753d9cdc5231cadf7a8ba02afc4016072e8dd64e50047d4a9c72ecac9c24d12c0d111492cb3fb5fb2517829dfc78589477a0d4348cf079df7902e581a5bf578e5e2ef2858d8969d82b682d8c7a0b4342bf6e9844a927ca249f6e34e8c98d442c3382b8d7d202464b275021372c0a0bf61d0ef0a2f77e2b42d531c8dadaad97ae9e51f2226bdf2ce24efac08dd8c3e0c9f17dc42089e484ed4bb39cae994a4ca5de12f53a814cb11f5176fd4bff159d5328e9e25ea3f290277a69e1e9b9d71c4d32a7cdd4b1e5e3b39ceaaf20dcb47f39b94bf4542ef1da0af9c1ef068e2556ddd4c892a2148e273ea25fdb1c3fa12befe7197f78b1a2e0c487d08dbfc00e38f5f2e2aad4509f4b3fff319dd1ff877ba5a3c68c9b4a3bb7af7d88bb13908ab1330f0795af271efd946131f582cac01312ac816a8538b668f32fa84c44105afc502c84994ebd5abef524093c59077dac152cafb5182ef5e97d577a7ba294cb9dc4d09363b50b4d3a65d3c922c04316429dc57f8d1159bbffdd0389327f526ed44771778d3706879ce576b1beb48523f2c60f1e7732a9ce779b787a93335a2fc60639b75102564ef1e8b534c30f1a281b47d7f9b9ed06d08df3165c738f59a57da4daf7a64711a31e44b0355e7b0c1b193d153fb2ec9bc76b3c6174b5960bf3ec1d463e5b30b1cb8301cc8b39b8743a0081272c797e85943dcf6814f259dbbb069c681c37689e53fe06f3afac4e11be1138b7d58dd0ccd54000f8369349c1c4f5b460391296315a4dd006cadfeb0626a4da0167c49119cf11452a7399254d2f4f5bb0d2e2e51b3b327c123777190cfd562eeb038e4d04014d84d9b20304242a20c6c3882d493ead84a660be5fa9320b38a5e6afb4cbebbb42a0cfe461ed015bfa9247945d04e3e3e0bbf3f5710b9949ebd7a713e2e3f5379abd2851cf4aa72d7bc90062ed31a08fbb6f54cc597b9ad7e9c2cb2cbe31b85ddf3bc6f3323bdebba79cc44f16ac8946fe109e5cc000604488b5ea6429bb48ebfcaf22bbe8e129bf820b935ca4eb6f93dce23d72e07552112fc149be923e54dd39cb4cd66b3439e53d54d5bfd5e3a9ce555c1ffac69caade7a693c15cae0506d8040e2fbe8fd047e033aec3a67dbaa9107bd043050c6c5744a26cc7fe854d6720e70ea0959ba42a98a6967e1cb04e75b4eb7789ce1d4c39935496ab5208d2e8b98422b7c815f7d397a2a4a233227e72d96c7814c9157906cac2da4cb9adf92f3c36d4c368a810122018b4d4c0ad9b11dfe807d8faee2ea05ee78bffc10d2bb5098a841e59f7e1934c5f695af9e8d3c56841670faf66676f0c429835ba98fc1a7befb21e6707fbd405e177e64dc1fc82a790ecc3ac579a365e16346804a7a3be8f0e3689b67ffbcbec733866ea48c523b1ba856a3221d6509de3475f0a92567c280f88747c93a9c857707723c37f95bcd98212e8d543099d11d9ce95270380b1a4f64a53384fe15195cc199c4187587e2fa6cf342ad3b472d1ce8cf16fb4ac3a6685da5bd61ece9ca84735edc30b5ea6e8bd5b3c139dc2d2479c1cbc527c1acd1e2fba2e50046878c5012aa0f176f865de76f942809f66911f90cd5913513111017c5480a0818c8e2285027c8037b489e0105d4de7fcf7c95c45127ddebaf29b3d21fe57cdef7ccd9c4ed94f235ecf7f0fc6233b470016e385641fb484c2d0f2a6a91aa3717474b759f3da0b4846ca9ec72f7d3c15320038d0c03f287d3192b17e2737dfaeef8351188bcc86cddd027da8cc8e8b0c2a13a7b572aed24b3834c4e58d1375c505c781e9002d5ad1c38ac9ef8a7529b241fd0e3f5c0d1dcc851043c97c26a4530f3e529f46de35225e916395c368efecec6e921dfb52d8363d941cd7df35df06864735b5182fbe3e78242c053c0d152bfb832e3c09a22d34509ce7880b1960ade03cbf5654d7e6beaf3bd084bfcb88f1e95777a67675a61c4bb8c97e5a35567263061ab8d198350cba2394b3b1fbeab510d1f4f2e39362e0c18e5589465916fa0667fb8b58035675c67543b22ee3c67a1dd9c02c2e99921dd8a58966fd924ea3b29ae5927c06ce793517418aa270a0c6df494b857ea5dd8784bb9468d1ac8502bf14418f5625a41386c4c56711d59b8322e950e7c057757957ea6356d69da761144b1d228938b96c11fb1bc2cd889503d7863b853a92c2ec31c98552b7202e22969fe423d3fc2cd417c885d891921affcf394e2c35189ffb5eff279e21e60b210fae9825aea71186f7d7428b692064a8d427442d8d248be7b5d0a980471a99cf291d80db458ac361ab7c600de3c51715173f4ceb5c399556a42f7293ebfcfa3d4d7ccb405df2e14de2b1bb393dc7fa3e0169768490b9a9fc581b7fb4a4ab84205855ce7dad7c70d954152eb8ee2d045ed902809367bb2e032389f866fb54b0079c5c2ca8081ceca37a19e2724e51847e49f5ad572d1c884ad1541f3c389d02ce72401e9e581a9efc05de27f8832c1e94663e692c4b4dd8ddb0b94ea25002f0611306ed13c3b281a98768d305d4f92b66fe1ce9df24a89f20cf04d168c42226edce21b258df1ad557cd7d1c33655547b2c9a8e68f9770545a29542a93af88c701acce7d48ff59dd7baaac3896092abaec6f49a95b8c4a4e71dcb8468987548729f1b403870d7d573c31a5c9a666f034f00fa2a2f0a97d4a9e33d230c9cee73e029a3b43a101fe165007fc553ac34e3c54c5009d7a5186425f9132e961c95c9330986bea7236d264dbf377eb2f304efa1118dcede66072a02301f06471bec4cc92780be9afd2bfb7d883aaac2e2aff10b460fff821429c0baf2b64ff209f4fb39a8e6dc6962803d0f103953185c6523bc79cddaff76989b7570b7913a3d000e1b9887b700f80304070bf3b1714c3bf5adc3bef49775d695e90795961c6e4e0c67c1d90b571e2f9f79e510ad90098e04cb9275a5fd4e22b9d3794f367de667ef015b9a1a6584daffc85d307808d954c2b8c2d15304ca42d647a5cd1fa36c75713aeaa43fe077a5380aae87d73a780bcd7440ed1a486e55a3445d4b69a35434d2ce879338e90ce63fe313751efd9b8826ac961ed53ddb3ebffc81afbbc69dba166466140d7dec9bca683aac6007dac113d509fed332178e37fa2131cb155242b43dbcce530575235b5244a5aef7e648b5e41dc023f331d09224b6f32b64b1dfc14e6c636e3b790321d7a3c7b7e151abf48422a7addde496b06c3f393e3ec76bb41c4d932e86d505a4eb5f2b5a72f751b23b48fcccdaa3c623cbfb2323357a61a4036783d104c3998e4d7753b705810611abd544963b38f6c14c81aa463f7a9605ee1a00e0ae95b689eb1223db4e024b147d4fb3acef6b7b16d213df7ea0d3fc6c962f5cf4ade15a3cda3a5b47ed4621242a192a6b0c7b43bef5aceedb4a7bf98f72f0154a85a75a98966b61babda28eccc9b95872a5ccf33e54637b8ae9e3642258379b55af44488964e8d178b90830b28aacb45fe90c2a77b56331f22e223845674c9729f27cb95eb552f779d3221b594418674cb8b8c9168fafafc54cb1e8fb3c2c1808c078f14684daeec80300c1fef7ec9973005bb0376679d53e94634d358d8fb9bdda600dd4d324dc93b62c4abade403eccc390ff2a576ca44c709b4043f5bf1a2ad0de68fa2304f32eec31190c356eb4db91e6583a920326cdf4394d8c46c047eed2d4a2c82b0e2f8be7603324e4e923fa4c450e1ba00713d54fea2f8d79937323db348cb44862aa4015a39e31990fc6f23ee6535490dd1c302c98687f1b8b242a3c0ddbb4ad71f6e74bd87e8f46a96114ac89f79b1f20ab449496c2dd6e7204cdae082e49feac1fcd7ced9fbe754b1bdb9958e2b60e4ccaddabb4d1ac4db9196878b47078670f315ab37f4be4078b9d555eb5e5b2b3f392c3a6aa009bab97af5176fb9725dbc00eb83b90ff958730937137c264559c85b22d7b43bdebe20ec9970e359dac1a8483c4b8a18be6b093fe959756d9488ea2199f804032190f4063ea4e70e1ef92f41bc08fde1faf4b45440e8f169c10ddae65f12e7c76abcb7bad086e21c2faedbb12ecdbfad8f1210d1526a98036c976cefff1cc520f522ecad7aad1f048977b4a586a803d20b91556f3cf2aacb1efe6e788ae0360035f5274d701c80d87f51b9c6c00e7311c7f6d7b5283d96a474e40b092cb0668140bb59c7a0cc9d93af9fa9d102922d931ea9fec28087eafbf432f309c0a934bb3039f1477fe8d02684e2633296d9694df69d4669387881778815441cdd433a17e635038064923251804c588ffad936bebc0c11718fef50a2aa29fdf66d175746c362bcb53798422f589458b78a7f13c9c5ae6a4af6498e8ef661bfdcf177412cc0c425410553ebc2e1ec48a96092358bbe58daa6819123fcf30921e8020eeea4902f760a939885eff9f892f387aa9f51907853f27749734fafc8ca425aca581c8a35569dfe2f35accd6c325e3988be73825ac4cde0e5039236c464e2e2bfbc530600027de2e78ffd5ffde273f4ec0d26a32fe3df911318aa48a126b97e60e06b49b1f0395fff8db92ce6920ac0e7607373fd1fe98cc391b9bf20eedb83c4587263e58b0fd618dfe607f363a3637960fb07c1a97ad7358c242ef31bb20d81a7849af8ac67dcba89c41d40e6fb3e1b656196d7bef82f29865d9221750561d68b7253fb21ef53a2f9cbdc7303d2a0681bb9d8fc805f25f4f45fcdeb381eedae16050fbb90a26c9140967c080b545d8cce46774a24c3e5ccbddf772a84d8b17af5938a6fe18574259e5c8435d0fbccd53172107561afc30b5e2d96450d64d26661a8f71d288c63b1ee093e8abd703634812b07eaf3e6fb36ffbc6b0b26716010ba5c0b3827655224d1b789854afcf57aedc53d7ebf342b79c82f83ec1fc1e56154f91c8cceb90e6cc809be82f4fe63d2d4fbd9eb7182cb62fc5d382ea0f2f685e12db29d459216e9136eddbf01492ece8ec32fe5fa76e9a913ac0b0168e7054c6bfc39431624ebe73c96ce250ace414a254a75d4b9717b4e3a60f13317bb9fc599c0e9e2fe547a8d1a256a5343859a4ed01ce781d1bb0e2ad661c7d050a67e033b46a427fec5cc570ae67f6e7dcba686d474000cc61cd661acb63caa74a698a3dce5e433f80aedb8d2d8acff96da6f337b92e12ba173c67ab7e6717e997b50b0f55182ad0de3718e930db765f3e93a86b27995d1c6fb9754061b16a1ed06311833b051e624ab50d37c0e37ba542871dcb10f559a53f5caa4b3bcbf8e5fce197b707f5801998be3d8542fd000ae29442ce12032d8b32d544e1271667cf040dd1600e1a540b03412ae4752437d5d8ee81c937f74a18f106da72083522e33a68081e8200c1e2153d636b042e81c31a7851ef671f7098a974c36ed270015943e95e1e0528e98a49207434e7f7fccd24aee4747bb01edc77a5ff68755a7c9c36db5e91879e122bb3c4e2d961d3825fb797bcfdcdda291c8fda0babce05ee6eb886a79835c6572020be80deda478350ed6ae6213b3d21f27a480ba5a408864bac7ab5bc561965e5e095fd4270c79a34f1dde4ab23742e39b94b577cb305a4752adb427b4492e1efd40f7fb8c5e8c2737a3aa6ec696813e83cf8edf7dd3c4cf27e950241a5f8108367625504e96497f4ef66343967d4b4402cfe796460be8bd7a3c9fa2259365bcaa38f352c18a9bf333bbf121e1aa42df40dc825c038e9432c8d0df15eb9c548cf73a6df68cc70a71aead3c7a194b503c9653494f0fb465f930ce2acbd19689b53b1187bf892ee5aef51c7d6191e3ff028a16988e32cca8589d9c59b05ad20e502df0816ce6361cecc0c1331deedc2dbafb56d8884b2afef5d82f022111f72bbac2ba085b005e983d3fbb8553a49ac9988f145aa65893e576109771e4e7f7b171014aee1de133db5ed512ad368e33aed3b5b8979755f6dff2540d58122c2f11d5c148bab6cf1c833dcf071be09ef7974e241b130644371666a99b060a48fdedea1be24ab82e803b8e928bd33127465abc922d1931389f30794832b0c014d7cbed41fb5b0f6aad22bd0e6132cee910248d94c05b5758d0599a01d2b51c4ea8440168efd9dfac7b1460ab5194bc4ab34e4de1ff748ec9a52bb2cd33eae7f7e54b582f469c4bf8ca3dd99811a93c6a2a2739098fd9d529bf9612f2af2d5f97c7b14daa9b05c40695bfbd14467677af65cb9e2c295186938524b8fe76582391ac872842fe3d22efee59d6dd0c48399a7f8750dbdb456a91e2d201e18aa0052cb1140b6c2cbcb0d471014bc8c41fc994c470f5ea6052768f7f9784e0c5c3850d7722c23421a11592a6a1ac2a7b2eac64ef54913b7144f44cc91f3cf2f260283e627de27ebfb69cca9592024b0410a76c41cca19b74b543e954fda522877a1c81d0a3cb6a7b48831ed3862ed2a50d65eb77f0860de94436d92f9c390e336c790e1f786c18efc27344ba2495eb96e1b1137218b811907dbe9fa90e6b68226022c51fb02e62e3dc0ae568e9f4893a877a727cc3ab8aeda13b866e57fb3cfaa511431422b64227b370b3b993e03a9852c281284d8436d0cc24c4f4ea5ac58e409c332fd9d440ebe50877f62c95adf43080dd1ac3f2adb64996766898d048ad5caa1ba9e6b91bf44aceab7297a66d2340cb6f1811ee97cbbcb4b3d93bf2c3216f589ae5f211b83cf0bef9dae32187bee2b56615a66da445f171f3ee119d8e2613d1117e05caf064e40760df216f80d14332ca14a0e5b5684521f05696909d412bdd84cf20d5105d0ebd60418717b7d03e9cddca994fe652072adecad27e133a76f476ad420648827c7b363304f5686f6fbba235ad631b1dd6933f5f96caa9bf55b639ed4d9934656b3b0f2aaa706389714392fab99e2e6146eb43c672f9b01e8f4ec202f5f40bee2cdb58d3b9975915d1ee44089eb10825377e063e051782b49b4f79148bd46bdde90276abc0f07336faf1e0ea8cef40855c79aade5370474afede4df054c1d15049f07d671c738163ee9e9a046a4994b9777b562fe8694f657412752059f2a80c34b288601860f1b0c846597063333d7dd83894ef024175575cda848bb03be433c259c9a81474a133334b20fcbc9f2d82521bbe446ec625fcaf51e9ccbca5a7cd5ce3594707f69d603f16263e24bca45a98f44f4a2fe8653f2ab0d6dfff0d331b2c93faab69fb1bfa9488b5a396efb385dd8460d356b8d79dde0d1a3f3c43cd95b01e412e161a1b703cbd6f1aeb489e0e4f6ff342e74be6682b1c68856c081a736a1bbfbfe13210ad2adb63260c78588f0aa7fefee02d51537ffcef469d8d2a527881d5be9e0a13b61a7b2ea7f73bf6ce76cdf100f1a74db4015fc2a8355ecdd024106d91e27489518a0ce86e7c734a6f2153042e3f17da1dfbc318a993d864b0f172e5128619bceffcccfb7b2512e5727c95f495868f143c117d671e5a10cd65caa28dc32cfe2c8259c8f0b35f3b9f8e167726bfaef691d20c8870ea3aa65684271bb405fe7197fdff33f573b7611161bace24cee149514e38f5cfde7c183fcfd0968cdfa726502020ff35fd7a8faafb688890fbe82ddb7ece4edf2ff60f3ac6e8b453aa0613fec2e0e21a6cdd3363fceded53dc1ff7625ab1940263b46b56affafbd3dcb03d8d895ce0d3c5a0419eeb389d1304f11a04b1c56ba930920b9733f51e2d7b27a39080f545fa94b0aef2882756e853481d03dd4a1264284337ca6d4bda466fa819d9a4390636b6e75144ba55a549af46417fb0388f7d2af8fea9591b236dabc0d939f60d609d5a259fbc839d2d1fac62ef31b13c9ae268363f3f827229b67e9755e40b3bbfe95dd08538e36d15f61f0e229a133f5d72a68495400caa667a04763b398f5e99cfe8a0db9a46fca287247a06962d53615345688ef66cbf47ad8391b4abbfc2bad1286114f8d58cbc3786e8a1d3a950286e2ddc02416e9b802f8b2195f50c0e6ddccd59bd0b1a9cf85d1cf0c6ee4","title":"378. 有序矩阵中第 K 小的元素","link":"https://leetcode-cn.com/problems/kth-smallest-element-in-a-sorted-matrix/","question_id":378},"90":{"day":90,"pres":["堆","贪心"],"tags":["堆","贪心"],"whys":null,"difficulty":"- 中等","description":"在一个仓库里,有一排条形码,其中第 i 个条形码为 barcodes[i]。\n\n请你重新排列这些条形码,使其中两个相邻的条形码 不能 相等。 你可以返回任何满足该要求的答案,此题保证存在答案。\n\n \n\n示例 1:\n\n输入:[1,1,1,2,2,2]\n输出:[2,1,2,1,2,1]\n示例 2:\n\n输入:[1,1,1,1,2,2,3,3]\n输出:[1,3,1,3,2,1,2,1]\n \n\n提示:\n\n1 <= barcodes.length <= 10000\n1 <= barcodes[i] <= 10000","content":"096221c37c5f85fac03c87f9e42ff6164f863d84c1bd23f07d6231746d59590f54a19b245fe7f8390508b05be10a76d05bdb801b79acff2039f736a84d2f7add1bb9968e18342399636081e50f5dbaf8fa3a17ecd9e1895ed2d3688e6f77660886c1a56322f6dba7d3ef82a56cbba2f03e529ce4bc871aaa14a4f1cbfa2be2278d9d47516d0c345614fe45229849b97cee1b589011661831b3fa4330c1e58f3f1c0e324a33e48c68440b779422f59092dd3e1d4cb092f3e272cb6fbbb57686f0d319917485c95d98251ba7e80ab7bff170e85eb29dbf06618ebc6d40e9d2e4053141729a50ae759ffd100cf68ec989ca18e5db418cdd63661a41cc377c491fdeb551f2d58af331902f216d628d633d3df0adea15b96da700dadba14db1e1089b0265f3c70b89ad67c9063e4909965167e8913458d8d201909f30ac1a9b1ea575918f7628c7d55746bd41e19482d703d5efacb3d1ca9e8010bb5c8fbb47524de183f0e875859978dc765a7b0e5f718c94279cac11f119177a5a64f83fb0eadc1e26e8371b0a4fbba56c15a1756eb24c041e330afc9684487dee525a847a342b609a2c404750328f2ed7d03a149dc1d37ad1a4d3e6a968c6027e2627e45903e9a2e95398a1b928c5117cf977792f225f7e53f823e1938d85fef46ef49b6e0f2e9164be2b3f59d0fd42cfa68b0515adc5ea8a500a71ffe664d0f08e3f36c3bbfc74c97b3366418a65f52239cf5a644143d2b70a15594b83e0bd2c3886a9bfb7e0e09b675f6c5e381314f7dec2184450e43d442f613c93596792f28d90721cdd0c3d67140ac9444a026ff2b8b1c9e74fe5f6fe22d54bf4abf87ae0b52d76f39a60ed4b7da8c81d7e7518602339a87672e8e447f3f94728bcd7ac6f308c7b11469afa93889a3809f6504170af94a61b980b2f5f89eda270dd7ff6229a1571c2326f08d55497f239848ee136520c5defa0e9b84f92a613e6417f4e3ab57496c8ad5a84d02d9223063fb0341d4d9dfcae6684121fd2456414955e167372d6fb4b8f1fb6ce78dce5f85424c0984f2d677e14c666a5d38464a00d585222f0bf3adda715872f7f01fabe23fd3d8f6988811eff2671e3dcd79536c64c49ad9bcbf86366c5341ded072b093a8c18c36fc242d656f95e45b6fbc81a3b5edfbd97af280b2d142f481c6d523fbe9bff794e1ffdd0f25ce8164d365650fda43da32e3a8729bf1bc06404260d2d557cb64e42d3f0ce816ad6c48cf10173fc8105995cbd33f93223d647aea721f5371caaa571e0af9b56324780b0aa88667740ecc19df4d780ea9889d233aff66753d752810b39b8b02896b8e745cc1f3faed08cc2b071d51c72c750b17910ce72f38f52481ef9bbaf8f9ea7e79588622ca6aefdd6a675f53a00b1578bb7938612cf8c95ef99395da9e83687ca63a7d6c90b474a98fc5a009cfb7965a8a6929c0179cf973dd623dd30c76af04f265852821c17efe565c115a3934d0654e9641dbf7d72bacd7f2e99be7d15335ef3dee5e694fec71ca64d280033a9ef439c5a701fac830e854c078f8a8234eb5962182ef5072769fb6f0ecdc5e121d0accbf237939c20561615fb8e5ff32868e3424e7da30a6def5d5828758a888c5da41147653e1ba8f8dc9f0295c4dc7d2761d218af14f7cb9114e71aa4314494025e451c182f03d1ec18eb98d065157c76a1ae05e2e01456135b19a5c89a27cfb42370b99b03aa1c2f6757898309cd4811f364f5b52588643e1a6ab47ef40af0a3a95118a22a388ffd8cfcc7d66607fa1ea249c3dcffb6643926aa325d46d013fedfea2b289ac50263fe9723c2fddc4f28bd5d1a392a1c88b39ccd71442610413b107532971f3f894e902ab0838e348feb1b5e5320439cd133e3d276f6b9eb3b9e37cc22485fae83c1a98b86aa05f2de8625ce66d743924dad5d2ed8eed9a9fbd36ae529e62d7fc54ef291b32e3f5150638917884a08ed483fe554f79ec7ba905cb12ac0d73e5e11de34dfeb0eeff0702b4b6fd21e055206c8fe6e13993d820bc66ed9bcc3355761bbfa66d865794ffe3e351eab356380669e3371b21a2838af8706fec8e5c251ed710e92c220ca439e19aed2f875ddac136d09645612d386da7a38683d38a6eaeadd04149bfe7ab32737136ac3b682ef10f6c21347289c72989c7a037ef4e1ea18ab1ea345b0e4f318b89144833b409aea2d76c31f80dd57a9162f781a04ddca853a8d43e4076fadb3ff269ed59199a8f2e489a920b914724fb01b815efd65f3343c635c3b0a48b4beb44b54dab2fe1cdfd0cc2b5d8d4564e968647719f572ac797ed60c68d23c65a26959aa94fc575152207006f3b415fb8432119ee45b0ee513c7614d22366802ad14c4fc62b295efd547ff0599136e16c2719131ae36ea6d58cc076021b1b5e1789b22abe8f1cf2fc860ed9a4e6065ed12ae6f5c315b976c78e1d46e60c39afc910fc86599df36196e3235af51d2c23c3ddf542f8b9a03a3fc3f1f544289babe64dd6b74a3bd8977030b82ca496d52836ff76893c3ebaa654ee30d8e5143e3a10335a714e0faae3d114fd6506ba7095655058f1dc6ead956246db70613582b43372198cb4160a1d961ce969070900c991eb59213dfb93ca34655adb8d9deeb5ed4ea89f2643994e0f97286bcf23ac4a07719eb18fb4020d1b0537f668d281cf76fe87e34727b134c256d844a325f73a6a831b690ccfdf1db77a684eaf3c7fc5a73febdd3d4b83da54f540cfc0d26ca2b521ab6a7fa0fd8a121115ae4a2e220b2d45b004899d4201a0eff68179d7e4b5c28340c57b285b6bd0ee03e6cd38685730076176e395adc17b4f95435ffd3b9eb1ede774bdde4f8d7dfd6c2405a0e908b734368c1b760b17aab5c2bf3006b2e119d83c68ebd758fe6378c6c890ccb78f44abb6c2373015f9ef9f2e399188603c4972ddbe177776743a22fdd8b1fa71a520bcf739f1e65d5a2cec5256f11cee34d7c1492509bbaf6b28be23d2a145d086f9ea8a0dfb32a2f8208911f2be3b9afad502b81bf899adcb3ddc9c28c689e3de34fd525a2e516720d9ca3c6c991b58160c0c36a3e717d8cbd19d644098071a129f47df4d262c9a806c4617fdec0d03484c28dc1332e1c9156fd1dc8b52cd0629926a2b665ae942193c8f69f82d4dbb8aacd7d92b25381c8c382b150c64bbea0874b9bf48f7210b307741b0dc439408b1c0fdde4c6dd7df60aebba43d43adaeefcb827adee3a88c2f91232c3a17a9d5bf0a55a167134592fed203a104c35ed6280ea3a103f59049f42c8de8e8ab0bb6a0793b701a89f8f4f729317c69d8135c1df0f5b49051da5249c34d99e61028b00d7c1aaba1d86c4c5ad8e506459f26f63a3ceae909292cd7bd26b589b665efdc78373b9b805d43b44189c99cec8bfe90532f11a08977cc5cfa9d31d8671779487b8d15aead345103b6ea7874e69c88775e255187182c2a3c1c059019d1649cbb73cd4ce0234b44efe15547a20ddc066087f46e606aede268783b4f9c14d68b02ca72c14c4f46a162e79565d268a5f7a252f29000b1f275adaea215195a012e7dc9d6a0ba91b527e4b4aa3ff0c35cbb44afcdd21cae31a2e8bf175c5b05c1e23625bc9efc21353bf708beed0030e8632b6312cd9dc672613285122473a35781dee3b372d0d2c5f4e1b0068419b1928e375afc3a8608dd6dce31e1ee57bbbe70de7ab98d9cf6686e9ea6351623efad7e915389b6ee0083a86aeda76e3c5d35f9a1be1690ed64d44e59c326f25e839049b1c5018d9867447a728385903eb37bb3674c0750f11c60114c6cfee96eba7e0c4f20dd95ce30c5f636bcf22b27a97445a6f66469f83af634499aa05696f6de749977e5efc2c6c19ede544a7a9d399b090a7daa677a5400418b866069adf245496a7c9b98f98cafe449b6f1a4fd66d20b5d695f5ee8cebbac37513116ec30f6e0e294e83ec7e01a49093cd52ee43e92c4ad517eb325c962510f4867c73e5898ef220ea6cc4de07dddf760763795df8959a35d946705d689aa366864eea6d6e826bfc9ff18f2872a76477f96b4ee6cf967be6992931c40dccd895a46ea3de83c23398fe7a0b1424ed78ad23dc61dde7873b25340c869b1e13817bfb0f5246142f417d6cd0ba8281f38da8c0d53b61d26c079f8f57d909387b84df2edbbc6c2e8f0b9bf033f85b04d6cea1e28fbbc04e7e6438847934b8088b5bff3a32ee2d4ae6f40b527cd180d6d5fed193e6682a5c4a20c0613743d94d3a6f041268ccd0ffed89538834c4a4419b1551dd6e6daad8b7a53bd478d78e0200504e1dac2c04e7e393e2b24789875e0c94675c2beee68274926ef627c85da51cfff2394890522c86cff76be37bd1e462534976401797f703dba4a695b5eb9f86ac513a428559d179e1def40bd76310b1feb55779c3315950e7577e28206b26270f2858a4e4e4e3df457bb5c669b25479d9aa5cd7ec387bb5b2f2808599b6542ef38dea7f1635218ebca570684a31c03ccac89263a4657dbe05a1f42a2a682cd52c88eefd6ebba30ef290d7bde39201e466e271c0169541c81581faccb7f3f2a7752e2aeb1e734546e86e6f1adff5ccf551dc4cc67730354e9b9726541b4f28bc9cf7758cf6f933fc52c3bda547687b2404e9e23d188606137fce1e8b9b1f6accc381f47edab109aefe0185ef6f7b83951662c13fedfd38fa03a6cb9ea8907e47683c9ba67093fb013b9ae84ee67c8f4d4f112621a9ccf5002ac1bcd61030b800cfbea4f53b8bd57cd12f871de9619eaa3b97437099a861a98a682cfd2599015cbe2fb0eb544591f4b530a7e3a44984975772487619cc3400d82ea55be526ebda64948adbc59b63d2176b4a37c2bda85b3bf999dd295cd24add022336380a4f89d0002b11a285360a3c5b73d7cb4dcce2b43cb9d69693cbc607fdee20cf7a568fab2351126074415d345689623d5a2cd0b14e3be1465fcb268cc3abd4872104e7ca518190247d57a790d73b211edb5a22e3892269943a447e1c642e4577553b86972ca6dd6e6c9f454fce95d89e96f42bdafb27573c3083604b46b46cebe7c8e928d61f835b449378eeed76f8cbad1c87f9cf4563007d9e7c0d7e1b286f1204ee3144a538c756664521e8ab949b5a1227663fd43b2303d8d207f7927393bb285fa0216a4a55291c7e522353cdbb9819ef1b8b75148c2ec2c534d797c581b6d2251cf5cc86c611547fcd84a1b07226deca7e4fb61f435a8dc359fd79a70a3ed3c6c91af2582e7edf57d7d767d018db97723ff6f1cef3baccf55a3a10e30b81c1decc451646eee508719066eab1d1f4d9ddd8b585dd3f56453c55d364d6e612cc48198cc328712ea2419cb6ebffee5e97dfab227942c166cf6975e44c13fde8ed2ec1b0a27ffe6e69d5c1ab008cb54c18c1c351e9de221b47f1ae945e5d783a66178fe03b5eda4d6fa6462c97ecff7db8768b55b51e40cebf97424bc1cc67b1acbd08f27e0e1032f877bcd8d1e003e3210f67b023561df3252d3a65f6e72a88310957f9efb3d390efab260c746b4ac24282b0602f7610e3270145219fbb31d06e818a4f425f8df564ea9dae1faa1fc40e633c05775ac08827dea89bff93581f4408ecf35f2ae37a53d5c77df0f1f17511c8133bc8eff1809238969e66a2997033e690158c19eb319351db83933e5c1f735d3e51c125a5e6722ca34b097ebc452f3736c60fbf8cb5cab1af3ad1d01d8931a5d11b7c35a181f29f2d05587a1997548ad8810b49465d733300e19e1b74dcdd43e5d1e20a656bdd5a4b73e6fe3ddfebcd4e5805a6228258821bbabb476699fee0924c2bc893c4e8c44e19a2daa2d733832e534d89ef5f849eb59145fc1f7f06b1d514553d7f5295bfc69d76f45fd3fc62bd3237512e91bdcf96255839205c7f3c4ddefe3ac2407dd45802c02b307fea430e7555e17150dbfeb3d4044d0a420e6a1f620e149ed938e2ebea32207599c22c8102475767dad6e8f0814dd144c5f4981185641d6390477d45738444991bc7520e83046bd309948e0f7b3205c2946489709a3d29b17a7cf569c640cc8a0bbe725d1625393c7b7d25ba17f56ce909872d3772388f2438cf494a8011868fe16c6e1dfac0eda1cfe257fb23e58db101c97d873cbf3e292678ffae8d81845ea771cfde53c30306abea659a5b91bfb037745776f7033154bf0e4bf002a0dd26be160ee92becc30a0a27f08e9da8a93c24a3d662f92086cfd87022a580f4324b64fff889b122e3bff74940ca60654d4845bf2737cae358a654c908de12e646a52e00ba413cc1b6e8b4fcc7ef4abb981d84f7678a57a3121ce28945da4f29208109dc55cb5c0570d7790dba340f5c274e014233ef723565bed3ee98843fea1802eb0f9b6c7b6a79b724060873c35493ab4d1763610b0497c75a7e4bf77d142593ee66ed6ec4655c073b8a114b4b7ce1c708290c7dbffbfc9965fca37869b916c412f0b1333f08b556da4bcd550647f3a04b45af863591c207ec7924700b6a95db1b5846e28aca22937073550ef401c5df8c255a3a52816c9d6ecd2389b2fa957abcf4ff4a3ea741f15596153b9e8da46b6e0d688ecb525cdaf99ca96eaddbf98a1dd5d8df749124b1b251849c91ebc5bf815338b053117df3a4e73a0995ebb068f074413345978428e65a9eed6137e913aaaade981be44344009e8cd4b314de6a06b13f3360385a28173b0fe7deb08e792f498b933d83b2391fb51e151aa939199948a217fc7ca2bc2afa0725b4aef23dab625ac548965e8d272679144a7cdb0cefeb4a7e55fc9b0b99e9c77f8fe29854891554cc92c240ee56c1d4171a35f0278f0680ce2fcb91b6d0add05c1ed61ca4049cce4aadc81f11aae6c27f0578d2c0ac1dab8098","title":"1054. 距离相等的条形码","link":"https://leetcode-cn.com/problems/distant-barcodes/","question_id":1140},"91":{"day":91,"pres":null,"tags":["跳表"],"whys":null,"difficulty":"- 困难","description":"不使用任何库函数,设计一个跳表。\n\n跳表是在 O(log(n)) 时间内完成增加、删除、搜索操作的数据结构。跳表相比于树堆与红黑树,其功能与性能相当,并且跳表的代码长度相较下更短,其设计思想与链表相似。\n\n例如,一个跳表包含 [30, 40, 50, 60, 70, 90],然后增加 80、45 到跳表中,以下图的方式操作:\n\nArtyom Kalinin [CC BY-SA 3.0], via Wikimedia Commons\n\n跳表中有很多层,每一层是一个短的链表。在第一层的作用下,增加、删除和搜索操作的时间复杂度不超过 O(n)。跳表的每一个操作的平均时间复杂度是 O(log(n)),空间复杂度是 O(n)。\n\n在本题中,你的设计应该要包含这些函数:\n\nbool search(int target) : 返回 target 是否存在于跳表中。\nvoid add(int num): 插入一个元素到跳表。\nbool erase(int num): 在跳表中删除一个值,如果 num 不存在,直接返回 false. 如果存在多个 num ,删除其中任意一个即可。\n了解更多 : https://en.wikipedia.org/wiki/Skip_list\n\n注意,跳表中可能存在多个相同的值,你的代码需要处理这种情况。\n\n样例:\n\n```\nSkiplist skiplist = new Skiplist();\n\nskiplist.add(1);\nskiplist.add(2);\nskiplist.add(3);\nskiplist.search(0); // 返回 false\nskiplist.add(4);\nskiplist.search(1); // 返回 true\nskiplist.erase(0); // 返回 false,0 不在跳表中\nskiplist.erase(1); // 返回 true\nskiplist.search(1); // 返回 false,1 已被擦除\n约束条件:\n\n0 <= num, target <= 20000\n最多调用 50000 次 search, add, 以及 erase操作。\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d842c3d4da25c067868220c57680898ed435087b8217750843294112d894dafe10c10fbe95567cac4128fd47ec11254003bdb501c0f8dfb1821537bd5b8f4619055114ec311e855a0100f267c7cdfde268f885e1ec8d0b9d0ac2210003a8432c7c9d92099833da7344b946ed77e1c398fed355e1a3e5aeac7198b5fadbb544d0ab750caa9fb08a73f2da198abb1f0b0b08f67e4f32f5e4a2e81981a656646f2e647ad8da9a93757a26a39bd0a7b0a841aba400991634073a3f913b4e3af36b446b696bf486c8bab234ce399f445566421cb1f25bb6277f88d7464350812c6c2a2200031a7ebd1b50785dc8e876db949f9db96d138a32c2f4e5b63d15963f3dbb137ff1cb24686c0c41f9888578d5106f68c7995eefb2cce744f4bde6d22b5ac7207d2bb529bcd53a49b7aeecc101d5db69b0f20525e90ae77d40d2fcf0420221c3205211010a27883a4645f74fd82e4ff7590a878c34a58512f534d81951283a00de31e2f56584cc03cbce2dd1613e5083c0a4fbba56404a24562b25716d8493692fe851deaba2143cb30267006b79840407e31a010d6cb19189adbd15beda9d3ccab75c20b790b2ad75c0ecc98e976a4a3b024c40b5ff659502e186f7452e72af0bb819ed0f469fd9b763d239d54bc2d135ac6ca43ceaf81102842758ecdc1b87ee5df64d6f048956d98be5b919d49450672c724f750cc5f90d5f0947d36c29ffb904d54bd330384b5bdbce0c623d5f15778ee81ae3e4a6cc6a5d6e7217e2f671d5bdc3bc6c92f7f1627ab7913e2a08563335b1a6ef2a9a8c8e75dfff4fe31ce48858129f42ebf1640fba24c53eadf7e46b2b7cc9472373867c4dfed8c6dd4d1fdcaedebd4293cd22c00332c7c461303e1911fd4a8ad276a478e20deaf8d617f59dd05ff4afc16bf4bf8792c5c9006dab0139781e73c5e1126ddbe8aa430ebba7097517c6a00cb7b965b4db6433aea1ed5ceb27bdb7667f3b326ab6d7641f8a73809c30934d19c4d758df516ce9847964b68593ae79e513964612ac4468ade9b4fa000475121f4b205faa61c9a2e6b17f6a50af121986fb6941cf8367fcdcbd4b732c67848adb5eff86468c61838ee241803168c12dd7dc148eb5df95c4486dbc53b145ff5bc98a50a0916272e552166532fbca7f9794735f2d8d65df4314e2e5752f3a231ad263a8e2bb31ec16c276b0d2f87d51b941adc948aa114a9ffefbb200da0b96cc975e645da4879c410db9f48a40475de800f93a1df292916c182c9f3781b1de7b3e3fa7f207e78032ebb2772ea5ae34f82192fb4a8369a80ea4bf71c3d80de82eeb5b425b7fa6e2ed778a92b2be3c11b5b54bcb8d2c5afec86bbe10312e1fdc7b5d45fad4518f532a8caf89452a8bcf18daf5b3689a57299b512adabb00c1f0897ab2f38e378fee37f6d1a04d8f92b66b90aab5be23fa23bb7b29f801391ad325f099626e5ed5595c43290956685b7ecc437518df01f124c3fd992b8c3f295cd47e94f656238e2824afdd084955e47ca5c928617720bda4fd298dae374822769fb6f0ecdc4d111d1b0fbf028949f2c5b1a0aff8954cc2876d2476e484cd8b368b2c5a9b8761346f42ae48bacd2d52054655853a9888c477312cb55db20b9ae9bbe0467bb761bb4670341677f1d5c89d877a2a6ba1d01cdfc6f6fc3a9d77f1f1f2673af85f221a6c3362cf99440d9175d147cf31bef489ce973cf56b737aa6b0217689761fe2ad4aeb2521aba37fd51390560b28c5c6b9731c135ef899fbe08642fd46f6932b119bf82e26f79a984695e89fd36ae9bcdc828ba471d22051fb3819cef66818cb8c0cfe6e1f920d8af6bc33edfd3e2cd6e0230e9d6e5f9de47646ea099fb644a68ed768023f6dda8176cafaac6e5986ea6f4e26ada30b951dc3fac1678c2a588a2a98a5877c659a6ba856fb5ceb948aee35148a617b24f0bf95b36d559fc9ffd176bae347edfbccea68c2adb59a2338617a49c3455b681d6d4d7244b8ee415cb43e24ca6b2c044b5a3ea611466d865794ffe5e0703a34f6c85749960228a1c3421b29d1db0d5bea63eba717dd9db25c446840ea692ad0b8c8258761c694d13c6c6dc7b1e217e72f284fcc5450d99e3529a2934167c88ebcfb169ac89013d4ed521cc923b473afc9fa2539d24a658a5efff19e09f7e882e579ee77778ca47cf8819f25c7db098b056346c3aa343fb1c47c6b0a871c690c3e0fcfca5cded28ad1d1937aa1f9a47e575d13577655c663145a8f3e2071dc4b2ae42d0cd04faac1ffeaabb757970158b7896656bcf0027983a28a8240ab695ec535452283349a9f54176498893600e5311ad5f9924c1f1cf36562cde677e9b6e55204f86779677a1e33c913ad861e27fff7604895d683ca0bdbe24cd22b1e8b381728be7366bd8d2f1ed46fc3a191b08dc2528ad9d7e7b9887ed950f857dc49a374c3b7f39a01d9d5feddd5fbd9fcc991680fd1e958eafcdf62ffb01f6bb247b2af8cab906f187ecfe6fd248ae2e422f31f31286759e5916b0f54d2ebf55e0b4ef2c195fcc0432e8070f004cec48b8246cffcbe90dce83fbecf7bf218ddb5120e0d7e80451d571dd039e10f48539b4fd78af4691363d1c380f0a91f18cf921e2275d26c5107f5298eee03759c165b00a6f9476fb92ff14f47f87ef5bf7f0f4e1c4fdaafe20fefad1f26f2a89790c6038544cfa75632f1a2c66a98485685d162daa5c7d104efa0b24c4775b1cbabdeb5d80ae300402f5a3ed29fed0503c6cd49029d5925368df02c782fbc6bdd1803959772aed23bca7504b5cdcdad4c80d4118860c5b56dbf164567f488d16e6ca15361a4d1d1140bd86b1416fefd0e97b2acc768378d8ff0e82cea0f4012f000112b1176cff26ce4eed1deb06b73aa6a9e7cc8150131c7878e4459f2b1de635709db6acb64bbe4b6d926de22c10c17e5a80f70821500d8fcdd66c7a8ac6b054e74e300345103bc3e1eb8798fc482b400335ffa246d0708cd917396a25d3f67f7f5d6d5a6033484c27a0008c2ffb6cc91259d1e68f533f6a0e0c0446b23a05edd2fbb9602fe40b8cf26ce033c07a9503ac78c7b6c07bda907b451683120a0351f6b3a957d952d85947b871a217c37a2dd14815f5615a50366d715e7f1069b90f1f941c460c575b9455a6356d62da400645adff2eaf979ad601b1ab30d9b4583b535bbb4e852e0ac51295682b593de02058fd6d1630e9e5434e93528939238df9f09bd1c0639a1004423528ca5d09a994f9ee9250de641a5c62742b909303448c6a7142eef2428b7a52019f0750a09ed8a7da29a259843317b5e002d530556b5791746d09721789ffa766fc80292b4f5d0a2b2ee24ca3d913a3f67d0e68b2c7c754993bc2c24d1d012dd090da8372dd8836e75b1d453ffc09c7e7e4b49f9565fd876e1031e421010759f8cb4ffa571114e682938de24516d8aa9a3dc842ddc10c64cd64f11a543ea20054f2e7bad02ce72401e9ab87beee48a58a2a965cacea2ebc250321edb9b5ab7da44a63162e100b2d215a8ef96715ddb644cad9c23e3ea50d52034c60edaa4079c7b40eb3c9209fb04e258cbd24ccd348616d364ad3aed35c57bd73cfb6835c65ca299c312c8d942e3d1d7b14011b377e7453e06a6370687e5f515f496d4f96187fee3ae78db86a88968e9d06799c25f3c82794e0d189832fd5bda23b10743abadcf81d279c28b10972d4aeda76b78d9a0c9453e56619d64d44d0a44f6f4ba77d4193520503ddc62328fa7b08590ce13d91367ec0155f5094400fca94ebc3bbe5edd3ee5ddc13f90e5b67118078ba52cc2b0e3a34089fd8ed2c0bd5ef4471325ae74ece7e2db7653c55a4b610a9f981d6a591a08db762fb560f1de26e47b0c22412c3e98aedc6d784fe4c86684840891329b58dbff5eec0aeeec33d56502ac31238486d079bf03659e59ccda602bf1ae92047c047ac2a119f6833f4dd5673e5898efd2feaa57740cf5c57e6a9caa1c75a0c14b31dddde98c13766f8268b5ac3a617fbd6d6b78f7e37ef333bad7146e6cf966fb9d9242cd15d9a8bc6a423aa968d847bc8fc665d5868fc6da177d62193abf932256f26869b1e13817bb34a13021432007b7a9fbfdc9ff39bb8d3b42968f86c5ab58f57d909713d84d72fdabf2d3c815bdeb97df84f1d97d6b5ad83f0cf5b7665659a3030b4168302b63e75a67952efa3211975d8aad6d5f1de9323d89bca97df5da6e96998036945445260a3bbd89de453a33ec1a555f57046d33504fa889de62a956ec8dd344f473149e5634ae7b8ebf7b35097801d42ec321930c4b0c737c67c8e3b814edb02fff2395d975223c8cef345f16c89817b0d30541958de894c83b88f8ba0a7d8cbee4b2654875fd178b5dee1749a4910bbfed5053cc22a444ca3497a222d50364c5f3e1ec0c3a3aac64766f89224ad5378d9a05a95967d75f4f6b6809899b64e32b0d1ea7e0c356795a4e86368535a927fc6c39963f94f2eea44e2bf2a376857a837a2adb277b0a34be3becbe8b3ef5ea7349b7f8853d405d33f81aa91f1bc675aa9b3cd1a8fae9ac57496e6dd1d2c180ec35fe34ba1c4eec13902d8c0f9ecb578004db323447ad92b957158348e8abab9f18db77043ce0c106f8042b5ce57638fd7feba2a9fe357ccb74dc0ef6738d6c7182c8467e9ac30ac56b6d6c4fd9d744a7266c1e772c6aa5c7cd48f47e627a54d4f112677ecccf41d78c0f5db117cb61ccfb5ebc4118bd57cd172ad1dbe29d7b52ad6086bc6f667b3982567a1778e1a67b72febc11710c3f4a830e4b6f647c0d84169071319b72a65a760f145e626623ba1416f7b1c03b9459998c0f87d702ef6a3260748fbb91cfb49ed93b0f08cee4f7fb2eeb4274aebf3aea8d36912b75d344bea2d761d572410e25d36ae25e2e47b2cf5f8ddd4c6d4a9bf0e03bdac96ad4e77ce9328c7c90e832f043f54dc4e57e9d64186d8126c78a19e9b1c3a008f016dc994223dc66f016536642e0932537e91d62bbde0695798041185d3c38797fd08c1d1701f757cc660430fe702aea2c5c6668d57dc4c0bc030baaf22a788f61bcbecd00c671d27d62f7c3d547d210a50b6315aa230d6166f0d5fa9e8df950a5d776e36cf11234a9ed200f59ff6735ca3ae37e4d1e982b49ce19f81c4037c16bb30588a65028c338a8a2dccda11701800bdb4dfcc86c611042dd5a0eff52a72ded77e01ba0e433cc3d74dfb72bf17668a9e9256fc442e75850b82c060f814f49b7d72afbbeaa7f59cfd177b14e82681cbdfc5433c16bca0063fd53ebef8bea08c8f96bad898aae7d4fbd45fa1136d8856ec9c4239c6c3ef278f7d01302762ab60185cedfbbf548955affc18a69a2d0876ef183f65b011cbe3f5ebab0a8c9c4f37d6c75880cb3f0b58e7ebdb254d646e6c588fe23a5ed0534daf4c30f7aeb43cf60ec555b37a3f83fddd1f307917ef77180ee63ea599a3c178b373450c02813bf08b9c5eaabbf8669999ffb20160ca41bee9ab34087745490629d7c6b8ceb22fd6027ffcc0f1c108babda6a64c54a20ebb460cc2c9847a3191010b09a4749041c1ff908690b10636f4547d526f0bb68f98aa6c29f3a023a0d73413fc3b623798ab0d88a10c77514503d91c6e8b3148a217b5d508c257b635cc3f968598025c18735d641f842a87a82761aa1f1d6bef5b6e727c821eab97d18fe6af54c3be58817ff0de183e66bbc4f5ce43571c71548e01b786c80a4e4345264211eb9c1012c8da49a18da30c68388e5c423aa7f83dc4dcd34e4660ae77fc37df1ff7d41364db97b0de1e29cac6d1f2d45155a0cdabdf3cdf3e7056a9ef3fd6dba78b45b217670bb0c90c10326442bff08a921fc841d4f86ba66f281a2790fa92d0715a4365523a6e0c8dbb3a8f1135c45810c1272a74e205156d11f35b0bf1feb3c56b190a0a4b68142c4040cac334e2e5bf771a4c99c22c814e02542fc0dfe8be8900800cd7f1911196471d7dc71e3d096dae4cd15e861607835f029c47c7da00327b922d48a109c30fc58a30ae8f65b233c06d2ed801e2771625393c2c352fb91ca630a11f832a767239d76d38991e448c11969eaa776e4da7d591e083e24bfb6db0c0ea44c159d769ec76216079e8bc9d888274ef348e9a5d8d465eadb41c940bc4eca515271235b8427a5d61baeb349a0b15b32e3c4da67ea2de095821a2838ce1ab7b38b5da3af93f959ade6126b380fd324738b7e79aae76f4bfb41c1cca7b14674845bf2737caab5ea84587419b08ad54a4744ca6533195d2acb8fc84fd1fb0800b93f97be503ab4159a1c6049146ef841fdd7dde25c6a3b858fcc81f97818ea76c420d66a1267064f5d1e5cc9179f71804fa1db1727b7a70b77f23077307cf3d6ed0a4a6c8a6cd74089cba8d6380d1b96f620aa43c9731551c59cf500f4532a49f5c743b7df7bebddd6bb2e6697bb750c205f1e44d7a5abb119f1fca0943c1224ecbd404b23581cb07b7536c354a2e95c61b1003a3cec4368d29780075a144909ad95c1f7940e5289427a277dce0b49529f9b1ec7b14fa5adb48fc5511b4fdb479264a76dfa64e51c5a6be8a2ef39bb9da37cdbe9e27c224c2f918d4829deb9ff5fe2a70b8034037f2a7b6103389e0f1358610636000dbc27cd6709eed6165ac47fff8dcdd0ff510422ab8f9b1b711964d3dbb3c762fafdefad1cfe32216770596cc8724351ed450b7817a82afdf0c9a8c448f2edb76a71757802dd964d2b82db117b7cb68c77ea148dc8bf5ffe9e90ec26c36c8a9f66522b903edac7ba5c85ee35993b1581e46a466eb3150c3dbbf648c9e60928a6384d6ddd9a9fa76d95f866dff4d4d9a7b47dfbd3d3503f8cdc2cbaff63fe5cce698e374a8a267421f6fbbbc308aafb005f28edce3861c4f04bd84adf012b779c53650612077464b332f247d40e6e8de4817b5ed512adc67b1b525c7c76c93ceed8975c2a01104825510edd3fa5424d96a0e8f2f1fc3125dae2b33a7153acf86d28eecbe741118edc8968ae8e524f186ee1fbedb7dd70d6d2617e49e5faaff72a9c234b1e2153e4e057cf79501b7b3f6d8c20dd0cc132cee91465fda1f56fb29df25bec4310d72f788f00f7ddcbad8ae80b14a08b2554b929f34a69150bb528adf06bb65d323ae1c526d98e1861cf98ec0e8d3dad57fc7eca2a27390cfb5d41e89b1202a6fee96cf410d41b9c6c53234695dfdd109263361f90496e0c5802f726f333085cf37926b07ce689764e19a62bfcf9e6d998a83cbe6b67b459aaf7ca91e2d201e18f72a52cb1140b6c287915f819e9c397dbc3a42bad9e6d86e8386ad5d7969640c5c3850923e3720114e5b166d664ec9b9a3b2b91cfb1b5aad761b4a9ad0fc807d574d9aa874910db9ba7aa1c6732076f5155f248a1c985ce4507e63bf40930d5077b6c83e0f2feab4b0cf22f7472faf6f02ad23cc02556093d5527388e4f3bae936a7c0a0a5c78c8ea7696106e00c0cb62b046e65658b951917ca96a8dee6edcc734f6e46ec0b997c79cfe241839e0df2d63fd46a8d32b1ad8906fc3fed6aa3cdaf095d305966766f732d0d7bc13f1de2e2633d7d9ef20a2b0cca010e1af7a655b8459b7ce98c4048ac02d93936b11f8b165a43d1e26a35c33ef02c66d8c82bf7ac9ee0e8ca6b8cbf09baf6ac2c671d811c25bca69a34e97cf78e1f3dd6f1683242b3c4ac5e215c89fd01e69df22d0139a2700526407b975375066245ac588cb028656a079d52e34300547604b150f65d397843ef0e51504a9a1e350d3a3d488646bdc44cb743150cd0b0fc474d237b234ce4cbdaa79df8766e45adbff966b367a7644762dc656f80748fa91a640e04d2fffba43d5ac738aaf76933f5ba7ab7d5bb0f2088c9828f5b11e6e496e5f3616ad2556d6aa9a8e8b3473ad23e683ee362b0f8ec6d661b49a59f85fcc17ed060c5141ee00fedbf109e533ce963b30539791df7bfc305e902ee81d1753a985f486367e3785dedceb14611c787ada87e4021caa9a182324c73554fdac707904f8a826dbda8f212a8d402d37bb527fe8dd07afa8eaa8ded0daa0ae9087d864a80130e0ad01cc3476167ccf7de9264b064573c0a95acdf76e930aa9efd06520baba9ff8d84b805e1e3ffd8e3962d2db83ea78b3576b9140e50dcb34974f10edcbac170c54ee7a5059a469f1c038a0f2a721a9517698cdf65f0d735ddc173e5f197e3b2b513c75e20a129dbdf12c3cbb9ea4bca70244c1f3573aa59aa9573d702e35358c803117b7267c7dbe4a8fafba3d161f702774b0c90601a608c057d4c68da969e557b5eb5964f6a12766ee731ab40d13f6df0d1fe2683c5e42d8d1411b86e1b9902e4e624f6e468db31e614f1d38dd61eda9333b63951abe7585012dd49a1a4713cd882cab32a8f3e37b0a38b6149e85f1cd94dc2dd46895f795831472c19d886f28dc2a5bf1574522fd148004330ea10961fd87ef7b51cd80fef698e71cea98966dbcf4f24bebbf9e120782ff4ee335e3280e13e4c2ee2adcce77ecfc62194fb194f9693a68083f8b07771ba74da3796205ada48490618453ba1d90a4fcbad8ae78c26b5114e1e240a3f4ffb7d1964716c0038626d8c7678d465dd9a66deba2b92a5e41d7314bb8b0d7e34ae286baea1528b9c9faf9c47e72e3275aa44c67757515588f4d49b95156e0a63ab88ab044b7013ffc76a6ffd363f98606f39a8e8c2c6aedd7bacc56e92897468db35d2987ac7e62043963926cf9bf0ab27a0cd8e8354897b7e76600244bb5a5c81e16e17be1e4b2322fa0d7b1b541b9b1f2b9f5404cfd61ac2c959a8df2dd2d12273eb65e9bfa724f54aa67e6eb1fe69ed10bf9a9a7a325b4254cc95629e6098db54278c2da52c34ba959097f2252e824dc48e1a77752a1515599d1961e516ebacf020acd776b6c8d9917927e91608e638ffd6a44977ec2ddb5ad8c614dc0463880dcc2e1380249df8c89f3e5da9bf42ac8c1f521b9fb5a7c399d0c1a7ee9a8bc8da0721c02e158246ca8a60a2d8e91323d43711ab2d2a8420093d9bc4db465eaec0073373d84f5cf96c04846ed15d76aa04d5aad88b2fc97cabe5710a25ef108e55382a8672f6af6cfae8c9535c3fa2aea0d109f8a90abd7773b6f0149435943ad794385872211b1c3e6608e8f02c58f6da16cb6ebe8b29a0615e001e1b4ebb07c6758f96ae7550545affc19755f065d0f5aa978377cac0b433b5bc073e0d957c0d4f75612311d7547ee281cbffec8cf1f49af0ebce7e432ba535803ff23a161181e371694e9db10c566164c6972664b7ba22b58943aa7993f961d5b0554cf9f060c67bf7b11d354048f6ce284a0d4537609536f8394aef4eb7dff667c40b173b826d329c4fde7e60cf5d96cea3dbabf7b0328b77eeb12c8144da9178ba4156b88249ac006cb257ae9230bbe02a21070e648fab47e613430acd28255a6b2b6e759ed0cf8239e9e3158c4a02b7fba2819f518d32c6767d3324378fcd2573c51862d0296172dcb52c970c4fe3d8683340100439636901c62d762a82644f1544cc4b5d626a0a1d1902eabda603c140fde7cf34e17196350e9e5bb4ae72cee3981850f10aceb6831b6e384390da07fc519c1fc0d77f060b22ceb509222e77f2c91976e838d440ae06d47532a9db32b611b430e99690e9202d2997c6ea4060b0071d087e2e87b00d85e308ecf6d0eecb7b716583861193b7f0c9e5c445b3ff69a0844e1a8e41c453a814b4e2086234650e07b16cb5d1d3f57eb2e1ec1cdc60e411988ee03728a56c8e5390c9cb8e5ef8e489f5e502b52f66bd3c180887fb8f6d3443e62335badef99fe6f6986424cf15eb80a97c285e84820996fdff50313bb5a15ce6b55637abfd11a5977f4ade6254fb81d11eda485eeb7568c08b83d24b64d206583439c625acb283bfeddae1998e86fac1d875c0cff691dbb11fb583853e331b289e6668e7861f08a4751b059db3d8845f67faea36e0aaf8b5ca3a53be798c29899a2a7642ba45ddb2ad39a01d871cda737d712726e05955170ea68bc3996ba5708f05a1002f7e080fa48bf61b8cdbc11a97ffb488c65592e1107acbdc454022a13f34edb65f04c768d73bb2e125fdaa7779aa1caea4e8f4e27a8eab393ba5aa4df584153c6e9061fa1288ab85b79ee0685392535b61d297b903b614d29e3fd804fa13068be8ced92c7d3dd3387de2c6281a96aa401c82a2fe9a3e2be622fcab844c06f93cce9203b38ffe6b940d90ae6534fb35bbff4e5466a6ca679d6517ecfb78fd0157d9e01f6cced0a1f69004ebf7141ffa6de5a79d53b99867b5a952e7fd5fe9cea5aec9c21e481aaa02cb65fd37fe3194c32f2610662b4547fadab35f21e722366e011406d222205edbc676bb89dfd8a0051420f253a2e9240261e887dc573cfd842a0b0f25a49571b27411b0f5b7fe7caac1534117b296d2c4e8465d55e258b51c601063157f875022d3b5a1011b4f3366e430c52336cdb7f6d3c502850ab548abead7c65b1cfe403adaeb7b9452442e3ad2cf023b6589c23ef0df518bcf293e116232ace172bf500970328fe436b152bd63e47b72e74325ff3b8406fb94f2ed20a749e5c5511e5672d20f87e176e67e2e7b73b844a78a070b310478ccba93f62d496c10389b2f19f92a74ff40eb0a3f45bfd1aee81cc9ad2dd197c758279731731756f4d332fbf7afaab6c5fd95e0526de8d9a8228eb6bc23010f0780266293a9d8230612e2f0be5e7669aeb404f00623eca9e4f3c1b290647905722f169af173b4244584c6363236b3736fa792ef21d25de141e72ecc7e2db4ce233b40b8a6c6f220c9b6dd1ff128a63f5c3a8497e38060e0a5a3bb06d39e46b1165ba12460a15d9bc2f600fb8412824154c4f62bff2215622653647d03e0912b51085718af97b0eaf7b092d3c84503d6514c9647169d27f3925e191b1b3fdd10256be8973716e9626c6c866c97e9ff6fe4b5d3815461b705c26d6f4c0f985c016778b5f0cd9bb0dd445883b6bf27b05abcc700b9357ccb8858d86c565f26d92a0ea971c92193beab0fcb494e0b6b151c1d1aa6fe2da46df26c02a35c70e641af2479d04dfb0a62e86bdf029db6df59f6f8f12abd16b8b430f51f8afad6d6eded2e60b78842364661ddfd0117e7ff14acbd6910572c39643d59c80f72c3cafe95360cecc64b608109695f714e306349006436b4be97cdf6215a15cee65f312efca9907c84259d21d3e4abe4e1e0f6119ecdc5bdd4e67e844220b608de7bfee2c17ada59fc8e73182c4029ef0bb0f195c7f5d5245ee74363afdaefcff87b78c71aaa75049afc9e5dcbee5b3bd38efaa109d0294a175a2099ac7a60aca59d4fa53edcffc101128e2cf72d75fbc108cd49eb67d7bd20aa9827131ab7a91c55a742066b05b5e5786f77e1d7c4db67899633a64153f4358a18dda214e0333a1aa00ddc6831b9790c027db7421d15e92cdd6d3fdd72629dda8e34af6d8b57531d57743cd59fa016a62a1141d24ece3122de6548c363a811ec96b0dd39f166844c2a7140691422ecb140d10b0b6645c33f58d85a9121b7914d4c2d9df4f5da36dcefd78e10275cecae24983bf0c25030646881d5290ee1fa2aa2bdd742e844448913aac4bb1bcf29e6933f37b7ddb8c38d8a8f7c7106367fb377449498bf5e35857f2ff0b1f95ea05751b5db1cbf03be4fa90ca2911faa73abcbfefe224063b84becd0fb40cec8c7131521ca7a499b2a073d6558ec695b61c268734895e1176e5192a546a3e0fbded21bd37b24a8655197d6617232c19be3545ed6769e0c0eec35fde58d82ed680066de85ba6fc4e1c8bdb78112e8af71cd620e6e08616520332165d1ebf58b7029b4ca0a0597efa83c01d1182f1b097cab7ee53e9a1ea2991d12c7905d345f786d940518c9a87575e2fab8f3d9792157008467d23f2f683b62ab87ab180773c3751676b1318e0a14918315a1fbf1d6c28e9eaa5673d171ffdcee47419c775742c8467c9b5e15df6925efe78a2cd70a637cd1ed08aaa579219033d64a72d08d2613bf1b4387af6ab3674723ac00a90c8739d1d6a8112f620310c11245278a96daa086bdd60c14c24c9c9302b10ff0d72c339ed03c6cc1a3db734192ae92d93a73cab673151a6e8a58e0c2e6bca2a57f08f6045499d71edfcdece110f1f659acd27fe9c9b10e817e394541103172f17f5930dde6fe6c14c44fc562f48d1a3a5ee80330f2581bc320543088c495e046ccd8deff36f60869b05eb822070387bba1f446e7824dcdd235ddc173e92cc4e6b739d69b35ce6b4af12f57c047493dba7fd51c4866d8df5bf330cd3ea6bf835501ee549b3d55f61bd9d9f86999983eeea362c5bd0f2592b01b684da47ea9d76e33962aabec1da619b622be15d8fdc0124c960a947d8c636095464eaa97a35f6c4d66228c4ad9d5f87867864a696887b24252e3e4f89552d870e22a99fffb2a1917c9921359599cedb230e1beb6b5c595f0a933e0ae8209d6302ea08a0e463d0746c2a3cbf451a949272cae9eddfb289385daf6b63aa05d2868068d5790667474836835c0de45eeef5b6ffcd57ee26b292d3606869b815244d1394193a6d864a4c94680fb32f0ef9f6ce82d664422d91082d9d77e7307788f995cee8d375f2952f97e8052ae5af9c74882f46f587baf983acef9e9a0919a913d71e6bd086222e166cc3f2e401190be209a69ed5a0d4115c86abee09d419635dfd1d6b9edaffcaee2b28e73778fc7e7c3542c4b6b8028d43b198185f783596cca6bdfa946705f470523f5d0a9e1db19ced07b8791c767b6110a38e17b4308ad72bd4eb7a701695450c745b386fd2e8aa126c4f5055a587061c3f05dce2a13586b5e2a2d7b6072940d93fcb9d14ab83461097af770d43e833333be774c93f5b43effd88b2d2441775d2262a8051c3701b53a0ed2c5e844aca7e7d511e0e914ed4fbb625387c00765f95138dfebaf95a3542b9f80f74aebf1f49aa04db9ed7f510c4c8b98570b5cd000d88208ca7f60a1fdbcd5df9e8a1538300e3fd9c7148da5b7a1a98a57a904a83f50fec7c6828a4d19c865bbaad5bc4e1a4adead1fdc31c6e45e252f9f74f761103ac52ec8e374c0a8d8bab3a8e65b5e5021ab699ab2093ff00f156209c35b99e7f07b052479bbed9536e1b3fc661a952212efcfc176d36a9f16d1381491b817ce54cdc7fa118c0081059776297ef8fa22c63438f89b93a263e09a7223f2f81306b40901263defe74fe89bfebcaf8e835638856b2ae20a6817f78c6d3b97600d70104ceb98ebbf9c52973acbe1673fcbb3a14b551844ff3bc3d10b6103aaaca3c8a3d55720d58847879eea7dc9f95a17b2f1c1d5238910daee29e5ebcf3d1014b6733cb5cd06b381f274310a5897cd7b01a5b6c0a6ffcddc4b40915786827c9e7790580b0fd6afd8ce50bb4175ed475cc2a07fbd4d0bc2834cf1ccc22a52457237f00302f58bc6516def3e26c0d386445b765059851d4c69298004393061df9eefcbe390b8a4829e8b4b562da24960db46b627fb18b8034780b5b414e21c3a76ab768e2c9150e23550871ff28f89838e55d35c12845b78578c766177377bd0b0ac18376febb21102f9002fa710a00b3ba4fe94798aaa682f24df5a0f27b558b3b4239cb19e36f34c9cae13aaaacdec8095bc36f773eeb32390fe164e5c77dc30f6349f5a9a07f573d4a5a2e44ecfd4d9cd53e1129f1759bd940db13e613ac2d06e240f42861372cbbba7b1ca9128657f5eed432e6ba4ca382a8376d1ed04ed737ace1451aec29679f718d860cb7249d0432fe6ab84f209da088fcc410688b93a738caa778d2496aa5c52ac370c719ab271e6ebe802d05e4678e87fc6b1ed9406b85da6a1e5e130e6c46d3e1f6e7d579206c19c46430b4a2a021c1c0723410791c15f8747b77440cabbc4375ca8e2f95ef2f12e2620e9a8a4d72d99c157958d142bb0eb872d036370c220bd096f5c27d713e165b72a73b3e49425f82e4a1428fff2379d000121402e5c04a75d8ec2ff7839180aab4481cdb31328f79c82d50b48012796dfabcf19b784127a2eacaddbd72bc03c8d283da954d20c42755d1e2d93fb7c5b90ecd8eddcadd97bd61207a871d1f0561060805584dcfa5bd6d0368e75da68f17de8323cf48a8612b33237187e5c5d448e904ec549f5d134ff2133de9f396005677c8b92db0cee862b6acecfe9bc35a7bd17ffb10224db8cc26fb08dd36f058aa4d95b744c8395434fab294eea94670a27e5bc3b5c3d03b4f3d8414d4c3046cbbe85b0c49ec111c6f73cc5c474de55552abedf64ea5ff0d51b8d7e75e821084058b4c9cc48e387473cad5ec80acdd3cb608664617541e899bf350304c5031a5d06de7b9407bcd5ae0a3e15b43ac8cb26a5747e7054528022f18978c83156791415ed9ebc6cfa158ed8fb939f1ee75ea0f7ddf20078dd53c2ce6d58c1d03d5eb61747dd7c90dfdaaad5c42cd3f99af29966c3a70ac839ced3d055ee03e7868ca3a2c0500a285803464e2f15f0ccfca358a9c62da6449b8c46e9312146471a30e44e0eec07d84cbd59427b5df5ac24261fccbab66950e29afad402edf82fdacf8827a0f9dd5128a6c1d425de71374d0f3723257d08bd0eb3b779f04035ca1a2fcfbad191b626aac9d7fd1e6547450f13ce93ee6bd1d493218b36c1526c947b7fb4fc078179330616dbcf0a2b0022f407820bd193a1e8fe30eab2911bf9d080eb282e244ba8ced7a86db72b550c8431ceea5872606513fd2b5c7952cf581c976efb720e6356529f45399922a19320831b3cfeb26eb4be327225f71580961a4c4d5fad23b51fe258f1720f1d2107d2cebd175cd4de6991f9b7d2f62011df3c51fdc10798a5369718aa07bcaeba6ed39a7f47d30fc60bbbf80653394cba51181b35a0154760e9e38613bf8167359a988e1246e29500b90bdabd6807a3c8e0356947501b8cf92a5816d43c976276d83ba5958c6f721884dfd7c513348ad7cea9864e71d015961af78abd7a3af2518d789699e326de3068b777fb655781eaa7294c3faf9a8eaa7f0c04c2533e16ac03784fc520977d355254951300d30cc8fb4a4f9c0d6c08cdc5bed48b5382f16aae97f0c853ee26170f61a13ee77f45f867dfeb483a2c84efa2dfab5dcd00ffec3cb3e89435857d3734b29ec513cce25d46cd017e812ef93a613612f4f2093daccd2ca80eaf1ac27b60e5791b69cbbd877eac8d6fe8b3e2310edf9a889b6e4d4b1b6d42f529dd6a1ad70664c02a7743191d5465217bd0efb8d790a1b050fd9f01be065e09db36b821c0a94b50ada051308420447ea94ef6eeb03233cd8562d7bc469dd093c5dd5958a3ac2480eba1489fbe5a85363f1032a67c2d78130c0cee97b205d6169214f5dc982f9e4646522130d87ff2e29fbc7631655ecc7432f809910df372234296026bb8a064fbd2c1c0368be2547dbc5e4c5b94ce01215d7a61532d59b3594857a9004472382b2d4cfdec14fb808d10ef5096502c398d16a920fb6f89f6f70f660019361cdf5fc3010127aade8cb6b26d87dae8e45d3e3d585224f3292e768c0b26573b30addbad5202e3deae9afdfc464d5fbf14d0e5cd7bf05b245801ccb07dbd216821d64d6881d74ef11a213c988ff547281094463aa53b0e05575d30db829772108728abee8cef10d56bb4471854698eddb27a7e503d4fb6f6619797f39498f4ca3fa78a761b5ed4cb87b11815c90aca6819e4f45aa9d6c5c18b44de1c1c573698dc1ee90235948ce43a6e4a7a4b9c2c6bc6ad15b44bddcf04751fc689b608597af417549d719663c96ed7b70f97e17fe1e05da686ff94bb025a7d2c8d0e0551ffa2cc0ed6ce7f98674d018418a23085fdd6a73a0dff26578aeb564a06d3462187ce8122e1981dbf080df2ee8c7a5ebe7d73f562d594fc7e0f2693f149e094c95dc6b3eb5c384ad3f1e84959bba4c58b9ee4af38481d34fd6d78c08aa2733467e22e193524958f799f74793859c031016fc4a1ab80e8255714be3fc2e52ef887c1e41cfaa5333d881812146faeb520c8a01b1b57ec088334f3329d61793242e9e0ed34cfc69007af9afcc58f3381ab9f6aac2a253df71b7ea97339f5450825751d7f978b5c0f709f57dff86a4e01bfd3ae698578ba8ed21ed43933f9c2c49e62ce6ac5f21a14a400515686ba41ebec70e0eeb0","title":"1206. 设计跳表","link":"https://leetcode-cn.com/problems/design-skiplist/","question_id":1337},"-3":{"title":"预打卡","link":"此处正常应该是链接","description":"让大家熟悉如何打卡","day":0,"tags":["预打卡"]},"-8":{"title":"预打卡","link":"此处正常应该是链接","description":"让大家熟悉如何打卡","day":0,"tags":["预打卡"]}} \ No newline at end of file +{"1":{"day":1,"pres":["数组的遍历"],"tags":["数组"],"whys":null,"difficulty":"- 简单","description":"```\n对于非负整数 X 而言,X 的数组形式是每位数字按从左到右的顺序形成的数组。例如,如果 X = 1231,那么其数组形式为 [1,2,3,1]。\n\n给定非负整数 X 的数组形式 A,返回整数 X+K 的数组形式。\n\n \n\n示例 1:\n\n输入:A = [1,2,0,0], K = 34\n输出:[1,2,3,4]\n解释:1200 + 34 = 1234\n示例 2:\n\n输入:A = [2,7,4], K = 181\n输出:[4,5,5]\n解释:274 + 181 = 455\n示例 3:\n\n输入:A = [2,1,5], K = 806\n输出:[1,0,2,1]\n解释:215 + 806 = 1021\n示例 4:\n\n输入:A = [9,9,9,9,9,9,9,9,9,9], K = 1\n输出:[1,0,0,0,0,0,0,0,0,0,0]\n解释:9999999999 + 1 = 10000000000\n \n\n提示:\n\n1 <= A.length <= 10000\n0 <= A[i] <= 9\n0 <= K <= 10000\n如果 A.length > 1,那么 A[0] != 0\n\n```","content":"0961e884611df7d4ac47a79a9e3b6f257d8e3d84c28815f2546a3c7d65595a035782802456dafc2c2809827bef3c5c1bd14d07d3813a048bf263f62bb5fefe2ef43b2766959ac2fc046cd2b7869f517a3af7328790a5418a3bf424dcf5a2b5c05f2ddd042cba9d63203f137aadd4daf214bc076a7bcf1605f7075b0c830f9d54a739a8fcf3c94e787ba7408641de15b5555d00b17a292354cdd22c78eca5f0154c772b2568cfe02b4566c12f06df1c5f22abe7fb7a3704619e1ce97a49f53d2a5aad76fd4769cb7def9d730d8e66087aa517c2675b22ac8c09619ac733347e81a3415b9a53673ea5826c39bee7c9ee9d175fdb410921ab88476e916b6c234dd0ce03d5a3ebea6aca3677334b31191d33feb3e4209867a62e65b9804597e90b8b0466f0ee0998a3a21ca93c690c966349e9911b59ede30085b21480f11ed748ff424ce0fb1e6d3b75d8d16f958cda02d2c0a089feca80a011af4a8ca6605d49fc84caf177a6b378c756526703556b829604bf8b341fdd92f78fee6feae7fcb76c1ca251196530baf51721f42f77d109389c320efe9abf4f9fa992d34fe591fbcc2951477a72dd0a6688f27a52b8bcab7fa7f4f7bbd861b57175a797720d71c2e19445fefc8c4f9f291da2552f69c2382d639c7ad8d2ffb98085658fe6714c6b64d710753759e7ed42fb9e8f3e1342728acfe68f75dbde8a64b90e04d398854c9a9f4e80b22b931043b28a40e5b0e8d71139bc665544feb164be994f1e29680156e01e536052390b2f33527dcc9ee0ec256490ee9b8147bb025cda907205ed003f48140ac92e491e6efea2bdcbff5df4e4e323ca4ca346b47e97ee21ec2ec9462c705b735abfb7c391bdb392c56463f9e27f1d6e611607741cc3b40bb49ce4a1fa4a1635e0ae2ede8f899bc4ef5d9a52173b063e69b966c839af301776c6187508d85186b065d6d9bb673d98a23c19770f5281789f4c7b45ac8e05b23388cb6bf92ca3489cf8e533833b72edf06b8d222512ca9de6b4985f069cff4f37d7f3c41a0aff5fddde8dd66f994a166b492fcf4290091bf866b3c88da94276807070b305f8fb74bb8c50a70b10b8d9aa636e9470dff4d58a17cc75500b0f563c82cd0db5bc33b0aac0932cce53da08fb678755e4fc225b67828d9a563a968b050b253f277a36d9df9f6b114db3e0af2b6352946090989fe59b7928e548a13a9f0db226cca3d4d95a3f5d6ca0459456451229d8134a29298fd82809b841ef30e6679cf45235e111a7fb3800a4a353ebabacb497c24533124ebbd0cb243b1c21374f6a294c78a3796bf3bf6fe3598db51c64eb22045b904aa7d20a58584b3adf4aa3a967fc67ca9311c49acf7f2166c9d8ea60392d0c690a93c761247d00d34d9f4434f733abd6d29bb61b2a2d4802e3f3290490464c961d3a76a8820798a5253edf78feac30e5d8a44e11df1ed041a0126aeb05a87b7ef2ef4a986b9dcf0692360a7ce89690b66b7fe44c39edc33d5cb2d0f0b5f9faa3afec9ec7f99d6e85074c0b65c1e7c075f9d1dad1a377d5414d35118008ed5a732b2ef3022754c86f0af2c5ee2bd395f4fd128e9119681620d78e5ff3246ff7414862a33f54ef71702465824043ea75a4df693600a9c5df185989ac8d726313eb6ed63a8cad8bb10541867b22a76a1973656525549bd47788b2bb0a15022e96e76efe4fb9da8f9ea713ca8719cdad147eb190008c0a2c4d688ebb0b23fa72a9789fd302c12f046c17be1f9b2b94fcb92e66adbdf715a8d3ceb98d5e6aa21ccd24fb85b19008610fd87a73339b01b486ee6d72ab87606284cd02a9a6c2275e8c294b3c416ca4d0ddcf1b31307b2839b8bbaafd4c06e627924139344182cfb03b142c362dc9cc952a72104113e73cbc3bf51949729d83c58f8b8bb807dfe5813ee165d961916b929bfe2c781258fbd37d079c5eeae2ac1aedff334aa7d794930a18975006d86b3dd353ff99c21449aa3561f8bcfea18a0ad754890143d04109d6aa7e036f5011dbdf7441db6dbd0bc6079bea4790a7e74b31bb50d61325b374b1cc4ed8906aef52dbb55cf84e47f8cd4974533d2ffb4c5b245a1df84087779c1a14708d071e8f853c7c5008dd868ef0c6850c0b99a2afe44d0b94802bbe7e211a77ceeac6c90cbb87524728dc32d8cc230325e181bd44a666e000e7fe9c09f8d07e9e6f7692e32a3c8a13819233fd537d784341d58f937ea176f82e50bea2ba5ed98ec7bbfbb7a8cfa520d80e0271b007876ce072d61c7536723d634faeaffa0e0bdab2c2048c99b72c568e380e91212b2550a12bdd2c78c21b26953470fa7573f39dfc5a4f5228330fe9a841f7d67518dbe21219ab56c22d4b236b475fe84bcaaa2be690a6d04efb0fba234416c2719131ae36ac220acc0f4814acc8a32d9563e3baea8e608b27ea9e4f3b16ed19ae0e2778269767788ad4282f87c4a1d458c624dc873e5f783e6bfd4b9d9c7208e14f5cccd457a7ae5e5a0313d5f6e563932f2985bd997e030082db407678a96f9c689cccf6aa7418865f8e590aadf5037b9059fde0d503741a98042ef5071d105ffc9d144016e1b2a8128edafba3869da15d45edf86f6fe834791dbd238651fe7315953c059c6bc0f46a1140512ba01127696dd482575040586a3346ff42027778eb52b3727ee9bc5b44379e7b4cb432ca77346c7b02452536ed21600d2aa6b531f5d19eafa8db35e8bbc0b58eae0927fea0d3d3a17ab9451803b5567893623d59f9e9be0fc5a1714054b4edcc6ca7dd3b2221d886724307ff6d178c6e365c61753c3efdc1f3ee75a97a34d88df8735e3703753209870383f94525d5d3b9eb1ede774bddf4fcd1c9cbc8056b75d2cf4a6223fcf7579b4a9e6f64de0b344121b7a986cefd36dfb637d77b845e9721ab08f32f3a7e7e48dafee8e2ca3fc54fd28c31dafb327e4354b239998415ef630602cf7ec94a2f9ac79cd96c2145d0e30c3850e61fb9a7f1bd86c1207609000a228eb9acc2e1276dd655d84a2be2b1f1a35e2081b791d69fa7b98dcb8c659e2cea54a94ae1b1592011d5ed92d791e7c47a9de9627d3e28c2e95c8403009125e76fa02fe9d326c7e54f8e2d5dd7dbfa3484c28dc1332e1cd719af1581ab29de64df7de7aa6de5dd62db9cb684b6c9dba8b1cd709ffb5adae2c3cbf750ce08f1f5c91fdea6c87b01e74c720c3dde3a049f1c5f88b9b4be00f601ebf143d13acbfee79227adee3ad893f75d7485e428de08bafb154925266805ed203a104c35ed62ddc01059795147ca10bb8b8accaeae3a478ded13d8da8746728d17d694ab35c1df0f5b490556ae2f871e9bdf3341c4449292d1f359decfced08e0e315bd0347eec8fff898b92cd51d26b589b665efdc7d136edb07d9a3b0659ceda818cfaba1e18a35f5b9971bac1cbec1f871816ec9db9cb66f19e2f44552bbdad642988c725e62b503ecce8e08d810a05d52c4ac2ea239d9f4c3e9715d415543e659bc0344d3e14b447b2dc30eb92b3e9c6766fa267bf611382fd6a457f220e3862cf0c60254360535f646e14c597274c98af0290bfce3e70e0550603513d89ff0c35cbb44afc9e3cdafb0b398ab460979640452f7359d2a9885b0dfc6d8af88d4f6ac23abf3837f3dc676e133551594f65262048f77c3739072d442f17003e418f7d75bb10bacdbc0ff5b2d4e11a53d53cf6df3dcd81d8998f2cc7bfe3264b2562e58fa0457edf39ae5d58ccc89b25b0c5a010d64ef46e1298501fb4e1186f25b86c46d755134ffd866b56bb096c2746ac72e9287481314b65896010988efcf0b9f5e589fa13dc29d6495066768c72f37cca6e1166661db583af634499aa053f607f20f0493817b267295d81ac17f36d4b34376879107c893081de99208bcb2d72e2e106627b154a324a3be157605443891f20a5fc95f5ee8cebbac3757f583d97135152710b8fbb2c02a48a93df02a24def2c5c852bed2c1f9b6856bdd5286ffb8187e90aea6cc4de07dddf205c2d305dbbc3951f97133d5324dfed21d206f1476e826bfcd6b78f7e26e82877e03800fa8a9e2baa972f74885d8d96c6a566f5cf83da2590e165061024a75ba1239773d4eead3b25340c869411d71ad53db3d98384b1c5ad9f1b527f171f48235432ecc278a9b5334af86fcda5c243658a575af0528f159be129f81341979ef0ec95bbd2106f752fc46170b400cd03ba177b9e2d50efb3021970d8bbc6dce5fb93e6682a0e0f7495337943980c6683ffc6ee506ad75874eb23e43b25c61c7c50cf7c77d0889de677952b848e714f1c1b02e57e4aeff6ecff9c4cb8ce1616f56e5c24eea1d72cec21a43b8113f102fffd5623c2006dc888b209a2269dab7659492a1b029bf01fc0f6a8c1e1301d2229a0ce4a0e8039ec5d4e6aa550a78a1fb0e01abe2cdbd0a106d78af8a1bde2a2c79fd6501421401ece870dec2afd01378def0eccc9377bc1fbbfc58584f07474bfcae439093c66f1f1a56a680870927fd2c49e7ce84f75f505bff43a236877ff2c88adb23bf5f74ba0eb99e8fcaa59e13c8c35c8069941831584aa8feeb5bbc4217755ba4b361003f43e2e53c6e98aa605c15c9413642b509bc7774f311202969cf7758cf6bf7cae008ea8a541697d763af4ac5a1486455c77aa17dcdb452aa5a6deb0ef1b4ec6395cc41f69aad32553a8d2cb359786f231d2f5ed96374babd493f8503d9a0f03c3f71b448d46dea5674211e0c07a4616dbbd59585ef98c7dc80c2223653fe4dd12da62c645b639dbe6159a2529b6b43be4138d86b26ad5018829a52c6fdb822b5070b40a2519eb410d90e384a319f9b8d32137b903a563a54ab70f3075575c8927dcbba8a1771676c1ed6c0f176608b54b8b697b3e28064fe2dd6e226fb08c7390f4b8bb3331c4212325953512405c4368f23b46b058b0fc1e4dde9fade2b28697ffac46f790f0f06e3189814583db66e031616e4e53a0cf739a00bdd09d8a8623407bbcc1cc0fc9bfc08de1c936f2e4d2d9ea908ccea2ba4d33ba5b3fe28851c182295833431e49ad054aa293a1af44d4c38f07f223660969955bdb37b5cf5b987f78db20761fd01d2f5deb9190815cb0ce909ce28680bd53f5917cb04bb8aaf7a62e131b53d480efe1bc128eb38d0576c8403bff4042a3b032e7f9ce80b08de891acc52441148c2b9f70a899789e0b41fd475441191046cb8770093a4ed4d9f954372175fc8a1779e0877ed186e22257956cfb5ed2a3395008927acef79514ab34478f0d7097d4febe3c6977333018509589e163d24840067f5a534ea3a45079816aea8894ad8ce19fbcd3b2","title":"989. 数组形式的整数加法","link":"https://leetcode-cn.com/problems/add-to-array-form-of-integer/","question_id":1031,"issue_number":4},"2":{"day":2,"pres":["数组的遍历(正向遍历和反向遍历)"],"tags":["字符串"],"whys":null,"difficulty":"- 简单","description":"```\n给定一个字符串 S 和一个字符 C。返回一个代表字符串 S 中每个字符到字符串 S 中的字符 C 的最短距离的数组。\n\n示例 1:\n\n输入: S = \"loveleetcode\", C = 'e'\n输出: [3, 2, 1, 0, 1, 0, 0, 1, 2, 2, 1, 0]\n说明:\n\n- 字符串 S 的长度范围为 [1, 10000]。\n- C 是一个单字符,且保证是字符串 S 里的字符。\n- S 和 C 中的所有字母均为小写字母。\n\n```","content":"0961e884611df7d4ac47a79a9e3b6f2477863d84c1b032f243483e5a435a7a0c5787a92a74f3fd1f23c502d161fbbd42a87d4088992f12c5be23fe2bfde9f36ff331672a8bc6cef10526cfb6c68e557025f0789580ec089727ad24c0e4a6e199566fce4462bd9a3c2832137ab8bba2fe3d96c1ccfec31329f917540c873870ca271d822966644e524da455bc4cc40dbb4f6008a376252e43c1e03c72f48ef103777b2c2868e9ff2e5d4c2eb98118626240ecf6910413761da95ab67234b13576379716a36801af53404be5ad8f5d2d729d2dc26c6a2db3ac0b768ecb351d7287acacfd1f94ff65e0800f4bb299a1fadb47535dafd4c72e0714248611330033aafc4d8584bf9a4ca04552410cd25f5b69dfd99001fe14b64a89d3c515a38865b55b3dc78253bce4db08ce744347c94522b5817206e7b56ab8c07abc9c40ea259a77e00f508da85d64a7ac70d2cbef6880f0f53e564c6850fcd275f3d67e2016c0e7aecb39fd950a86781b3f37020fa0235883ac06cb1917575a64f63ea5d7dc2938c315e30e55bdab4e20a15352b15405da6f1895c5a41dfca12c4ff430116e04a0be665aa315a0658bc67953adb18e4baaedffbae173b66c756262c50d47e0e3b947dbe75b68826f40b33d774d667a0608d8638e9727e5c6f74bed955d0e2ca351b3000a59dbd243f4aa8e10274074acc9da829c51bb24d49f1085f94e1bfc74c97b3366418ab069eb42c35677011d88e04a42100dbd8531f7894f0e4678615ae73054579ab4acc05c56d40942692fb9cce7ff869f4bb80248b6b6ba9262c988eedb877f3f49027eeca5bdc9e75df999d8f956cc4f399efe795a87ecf98b6d51d6f77f5c9e90e66790afef1ec0b74c06a88bffa5aed9bda73c708e2e6f7ccbc18e88973519a4016ef04072c94596248891080165b459c232ab00c0cc67ddf3bf0ec5117fe47a0936c6d3c09b6e524862ea1d728e4196e3e2d42ee5748d7715c38404f95b3953fa1f80a01c7aa84680121fd2fe121e957319bbd8b61acb8d2786c155f7097b3c6df9f8081815280aad1b97bcce75fc7d583a7cf2cf58fdd665984412139d3cbe79e050863c35da447838e6809db1b829e4eaaf82fcfb7552c534220096b0cf8ae96dc1069e6441b454fd46a0fbc92f25b06d135d1573672f6275684b1d4b5bf4bb7795fda3fddad25feb384f29515ec889309b2dfade03f844d6dd81c2eee3ead37cee218af3a6ec63a29288994a679e10827bfc23f6bf0b67be44d43b9cf20b0aa7bf44e1a8b558145a80beba88496bad4b7658767f89d68984fe3c43512b0ac625fd1f73c1bf65d382823de279438e90c3fffd0eee7914da25e0554c9d429ac6442157dafef28bf2ecfee0c1414ac99cb8b99719ac365ef55bf7f892df4fcbffd4ecc44e55f6b2002c26db37d4ee05475391fe49099dca7f67b08593a31179c58535de0fd704cd67c77d256874820f2bebff60cc3db392731154eb48149548729acd7d3aa6b355043253fbddc7d79addfd11ac792a2a266f01891f3972783d0ecad87948da87cd4ad73c090f60a8347803f91b6de19e8c1985efcb9145b8e577477365d4d505f1653fd4050964d15f719039496a22a0fdc47af8697f0eb68d6d99e7dc528d8a8266791ffa6cd61ba9ad9aa00876af7539b06b14766d432d56bac276bc80b83b37052587e545f688687e542216d69d9278aa984e189d10ef10f394d98f194ff95acab53991583be141eeb2fde44ad669831f2a64f1d068edba164662637e13f06bbb1cce31c989a0ae095404d64a42de3fbb7bdcf53d2894d50149e19404cffef56423bc5bd1ca8eb77607506f131d3ad6885f2a2baa49d7679429f93d056c1eb888e80c5373324991c9fc775875c5b6e00484d562bf4975a78fdead8ba79107d4ca8b38cb6ced6a50943c8ab469e9e0a31e65d6cc00e5eae48212f1f733877f089b9b01db01c1e43386af08867b503480850a93aa183e642d05d63bdb77b84c990a7184f97e7e3f5202c8c02d1a83398468a243c5eaf11f3424ffdf2cb31d7842be2f3700ab4d618f7388322cc1364e6df1ce29e28deabd29a37155dcc738ca4a8521d3c69c21acde39690d770413da87cf6b1f7a3b0fa6cde7cf5e5dc8aa479b69360671cfb7c6a230f3c22b6402c758989c750c7e3317188e09cb2ba465642deeb4c3689e4505ddf93e3ac30e8adb19e0531c2a5545ca87a134a947f90856a4eaed7edf90c6bbb8fbffa38320b9524d4ff95c9f52fd3ccb616436093c634fe0e7f37d0888f7e00a8b85d76551d14e1dbb7a012550a12bd2233b46cfd60a8ad13ff8ea3634519cf7ddef88c7607ae67b5b8b9157369ccb40d65af0caf6c3e2cf408f6926e37e307068c633bf09136e16c271d877ae3edf5943b10f3472f8b5cc24d661fea6e7c733de6ab2f537694fed12a1605cf4d52da8e14810b5ab524c2212f161fc7e233e1b377f6bafd73531b7c111c3917d1ac04a6dfbfbd7ac4f3272e857a6b3690b00bbb3b14754dbb0d137a84ce655434c6fe8bf6bd30859696269afbe5def265c0eb9e1975093933281863a5cfc5892ae950b0e21b71b13112769372198cb4130a2d7338899d9089842cc53bc896abdf66ef70306f9b8c497cc4492ea83e3307d8fdac858acbcf26d8ce93b5ceb47ff097289b04b2637d85155ad2ae07734253d024d564de21d32426ebba852bf9097d7f1db3ee8d0eab58efd4168acf496d7bd33e8007501a04c2487315951aaa1f15d91e4221458b4a4ae61ba9149314899d4201a0eff6817df2c0e1d216e7414fdc1f3ee75f45034d88df8731d3a5c2a7023880c9ef9091fd5d3b9eb1e893f0291e3b98dce999a057a7b958a650f37f4be7dea03ee1f64bd44704d7d9d8bb5f5ef088ffb2a916cea468476901efe3e2d23540b96ecf3fe9818cf50d3d86595d87371210aaa329bc505bd0654568a2dcb036c9c88c3c56c660ae4e34d7c149250d8f5e1ae9ae6243f6e085c67cdede3cdd76e23824bde4a37bcf7e689176ed5b787f5b5fc938dcbde20cd57a329ff12a2b65e3d5fc8e6959d8a9f8129dbe9627d6c6d96bc0eca4a1c8076b245e0348dc62b899c2cb7635edea39f70c1e8a781736e5fc106d75e84a42e8d2dac2fabb139a1923dc0c7d5d4fd9697f1e9d75792b253819e8688a31f9c14b8bb9d01def5c97a07b34a740a3ac4144cc34e198ea09dbe33b10a98b64397729bbcfcdb2eadb510d893f75d7485e428c34df6b25a0a29740c51f32068551f3d9e6c91855e576b110c964bd3f4edccb0b33a569de448b495d5467ac4598294e235dcdf1f40494c1db924ef3ad79a7d06900c9a9bcaf310d5c4c7d0d5676409a36133ec82e2989b89e718946b50e81d1780c7cc2bed8e5e9a7849179a93cfd9bfa13432f11a089721ef9283935dc65b14aa8aecd550e28726427f62a687642988c725bb01503ecce8e0c4cf5e52cf2c41cfb66880810535b44efe15543e659bc0344d3e14fd09b49927ac91b2ba93093df80ede695882f86a546f2b151262cf5b286c0f255357282b52da97364c98ae12d7c9ce6c39a71d52034d7da38c02798efa0da8d66696ad436bc8f8689ef9134b6d361e9be7805201fc3fcfab830a6dc032be42579599213a6e354c444f546a74468f32376b427e5f0517003e41d25728a03afa8dfc259b91c6e35b4eb63ab29727abeede8dd44c86e9a22610326ff49fac5468d228b900728f84da34b18092148131a0275dd650449ee1186f25e839049b1c0d6591cf3802a760227303eb37bb3674c0754657c60931b19decd1bef3d581ae408831a24945193b8072ba329e6e5a6f66469f83af634499aa053f2b39b410c1495eae652b51b9e549a7e0c8b3f1def4d4e727f5054a5cb02d0fb0df245496a7c9fbdddd8bb55ff8291a07cc4720b5d695f5ee8cebbac3754e3b44c30f381c254ec8fe7e1ca4d8d68c02bf04e76903c902e23654c02c2afd863036a3dd83ff3bc06cc4de07dddf201563645df5c3881fd90f365d60c8ea21ce1aea716ef165b093f9c82a28af7377e5715fa78a8562f0df357f8e46b68dc6ec66ebd283ca3e90a86856330efc71a1239773d4eead3b25345ec3c8655afc7be60f160f477b1b193fdefbd2d1b6c3ec95b40368f86c079f8f57d95b7d2fd18d6092a8292b943f9be129f84e6bca85daac87beab342d326b04f6ff729b3656e5a3ae59ead27531bc8db3752810626818247242000d0c7795f5d9fe5094e66f6e95a17c332b093ffe69bd37779206abd725a1e9663e5a6edc51b3094befe7d983d12de4eb20021d767fa50249b016ea351d6fabbd88718021acfe2ebe399d5866c18c0d9cc10e3f24c015bd5406a4d193e4dfe54067d5367e5754e8363924c43aadba4ad90cb02f6521e757c4d53c4972dbff963f7542a3d790e5645418265ff089677752475296826c5ba43bb9b84977a3096980bc0f163d1c295f59bbb868006599f3f1f457340ae5ac93f554d035497e9d68dfdbbe45c2b42aedd2881385286b0e92316fe0666b3e20207fcf72c80dcd48d20de10c8d0b6c2b6e7b3b4a213716d305725940b16d6e5349710878a57266a5fec0bd952b69beee9c8a861a597ac24b7a39b836c0cbbc835327b9bcf2600dd4d209ea98b20a8f7b2cc2e609434816ef377300c4bd68cbab2638c6c6566205a7306a9f34935d135e646ef694bdad0a15fb6f1b98af2c05d368ba33ed878e97b0562b65d7d31b753f8bb2149a046c78518c4342c116a91cde1e8bfdcc7d9448200d229f266d8fe16ea342a9eb71915beb7e48913202a66e54308c003ad09abefc8331b8d337649e42872cce862d4a6b77b69bf53b963f76670d0e1792de375217e0c346efad28e58eb7cfc23e178cad11e2e6375fada8fb6905b55e2066ea2d441c5e0b11dd67348e0fece27f22ffd8ddcee4de909602ad32294e3794b58d9b436c52cbe10559626341a1d3445cb9701dc1b9d97861db1a7c38c357f65525496950a2debb91d3e9c9f1073eb6d97c3629bcd47394cb3f3950475a2097511ebbfbf4af3aa6f3c97ce27b221c1aed53a549948dc676d9bc76236c27d229395ad39893ae71b3ec999ce38483bf6bf7bf60b24dafa9c8a3200b235ce0b6e0efa51d8cb7893e7025d09c33dfeea29031e6f4eb4528765d0c4e0893e1fa3bde199261299b6e87952e82b99898fae3255cb58ccc953b5b759a84a1ba72468e8b2c0eb2591801d8c141bd7bb75a19a0ceca13925a2a7f904a82df6ce71bc8957a63e3f29da796b6fd593423f40d9adac88b5e6708bba84a34c21d97bebea08680bce396ca6c1e2773078721d8983b9801118dd1024644a5429386fce4e840c3d7bb613d64d24cbe0335a4095dab6130fd5664472bb761a6525c6c860a10a0d193f11c2c08db8986352f5eb7e4bdb7e1f14764da8a58a4e160e58c310213ed758f03d5497a1583ab934230fff803f5eff167f73f41101bc02dc48a90e80bf4434679b6381211a038302a38a3e069c0783517bde8bcc687e8f46316766018e819a8b0606c3917f67309751583886588219c972c051a999c47ef84e553e23b945b30744b7101dbaa6491bbe2819316450608642eecae1c94d62f13ff385cf17c7e9b393bc8b9b0d292299c9828ebdc436fe794188c24b030da1f949494621c0d7f437c1eed3febe16928fe125c39967f26377b894cb69fd38fe5af738ce71d992aa5db542e66868fee8b635f0c7c47c01df181c1444025092a4255abc45ebb3c10ca282666d597b651d4c5e34a74a3623155d5ddf27c6cc637d015fdfe5a28dbff93e4051587db97a1817f1ee5c4dcdf728a735a56f1aa0cffd78ede0afc072763ff864055732a5cdabed4d47bee4f868227ef3c7c495de8b5c69f250c1c2095c2828a6570fc12b6b61ca19419e8aaa64ec8f3a89862f0965b59753cbe8a91e6cab1ddeaf4de5837dd797446f5e1ac4670874782e02a2f939aadb6c64f8042d5f28c07d96d5e14de12311d28e1029958ae1c4aca476dcf4ec781253d7b5791c064d73f843f73f57b64f3789318c4ee51c03a5357676a34381428b11cfe38e45a8b676316568f39389f1844cb5bd71f3496ee855c1e6e2b095cea3fbb45497befb073d769ec76216f3ead3b4a0050e81db4745e975b9906bac678d04287a9ab3fe38ab87ff7d1993c8f8d70a56665a977b6ff63fc1c50f5fce63f670c1041bccb7245d45d638dd3c5706733170cb383d671277124cb6f776ce39447fc80d1e48010a8f35166dd47b34ee51f6ae815e07a08e94d398ef0e8f1afd0a001e8cc0a93aa5b867ea2411bf3834ad55d03078118d54ee15c5735840244c7345b1a630f11597d8b267037b0c981cc8c24894a51ed43cf27293470e53a7f13599e4fb9eb0d57494b680fcc96377441e3027b3096a663f46cbd72195d42d911380430b493413b687de4d1accc27b0ea7235931e875da5a922390ef44383568b525d04efa6401efbdd66d5bf48d41b65220339c189521601e2f9c672813677495fc24d90c1ae761f791dcf289475ae6dddb2b49567bc87ac2c7be906a540b41c20b48ded2d6e0538dfc55750c3e8dbf272fa95bd9d1dcd8d963ad56df2f7029fe4d4b8cbefd40070b80c4f73deafff3b0581e2f13bbc6f2a3313d2c72183089ea22765ff0ea5bd90d649f6590b62c3d3bbb515cb0c78b26a712ca89b859f88872244364bd1898f357552ea2ef8d366cbe18b129a8c489b6ec17aba5925f548b721daaa3da107a6c22ece63f340eac5e8b1a0bb528c3b68c0f1e0705fdd18ede570aec15eb835dce3585746ed28eb63118d9cb32a9d831af3e91e84cbc0d9caf3769a20cf23f741488b5300f2e63c343bf2d8819da7ed7fb9aeb2e3aa0982a26742424591bc308aafb005becbdcf8af553a43b79ffaf712b7799968167c5b22460e283e105c4befe8856217b5ed512adc67e3fc628f935e9cb3ebbe41dc9311049f073aa39bf5056dd9610e9e5235c3125dae2b33a71576d885d58ea8d209024ab494f4dee8f824a3cfa957eaa070c670472617a7d111feb63cafc263ddec477101517cea954df2f5a2fef85afae6132cee91021a9c1f05be2ec234f6c42b066ab1cef0463c9ee69db09aad0305991505dbc877a18d11a401fa9a0eb27ed369a517183891cb9b1caacb8caedd889a3093c6a2a2739086fb801e9ab03a322af3d5db514463fab98c7c70201eb882726c4e28b2048ba88ced6a266f2f30c69a659c394e8920c36ab79268a5c7d92483908387a7aa7953cbe601a01e6f725b59bc3178cb1140b6c2c4c40d81839c7a28ee3406a7cbfb8927fe86b05d3d203758471250d7727e66111a1a442a231a948da3f1ec4ef54913ea63656ecc91b09a7d544dd4bf699158b9b534b4c60a3b5cf5155f24d736c547ce103e23956ad35b02bf2c4bbbc9c8e4f53614d06bf9a56af0a18709cf0156605575aaf74c2ec3ba2c9331052e1b02031763f3cfc06fa3c87ce495b680ec07678dff0a74274a297160b6c1cdd106d5098ba40a1ba3084bd31d729c12d62dbe6b5a4efd1cb247ba221963051d1d4c2ba9e28da4d5f40eaeaf2729bab7a3321fb08fc944a2c7b96a2198478208fd7969aec80bf052ede7538032dffdef197dd2a338f077fce3027cd8421214257769ac361bcf4d032df7add25ef35d8c9d94342cd95f8e5ff94d5fada58d305a4fcedcc19bb48f0f6439d5e6b02fd9dfaa88ea42db5f46110563c420779cedae9f3d967bc9c6b2b28269bff8502c6e52a182d783da55a2d98295f9d00c8330738b3bc5154c15277ac086f63b3e8900044f0749709b84a9111f3cd61da33fc483fa56656aaf67ca76bdd3c98854384100f9c26cfe2a50a6af4ed33debd563a9cedddb4846bc930123797b53a4fd54156da35857681dfcff31c6e1f74f8c286aec2d155b8639640a0105ff489355cdd76da057788b3a536ea024fb5139b193242f0cb0328d121108bcb41bb8c0bfe9ea1298425d75d8968787680fe487c1152a5e26e9f0bddfbb310bd165c61b226dfdcbb2126d59b514f733e00a6650a75f1a636d6ac5113dfa452813e0449ff9ec41866f81d6f105567357ca16acc8c69b5f2649a724be4b0e279db88b73401d03057f8b562b68652410b6eb4dd8624bc8f603a2cdf07e99637efbca400204dc734ef6af41ff281fb4ea00dcdeb4a40683a36933e87518a97104d67334195d7569cd46c49165ff1e5de2790c224e8e53e6e0d4b2fccf0ad86a34e236ee62a79502c9caf0b9b74d15427d617d7777e8199af38f9217a7a0c48c451e0c681f1b29d0a59d3b41c986bac7aa7cf92a9f6ebf903b471ebd151f0bae24829b75aec90ef66d34b63052e213ec189c076d6e749d1e0b9372a1db272ea696a67dde7f6df0be06091f4bc603bffe110e4ecfef7da0f550ac115ce62d9ab096b98fecf4642d342e67601980eb9cc05ab6b6c6cb11cd30931ce657718452c95af949ea2328338c4b22d3f7224286993f2466762bd097e84768b3e0ea7c2a0a75ff097a88515c838838036e5c71aaf00931f9e4058e15e38bbe704706580c3bacd9460a8df9caa2de6fb343490c215e2142b8610b6a2b6c47b4aef91faa870be6705feb697da714617cb6b5941c4491d23bbe3c3fb36589440b1c4a128c29bf8ff36eda41b1ebf19d1745132174597d2c39814c33af8df0b4305bc63db47177cc60abe2677f41232016b53d6ae05654a6fc69c75340835452d60a911232e55f6800e1206a87a97e4cfddcb0debe814e85d66027efc83bc7d3fdb437cc969cf9dd38baee39c1cb537adf52589c0713bc1b54f7ec13f83a1d2bed04c31dcba17f17e21ee63f2a75f3d8f6cfba361ee638a4007b92ab0deb42f9a77463161921a7ed7ad31677f7dbc4aaf9f620e413056ece16737696acc57cf8a7b55480fa66e6fd74ef311a6c80fd12ae1cb70d4ca749c0ed4a8116d347dd2992b6490b90dc7b5bc9184f9591e951230b0423740930535d0d0050d7cb06d8f80ade7a4c8e6c5c4d83e6498211eb4e6ad7a2ffdf510e39c7965d0f869fe90eb0d102c9c01feb16e1d76caa2f29286de43d9d3833d1d1a92a9678b6d7c460fa5204c8042f01a7aebc612f4d41ed7076ee2aaff22604e4eb5cc3399adbb999f5bc8cbefbb2c1691d809e1a237ba937a5679e36e6a6d09e95e339f533fe0e3a61e9ea507cb9fb9e077eb567b1aa5175b78ef6bcbd414ccec2e411aa82a6d5c35236d793f778487c3d68445c2f271b5815b4979d1f31ef37e333409b66090f43509edc79fe96fc2b178764bfd051fea51fef76fea05be893775ef9da0ada079c9f454d4a54e39d18053a4b541a993feb27199e6bed809e2b87486d41c33f73d101ca6971971490ccbf9fc3f7b0388b17cdbb37904593996ffa0904a2eb1de95231b234849272fec13c644e5b7884fc1ce6094a0d806a573c1c016e7f91a7b3e96be9b05d815719bea8a5b09160863b9c3f2e67623680dc367fde5f6283704772bfbc2ccc264fe3cc662e0c42132f37741ca7396527882927310889051a362203067d67aef8a30c82d223394ee215b707b48f7ab7351bfe2b7f22dccb5fcf593011cd87b1a90bb352ae0cd6515277cbc3a3b20b1293e580bc1d7591b37fbe10de29c16ede3dcadbb474f327bc734d2a4fa5c4db00330ad0f50593d4e81c7a85f65ecbe308e3e6d6bcc73538688dcf589dffb8d696895ca4e36bba98580495038812fc4280b4492e2e2c4516b01fd284aef71fe1fef755d560b654cbf5a94a28b86cc71ff28087cb56b4bedb6226ee279cc42ae2d9844d7c4ff9b5c60fd8a2580a6a3c68a4b223a916af325a6ef792e64c59f50b2616c38c99b5c812a0fc187effa4116d08c4825fced12e744bd504365ef6752bd09582d205629a4b7134038e6cb7caecec9693e1948e9787c1c568dd86e6d6d1a04df7c6d46a574b3c9e6f69e7df020fa4492b3a8afa84d55f35d2a34ea5e4f192fe681af63ed8e31b40afa0ee629d1d294bd131ba0bd346c9b9ea89e34fca9089ae383645b36ba57f800567a9b1bbaf956325669d650156f04a6f2a1201ac63b3213f4005ff99ea68afc0525ae3a402d879ff2a4ae37d0d5d248013a1a42d7240bc3017fcac232b9f2107adbda82cc83fb5126c2b27567fcf53f153cca9310567cb79dc2c0dd275e65ab6c3247b0a47abe5b063ffd3720192be96c9129c5b406b58b8a530d3686804a0bd6df4517ee605233bfb059d6473e7822a71adb254617bdbae32d02a58e5d170b14403d9a91f7180ecebffdf4aeff60e4db223a0bc801af1c33bf1a263e7b452e4c7a5f5e3945b0b4eac16d723e036e840c3be66755e3e797867f3d7b87a3ced7671180146438159695ed0912f8fc597d0aa505a72fe1dfbe05c473293cea15e3caf9a53704658a48871e03142cbbcb7a234f2f00d6354e799aaaba6125f44b0d97cd5f39ed2dbe879c2f61adaef55501e332fab34d47a28d2f6a7d3c919cb16f85d81b892955550bb0e7d8ea360941b4f253391c17a6920c7966ca88c6997e07b665f5b7ee6fb35b95a0e634acab74df82fbd6ee4327bfc696cb135eb54afa8f8fd30994eb6c31a1d180bc76befe075ed5c47242b2dba7d18a095d38af90b34243ebaf4ab96a354f0f6a1721b9b7eaa417e75a9d1b5fd069dc37cd19dba3c7cfd7139447cfbd938d1aa8f80d695bcc7a11f6db3c4b33482f2fb3a4e2b63ee6326b6f98471292a8ec7e63c373beff750b5547eae8581bfcbfbbe6579037308089ab73db53b52848f674f6b997365a8b8b937c814fe4ca035d6683bb2ee02174cbc988fbc7481b0da06e069e0715a34f7d2adb02cb2aafceb0fafdf14b1441ef2247dfa16c990b759f3f71cce041a83a22db97d7a4226037077078ed623515c4a51e6c4e3bfbee4b59c90001c914e5dd642039677fbd24e38121b64f710256be8de7116e1585976be3ede9aad2bc2d09a80453c9c03ef12300d5cc87e087c529fffc29b7853d49d1e0377b00d92355c866bdc6bdc8f23df290c5f79eb6e408360e32193beab4a871a0b0b391e002216d1fe79ea6cf26d2d841339a350cf242a8807fb1262e56ad75cc8e4d62b92beb864f442e1b42af54dcfa9e4d1bea57c25a4c70d735a64a5b4460299d509acab7407014a3a652c549f5d2684f1a4c25942ab9203608c097844710730341a53317fe099d584ba2c1f7b81b111313cf3ed19905e8d64f55e683c23677b398d249f80eeafaf7edf10749d669a3faac5df28931efd9c730d7e4c34c7079fa5e695ac90563a8b0a2de68eb6cfa42778955ff94a02cdb9f003f2ab5026c2c7a8f21ec72e5f11636c82d41533d7ece04fb83e8eba927a5bc769a4795aafbf58dc4fc13596ae4e8891225344e3f3411bb7100c6a1e8eb6635027a497bebe57d1d471894b17e550a01bcfa716e4634509ec02c07f74c43619187cfe40124cb253de7d7dd0756ed3b8cb66af3e9846440056612eb6d1f408a679590e8047a14876aa2a2b8b22fa19f684eadd39e523a5145f620128492d8fef08cf6f0b2f0b907a0a8c34972ba6fd4a1f649dcea89636dff8d79f160447c6ae24983bf0c20b1a182dc281665cfdb364f6a3d706ef5854c457a68dbb41915198fd7073f2dda5c3c389972e3f413b74ef3958d98ca4642e85362fecb1b745a01e5abe9b52b76cec1bc743e6d412b421e28cb6e3645d6ba545c9c1e077d3c8a41a156583291de0637a74360bb920250f8d2c36458ba558391f92b803abfce990f51297367682515187df61367b92cf981d23d625d10c02b561c8e9dae7a83839089ac1ee74f3e186f8e0815ca7eb69ef580775226165203321239eb9f5833967ae8f146dcfaea25243954c39051235f22bb12e9c1ea2da435e959f197b1b3d76be0518c9a87575e2b3fef3d13d264103976bee7b5c3a7f698c99ef57503dc368163ef470ca113ebb8349fdfbf99fc2929ee4567e9925be9ee85a059b615451c40733f5002c9a790ffee7962c93433028f78e5fa3ac53219033d64a7ddfde6352ed580b8fe13ffe6e5c09e849fa58a15a86d6b5116b691f0bf65b007ecbd4e2a8c4f393177097019593599b25f08a06199ed03c6c8fec9f3619d7b992d92636c0ab205c010ccf19a4d99196ffbe5548b6447ef1e808c785f1ea4492a41dafb919faccea74d8547a0900436272d5785c29cca7f2774ed948c173bef3132074e80330f21c05af200778c796c1a51598ac919c29ff132da613b731595191f9f5ba51afe10a858635dbc773aa7b94b6d87782962b9c220db9610e87414d71f5659b1a5134f2d671f330cd3ea6bf990158be119b7e4ff648cede803bdcd66af3a32190f50f3485b4536c1f8170b2d70e50d87ed6c61da619b622be15d8b6841825c358c638c2376d8b5a07f0dfbb1a3f585b5eca26d989a47824d31869689ae6524ccabdbf9440d53dcf22a8e1a862545de3d75f0a1c9c83fd7ea4bef0faccbfb9a97aaeaed04898776ba8c4073b172d0597f199b11ffd497c63bfcbc6a92493d185a9bc32b21b224e06c35e8a4c7474836835c0de18c4ef5b6fb5937eb02e7a567f7bc3d6cf177ed1780fd7a68a21f7b20f80f669cb929f25bb2d280b76d97ecd97926459072acacd5cf38d630d7c17e2548052ae08bc9433cb896f457bfdd266b5b0e9e9d4c7a9693fe6ef771a70a428983230125891b926810aed134341478924f9a5950f9638dfc3dafab5eca2eba1f78a770fc680af9754314b28d57a867e1e9388bb944350cb42d2fe473976401f7ddf9ffbe1895c9dab32879ac776cb110138b32e0d5aba79ba35e3da58160602820be78be36ac5f668dfdf055a582224908b14b32a0e5864317956326079941ceea198fb5b923461097af770867b852335a52550d6f3ea47ff98cb6d0e365e0339800589d0ae9eb524c137307a9c1b11031f6b86a344ba4f3280a40a14dc4f84dede39ebadb3e31da2707f70ac0f7d1d6822bc156bab8ac39366118be8189032cb829e378eed13717a776f2959fcace4cda81547d34850380e3749b94e940cdade07394f4440df9e6eba09201836bb90aa1165d026ab0605e8958247da1eecc69b1ed52b678e08285e6f357416d885f6fe19e3553ff1ba3684ce8bdd40d9607712f1d690e076587bbe145b34a1e600e5c4566061ae438a18fc40e5f161d36e8a27fe9aff4cc37ad21597535330f1ea41af502fe78a9c8e34b699affc46986901fd63616468adcdc920776b520d255694b876e7ec5cba4274b4d8abda40e5a1ced5c8465e38521d8d11a71e1c2b04d8f7a84f9a8486de7f4069c02e27e47033466a60c8e51f5bc66b758370a77197c8730f1b44a772972b45b7556d00a1aa10d97b2de8818c402d8e1f7e0946975fa1ce791c61a6f7a7f26e7eb076cabe64996cdf65496cac89d0cb45c8590da41708c29362b05e60bc860cdfc9d5455d073d5cb41228bfdb87032cf26b3fdfce970d667a4409ba7e1f3721e954234820929eb488abd1ea8b8e8e8b62762d8d26268546cb75f009ba5167cfaabf3abe48023ffa0bd306915aed1f06a802b699bab1dc53df480ea414061f8361366a5972c1bb945d685dbe981971f5004cae10fb6774f6f9d237192096ea965c8f83a134c6367387266502d33dc1373387166c5f6d462915f367e22b1bd2103fe9f0b9bc18b56c7ab343dc20f47ec5f46069eb11566408d44ad733a19d250e0dc2626438c4c34125728602acf92163634400ff6d6d210ba9537362a2e04b51930bd1f019f02e33ce0b51bec28c799e10d17b8d7253dd4f4ce6b684e21dd541485af6d23221ff951469e04fc923067652ac370c239aaf7195a9e40ac060576aa025ecfaa5d10fbe77dee8a2ea2bd3de4425672b2e578f06a0ce140252425940151f1d1f5c32969e3afa09b72f0fd4fe8a2f62b5e2bb5efe8c251720a0a8b8d75e978d12dbca4031e2ac867273230d974ef25e215c35d84160ac7eb9864d2112922edfd7fb806f37aa2ec5a88cda8eebc108de4b5579bddace8461a6576d62dac01a1d7621cec5aebd4825241df98c916f6104fee888ac62bd3c906015a9449a1f0f70565014a9bf494efbae8be595f0fe519a1b0ba84cc5e6525762c244c3c1b61397d73fd42bb110b235e07b7daf8a1bf24cb0dceab2d2aaaa14368b58fa30789956e4c05e30f9f2edc3a4066d59c12c58b1c401534579a5017bf5233cd6eb144520f81f0f0bc0d8186f0e782f6683950a09ab2107ea897a1727fef333444251baa1910605543e0d8aa09e84c4ca804381b23acc825ead5b1c64fa9a3c8519f8b6178d3275e3624c1b4383c98f1db1d42973fa4df90acdd39925d231333b41badcec736c158d6c5a5400fc12a25eb987840232049046c9c766fa247a1b45598425abd221877d032d5d5aa39ee746aa40cc94b2d0c661b55ebdf7c8e21122c04899cf7717f5d06e16f94513982fc4ab95c9c0c03288ef958ad02884a779c4398d9b9107ee60ee86d7dbe79405586658571452245ada82fcbe58dac861e30adcd80ebc123a6c6d1a30e44e0eb12dd805f30d42375de8fe12095ae3f4ab3211cdc9a0cf38ede22f9489880da0f9dd5178f383d122c97133025b73506a7f05fb03f58075be0471d8305ee5bad191b626aac981d612754d17500fd2c7ed6bddd881319852c84946be7b7fb4fc63c428660545e78046275076a71ac3559a83a7e8f975a1b2b349b7d2cea44d672c35b4d0dfa1769d2b550c8431ceae11767c5716c523022c4d861709d662fd360b6a0078d34c359963e3c028d11b31feb221b5e64d202ba55cc7de4e421b1ee123e244e21eed3f1b5b0b55dbcee63d5cd4de6991f9b7d2f620118c6810be8a45c8ed658d0bc352eea7a144d39a7f47d30fc60bbbf806013951ba2255082eee4c4f40b0b1da57fbd63827abb28e1246e29500b90bdabd685abbaeb370326d501b8cf977723cd43c976276d83ba5c78a6e754ad7dfd0d9126ec3b489e1d25506fa488d30b7cafd50108208d96df3d7e34591742d9d5de60f17d1b38d6a007efca7c19d754001c45f7145a4026f49cc78e9742f7854951300971ec6b25542db5e6b19dfd28195a148a6ee32a98bb48756b55f1b0f22a824cd7f45f867dfeb0b6f7c86f0888cff1c8e4bf1bc73f9b4c47eea7d642eb2cd9141e6e25d46cd6f31c56be320772212f4ac1373bace7eec41eb5fca3535a8701a119fe4d73bb68d03a1e0b64a47df81b1f4601f025c2516f534df2b4daf0836896d3f1702371a653c7b9caaf6dfc3a89a50beca53b054174ec127eb3cdde77f04e8fd3462845f4437e74ea4affe75768c8d63fac4299dd18ec5930c14efe924d3a4f50dd8bc1581032f7032eb336820394940bdd2b24bfc169214f5dcc87ddb145b4f6f2c927ca086f1b4353d654fc55e18f809910dba342b2f911971b6bb25fcd88edf7fcca50d75e2594378948c53641c317a792d59b3591a12fa7b502538362d01e98836bac2de18f605d91c29738154a72de4229ab8fa4a7d48435914961197014f72e7d78ced9824c1daa1e440233d64074ab6296d23de0b3b577375ec9fb67802e392ae87fdae6c0f10f05895a4837bb908561d4c83e638ab216821c302629bdc11d3592d3cd48ffe47394ef60f76e0334d50055d6383d68c7512cb73b597a6af5095","title":"821. 字符的最短距离","link":"https://leetcode-cn.com/problems/shortest-distance-to-a-character","question_id":841,"issue_number":5},"3":{"day":3,"pres":["栈","前缀和"],"tags":["栈"],"whys":null,"difficulty":"- 简单","description":"```\n请你设计一个支持下述操作的栈。\n\n实现自定义栈类 CustomStack :\n\nCustomStack(int maxSize):用 maxSize 初始化对象,maxSize 是栈中最多能容纳的元素数量,栈在增长到 maxSize 之后则不支持 push 操作。\nvoid push(int x):如果栈还未增长到 maxSize ,就将 x 添加到栈顶。\nint pop():弹出栈顶元素,并返回栈顶的值,或栈为空时返回 -1 。\nvoid inc(int k, int val):栈底的 k 个元素的值都增加 val 。如果栈中元素总数小于 k ,则栈中的所有元素都增加 val 。\n\n\n示例:\n\n输入:\n[\"CustomStack\",\"push\",\"push\",\"pop\",\"push\",\"push\",\"push\",\"increment\",\"increment\",\"pop\",\"pop\",\"pop\",\"pop\"]\n[[3],[1],[2],[],[2],[3],[4],[5,100],[2,100],[],[],[],[]]\n输出:\n[null,null,null,2,null,null,null,null,null,103,202,201,-1]\n解释:\nCustomStack customStack = new CustomStack(3); // 栈是空的 []\ncustomStack.push(1); // 栈变为 [1]\ncustomStack.push(2); // 栈变为 [1, 2]\ncustomStack.pop(); // 返回 2 --> 返回栈顶值 2,栈变为 [1]\ncustomStack.push(2); // 栈变为 [1, 2]\ncustomStack.push(3); // 栈变为 [1, 2, 3]\ncustomStack.push(4); // 栈仍然是 [1, 2, 3],不能添加其他元素使栈大小变为 4\ncustomStack.increment(5, 100); // 栈变为 [101, 102, 103]\ncustomStack.increment(2, 100); // 栈变为 [201, 202, 103]\ncustomStack.pop(); // 返回 103 --> 返回栈顶值 103,栈变为 [201, 202]\ncustomStack.pop(); // 返回 202 --> 返回栈顶值 202,栈变为 [201]\ncustomStack.pop(); // 返回 201 --> 返回栈顶值 201,栈变为 []\ncustomStack.pop(); // 返回 -1 --> 栈为空,返回 -1\n\n\n提示:\n\n1 <= maxSize <= 1000\n1 <= x <= 1000\n1 <= k <= 1000\n0 <= val <= 100\n每种方法 increment,push 以及 pop 分别最多调用 1000 次\n```","content":"0961e884611df7d4ac47a79a9e3b6f2d768f228a04f50bab074078247f3c02341afe906d25e29b5c3a72e15c86695abf3ffaf3406fce911155659044b8fee931e364252a97d1c4e70a2cc6a0c49e533134eb70c984b3039c38bc28dda8a7a99e5025c14460f8883a28320c32bdd8dcb533df4a2a294ffec570f3ff8463ec08a1625acda3f2e3a3f5d86228960d950ddb296369ea6271a9dc196c8478c18ff1035e76370668dec42e50542ca6ac10446a4df5e4930f337b3f9e5aa87d38901675259814bb6005ad686a9f6b05805e147c8325cf69552f938e0b7380c0313b72aa87aeef2e95e370e2b43d44a3a9a0e5fa4b6f53a2f1de2e0a3526b20b331730aac44387b49c9b658045534f0ee16b584bf0d6912a38ea7cd11d9eb22e2d884d985d02e38f64a3e4c01acf7869a942e2e6e4b6285ac2f501908815a1f119ec44ff7a45e1c80b6d264adac2669895c402cce6a2aed8c5aaa811ae608f8e725c7ae88ed0cd76a29e7bc37b586129534d827a90006ab4ae5f37302572ba5487a88435940bd5c08ddfd7ec4650f96824fb526d907656c9fee34df7ef5d4d855b3c2c5893e41b4a16448d658ef77866a6b39669acc0ea574730fd7a22097fba6d41a3a99b11a0ceee0aaa6c49a5faaebcf0a3fe8227b12d540f0789ac4b637982fbb8489336e4e3df1e028c07401ca5fac6b77b432065bfb4e01a89ef062eb41e59a5175ba080664cb26fee338772e0b0c2cb163487c8c9f5b38b2dc1c2194b25bec4d526f5fbb9caa7d9b95b094ab3f1d9be7c5072380d008c12aa8d02197d16ee0f2d721231dcf0c7a2b87e01786463986b5a3b84469d211130a91228f9a56643da52c3da7e74a2b7ceadb6b78562d0f13f35cc112938513278da1b19d229313f1072a8dec96c4db4414660a8d8aa06c2473218012550b547c0308d36c3e17ad0e1b00ff51d75fa68041bedd2f7b6a690a8fc21dbed46f69ef3c8d526e6539da2f71b4d65c207465dbf579ff7567cc32fa3aed1722fdad71e95b5091785f0428623b1c373ca0a75066dc5f90414342b20a319be9bc571ca7d510371cbc258cbdf6597411832a9d12e9d65b030d9aa7582160e87c7b8eb0a992e63f0c9fcaa314bb5690b94bcbedd8ae377fde952ad22da59b4cf6d5345ccc49a0c1c5e5cf89a82f3a9aa856d5229bd9df57a6a16fcd5e6983b9c4c0b7f52cc8732a10b35a22abe21faa5ebfe86a4fab013dc8d191d472910b3f9ecb22d0f86a56ed157e46efa4941db10f5bb4b9d0c76d6b70cb498d20413d30e2fc0d2761b2fd8b3dbddbbd7fbf3f6cd75c0db2529d626e03372e99f6bfc99820ff47b529a58121776b4891f164dc75d1d079b2ac1e2127b625f10a29f84a4eca2825b354b417f72498267c2db07a3733d7b19db626a051b4bfcff3b7eef5544d43b1225e4d2cc2e39b0f10a1ad6ad32720357c3be6636aa17f05aae67a026b8a38a800adde37c5dcd0bdb6e15b9d0dd368c8621ddb57a33e89631748ad0a4f869182c160c5f56d67181bda4dd453a914c87dea1067ec666c4bf13403882348eb09b917dffedbd5dd7a7331545a005380c39f62554a9cbcfdf633abe539b8a56ffb3e61de7810d365b5f2f90dacc60d980a4e2c9cc2151310dda590c0a85ac9646cf13f661277f32838b73fe8f5af6d787ae91d4df5978fc714830afacdda13630d37f43c0ca8392bb027017758d87441f95f559aba28a84941954e47a84fb758a5631e45bf9f3e6de4e9878dd5c7636a69b75bd9e4a3f1c2f3063a4ef7cfa009f62573a27c3fc64905c344c9a71f280851145233ab9e70f07ea39742291b861a29eabd68c5b5d517ad59a96b7879b743102ff7818ea15aa88e1b8f9140421f3c3a4fbff542a7aa2dce23e6a6bac34f674bf81f33d80e9918b8c8405f1f24ed95caf71c229d177ceee39650d72600e96840db5612f09dc6a563c8015b30b4ccf6bb6ebdc59caf457f5f09dc9156ab43665f4b2cf918036e791365ddf3fc6db2c36d1a6ab8bca89f63c3cfa2e8372b84bd599d6747765f1ef29a107311db76f7447e51fe64c8f08cfc905cdfe6d80df45b0dac3c238b8225adddf06dc4e9411a0cbe372eed9003657250b4f920e1d979f86d7bf7134aff51d51d5b80dce3408787bd5aa92e50e8c96092e499222cdcf320b6afd97ab47b8772b915d672de77335bb0bd78addd46e64c34ec3880a809ce1d4c39c3e4771a723952c8aa86c2646ae52473c760d51231d29e4248bc49d519157906cac2da4d68eddbff906f4d1b05b5590fde33e8b8c8f2e16930b57e96466601ef523c8203b925964c52f6df56a59351d549fe0eaecabd3a68150aec73056caa0415bec02da727347207305bc0987c873a7defcd207b85de17c23538c259923a236bd321ac5142960eab569ad7ee71e507716e78b54bbcf0c654fff02bc635c204b841152a2817e7bd999db801c857ec2db7107337622af1d9297baf62ec39a72df46dcbd5b571f1ddc3e75d8568587693d31b78296477bdc7669b97c38f43f056b02a0a7149b16c30ad6e7136afe59f2f0bc037459cd577aba4a6e441dbf139cb29f0f0664ac061c572b8ba8955d70ff30e2c73c88ddd83c988a53e77932873339946ac7c368184597b71ac66c5106a2a43c354de06824683abfb267089665f05c3fc0ff165c63c2381ea37aaf273c6560024a2a3666ff869ac818a823a681ccf0fcc53e204f5e703510cfa7566952122c9369000a50e5cbb666be97f13c4606cb5d3b713b299eaefb3fee920d5936d8976b145eb0381f94654b536575968b4904485075a46b34d580e673dbf6f9e3f3934f850436c899374c0d2ea5607746cc8c93af5a3636c28def1653916249adb761ac29a35e3cce0d2a413b819ec69fad659fcc268c70944fdc2da603fe2f3d33442187bfa7acca078a1f9ad86985a5220f7904fb66d59b17b9491a1fcf6f8f1f4608076102a2c2d7787a8befa1921996b6f1b992e221708b94f03798beab9039f5a647e4744a35f8acfd66bfc8101f5119235c56097144f53deb5edcff1eb2f50672cb1022ec89d1f5ab0385c062b484b60773daae6043c5e227cf788212ac41cab50612e8f2194d4e1eaecf8d07b38636bb55fe1d0d4cd019b051a75861a5677b59ea91ff42287cf1b5aa08d43f75cf210d7167dd7acd0bf1bc875c8ce3cc701bb30fe1e9d842c0904798bc1b496d32e770ce732043d055d2a5f5bc276a549e1e256e9be730ce02960bb6e6d3f888f5d58ac70af396faf048ca1b68a1d4a4d5c222c70f626c082813fdd1302df54c1f1fdeb50191132403f27a4bc7dce0c2a701e22aad5d4c868e58e85536473bf97207516949cac9cf15f8f57f3727010d4d7ffc17eec554faf2b4899264a8a012d46f069f7d7745114673a2b8399ca9509b4b5434059471cf9860732a24b76149a09be7b1bda90b21c3ce2178a1f214e6a8b0d8d2421258d7aa87a238d2d10c2e5bde6fd3ecb1a3224efded84d30ee32619cb23714b7e13b5ee4386f4acec0d3cf2f4a7adb4d4f147cac48a84daf799dce1dc100eefe43478af0a5155a8bf7cf9ce9ce8a43b75c9a25973d1535bd21764ccd31e4ae6014b9e8dc191d8234944c8a733a3636e269de01b81708ca91153f3ab83a497e1c0f8ffce378f3f373b172d1705d0ba9a8765c1ed0083320b5de0775c5301d6950efc772aa12130191d55c0ace4a2765f626f33250892df44ed19b9ba09251fde670365d25ca32fe2ed5097cd042582c90fc2f1a437d9f1f55467a8c63fcaebce812faf3ff1d659ba93bd03aec80373055e70066c19139910d8ab0a50673b45dd02fb39c192e1f683023669e3ec5e10a1faf2c322ed6c9deb63e9f69f2279e86331735d6954f487ae7db0058ff308e4a81f17aac4533a7c7f33380f7ac317a783ce6be8ef297a506c78495732c3255c416e06bd941c751b9bb67edb1e7c103b947aed18afb0118112f2549d626ef443d1e020260131804846eedd04dedfe48ee0a3dd54e9a2db42c5b7ddc95c17e940e24ba2f2381ba582ffc030af3bd61d9bbed202e0967df658fdd8e62deca7ec9c3fbf9acc843ef3e72c4ed6b8465b8b63d73384b7877869755fd59b7d46d22fb4422112556c4b2915f4fbd2d1b687a98e9e5617b1224ecbf028d15a7d37c2d32ec1b3363d9515d2af7df1096b979ef0ecc7fe811e7d74278a7f2fe0089e568c1118e32d5beff80b19758bef9a93f092ddb268370e1f5e9533794398036945171764a0f4cfd4a316eb6680b212eb7a3bb72e2efa88d9a331957bd1dd39474f5e05a36f4abfa2b9fba951ccce1008be091365abaaed37c621a43b8113f14bb9a02f4c8e46638bc6e609be29c1ee6a50142d5f0891b96689b8efdbe1f59986ee1068019958d86ce68dfb2f963340f4b0f15f219f551602a3122c6d64146b665f3442affcaeedd5457babcd37fd101da7c50eccc6383ff0f4f2d0cac9f84839bfc3aa314f2b6f92bff170420870927f858cd730e4097ded40edb224692678d53195ada221f5a50ef4becba6aee21bc57dc871c0169541c846c4e6d8f0ffeeba217a48ba5a1c1003f43e2e538de9d7fe51851ec139376e1cddc9241b3f1f67ec94fe5fa6dcbf7cae528fb9b6136e33672de2fa355ad24d0f6fcc0cfa9b4e708fc59aee269fb541c8e401cca13b7283980862af70f3e92c8056f58396f3d331126027c5a677c6ff1232d38300a139875d43116b3ea287f20a349bfbdb0a7ab452c1e4b6c5118bd57cd12f871dbe29d7e67ec40e6c8ea861b4ab6459f42e9a011bf663c1eb1405d1de9f5ad4e3c706c0d20c0d367959f73d1ca76ffb40c326af8f49d5b68999d633d8576a48258fe6ee5b26e9cffe2f569f69c6222c1c6e4b1d89b3557845edc8040b295738ac9502dff9ae6de19f978886dc37bcab53d6711dd2e428731b7b20594569088b736d532afafc0f63920f058e3da6c3ab809d2d04e7c950939b103f0be4a0a26e5e0ed17913c68328439430441e4c257c043a07259bcc31b1cb744edd5c26859796ab89a376948369576766cc290f1b9e6ce1e8abcc7d8d46c155789277f9b778b699f241c8fdc71b765b7e83271e3d497d67135ba16543bf3bd60337570bb381949b1354276e6b9c727044cd864eb9d43e90ab284ce66974564574546750234ed9b0d911ef72c4205ad868868c298c89839dfc82014ca09fcece495d64baaea1ed587bc5e05440f5536952869368a179be0f38c4ce9b5da7472968835aa88425a070f9816a63e9edb3f3b4dfb65d6411e91c81dbc3951b3216a1b5086c9020bfadd7f4c5c0d8b5df916c16453c558525d9cc1d923159d18356130db0198e91e9eeec0093909865341cf14ce57b70f05300e5a9ec28c0f9ef36d42f3693a7ab158cd80d5989824eacd6776457a8c1ec2a2a2f10245cddc3245bcd5f08a61762a2f3f86cbf79c51ec4501f839d825162fddc4deae8e76fe67a0e4d60eb77a2a090a444c6110b61a63e5c58fb737f7367fe8369d6776c7aa4fea6ce9ed3bb221c366541ba0dd6ff3435691bbe3a4f453c8fb820db68818a4f4a4f94b65de282e816b97ec80e357d0f31089baa6491a087f9931e1c485aa3fc5f75a2380b9aca38bff8a566729b1d689caeb2cb9c379c856fa294393dfcde4a8d57e5569f51d3c0952d12437f0f2c16cf78adf30d61aa4b5522bc016e7e6ec84de2d6dc81cae6478cf1008967e4de4f1866f581a29307185869769d4fd0ca88043125636b1414a4a81138c2842682c1e3186a308b13202fb3fe7896b5d30d570ba03fd67e8546a9b15e1d8fb6a3d44c33adc68abc815559b1e48bdf21de32191db8c55f849ef39759a8176806af9d6a55732a1fc5a5c2d17cf80afefd74bb7331672383f68d976c4d4720113e643e97a47f9b1128bb1653956e653ae20d086c1db91050c6fefdcc794d430c5a521d6d0533d7d138ccf0dd325b0882e82c8102134f7f9387a0e19237804a96bd9f7e8d6d1d7dc003360961ed44cf548e160ef3517bd44f8e945b3d235e919b4e9470ca6c27f53f2de96a9b518bd31189210957667232173828b20dee35f853e86e783c7c8f39389f436ec454d7daa4392b15f3dbc7a19bad07f028fea7e3449a73d769ec76216031adae8dc9dc3fdc25808e2ede5b1dd3af36940bc4ecf83f7a3835b84d75008e244bf002f08864f25f0ea637ecc34f2866f3c3c0a0b45f76f0826ef963c99adf626fa3c1e36a0261a8b8f1e276eabffa4951c320654d4845bf2737cae31be901870ede14bd47ae7a05f81f558ef8acb8fc84a01fa8e658d6f920cf03ab4154ac9244ce5d032d8118d54ee15c0522922d58e87a4649730701461df5692037bb94bab19753a34a51bf5bb1727b7a70e72a6e443a8054c5e404536308454795d3197e4bf220183e82e66ba83cde7f011c47cb5d424b27cbc70874267dbffbfcd02ba8a37d66f457d35db8ff0a3b0ef31ff2568b0e0808bcba401caf933590c21c9d5324700b6a95db1b1e09b08ac23b8c2a36525fbc448081843f1f651d8361d93cb33889b9f1dc7396f4a2603ea741f108e73f3b9e8ded2d6e0538dfc50115d3e8d5e325c89294831693f28935dd3f9bb25184ced4b8cbef892a70b803402e9dbc9c2f0c80849202891f6b500ad3c16fe670dead2126fc17d5bbdcd91af2103c7f90c3b1be27ca016ff93c6b4afdde85d1cbec7a377f119493c1606e55ec28acab7a82afdf4fd48a178633c234ff4537c4629d21daf969e044edd868e063a109fa97f2e4a4f90ade3568eab8e06c5fda4daefe3ee88d10b77692a517045ced49b93150d480b439d0c92cdabe78aefcddd9a9fa359611d539e15d489a4f5caafe2e2437f9c387ccafea23efc6f7b1a309d98867421f6fbbbc64c2e6e30bf38ac2c4b40f770ae4cbb7ff4ad930d3360d1f5b3e4640333e0d1f09b5e69d0643b5f05127cd7cc9fc628f9317dae7ab84699ba75f5ad04214efd5fa46239f2e5d9e4f358d570aae4a61f5542f828dc7ad92e6535a43aac99792a4f034aad48357eaa070c670136e5eb7900cfebe31b18765f7973a6a2b517cea9510d8dfa2a3d270aab34064e6c9181ad24a48fc2ddf6feccc340777f584ab713c8efd9dfa9af84546ee0803d6d23aa7904bf754a08b4ef236dd6eef44627190a49b11bbc28cf5f7889a3093c6a2a273c487fc87109db73d6d21f5ff9a13176bb9c6c532602114aedf5a72726bf40a92f4c48f627e66341ac69a659c394ed40ac36ab7db738fe59d6dd0c4d3d6f7f0351ab0e129e45c68721e43dd2a52cb1140b68b82c405d5cbd52926ad7a52f593b5ef6e8e97a45d2b2c30590e7650da63654c111a1a442a235986e9f0a5ec07bb0a13f73e1b0c85c2bed333171f91a0698b5982b572a9d022743ebc465167c448e547ce7a7e63bf40d0584b31abc034143eede6a2a26aa36d2faf6f02ad77844b066eda9b546d9eecacdebd5fe986eff6bcd8c6ee3a6f45ae5871e473502b2c018be14b428fbca8deb2a5852041275aea0d89637281d069818b078b876b9c23de78b7a5dd47b56a9839ed9ce94c133d17016c6f3a6359729c1803e28c2c7338d090437802894f5a17fafe2aea45867cbac95e4bf605c43862cf57c245541085a3292d992ffc376eccc85b8acfd0a3f3e06b8cbf09b094cf60221dc20039e5dedf79ac32a3865427d6bf3d7f49b096e30b251397ae46e09cb1390527ab74187041679e49042c6245ac588cb064203e07d452fe434b1c0845f21bf81c696140a1420d5b569b195c436e3d54860fb4c405b75e155898f9af0a5b3f2f3e47a78f9383d9b721206fadf6bf66bb2ea77a4772dc6c2a986f83e03e2d404780bab6e1730eae76ecb83a48bcf922e5c4db0f68c09bda9c5e4d84b0bce5f33c408f7f2d2ab9d087b950ff38dce0c66b8d2a7e29c5c0ddf715c2c79fa736d0f526c3941c81023bbd58ee9e2cf935caa5c34de1b9d90531b011d5c0792196c9b49eab77ee9a576a77f1870e30396dfaeda9384f2118a98885800b9ba041d40b8767f115607c806c4dab15c71ce11f72519764137f636ac506df49e7289d0a91080c0fc1789747a7d46133432ea30ac091c8c90e1519fa2ad5382342c386c22b744f8d80d70dacaab1d0a89a2d6ebf2caed26319ae3ec9d9467afee0348a717c7cd200d4616ad76f06b51a56cc5c4e58049647fe6058a26c77f06f6d59cf343e4e7579e147ec9164db1c53d97b0f2043826ddcedf19df3dc1ad54405e909eb6880b903d5d7f0b8b84d16537d59747460f41abedc8f943ba6b2d14bbfd98ade7d51159729603045c5869ef7a857cb2b886bbf961c45278e15320416895c0bb973528344a5fe78b5a0309e21a709f887a8945295d43ca42943f8bd1a4900cf0deba9635fc59ed18c0f86141db3a088618f1aa7990194adb38326f3db81d7ddd4b11f3c564b62187782acddf706c99c9caa24a6788775b66812da70be2bf202b820484e9c0645c6a2774f387583a8a00430aee7f0061780a0987b685048bd6f64e8335cdefb1e573e6312323aa3f344e40c8f15d5a952d7d9c183e13be897491d8ee0cfec942ebf42008dd48fe9c128edd6dfe5aae8b6bae2da7e7a8d1d98d72390ee6adea522aeded02637ceded5d150ae1636d5437d567362c63ccfddf308805edc98cdefa2ded99b15f1808afe2a4d07b28fe8b33b5fe0aa79b1fa08cfabe267ba81d5bfe97aa28073557085fc60f75c449693a13c4983343fa0d5a4ea6bf302122f544ce2e8b3c58a8d4a97d44f3ceef61b035b7d7daf1804481c1b5dac865bc9b80b4eb70766e16700d4456393b7309a720c61af3aa460fdf9c9b624eb08b9c89e7b3b15521b5c61ec58d70e1ef49e43b15bafc85e03451b65f0c50aaf090f98cd5f201717588b544ae406effadae43356b053025c31a49102db852bef48414ec8a320e5448d5f2b860ab0ec1edf2ba2de35854e1a490890dc5562ca0c6795addc593332053161093857532c3758fffc0ae2f20ade774eae6951788d09fe366ad62562833115288f999d5118b39053702fc74144a204409c36820a78e054c1e6bee7e40b913910efdebe0f977089dbc94ef77423c932170f98a2bf7c384347e9706fe82b8ede2d25ea04f47eff335bbaaef5beaca0f1b4eb6a1d97903b2a9824966215b264b5b780c3b18a67c25797157a13ea95fcb5743c05cc2d850e51145e749d4a1d16b26451c3eff1129c85a3c8febca37a91f35a4477216e605320383a59169a9d8707f11d8a3ab4d49d5b1eecf2f75576ebf3aef7293f80a30d1ee66e47d245f64b488d6f4086917b41a403cf19748cdb9daf7210cb8cc38bb6bf4d5581abc500a161287bb73762271c82a5a23fc625b2e15ffbdec2acdce298fd77c52395e969d11a9a0db01e8dc6726ee3060025fc14fcd735bbef3a5a09732a0f7ef96df6874fd7fb8ce36b266eb2050a2233b42173b609b1c5fbb2bf878c46833f806b3b752863db96adaa3dd4f21ac5e1d8dcfc62d45e0aaedf692877022b7cf2eba203c1b766c4e2f49d6ee64a261f624249031dfde2a30cd21be6e5c339bb27c265499f54b6e54cabedd24817f820e47e74ffe2e9b55e31e36a985551c4910506cc986a73beb4eb8c610685ccc212d9406ba95eb3810913f758817096330a3822e2eebe60206380eda45f91e5b6be1d1a11d0ad43fde6cff9c0615e2bd38058d9ffb5abef8d102400bf2b7fcccb40a483de598f6e2cc42e6d2b57167cf4330b535fc76150329f71a75eb55d0a67f2b80aaf2ea6f28d870ef93d745f116fd04de4d05eb1c4cc1a4729a3b2a176e1c1ffd9e3d1aae19c6622cf63b698bc30254295ab4802012ec28e817009cce6fc1874f9b85ce0d92b319d2c43aede8349e9d3c25ab0b2031c41310579915b583833cb3fe3e3eaf1b9daec999ffbfa087fd8071b3e5d007e4df7056bc8142f7bac5c28fbd25645f7016166a1bdcd881667a1ee2df5ebe9ea8e7952b83f9274d0c5411041a7129c2471ff33940c36f0b7e6f2e0a6419fe198c851000c05d1d529db4dee4ee0e2a465e5ddb772f3f9ca0b91e4fa95a55983f68da33fa2621e26ae3823f6c74e1ccb68c52cefcb66b1eb2477807ffbf7bcbbaf09daea7a70bfc52ba6c13f3c2ad527fa6df7e2cbfeca9f175bc11645628ac2b804ec059acb338d7af3092c8be8ced92c2017f96b38ae802649c2aa0f59ad8a86d43e6da76eafee9f3543b57ac08c67cd8fe36b8471dfe72134ba71fff7545f7ee08a61993652b7cc78ae480d9cca1f6c809fe5b39a04fbe70a0bb16affe4d216bc9868a5f334b4fd42e9b5b5d3c99e5b5807bf15fd01b273bb3bce86206813762a5921e6dbba7564b42e3744485a52db222d40dbff71bc8080fae3504672b71df6e0474461bbc2901132be91540b1325f7d03df47a42f9aff2b31ee38d164954e7c48081a6125018f55db45a67446b522f94403ec5f8b75c3c51612fa378912e289bf6bad38a478719f602cfbed7cd461cef6a10f0eb7b9452006b7c91ca1f392894d372abd612d3837b3211622598b33bf8185d6b188fad70b101f82fa27531a9176cac75c144b5faefec319e52f891525f29219a70c5a035ad76246821b944a5980053555078d2a793e437636c10389b6c4cab7831b114eb447a4aac8db5e311cfe57ed096c45770ee4a20521ab2dd71b5fe858db6d78095eb4f6dbbd2ab20c5f5f2241c1d04ab277297e596583b22c2daab37383daeb904e17b09aee6abbfc1fbde377d19755a5b9abf36ac301e9289126279e37b66a799ef25df58eb0aa629c17f2dabdf032045b199f4f2318ba39a06fa74af325a2df9f4add325b2f1d6eb0faadb0af71812ef6732bf3ade8ca241b7d769d1041882f826fe32506526124b38488ece4514084a18e6d9e3aff6a1b0da824321cb0215850546f46cfb9b45331b1b3f8f55713ebad93757a7780815e93ec387b06fe49f9a9b4e2cb50fdf576359448011443a5e9fbbd79bf993105483e0fe6baa55fa891dfe663487dc36d967444542966e4b8371c92193beab0fcb00080b381e1f1f51efb030f014b73e56cd1334a341b22437951afb442dff6b9b0ac6b298018ebdbc6ff342f9f8638e52c3b497cbfbe43a3a9a89527f4b3486b44b5fa28209a7f03b03400e5c603814fc7751c5d4eb8e7f43a883514aab49291f3b0f666b2d106d25b383d8eae67f101eccc2457070b7ed8401e04bd265968cd5a5a2abea78d09980fa91b460d44331a125da2491efdf289357fa8e08782c4029ff1ca7e8bec6e5d17327d66963afdaef86b62f788a5bf2420297f7f00f8fa64a3df9edb4f24c822d711a522cc1863335fff1d202d66a9dbc8a095b8936a42566f7c7119711e235cdd964a291220101b7a6471dfe11477444fc98312022e4ca94d97582ac38b041488a7a8a5b8fe755b4333c1ee100d82c69b737101a28c45b1d0fa26590203687162dc992cb66af3ece4a49174b767fbad1f457ea79115cd25da14c22972b1cb82ee949d699e2d10ab909d6185f211443312dece608c410496342d37a5cc37d9a65a2a8575771d4f3f2da2b98bfd8fd1e0d5cecae24983bb9840b121d3cc0966200b2b370e7b5de42ba0b4d8d41d9c4af0d837be9d77073f2dda5c3c3cfd87c3f49216efa7a5ad7c1f1277d8d2726eb9bf95ea05751b59252b16cec1bc743bbfe38b421e28ce6ff60112a953ec9f2b46a9e87971b1c219150499b2a07742b0ba972415b8d6536588bf60c785cd9b615aef5e998b5549a3e2e99655197d6617232c19baa125ede71d1544bf63cb3f29fbefd7b0a089cd0e445d9e186f8e0815ca7a272c57a4e753c617529337a4fd1ebf58b7029fa8f5d6dd2aea51c0dc7186f401561ad7ae245ce1ee6d75f2a95cf2e7b527335ec40558ce62134aea9c3baa462451257ec22937b4127220da699ef57503dc3685f70a07098546dbb9e15f2afb0958980cee5067b9034b598a7140280774d6fc35379b9422ad30f14c5e78a2cd70a637c8c8e6ce9f73c6cd57d820b318ca52a2fed450b9ffa15fe6e5c09ac00a90c8856af83fa5f2f72090c96380075cbc5c282e5f3820c5ac754d7df10d825a69865779e99722fdda9d27305c6e58ec53c36cfee73415472cf4fe595c5bcf98f7f08f60454db9851da83eaa40df1f65987d267f282e76dcf76724941436533e57c1e2fd1b4f8314f9f0a8636ecbc303a5ee80330f25840a0665438c1c48bfd46dcd1dea44bbe4125f556fb775551c2f5f5b016f6994fc8c37b8f863ff902dfc9f27c9f967ddd6e16937b5ade110871a67fc6630566d8d62cd96de714e6ffc37f2be45e5eb9f830a6384930bd197ecc351d919ae5774ad1e4d0c189248e7546f1b4509709298720d62a987bb0507d2592c660c500804d3769e41c16e4dbdd52719781cd29914d4c20d5e26ebafeb74f29d3f677050e199d59a92fff134b31bbceb8270ab39dc1162836b7242e19710625f0e472b8ddcb539330e91a2ec8f3adc09e333e051dda46c9fca1690e163aa86076124062b378bcf5ce874aed34a1fdee4adfa1055ab50252f9aa6653ba7af12929590e8e968a64278b7c419ca6b66da006da2c3ecc4c2b07e1e8436680ba43d6317413e3cfc19f5a0efc51a7490e7f1726c8389702ec3e7dec475dc29fe70f528762d3c3e7d7d5d4af945b36cabf5a8eec0098f9afda104cd047e350929aced37fea766e078410971b4c6335245168431d2218e1ec651d662bf4f9cd8912e112b8fd514c7171d4b308fa5630d1a9b7cbc9a2dfd4c6e9965896a332ddd4ce63b6d6b09c649b819d7398e907e4e410794b47cc5fa6c7e3a96554a07f73c2eec9b4fb6d36dd66efbcd2fed7b7e8c7e8b414a55a200533d503fce0a5bc44dd42e66ba9fd5cb2a5566722901d4732e8aaa294b99c8c1aa0d392a471ab8b6c0210d3325a6800f9690cf17dd754e7bb5b4ccfc96bb5e7547079160999a15474729c357d314920991668a98fc9927911b2e3de50e94237c45aa6ae7c6d18df96a3820e2d310222d98c589128610d7c2ab528cb058aa338978ea4d15450990dd8f09ab50855c6320f65b7a50806e7b8ae44f410230a6288358d659c27266778375a18d196f573cf2ac2f70b38f4564a6f1e87974e0dbd224b5d31b1294fd96a6776364b04c3fd56536ead5fa41bdc7426018ca9444ce62754008e528a38c004f00377f6f95aa9133ce08ed28d7fa41b2400488276163bd5e7aff4170b8c331f3d7e6a4f43d6e65b85b044c9c8fc93f2736d1eb3af93b7e02c2221f09159d43ac7eb6a2584d8ed1855ddb326bb1e7c8996db202f29263b5f91a02d1299671f09d1610e919622184b19a919e8182ed2752d7aadd78f12bca04d40f4604929b1b8a5ca5300bf840433061a65050ffed40cf3066e9fe70e932843464278125a841a3075ad071c92a92daf0a5b9bd75e93919662401c3b76a60e75f5c88a103eec6b07d9c9910b654e4d488a1f05170b8904621a259ad8efb49cd9f68399a5b1387868a24a2a8f15e27df047ef4a679bf8eb45f30a476d81768e2cc215ae735eba04b6d7f285f32d9a1b5ad05b6557c260733b1f3ad7bb83093c12e0b21102f9002fa710a01e31bab0d36497f0642f24df195d7db972afb4328aaa9e7ff814d0b97fa4e383afd2d0f173b927afff3cd5a5424e6820f62df67ada49df2fba67c4fee7fd1491b29fc153b9089f5e17e99d0dbc722813c5ca507758429b133c8eeca7dfcc936d3e2802bb5d7c2cebe0242ad0339dab0abe670a8b0e7baec29679f75e9732c33b07841023aaf08ab146d400df800459d9aa6233ada17ed60e96aa5c52ac370c71c9f73da0a9e40ac7774a48a363dbb7e99308e40da4adeced6c8d843a25356e7d579206c19c46430b196f021f5410165c7a949810c1239d434086fe822762a7e2a211b38466496cafa1a4da33998819c1973e79f9accf79782a0d8522f20d64107cd902e676ff6315faf48525bb16056b7ab1f23a8c2a01211d045c04a75ddd87b33e7b1e02ab3f9dc5ce0c50bedbca810b55017596dee3c827ead761224af8adc5ca2bd126a76078e810d2114239185879e8b8440cfce291a39fa2b61c935c53e96dd7c9174b5e801cd693e55bdbd838947ed868f778a53526e1c68128ec640f66775c066e8e904ec51bb08561c32077c8da3673593435858ad11da2940161ce9cacf073a9f40ef4aa0b2c9681c37cfcdfc03f048fe09c78054c8395434fef6c08eadd294975e9b776513c59e9e4dd400918750a8abbcbfac8cad602cda86885d10ad7555834beb12ba41aeaff1b8d7e75e8625d1211efc9dc58fdcf0d3ab453816580968534c728326f6be899bf68464896461a1440d66b8419f489ae033513ff21ccc972f838794a4b5c8b7eab971e8e3f15374019edd5b56cf7159fa5fb98c14be31ff1dddee7125ca5108f43bdee2d6d9f9b2c918275da56616aa082ab4a8dbc076f0faf7433cf4c94086e72907485281a3634421cccfbee91f489ddd281dac893ab49a0c207ab445c05dc7dacb583c3b7f659eccb2bab17d0079feaca996e72a6e9de585e32eb8b080d276fec7572ea5e15679d0f3d45cb78b0cdcc6c5acbc5c4f3e3e4ff9d8329eb3858f97898fc0683e7200776541eb66c467855dda0c5ffe88115093adc0d5456c856a16397f612bfe72efc67ab20250d5eb58f4e00172668cf6f8d3f0578703d75d3b239ca2d5d760280facbd90140103ddade65010c40a9542ceb88ecb1e370bcb8eb88649d991ae7149a84eaa5bf25e1ff25826417a74aaea33b61ae7361cfe5bb0a985d7089cfb2da7b8dab4fa34ed7765c03c49b7b0d1db576fe1bc61e3d2c57319cba49cf8a7a16b10d5cd318aa4d9a692467d7665fc3cfd3428753c8b15c16398507ef9ed6ff658cc0e406154ee066138997762001d7d84a53bc10cd7e12acc34f4309d4f1cdf231a6fa2958d16fa452c7e511b91d5274b40a3294dfef81542fd69e4f5d7290cb7fd316b28a82f52e6ea202972ab3d5a6638a7327f332ab0c198fa9e864436ffdbb83a27f41079f5b7745a11e7942ca70b22e7a1e01c15a4f9d54c3fa47439956771581c0b4d7d315f2b160af87f59913f4431a5529e070ea3d1cf5219ae6473a3dcdb4e7def015a4613707e7266427e72dc5ffb3315b6a9c0879d88e43f0f872e53fdc9fb5ed50ef6536acce4f8905ae5f03b78d60f78387500e42e41f42f352fbb6655ec2cfc3d1275656147054fb77926440c4527a9a74280e1a224c7037749caafd83d3eef415be09f31254d0f51da71191057096d373147b23934b442dfd0fa4ee7587b54763c8adc4c619564b4b05c88d50608b41607e88545f8614ebb7cb9a47e9d2c7fca9802a0b05c0798151b45f1962c61defd897c5ff5990690b1517be9ff29b63c2f4439d548900f290bb11e0b37f6099722c2a8d52c7a71c1ee3141c525d0eebac9bb250532c22ce510003fd504a4237247d42e99677b88edb59ef0a91097168d74ce825e76dc192","title":"1381. 设计一个支持增量操作的栈","link":"https://leetcode-cn.com/problems/design-a-stack-with-increment-operation/","question_id":1497,"issue_number":6},"4":{"day":4,"pres":["栈","括号匹配"],"tags":["栈","DFS"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个经过编码的字符串,返回它解码后的字符串。\n\n编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。\n\n你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。\n\n此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。\n\n \n\n示例 1:\n\n输入:s = \"3[a]2[bc]\"\n输出:\"aaabcbc\"\n示例 2:\n\n输入:s = \"3[a2[c]]\"\n输出:\"accaccacc\"\n示例 3:\n\n输入:s = \"2[abc]3[cd]ef\"\n输出:\"abcabccdcdcdef\"\n示例 4:\n\n输入:s = \"abc3[cd]xyz\"\n输出:\"abccdcdcdxyz\"\n\n```","content":"096221cf5b628be1e73e8bcfe626c734768e278a04f8088208427f247f0e0e2b13ffa443ea6410d1ec9878a833a0e65ebe221bc49a2e129cbe22b42dbfe7b231e23168699ed9d2bc0d26c1aa8d98106c23f6748893ee66f477fa654b0266256db0a53fefe6414a444360493f2f3825348314cce6efce2926f8275a0c890d935aa8d6186b3b463d3e45c128b70f9331de2b684feb5b6445588da61c16ae9fb05e7d33760b27afe875237c64fb8877175a25aad5fc7a19366fa826e86c7bf61b225baf5df8686427d864592f36ed21343cfe01ae3a6975ceb9492995976b1803cca3e3b41dd9ae4db9ff3104f5a3d884ff080c51c949a44e314b5586684c2942d5ff03dea5e4fe4dc5015f1671ed331a78988c996da600fc3eb49cb40ae2d161fb0a09aece76c08bdc46af791639f4256495c515029fc74dc09a6bebdf778a46871d5daa9c12045352a5a36ccfcbf84848272446380ce1926ed255c4dc6c3617e7ddacef3ffeb8008963123f362f2b98df7e9bc972e74a484d3a3fdc59edeea56c07845118673a83cf190bdd216ecd09358f312ade9abf75b9b16304e87b584757fd801d13755ae801bf8e284ecde9ba04c3f981d8c032c960230c63b7655ca3a8b811a4dbec12986f409e3f5c4b6057130ad062a999d2c2e9bf35d2d6243e56d453ce532a019afd0c87aefa602a352abaa6b2bf3bbfe7238ac30ae97ef2c760c7c4792f6b638c6fcf0b8d42fab3f0d7191e92cfd2fb386eca7724f4cabdd8b8c24bb6f3df78001c06fb054cb1fec1ad7f714437080361824e08e7907d19d70c16581f0ed3fbc384b9650675474c9a755235b1789f3325f569e4b7066af89e4859c6dd735bb8b7ddaab7a18b6ce3fd3e19ccd4c9c3c5c0dcd92503d1380b3828424128240f23738da5f460712bcf3282c2a80a21706ac1298d76c4462e965d3a779a1dc5f93691b061eebb97a72e1a6d3e973721c76edca9d28970dc1ac8ab6086eb069c3f0b3085363722debf24a2677c6d81d9a2d71e86b59fd5563dced476acab2ad762d2d7ab83dd4c56024c439356ecbfa5ed2db80c0a049cf93cb4f939d16452758a82528c30d30cb41cf380233884e89feb09862164eecbd3a6314ab26915af793e7b4dac519b5b9624cb059f450ee8e7a544253280aafada2a754a3b5b2329270b1eccdad139343ba9abda15b60e0955493ea0a648f00f44df34df46eff68ee3dfe9d8d97dc43987c2b8ec76969c9390497fa1df03dd3a8f61b12c7fbe6feefc01bb5200cbe149b8f28a317555e4e99eec1d6423a2d5f95f5589fbb089ed05a6e74f51e263803f3ab98427978ac349d2243db4e781d19172ff2f72ca63b3422ec442fa8c6d6c1ec0aaaf8c80aed58b8b6e2fa786d4d6a675f53806b17a85bb9f911fe1b297cc99375494eb3eabcb6c93d6f92a447bb23baba496ce7865ae8993822978f2993ede19d70bf165c166257b6aa518be69bd41cf3a96b46b87eb67bf30a3160d8eb42627f8d35f5c54584f309ed976779d50bb0a730da07e8e76e5d0f81289b00fb8530d8381168e529ccf84912ffff3bd0be9d64a2a812fa6edd6af42abe2ba9a9ee32d02811ce2dd9d00542ef831fc35315956c01d889d4fa60f5a63003a3e5d625894067b05c29b9937a01d92fcf580fb6a44f02e3916e2d888e39cc2d25637b00ec3f8397953193a310cf1f5f8f05a0005d6a8b87296bedeb8223ac703f3a893843008d24a94c77387545879961e790c37d54581941d2975a99c61feb95c280b243856f284f8359248f5e73a3c0360183ade3a6aa673de9f8d375b7041d9cd4e13fb2e2814a1a85db98cff84f3c08beaae7b1b59243299f3f3e97993e36ace74d0c3f386146d34e0d7c19c8f036bf0534c77f1bf098e2bffab27033bb0ef43134d203c07e9cf892fd3895bdd543db43397602a24674765ffcc00e5ebd6ac12ecd8f43090b31b5e20fa05eb08d96fd344f5fea9f1157e9d3549c5b2ebaa6fbc78922454f50ac6c83137e6bea08fea4f0d856bfa6ed522ecc238574aa2bb04d576fe4a88828176f2d58e7bbde55c8109f8d105cdeeaa6061812f6f7974cd2af1af5528d14d82609d221d7ea62516939e89bc92880d7c5884e4e1e8f82e2e0e4bbcf31210a50baac295b4063d5e38805f6081efba5bc9165be1babb7a366cf213b150903138208c0c1ee862e5c36106bad3789b4825dc52dcb5db9ac13415159475c50debc7615424b410f6a0a2a6f221041ee636b9280ff75415a239f90fd653251727182cf4f5f3732cee7737db1b5578ad866980b13ee691819617b21b87b746e6e30a94f63cddd635067d92d9c1e0b5e8606be3796c9899471895ff5cd645f8cbcaf9e1f878895612e87a317169de339304fcc19c0af019f62aac6585a7098b84a96934699846e1114a99a4b429ac6d46b5afcf74d403e198aade53f4d22769aceb0d426748f1039a434fa5d2fcc3926ab50752d7ff5cadad0970c00b22dd9fa2ab1a7642a93696f130065cceadc5254187ccdc6ec66eae33442f31e0cd03f547f9b86868b1bc48fd274937b6ca92579882328fb0d5ec529e3a5314c482a92a99d4eca38a97935d56f3f64d52e60f5316823a68e69a1e0afd6c11fb0dd69011301e2b0ece4c030932cfec0b7d26c32f7b489e0c27f4df78fa70a9cebe9a9d878647e0d968856fb3afe9beaacce2822660610b32e5e331702d49387f65f94640222a376a91ad38137e40748f3a9cb48955a9ef64dedfc6402d2685002cc687d8322936feba8e8fb6ce5c7ca4dcb872ae9832bad3fcaeedd4d170763462f36ec0901f1c63b6a3dd9ebbd123a2019e3cd297396d052da651b2c66a6036289c948b1b09b34e54eee2e3791fedb17aba5e27f644b59988591b4ba4b0754a60954ad235893ca27cab6efba09454069ba1bb746fe44e9b2a1fc5357392a0af937cbe7f4d935dd906519b3fdc446c0a1043c528620fce26f6fcd00aca1e490a397028a787d9cee0ce0869595460c3098f4b1bccc771424165afe1d5ccdad292e293454418a3268223f352ca2648d3ffba5b2f400d092744b52606e5d63e25cff75c41dae8039039aa30986223ee0f36aed46558c0c015ad12061575f6beba57e36dd84552bb468816db71ce60e818f5625a41386e6c54b8d7cd709fac534947570d4ffe07af5c304db21b2b36f2d961cbbfcc8910c4c23fa311d0f9d1f7b866ac221dee11be772b710fe02168fe40013efad940608550a118228df8f3b0c7c04fa8ff9df4f257c61b7580d5b2eecd3eefe2f401672f7ab8ee5a5fc635413e81c829d3483f6eb8719f5c5b54051fb65fdd26e09c4e3cc60492546c7691515b014c34674e08d81c3ba4d6b6c8c893e85e826511cb2f1df3919866e2f4118d7c5c03c090d1cbf39034dd4d92c136862a3a13931dc698fd559eec5d8c0f168ff2b0b7116bcc984c5ca97f99fdf87a65262406c2d331a0a82c24e83547ff835ad342dac8844fb1c14f30365ce013b0ca79eacdb6b4c75964a02aa220088dee2b1c3f7c0d1c289f4b690f69a5ceecadcfb34b3fb851d87db23ad50984d426e290c6f1d96c63a0fd44208c4430a8371c8af05534f2711b9ccea891845d6728969b5af0530747928940843bf48b431ae7c6d48ec59ce7a7a5dd83609aa7aecde79a9fa3c784e5929488107a351150ed4061512fd69a01e775208322262f1e43e0437933e0a8bd6fa6dafc1129865bed52b12f26f05ce2beae57d24ff4770ecc5f4bceef513f6cab3752d24c5f1fc088295af66e682344e21d91f2e966b3b79e0e87e303680853720a6d26339b04d36ef89cfca73f727c9a2faac1e3affa3f4b29c283022dc2a4e2b540de07d4f633b0c0de5671810f391a244f18414422aa42c1d2c676a08d7f43889c091e0d21055e7f6e815f9edcaf7d83bb391e1b652b115e7e5bef13432b934a794846019db02adf047afca603c430a9215fd117f7785bd17c34bdd63530ebdfc7a22fa62193c95d91d16a45246d77df0b28b31ffad09af33264dc228b67daa90eed384e254aeef161c2f8e8230bfecf967fd4d8343ad15d58154cec34ae82c68b6ae3fc3a0bdf8f60b70fa650c9702b30b9e0a8a3453bbc138b713e96c4838489c596a9194779171e7328503eedf072a98a2849d874cc96d0417aab547ac4bc179891ebea58b16bbd9f8b91cfb6d54a7e6271c37e2cba41d31fb46264aa7d54a7ac534131cca49c85b9d8b9ccafb189c8ef18fce5ef5db3c78cf9d0ef5c5e553d629b75ca4659d475a7b15baeb93d323929eb2f01ae8f0a3214531db13319fdb7b6e2e94c95875e18e82e0c24a2f3d3768a71aa71d154f828d56fe0a104bccd0f131acc19b75d378f3c307d1551d467d70a7f6f7acbdf5d1d6dd7e8a00ca91bec447f60bd6d1349e5b6fa1953bc0f4f56eb5d62a2f8ae414c1f7451bae9e8b88f072fbad527ec156aa7ac428d956b7bc6fdbed5d1d0bf5566d985a33142712a9df1e12f2b4734d70cd1de9e7eea472efb49e7f82a79722c8678daa4b236ebf718f4b983c2aeef0aef7dc871c045c1008b5e81b79e85c18aee217755ba4b361045bb6c2e108da0cbbb56ca668f39642b509bc7774f314f28f5daf7368ceba27ca92fcce6da13277d247fa7b7701486455c2a804af6c9403acacd80c97ecde31d84f906afef6f7b83951662c13fbdac36aa56f583c4b6837453720bd8f37092b6413286c564e67c8f4d4f112677ec8fa14f78ddf5981366f11ecfedec8b7ac89e7c9061c31ded7d96a535ec4631b5a633fdd02a5ff33fad014db72febc1544591f4b530a7e3a449849716274e7c49f2361bfe34a34af426f6db68c6bcd588d4638b103f0e6798f1e31e2afce4d93426da43c6282336380a4f89d0002b11a285745f385b23ac4eac30ace255b7fcd8c686d47afdf3209f2b58dbe473591b2820504f7108967d655b3ed0b14e3be1465fcb268cc3abd4d56457e9cd4c9b941e3f45b09a9c3e74128417399add632adf41496f616a671639523390cb35b0862f09f7040c859d96cbdbe622c1d127573c3083604b46b43eaeb7c4ee7cbd5ddb565fc62bbaaf22a788f61bd7e6ce433a5525d626136d113c75255ab77f5eda75d60b6f5e0be8ab949b5a1227663fd468770bdd9901bbcf6099a02203e064240f04746f7a512d0998a19e45bc0a81701f9968ad8a2fcc8eded595c90f1cf5cc86c611547f90aee4fc2163c4e07e4fff5943528c9308f33cea5a6a8ace9347b34920239057d2c161eb52d9dd1337a6a0c0a7f59cfd017117f31a808f98c7507609a7ab0022c427a9a89d8acccfd69ffd926688eb91936ec64e56c912caff0a3db2514ec93dd0c56e1a31c7744b0de990c166ee20b3b36b9ae8afc6b6039afd3db778a4c6492f33878cbb1c9d0b18d46e06abceab765b68e29a813a77561a19d0d32a81803ccaef571c9024ede34ccf27e78146797fd68d1e54d737692e98a050547e69b9f97226550bd262dbc3359d6cd6c03aedb7b9e42308ac6cd681a355ada181141a4baaeae2ae8b6e8122124a463a5db0b5b79fa85940a10f904e0bf5c5ba68309419e78c15b236c4c8c3818baf87eaaaad31540d3621d1f0adc0243699fb17ec892545802c3f60b5ff548ff8684d363403bf4365e1566ee7a00712fb209f39ff59c2660545fdd6d39bc9bfa24cee206cbce26ed2d3e71aece1b99d03b3035803667534bf4955b740911757c980a05d306655a1ddc892997cdc3d06448083a6c180e09d2a5996e3175dac0aab899cb8ea14f291b7780df0445b14ea8d8f41c01e825dd1667dd7f67b3160088fc825c64f130bd88f48576978b405dc9cda2228dd145b5b4ed26b91fae27343efc2b6ba8e5d6f3b58903ec33d1ae2728eb388db0537565a8d93d68fcfb997c11b51ad5781e25981c050c9fff342bf9ea5ee32c4e41e450d4c83decfed81eaf08e776a5b3ff2757357fbe7a84a6e8d4791cfc68b3c5d17544fa50f850a1104fc3ca582c459f1d881b531832d9303c8a883577cdd1593dac991dc9e2368ac03cf02f4ad30a29e65853ecc652ed53ad498beb5fe86dfb9fb589e3bb626c66e6ebd87fc49b4bc5a9ee602ea6b1e39a6eca17b1267130a7fe5329f454565e55fcf5fa04cc4e4fd8365626d4d24ca62c16118e857c5b069699a33c276443b9f85381f7eedee9a3f978f68a264458d718af78c54af9786f98e666359665ae5b37d35a165cf0f3227e0fc7b470fd7d7ea18744b44b34f293dddde06d1cf88e0d5bf64789fad4fe9c51fd158e04ada7cd2cd5284bb16626a0d6c412da83063d71e5abd09bf0284dd1b02963389b584ab15d58740fbc0d847bfb434fde6a0e2cbf5caea27e9ec9b75040d0929ef64f1c579a81eb4ece1b51dffe9a0e305d43b814017aac0acc16f0654397ea4e7cddc137a80618c18f5cdbcd9179f8dfdec267dacbd86cf7a664e5ac55e6485be7d842994195faffcfb7c8a18d85e8b879c162883cd6638874456b570c897b6b6d55261bf9dfa724c7ceb05e5b1dcc42c81143e43c6b9b68163ed2ff521ae0d7b5a27bf214665da9a6fde45cd07abfe3e112491cecdbe7e00adb0450c1f67fa311e7536d2125e17eb25e10a0c94216d13236f2a7b8fb4238685d20d241eff845f177cf959a8c9aa6f9a84bc6dfd5b45f165ae3afd370c348e3aa399977c5e5e419103f2e32e90f8ff491b3e6f4139a081aafe143b23f3a3bf6de21d46c0266a52bb5d528b0bc62d5c90dfb357a425ae1e329d659f2c07cd19f44de3643118b18ddd3c8c2073063848abe537ca6f14bc1e46917fb31943c492d85aed6fe4d4030a3cc2314dc60963c326fcf7daaaf9761dc405aa33a921e4404ee2e3367c1fa188ced6beb22b88c7fea2f95a82d1280e4a3bf2f37e90859a05becb9af3b813324ebc88b5fa57d92ddb3a5872536d030c753259045ae6bb8a1a1eb5e04f2a8f33b1e6488f9317dab3e3cd3ad1ab5719c6410aa2c8fa6e3f8d6814b45235c3125dae2b33a715768a92c3a5a4ee5d6019f0dddec3e8aa61f38ae80395e33f933e13260ae4995880ff72fa8778f7ec477101517cbddd04beb0a2f08631a8b21330eedd4754944c0ca4428d66f6cc62483eb184f05b3c8efd9dfad3f703159d0f1fded36099d056a406f59243e92c902ba7063b38cae19b1caacb8caedd889a3093c6a2a27390cfe7914e9bb83d1969a180d4471760a4c69649673d1caf85740c3328bf04c2a197c76a266f2f30c69a65d97507cf209011e48f6ff79be06dcdd9839edcff262ab0af7ca91e2d201e18f72a52cb1140b6c2c4c40d82835ac1bc28829633220f3bdc2bacad5d7969640c5c3850d7727e66111a1a442a231a9af3e2a3b842f51d6cb96a1d44d191f4dc2e5c1e80ac7e910de0fb25efa9592076f5155f248a1c985ce4507e63bf40d0580274ab9a380a38a5b286cb25f6237bafab9908e751be92d41b118d91dbf596c3bd64685c0c6d67204a3fc4a59b5ccbb86caaca95f2b63824e2ef48060cdeb4a89c360e3a6bfa0b9e0437cf8400cfcd48d8fc3fd46a8d76f4eb8947b87bb77cb6c4a851222d58796c723a311c228473579ddf7821388fd85e545f9e530e10f7ac4ebe4dd439ea8c4d5add13d9232ccf16a1165a43d1e26a66977fb36766c5c8508a869ee0e8982edcfa48b9c1a62f775396496aa68b9d1ee97cf78e1f3dd6f168320bf5c4ef0b731797fd00ae9a87281434f03a65261333da4e2201786fac588cb028656a079d52e34300072245f21bf81c3b6d52f41817134c9c564d59363d1ac316f88518c810415efab0fc0418717b3e4ca79e88a9d9b721202ae1ecbc7c9967a7644762dc652acc27cab330640e04d2fffba46f1f977deba31660a1ab2feec8a65c188ecfcd8f462b84b0bce5f3616ad2556d6af9faadb35a3aef2567299d48bbe5ec7c4c1b49a5c8cdb58d3bd03391550fee4192ed5e9e0179b926f251462a49e6c09105f402bdd5903623d35b526121ea161bbec6a14f3b87c7ed82544a654069494492eed8808d5a67ef03bc33a2679782ff126e63941acc21e2346f52825619794c6ac51013864346dd401dc6e58721a007dfec67a2f71a0afe78e3d4b8df66673d9169c25a9eb306dbfe4b25601241228322435df2ee96eaa46bb1104fa2b70ef8b3f21929cfbb6db4d8d5c91ecc4a2839e710a74cd6df48580a72c30dddf34e76a27076f06d6fb45f5597b0b222fb2697883ea20e1d94496993c057cb7d294c1c36736dab745084058525a4d27ddf7a1f3b2ef24a610f3177341ce34fc4dec2c901d56768c451291c3bc09991556055b58f3c1357373ca43de0459e3730e1d0f46c9cc5e5388e670bbf6a4fde46cfea7db7a725923ce752bd0c157ad6452afa178a986a0acec8af1b92652caf924c4d12289c23fb983a6533ee8f10b051ed1bfa998039ddd9b1cdd0f395d88ef284e8a8bf6e501aae1c85c89efb7d961362d036a3e14c8b15e066cc38c9aedb71ddc70e6afdb0a2f0616769e3f428122884e077695defc894b72c8a9572ddb45742f3c5e78f83ebe4233eb72888fd4acfcb14f58ebcbc81a63e1ebec70d2d226a5df435ac9e83ee89e4e92beff1cee4bee8b593fb13b58c09f4539a6bd3a401b8635f89b69001428fc6bf7cf9ae1c2ed5454b59734ac918f4dedd1b837cd3573d10cda0b7d4941c3d86fb39402c878feba03a5dd9a0618c77cc343f29e7b5c3d3aece7bad877dd1856c35943dd7cc2b84f16a1fc96464ead7b5ee73e382cac6544adbdc76a7b9ca2cb6bc0b20b99425ac4b4467c448024f15499bda9e1997a46dfc30074dde6d12ee444880b607bf7f2a66ae079760eee625139565fc5e5f7ebabac7b1de344c8b3eca5d71efe125ae32c3e02a6d5e5400cbab638c4465869be4fd9cd0b008a29b6ce43e7f489c6b6dd2f2e1dad4523bef1c04b28e02663f8bb8800bda77e48241985c33895e846917930382ffce9d6850b6e75ca7f545051d98e5dd8490fa","title":"394. 字符串解码","link":"https://leetcode-cn.com/problems/decode-string/","question_id":394,"issue_number":7},"5":{"day":5,"pres":["栈","队列"],"tags":["栈"],"whys":null,"difficulty":"- 简单","description":"```\n使用栈实现队列的下列操作:\n\npush(x) -- 将一个元素放入队列的尾部。\npop() -- 从队列首部移除元素。\npeek() -- 返回队列首部的元素。\nempty() -- 返回队列是否为空。\n示例:\n\nMyQueue queue = new MyQueue();\n\nqueue.push(1);\nqueue.push(2);\nqueue.peek(); // 返回 1\nqueue.pop(); // 返回 1\nqueue.empty(); // 返回 false\n说明:\n\n你只能使用标准的栈操作 -- 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。\n你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。\n假设所有操作都是有效的、 (例如,一个空的队列不会调用 pop 或者 peek 操作)。\n```","content":"096221cf5b628be1e73e8bcfe626c7347784218a04fa31bd094e51256922010200f19c5d26e68d9092e660af7dffba08f46803c2903e14deb929b72dbea4fe2efd717a7794d6cdf604308dac848d517a3ae17392d9b0199b21bc68dbf4aaa28a1431db0862be8861435b443cea542d78f736adaecbac7434af8dd8da3da9927f8fda0055355d153140cd2896109331de26736ce8595f457a89a4312dadbc9d5e5e09702f0c4c61ebe6c422bfb01863484fc1e19e200d958d77df6cde35ae1474299f14bb60038374adf77b64ff5b751d8e7cb0571773a0e66759e8bc00532ab6d4f7cbb37a37a27472a3da39216b4c554d5f57afd1c12f3a0824ad0c311904abc45584b9a89646b3464f660cf35f586bc0d68f20fb0898a84d14508a244dc0339465f0e405bd9ea228b1335735994f6eea8b2d56e1f700ada615b8d819ec4410858f601886a194eb126b03c3b9857cf6a6ddabb9a49fd950a327e99b3720769de2c99427b8db1de3ded8b6ffc4b42859ba0e64b4af423b322542b54397a5b31278991a457d73dbfb4b53ed722fd56e8fd9730895c08ccf5703849b32a2d8bd85387dd19f85b220bc1305fa8b02184fb03a251d3865fc68eecff6ba379f8e68777486716f39831981896bbf98acada7e49c1ced7e1e5f2d1765b41c16effeae5997739eac9e5246848691fc600c39ef19202b75f32e39ae1e14de26f04401d951012d1f1721b4146989688f03301817d0e04b570100f6c36eb2844c0eede7c89f5bcb533b13664c40d104419dffc28da3f4c13b0a138e07848004277e1ff10e2c6a1d16d4fafca8b9440d7b58439b5a4936ac6558848c3020cacf4f7cadc062199fde3102b0db6644277c60a43031f9cd2241756d523f3d57a7e459e48dbae29fcf88d26a59b811407aba95ef4853f5c61187eaea358c32a26a8ac3d27fdce3b40ff11875c87e0b3dc7d0e582657d4b8e960f37c55ff1abf98f71c31ecabe538bc22e9d142333a62dffe90838f34be48c9d14215158d06976f9fa1165cb8c1084c274d60b4f036cf1d9cdd9ebbdd1001882adc24dc3b88cd0e8013352ecc966b8451638b0df2c8665b81bd9aa7082033d87cf91e939bc2d72cacbd3b63f54a9632c86791c4642a676997b8b24eb399c5a27e9e1a844103281a3f3d12b7247087b23232d0d33d937981e576bb5f18431d05a343a3324c4e0688942518548c30ea0d0e1a5f68e83cf1d9f2dee5cc4b57bd7c582f1096bf7850495678032ef0623f14da68129f42f0fa68f7ee0afbb5a21698dbfac896e5687313a0b75b9e7c0fcecccb3393ea6de7f25f63d71e0a36dc3ad842de894b85a186e7c39b74a760ef928ed5ca92be35f8e53471dd88f402b346249e1cd6048eca4573b11d1f50d3e5edd317d30de7ecdfdcdc6c44176f1a11c2c26db37d6f503a8c322f2581b9cfa638b1a2155044d1cd7fc6dcd893865e91aa84d6e1043e65e3c8a98758154a0fe2c2f34b66c6de46508eccf1550a0ca1c22713feba4bbf7cc94e26be4665a693cc38573e03f424bd1bb45d55956d687e546c93d0a2362ab2a71c619e5fb48c5fb1d15782466c5379c257d191ae0876bee246cd643716faf3b4f27ae8abcc0f2f2affc33ff8ce49c49cec0b9e019d0bccc166072835c897f8ecff58d601aa20e4c880f536b0e16392cd0dc05e3bed8a3f883e36f67c3a8fd7edad6dbe746483d78a2bd4b00b0ff799941516e02e5ac6eb3747eae4591f93ecf17186d1eb71da62a93f79a20419b7964b7a8d0c057d74c05fb29a848f3c63a7b98bde15bf437718873d8b586334ce6c54e05efcf7ce397a94a5ce341778fac1fa0a49df050472b3d4d331477148a13388e49a823523623f9cfdf6337499ca6c5ca9e2c5410ae899262a657ab27033995e0ac91c5236c943a204e67f618b548de3d810b78e09d40412543d5dd0fe53d7301c13199af23dcd9173c9378ce664a9f706f8f7590c5c77417a95520faee8b9df15ef414e22acc5c9ce1aed97f65121b18ddd97d12ca62d971e24dc8a3c13b6267afb06ae4567358f67a3e18ad160ae6e24bc2b77fe9a2e07f08fe260e1241bc48f6c7102ab233811fdc0f5d2783a6815c6f4ce3acf65a68383f0a6c2a30e969152ac4d268659d6227b0c88c4876436cfb700ad7d9c727cc988d7ac5d7594924d178eb41d9550fb65bb4549145a985756ae5dd05f47e4c827195caf8c19726a5158171c419cac45f4e27a52a1f2a116d74464f179c7fb791d57ff51b881df939df7927d6bbcfc0484a37958a0d3418887a6504e3b91fd5b2bb33e4b9fcb2e441802f838cdc6af1c571a0fe695b7cf289fb85fbc80a39e11cfc1657a0cd5b1fb8479a3214626c7658a11683f829b0d4e7d307bd54f6782a188821d638841c6b869c04af85a079196aab74e40f547526cc4fb4251782d08b74ba6bcee6fec73b7d78296db0e832426e6cd200b84f4ea6cff3e08d6aa92353e8cf559a8d0842f10a16d45a00cc405af9a30f922daf7901d3c690131dd0eeb036d331fe3b066f3ba1920a9b17f1c5314a03bf6af9276703b9d0bab2c3a341c1ab899a6fed57724199b6e2789abf9dbbe537335757ed233f4b829cd0df285dcf7459b689f1602efa1ec3960d1a113709c3561b0a11eae13b582ad73878689c0b3cdbdc44c57baaf1502dc4e8830bbdd505e27fcef3ebd6c4f0b5f003eef5c4c0601695790c60345358fa71782c1d3f84cdbc72687327218a44c485df33b0a20ee0b79d6163778d7864f5f6930e4968ec121bfdafa7146ce6ae903af48e58d9d19bd0d15e06325d5ffdba35d6201b2d5a5937772a5a6341dc58ceaa4e3af083b7a24e9734458befe98ad7d697415e3dd7857b0f6abc78e11979a14f6478e3ea2efd2006021610b32652f122c546d328e51ab23886a2e6d9b35e2a2c7777c9459f2ef2525300a6e1f18e2fe4720ade5e8e97990be203c7f3774e4e52eaf3abe4c94c07699a188ca1f3afc5a860744a410c2e8ee3b5d9ad6169d518980d2ab9b6ade41e44ff71556b5a7a31425720ad01952ecc75c91573d3d2b4533f6a0f390445b20a05c1ee3e7897ba14848ed665e131e5bd3a681ac700148510f1fd1b4457f202604851a2e8a41e9e62a40e65ea19977baf7b5e47c2dc08bd94b7d0fc8488a2a5c22d9cfb03c88bcd9dbe00c141bfbfd04e84a8cb6512ee250d99ea1dbfa42ed48e64305757b569ad2c32e81ba676285409e33662fe412c32f2fb417fad50a70421a1e7f081ca05bd7569584cfc55f41b4e85d39ffb2eb584684503551b7ca6fa5874d934620880da3cd34d186289611789fa8cb995a574c967d3dff5e9728c3237d1a3168ecf096a2a8bd39f66c18a231e4e5d0b2f21e442acc33fa3e2750349b22975dd5cbbae9d5771483b6e7fbeaa39bf9653b94f540f129e66f977ceddef99d00140efebf1ec1f344e0385c7e00789506e99bba88d46b0f65bd2904242d15829c5e92ac6368bf1fbcf1206b4e536d11beb2619cbece8ccb98d09e978a733e9f9a8d2a3f7e7eebdb4a6548fa7a5e2a5fcfdacceb74630a29e0404694e3f75f8d9639088bb99e72082047d9fe01aaf846190e10b2e8db22781961e0823385dd4aa8f0253b37d83eece592bcf7fe67d699499293a1e64041c1a726e214eec7c7066112a1e465c5331129d1b7df473b5c3f37c9096d2ba011bf73dbfc96faea6c0908e288badf76f1d7e26b192ee0d659e6dfc5431c0c09f7bb0c88b11d80daf2e77fc95e1082580e225a17777cf5d1304910ba09862c69bb58343f8279a3b95217c45874209ca0b3d0c3e28334733f54bf20963343e3b48fd37fa16ce9cdbe980332260fffef3d9093f1f29b30c8e1a52fc462d4fac2ad80bcaa3e9dbf49e95b166a6461815e0790fd39060118c8de3f9cfd880ad6e84684807a11e51e093c0b0ee91ebfc963b5045278c4138142c4e93d47e1cf0909fdf0cf603d23d4ac60ca47f54a55121de867c27adc0ddfc6fbf38b78a469e942008631f20eee9d504f36c1d0419cfe633c340ba3f21d624a88fe7ca7030f2293fe86c4ee8df9968e3de2e3a8555c484c6b74cebd2d78277c3a621456a70bd32ea2dc72687a6a5632c2f26db803439ec228a5a171351215061708ab48688e686e298d17968e56c41cac1148d40773584d72792a146788f5cdde121f94709decdfea392aaf24a6f7220c23d39fa4fd71efe6c69c92d5beff85f513c8ba49f9bec9ec6b26023152574956e534398512c11110066e6aed4d4aa5da42ed4920ff07c5a937e61aa8094fd5dc830aea41c166d4e0cb02644b7eaf6e6a8519c9e5818ee221960eeadc771936fe76fc85cbf02f7a97c52e8006d81ceb201a37ddae27518552b422180e20fc2b6a39eafb2cdcee710332bca1d942abc96e672d92a5ea3b1e003719f643c02a34f066d64462e320a665feae4a0aac50560fe9259a94074c6945a848f6b75fae7a6f3d1d8b35072bfc0ed76167d6fd6f1b41773222d8955afe18e41f80a28fb0bf1a6657e27788c7ccda3f776a5a312a0f699aefba149bb34873fc01e9c41933f81aaccbbe8f5bc6f7701f202651e4ca16a5d07ccaaceb5499502c86d2c2b4d86da775f31492ebcc8bf3cdff8f632dd068abfbb1d6b386a38f3ff70099b585c3a9b60ab802f40e2d5a5ef6fcaa60ed4ac4ed1a03b22d3d0182b8f2df2f962aa4bf5c5c3bd90655b692697ae37c6ed7632819506af30ca4d47456e3ebf81e8010b89b4db0f20f417c4aaeb97328b8e56d12f871dea619eb570d81e74bbf273a39b2374a176cf0919ff66b8cf1d0be2a0f473ecedf406d49f1f2e071319b72a65d07bdb0aa9668fa559dca39397d533e0567b407de09ef31b2bf8ced92e439469856462656b0a22d0a1556e44e79f5d75681437e9ce02e6d3a960fc82a7b98e873fb1b529850158dbe473591b797613263a06c63235535eb4f81a72a00a1691638c9ae481876413a8ce45d28b0f6d43a78f8a27315382166b8c870869943a447e1c662c475d077ed5997cf3dd635f9b0a45cbeec28a98ad22dcd15c2a163083604b46b43faeabc7a1678b46fd4c4a857dbae1769db6971587eddb0d331c60c43b03695c2e640a53eb2b20f075d60b381642a4ee94c81f5e6168769a48770bdd9915d09f30dcee660bb221270f09661261567970cca9935aba1994701f9678c6963fce9cd995f1ba5b5db68788965e047799a78b9a72269a8f384faf0c101a84c04dbf7ae65a3290ce895da6036b20cf07eccb61ea40b0d43937a6a0c0a5f79ed7533443a648ceffcf96163c03a2a04534de32eabb94f4c38fc2fd92982e0c2c77559c228b9d1a92371cc2a9025b44e317ddc7aaaf8d0ec3dfc86d3d549e00a3277cea7506eaeaf563d2a9a26e9a256b87e281208cd5581cd5824ca6d5641d4fffadcf252d3b3a6d1889b95e1a9f1e45a64c2ef5bc9029ed24c555ee2250ceb2845563bcc505f4a6f76ee172195e34bd70bcc5ddae0de8430867bc224658ef63306b76e6fc2cdc39085df1ffb7d586f2a1305f292350bc42c7fc25217c10e47d2b066ecaf565953e8395650c1adaf509ab84e016ff7a900e30790f7e068fd530e2b289e8d80c600908a3b55f68a228109ad470eab4b42e688d5f7dc6a6bff3c63a9a8032dcdc223db5d5418457be7c9f51d3c08f2e5e0d38406542f725eceb6c6feb1b0567f2112e64788a58b8ded1b9e5ee79c7f44dc661ad9b5d184cf581a2ce2d180a71089506b48a9b01574907651701d79f1f3fcc905ce7d1ab510a5bf7780a7fa2f972dfa6960b5042a0299a5bd915f0e0132795a3fab54c6887c68abc831e15cf9ff6df728a733d13f7ef0bccdbf39845b3596849baca051836644b9bda809d35bb0a9daa25ed167c1477c2b5c6d663035d6f087f6f0892b834dd4427e24212d6257f10e20d5b385cfa5b5088bbffcf20044450417c0424546a9e8b7db1ebf7601e5cd7ba628151024c699dd5f8a4fa49c109ddc6cf45f047377d9012310328eb09c94f9e5a5dc6486e9547cac40f7f3418ddda4e9470ca6c27f53d2fa2069305c4831094001842706b72287d31bd1cf270ac08c23a30797cde6c7dca5d448d07d79fe9697f4cfdf1c7a1cfe257fb21e78fc9449a73d769ec3f67607fe2a9d9dbda38e17f869020974245b2af77da4fc4a2b76b274170f40b7b12f17038a443e3963c94164da67ea2974f5829a3998cf4ba2738f0f63cac26e39a962467f78ef63b4c29a39bdbe276eabffa4951c37b1d081c10ed6937aca257ba44ad1cdb00c23f8a3b5ea8041cc1bce992d6c4e05fbf8d0e97d3638342f81259cc9f7acb037c688143ff4ee15c0514922858ff282f547303054834bf263979c3c0ea8fc762894a51bf06ff372a2f35ab16625c368411c1b54d583635785086d51f202f8c285170d6b675e670de72557148fb440e1e39e9ce082f0c7dbffbfc9965fca37861ca4ac61eeeff7a7a14fe469f7e9754025dd8ab5e19ea845ccf9f42f016766e03638ef11b5846e28aca72c231634f2cf505d3d1846b1f37589828f527b562d0d6bfc42ff9e8cb2e6ae206b45aa21d3285a7ed2d6e0565f5ef011580bcc4f52cff92aa834bc1bb9b74c171e2fa59cd8080b893e6d45b5ab8034073b7e1b66f058eddec20ba24656310c4cc7d945385c76165ac47a2d2ba9849a1100f7f81dbb7b054d70e78b26c7f30f5d7858aacad2244364bd1898f7c6517a135e2d509d6ee9c4794975ead2bdf22e31f25e762c60bdaaa3da107a6c2688131f348eac5aefebcef47853059c0b8e06c5f9303edf151a5c85ee31fdce3580503b97db92d11c2c9ae1fc9ca2ac3ae33cb86d5d0b2d076d95f863099220bce000ef2e62d300df3998b98fba426e7c1f9eba309d98867421f6fbbbc308ae6f605b684cfe38e017349b2c5b3ed77e729dd2a1e3c523e1d6a333e595740e6e8de4817b5ed1864ce28b6a86a86883ddab3e3cd3a95ee1144a80759aa9bae2f6dd9334bca07678d1212fb7f40f35435c1ced6b0a4e40116518e8fdedee8a50e89cfa957eaf025843c0e6517a6d110e6ba33b4873dbabc132809587cb1bf4df2f5a2a3d270fab45678bbc34c1ad55176ea29ce2df885312d73e1d0a953358efb9bfad5e45735b21d08d48f7db7bb52a71cf9d70fa04fd323ae1c4c12e0e19b1caa9bdee78bc9ce759390edeb379086fbc6518bad616f2ab5ff9a13176bb9c6c532632114b194092e3261f17796e0d48c646f3c4a7d96ce3c943047897be96ab7db2ea5cf9d6dd0c48399e8ad6873e4ee3fe2107d754d50ff631cb84501f589ca9442d18b957333c43406f58ea8f26e83db875d7969645176657afd323e263b3079345a237986e3e6ebc664b50953a96e1f6e8fddf1c92e54208d9c798058aefb6fccd30b6920b4411a3ea01c985ce4032a22fc0bcc114c23b5c834140eb0a7bac366a3227afb1c56ec6087197f4a93d5173f8deea0d4e97fe9d2eff0938487a7324b06e00c0ce46e503b6063c2ad0e4287bde19095b98d30046051e40f98773fc68d0094e748d8fc3fd46a8d76f4eb8947f72eb14ab2c0aa4e532e59782467732d2a26807148ecd86323308dd111010cca010e1af7e500ea45867cf3877f5ae313dd7832d44f831f4169d1e26a66977fb3673befc8508a86c3cac29a3ecef340aea4cf60221dc2242ed7d9df61ac74fe8e4460fcdb68320bf592a04237528be115e6c1b5351475fa67187d242eda495f066245ac11c2c37c24294c9302b610480f7a4ce931f81c69285b8b6059131fc85e51593a6d07d64eb4c4179d43150cd0b0fc0418383d3e44e8cbdcda8df6626b61e8f2a932ea6fae6d4739f6652acc27cab330640e04d2ffb2ea2f15926ca2fe7219f5f92fe5d5a60f6380b18cdd1256aeb0bce5ba2f3ed20d6d77f9b5f8e7296efd326d759d07e0f0e5764c1b49a5c8cdb58d3b9f66c52609ea568cb140d10334e078990539791db4ea9105a647e980c27871ce142d336fea5200c7e4b14611c7cee3fc7e102ac0a6ec8b2f17371a0b9fcf49c50283e12bbda0bd47fca7569238fe29f58fc46badd4eac3a5028017e94b28d444d25a494284368a09732899a3d69b7f9a64577f5fc7a28d3ff352fe9ee0061c44efec87c8d0ed57afe3b08db7e5796cb233a98f2863ab37157adcb34974ac24f6bac170c50ca8ea07d5479742139c506d725cbf473bc9f565f0d7358f8427b0a3d9e3fbab32d61f7eea69d1d607bd92b1e34bcc7624034a6100fe51afde2fd301f7484cce584b1f362e898fb192abe098f23b9d425d61069aa59ecd4ab8df89f25c5336b1efa544d76f6a387b6e21c278cf66eefa352f7d93724532ed4e88e5f1604edd0eb4dd2598e06ad430e61ff8d7684ab21f36a572a1dce8dc0a9497471a22689ff612404042a348aab7743b01a7fc2ad5cd3ade3c19820cc5d996d2d2e5b21e2e4349592976b6bed2e03cc8a0b2ad1d9478877854f7b5da548e2cc92c5b8aef4ea1144bf8ac7b7c01759388a32920a8ccdeddee6b226bfcc2c48977d3c962dbbf5c51590f0a06733c74f2fcf94f88fd4af50d52e2e1c280c8fe047acddb4b69122806da63de9ce7ac8e9b8b25b78cdeabe1ddd6f2fb7af3ac4487433fa37433ed120d2b81dfdc2432277e773fe2e17b3fb41b64183b55a868c0bcb02ec303e7f894e724317a2416d99588c3254d2f838ee0bc3b5fcaa97da1fc38c24550feb9cc524e13f6697059b8c721fd44fc5f43ae5452d6c353c9b55e1536178e6779064aec36bed6c1a58cfa2eb1810837839c22af8df7cd67dfdeddec945e91875af18c0b4eba0449ce6f26dc4f4d93b62cb77e3f75ad1ead63d8fa2b2da767e9755e40b3b6d4b3df037b8c06cb5b7bf60d812d31e9c82950495134d7a754a44772bf98ffd69cfe830bb6896fd618724280684ffc340d3757bbdd65d6ed74ef30194da8f4368d1f9737429675cfc1438236e38021e11d2a2157a69d2e48a9775ef9dbe50e6b115f5d496a626a3e483b3d614dcd7b540bdd414eaa7b5d7bb6eb5bac3b81e8a469acfcde510e38c6b86a05948de50985d034f9c238c715c0e96db00e2b0c49e515b93a2bd9d1982e9a57a5d5c456fb643aca222f0e8ab7bd44114f5ddc7775e52485da213dee05ee5afe027bb884f0bc99adfab3cb6433879f101b951bbe6139a3a07c4505185a4e39f514fe1a0269dbc07ed72935539b3b299a8aefc288f7123a96503e4d91b2f56af499fab2d5f0ff4fd0ba7a0b0d2905064c6c5c02024ba9dbc53d9544a778f3fce7030392aee9391af784cad17c519eeb7322b8355cb221c5063c8b1a14a6ec1478cb5fc95029aeb9c6981758f4d3bbbed2f441df6ff5c07ddc584f1c9c48c794d90df6f73ab857898801c06248423d744510184fef173ce579ce2b4deb06c0905e2d81239bab08f3610ed43b0ee8e582aeee52768110d3c0fb4dfe91c4848dd7b2242926089b2c7ea60a9df93f60540143b006f555f9b3cfe2f84f59d5a057b9d443a3eeb77a0cea17a48b7b00e0f596d6e1eaf8f5b00ee4aca37798928ce908d6e1a4c3a7d9cbf76b571d2945a110702ce872fb2af6e67930da70c557263792964da30a2e7497bffec102069526a81cde0d18d5aec3bd757d888ee6a3430cbfcf2e8b798433ba13c0996f6ce73ce459ff6926564bf8bec76c473cb4a936df92cf9ebc3d3fd61079c71507411c2cf099e05850e213653b116d2cd57b19eb5a58879c51c71fb7399f0872f792e8cdb2d223e083087c7dc4404a33ae7ca47c9b51365ff28012a312a81c181d0fcc1d76413867c44ae7f646b0fac81c6725ad9cb177eaeb3a2c255a773f178bda53b850134e89e1fa3b13e0737d00a0fea62364fc5f7cf5aa6241b16d11de836ac3d3337c45ee00d8c67cbc932a1c7920c6907dd0aad1bb32f973002d7b7550cb5f0e2e3d7b7cb04e3877370820d56a0957c6fbaaf01fa7817620bbd0019ea8e959771c759bbc357fed3f2b30141dca993da87064c79938720262a2312477c033ae09d56ed2b8e1b6e278f4918bb4383c525cd808b52795e150602e48cc0429dc72c5889e52d9a6b4ee945381f6107acbcb0d236ea63c2ea6cf450bc824927ee6a26ab9ef7967cf51a1f4babba036cbe66a34eca251ea84727920c46cab47cdfec0bacbb3211dd55e5a70c781a01eb904c99839967da91c109ffad6cd234458f46132b7cb6354d9fd1f0e9eb2e2d96928aa3de7a1ca2a42f4699d8a24cdd8b166c70f9ea46a67b725b0fa4e5762eac17f952243ba9075ac54128ca5166c8d92fb99b0c2133683c905ea331f48d47218897e76e36235d1760712200f3ceaccf44150bb6ef727d874ce8666a1c19bb196aa710545f6f207b9b1fe49405282713a51d4d677a68dcf92ed13093fb85cacac1d1b76f19fc94f29ebd04c4e4a71e7da35f75ed21057b76e8f6d48bfe4917056471a0912435bdb11a100754265d6ca42c6d023dac59092d6a4a135bc0891ed34797e485cc76ecc3ed2092c7f779ca65a859f562fe72397ebb9f9313095c39b013fbd2875921b37fbb8ff9df71c24fe57ae9bd08c4a608c77e929a552ebbb75ffab0bccc138eabfe9ca2a8f45b658ddf6cba6195aefa14ed07e257a75ba52f3d10140154d2885f99da06419630521d03c55f9767be153e23d1505e9833a04db5831865c6035deb3261b591a568f9567a9fecdc5e4c5afd0a11624a6d09a6e83e8e8371d4246e13a7297ea8e6c3e22dcdae93b2167edfb49ff5776ebb5fff68eb58d382e47334a5788fc7cb73e49cc884f773be72420aac1bb37d95ffe09bb288f6029addf403509ac9fcaf431c8f78450a434bf2d592e94cbbdc735a0f8fcc125d3","title":"232. 用栈实现队列","link":"https://leetcode-cn.com/problems/implement-queue-using-stacks/","question_id":232,"issue_number":8},"6":{"day":6,"pres":["栈","单调栈","队列"],"tags":["栈","哈希表"],"whys":null,"difficulty":"- 困难","description":"```\n这个问题和“最多能完成排序的块”相似,但给定数组中的元素可以重复,输入数组最大长度为2000,其中的元素最大为10**8。\n\narr是一个可能包含重复元素的整数数组,我们将这个数组分割成几个“块”,并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。\n\n我们最多能将数组分成多少块?\n\n示例 1:\n\n输入: arr = [5,4,3,2,1]\n输出: 1\n解释:\n将数组分成2块或者更多块,都无法得到所需的结果。\n例如,分成 [5, 4], [3, 2, 1] 的结果是 [4, 5, 1, 2, 3],这不是有序的数组。\n示例 2:\n\n输入: arr = [2,1,3,4,4]\n输出: 4\n解释:\n我们可以把它分成两块,例如 [2, 1], [3, 4, 4]。\n然而,分成 [2, 1], [3], [4], [4] 可以得到最多的块数。\n注意:\n\narr的长度在[1, 2000]之间。\narr[i]的大小在[0, 10**8]之间。\n\n```","content":"096221cf5b628be1e73e8bcfe626c73472812b8a04fb39950a4a4328440103223cfe8c5225e0885c2263ef418d6a54a5fb0e268eff401fc5a93ce974ffa5f124f52a696a9fd18cf0076dc1aa84d24d6d38e6718399b2439335a168cdefb6a2864a6fdb062cb89a252c7c1470b8c5cdb933df4d665120b0833e62574efa09f32786b545596ce3a3e7d5622abf049835d22a4b452d9ea1d1b208ab060542303b9b122c0a4916e98f70450073b7cd6c700311c286d7375a0503fe1d94334abd442f31d34b840d69820ef7c62c19cf22301dff068f374f53ce8f792d8ead87bdb4091ba2f32197dc79e195044aafb14c6b15c88fdba3d6d82f3a0828bf213f0f3ca8c26783bc919942ac46636b03ea665875f2d98418fe06884787f4c738898870895601d68d779de5fb1cc9667d47cd4a21b6b57311e2b57098c249889c42c12180710f80f0493c1423b0e40fc7888960e5aae1b9b39084d848a62bef96362f429fdcce950f98dd39c63d28646a0a6be4c8201179a47712135b5b59ea3fb0eddc1f1ae430230a619fa56d34a16c6bb1543f0fe7985b46e475df03c38311a55b504ffcb4241e487de50e9c831c41c7d9b304dfeb81dac030f76920024cb55e4ba19d85138cf3ee3f926d6dae3d564d6c6b1d09fc54a88cc8c2d69639d6ea253661da69eb502c3a98e1228ba7da631f372aaf8abeb83cb9dc1c8be639ec59e2ce4af2c47c166674a962f6218644edb0f0e51b0da0c2fdd23655ce7a0aefc88bcab9c04fb6f3df96b3b4c04b620baf94b2bc0718457a5f06dc6eb3cd68261646f3565d7c6c5eec819da0fb3913191f70ee2f5a4ef46bf44f2d9921fed74f7693c074249feb1401bcdca1aed6ea861ba2cb695ef6b5bed69abfc8b06b14b49ea73a186146130ae3b514d4978928737e8d06e1aca45e7e71d404ca50f522b5a456a2bb98788c2a07b74a728458d0dbbc62434246d283ad29dc99f1d7d513f28c0d45a5114dbe55e796fb2b9e246b82f07a9b08f08c614857044ac1a47390527b82ee15112c2ac36914293b82ca69500a4843a86e38deb75aa0107e5d19f1b026e4a427ad2c6c04f08a38f0038d6aa1b61fd70b7ddff0d58702c5404aa3b3ebfb4370c63703ec020f0f2a82fd9b5daf27ed3c96612debf3aa44382a476b4b19b6daffa9e89d9faece81771d4cc2f06481cb8503c35a362f332fe6248e2187f20d827b906a6c5a6f433539ba25f045d0e5cfb17ed5e3a6f23360fd830796458430c21c23e373a29b2f175034f9e3578f37048497f98db1bc8b7f5b9d613409277f52764f5e65a26568ef8173f738ba7de3ac67f89e5d8d5e94309ddb8df190ae60791cd629ec5646ae619bd2582172dfffe4a2f2c9efe1e5774bf9beb8acab1eaf2152ea5cf7f8921bac723650597ef2f3423db60618da37040868226c08fc443291f2786eac8e93ac2d7ac284fa39b11eac7adf63f69bcbb84b98d63c22cd09e9342beb503ffc0649a614299db91004fbca7a5a7040a2a0d89ce1ea9c61b10d4d048aa9d262995e7dc03d298b4f8405a59f8c3bd05957112fd20a9ad745aab9581059ccd1b1dafc3aa39b1879f5e33d13b8169d30e0200b6ee15f6c883b796491274c03ed73a0d5b4e144f4f6b6ef02d6a0e6faca9a0a9d3592376833f77740fa28053e8996cb6764115aafea980e077fa37b4d15fdaf5d4765dfda541e1e39003d78b9ac482093f24499a2c3d2c44dde00a41727b806e9f779870b9681a01a1fbb3e7666362d7397756dbcaac8c8571df067870ecd24dc66102bcffc6a9e753441859c511941a8e1e5e17905dbdd9347f3f05b25874d100a091d93909df6434622304f0a297536a61f2eaf4b85185c0736fbdddb672d4f7026a0aeae6e140feefcad08e057df7c2e5ef9ddecf0cc9bfb7ae7afd51b8a19d5d02fe9388ab17e26540d2032d509be60e6f0951aedec19a51400e9f042845cbb9d43c8f619fb71523493df5cb9b553325c1257c5639f6ec2049a2a71415cf1daf496952c25e5cf51ab63b12398342c0d81f1a85d78c87a8ba1af7aecfe8e5f8fe757830bddf409dbe5ab4e5e862c647b4ded29e9835427e54f94739d143f71b524148f8a84a48c871652589fc6e6f3d72f1b3f4997f91210a50b87e99ab9083e4230865a548de29b59e82c5bc0a7bb53166ce627b16190331626891433eb42dbc05b0dbbf06995720ad661ffb4c183c00929d22ee5c710d5c5427327a2301812376e7e6546358c7cb194d962e216aa0ef925fbbe9889e3fba6267772c19a687715cd194048655b95105aef21eeb5c16793522c40934565c02561eb694b8e5e5cf86578294834aeb215ea866f4cd4bf0359a5438322003b2a7659b10e8ead6bf293fd8c09ff3499fccb8006e91c31ed79f96c5e9f743d12e5703fbc109a3ee8a141e127e72857daedd52aa80aaacca09d2fe378f5d4e5b02f10305e9866a9092ca49095effd35b4590ff6af1687e26c7d7de6b05b9f9cbd154f4fa80b9439ecf2cc3057004467e0b3e409aa70c354794faa75086ae7019f982c33bfd237c6452828df99a03ccbb259c385bd9463ff5a7d69998efa71b08a9cb5dcf0913e03c6b3374aac4c4a73e138e0e679790f9b33078065eee46923555338951317456cd1b4536b469e11393ab44566c28924d31fc0ce1774c287f00ae19c1abe25f399aac6a080bfb06bf0a399cb29a835e3c09cb8a3db33e89ca5e2cbfc0de8620c16217ff76d8d1815a4546f9878d1e176e9ff5d97a1b6faf072510ea93e5a858afe56488c1a42b03f52cf7e8de4e5751f46afc13454d16fc6941d1d57b6bdea9287c923a2c4107892806f163747d851c28f440d7c3532561aa909b3717eefd3ef7431dc748854d8de1982c88bfd12370e101eb01255f225c14ef5202dfb4cac3ee891f8cd2a1f7c2a628b30a787992ac77aae8dac9375bc4e629049e0c39860b925ab6c8fda9c0ab9c6110959e9b49a13966d6565494f60f48083b2f8a2687e240366ab8e118e71c5a6175ed789dff16c7e7d7359403a49532ca106a62ff16cc6166bd1d094533f7cc99bbf44af2405dcc1fab0462dc40e8cfb55e232cb7a95034ee54870b344acca5f0671bb427a0205ab8ed436c23aa76c2ae172e47de3237dc52c45f7040475421d441c230e0bd32077c92e0d736530ea6acf6a460fa16262188a935f80e3c6ee43d09045a6b51e546dfd77f6cf6d18856a861e737c7f970b26bd5b5b79dcb23074ee3bba707cba97a991879f59e8b5958a8d43a5645dd6b88e9ebe3b846c71016c0d709af4597ce534622981cb10d34f2b6da74019b3f28ca08e62b707fb077333876cf5551a7c36c75007495347eacecd3bc1f7742926051b4c77c014ccfa5ffcf83e67731cc728d138fdb8e50872304a5010da8051de901de75a024408f900f2ee20477d5689081482c9ba9b136bca9b4d5d8a749dfcfb525f252511cde839a3b31725f33945d48e5bc044d3ecb1a21a4ef1c384d30ee32f05cf206f757e16a4ea6da530f4d84458c490f683d3bbd10b95f1e3edd296daf9ab8e215e8bcc5e069d4f0d6efae86a92878d94ee1938b6910d08e33904c15a37e1ae7146ab6571dbd4d4f286112f0ec8c65ea6081127cca905f537bfea795ba1d69cf3def28aadfbb3802bf581da85c4fbc6b7a2f6e17e92a61ef3432838bd7517091b9fcb16b72a10e1523b5f426ba031696aa88af4cf5a5b35fcae7b9b7d99e3401876b346531bd11bdd15b79a4de382205ddcf69a2e818b5c9dde8a1f75ffb803afbedfcb748e7fafcb06cd80d749aa875057620b78601e3074e72c910bebdb9c9644eb11fd02c29fe9c480213f69dbcb5d3281fbf7fa23dc6c91ee50ebd6bd2b50d4603277566d72327d54e36c948cf202e8951f1a94fa511d6d7e142b0c40f816b1bac242fde60d59516d43495b1604cfb7def26fc7b69de3fb583ae7a362605949b2138a11cfc825e58e4855a55132bcd22823b69381fd70e425949744d38969456c364ab9d49855d70c201a619a6cfa2e8675d4aa1aef384e3d49cbf060e1d32edffc6b1078ee0739a6ce219a073e0052da2f49060f913a60e68adf916cb53ea251d25b2815b4e1acac4e3c8ad43bdf3493fb6c3eeabbb3f9537f1479070777445993cc3fe2b0591ce21fb591bf1e79e10e40465282155e44813ebdf352045fec86acd312eaa9c609f7f47c86139059def779829e5f56cca3d1d8eb8487fe150b7c6879415d20d0770602ca5143484496b3483f0b1b3cfb7bbe2f72921092d433882ebbdacf29eb39ed0b3ab4c9bed2e848a6e4417d1122239f630989947bfbe9ef762ac77ec6e61e9f44b652c56b20b3956ec5c85e4c2a84a23992b73b16537e0a5298e60281f9bd89e8df94862b96cac774a1946bba8cd43b9e6801ccfe72eddd5ef197c41682e8f2e5d2cae99a86bdeae3a7b1c24e6bd48778af7a2dc4e41fb1c6ffc1117a7c01432c60dfe3724302be86adcf135631a5f4a4b930fc41157ff822dbbb06ab645ba5eef3a910842e6b33ad3a6be7655b1f2d0656ce77d00dde4fd20ec40bb52380b4e0bce1bc730c4ff340276d0332928994374d43038ad00ddd6b64ecea3f02dfe8f6e68f73005bb1175878e82c975749f00327b88cefa770e49643d9e92ac94a3121a1ae172c1022a05a4ba74357a6464fcd51a9961561c1fa183fff1ed832210fd9f93c12eee616608b569c763182c14e22e70c8acfb00c5d24002c87f07d332ccbe814f3457105af62df9d339f05ad5dfe6987bf7ecc5c2dd9b66fca936165a776877202fb7abf881b0b99bbf77ae2a0f0409ebd16271c395df2314fc021a929a173ebc47af1b8a897c967c65d37562286f2bf5b2afac5847c26da43c6282336380a0cc6854e7f6ee3856a5f2b5b3fe0cd41cde5af60e6d89c83c0952fb1a764d6680cd3ad3d0d125174110c3a06c632351078afff1a44a34642cb65c38fe79196301ea6d457dc9c1e7957b1978b313d109e5b7087dd2b43943a447e1c642e4536492dd5847ce3a40c13dd040c859d96cb9da970c1902b577e30ca2e4b1cfd3ce3a6d3fd24de41c14a5f8372b2bd24b4c2b40fada99e4b33552ed674563d547d620940ac6575b10e97766f5516e8babe9b5a1227663fd43b234a9ed24cb5ca7e88912470f05c744158200d04032d0398e8d011b458c4205a917ace8635d79483a3fec91201f58fc9935f0000d2b4a1f13c75dec1634fee7369528c9308f33cea5a38cf9a9541bc0a2a63822da8c46fef70b0de33f2220d061a575967d5f1eb008e703f90cf74164bee23bfe759d17e26100d4a3234704d1ea3d1d5f9f376ad28444f942d0c82d77d1a4426a571c5ebe2f24097a08a6dfabd7f8a6a9dfd3aa5941c3f77da073c768612dcc11a712dce156adae11c8218868d02470e7c776ae09ba5fca9d21b03efdd25ba8311dae5402a7fad40e278f72bca934765481034d39923cfb4bb266ba3f0d5c52bf2760790c04462dbd4f346fcd5c304ec85a5e6392faa7cda6c14f16a7b1b1a177ba6dbd0adac4a871836aff0839a2decc6b2e60e6fc351a40553d7861a99ba5ce599e3447ea968cbc6aa86bc8f0510cb5845556d2b994a67c73f199ad322ee9d1e44b1393146bafe4cbefd754d341a14bf415128f2b32a53bcd18e18fb7bd909954b4ddc05128fae95f6a314b6360ceed4358ecfa47ff5841d17c51db653037274038c4b40b941bf2454e1a24cdf82a1cd2ddef8899457dbd0a00dcaa5c6b08f86cd0e04c2d04136bd6c1a2f9cb8dc14eeaab7601df0477217d6914ab02383538450affedcf2773f40338ad00802172346a89f2107561bea00731919f6a10bc1ccf318aa79dfb2d93a1bf55532784d9535323135e845cffc62ab433d4625c2727c3b25475a661a7ff9e04d3b951dd2d333d2ce33a8ddb52a92e2fcc5459fcb7e3a282ce8f5858587b3999bc9840621ba0b4f33aafbcc1a62e9199a81b5bf5706153525ab48ea3a7855c64ecdbf57ba90dcf4ec35c851847f97a10cc0b319827b52c98aed9e2654a00cda02f39c31a78d66a116c1583bd538c4928a8939f9d5e6af4cdd639e4c9361e6787f33da776ce0594401e67bdae7767e5ba7a485a10858f33dac51457de755ef7ba173cfe7e0a66a736e4e0cc160cb6b19e055ca84516aa605cd7c633e9195d7af1789effb6784e938a20c188825dff422b918338afdba6a7f47674decb36013a841ec0f3227e0fc7b4a2bddd6d13b777452b3422f3df3f5c97187c3d8802292378eaa5daf0b8d9307ec2db077be955ac1d02c300c1b381c0bd943559c4d7ae74fa268e1fb8bec089d4529e8248b1cfa6f9ba7e9fd5300bafcc89be1f3d2276ba1653f62fec0ab0b36dd6bd4c878b337b4c6fbb42ce9062270c057936fd694a4e1aa2eed5edbb6cd2e8897c459208c05f30b8b254545c25e0584e04dad4922675795bbbcd935a5a36a37b40f93008fbc2b3b09e811ec508953174df3a01566af9835818f42f15369315309dd8e55131596c5b93d902a735f57f201dcdc88765e2b4fc632be75e72389b2fa957affbbf72e6aa75cf14bf35977dbceb964214b6bd1814453c1e9d8f42afa98bd8b54c0a6d65e9124b1b25184ced4f684a1ab5a35ea4c3f30f9b5b6724cd084b861f96f6b334597c53b9f5a83ed714f8647fff8909849a11019659197bfff54dc4065fc3c6a29add6c483d4a12217791985cccb3d6245fb73be9b5082afdf0c9ade0dc8668f76ba5e6aee21d27494fe46e07aa6df75813ce252a3c5f3ff96e10ade640c83f6b46c528e03fcac78a58c17a559dc27c3f946e039eba6be355a52dc9d9b69473ccfca9993a6f3bf249620c523e708ce69afca3a13457c44b099c2d6afa476a284b2aaec09c1ed320c4b14fac13097b2b015a4cbd4f8b32a684fab8485fd5cfe79826e16245b3d46047a781f57847d46de58177042e9ec74d7e3ed62400fbb94fcadb260d0bc5e66c1490daa5e04afa941c1249e5235c3125dae2b33a71576c98fd3bbb5d448624aaf92decfc2f824a3cfa957eaa070c670476f51e4dd10ffb12681c505f7f15a71104b7ca4da038dafe7f19d0fb9a8472ce38c020b9c1c05fa21cb20f608f9e63ea08435f48448552dfa8ab1ccda4a1204d1fe6ea18c50880bee8b067ec27ce736bc3b38cae19b1caacb8caedd889a79d5c6e1ed26de9bce9663dee474663af4d5d45c5914e383977d4b2a13a9d1023b3339bf07c2e5de812c26abb49ec68a655996f64f88736abaca2e6a5331239f8afcc3e2aa737ff3e128a9db87a0da80570052cb1140b6c2c4c40d81839c3967bb7a528eccd5f2639e86bc777969640c5c3850d7727e6611535c44646c54b6fde6a3a331b60747ea235244dc8bb0db33074ddff02cd40de8fbfb7a2f176f388a4f1a76c563db12b050b9ee16844af60267ab00fcd2ba607cf9cc23e52b2f6aca8a648044c5eef85458be15f1a1e990e936a7c0a0f782d8dbf5276147ae5f26ce2e107b1d01e1a01d038fdfe79aa3f7e6590f2e54e31e9a6f1d9fd14283840bd8bf739539de7687a4c512ec32aa77e6dac32f5d7e0c2b6c3f6f21153b82324aacd82c3e79dcbb427e4281527a5584aa52be00c274f3875875df50d72430921fd03c5a43d1e26a66977fde2636d9a11edec3d9a5bac66be5f15da8f9a0323c1d810622e8d89a29e932b2d91f5597a2205f4aa5cce6105952dbb446aec9fc7b093bf66e59685d2ec7494f1d4845ac588cb028656a4ed306e30d4f497800a054f80169381d8b6059131fc8171f0d3a7406d23dc0c409ef13504f84b0e104592329300febd1c6ecd1be3a0a6fadbff966b367a70515309d3c79c27485e1646c4b5c82bab8f03441ed12aaf76933f5f92fe593e95d63d5d2c289121faeadbcf5e86123d2496d2baba8a3ff1f74fb256e60c943bbb1e56d3d3149a5c8cdb58d3bd03391555de25b93bf489e4e3ca831e17e7004069eea9105f402bdd5903671960f4e7d3bea0b5df0cef41e4182c4f9d3373d74afc7e4822f4c1d1a0b9fcf49c502c0e738f3fcfc42fd800a8b77b564ff97da6bfa9ba69eca0bce52af0a7d9810da024542943fc34c6176c5ecf49264b064577f5fc7a28d3fae31b89ee8455311a1b8dbcac1ec0db9eaffc5fe963d24f1238ddb6733a33e0e50dcb34974f10edcbac13e8a00bde0199a0fd7096dc55864720795473bc9f565f08a1fddc173e5f197e3b2e541825e74e7679cd818bc85ede40c8f242c1416356eb710fd9c21cd66a71c15c6515035362e898fecb8f6fbb2963493583219439b6b014a8c057d4c68da969e17291bf4804f6a12766ee775ee06d17a3fb182f86185cefc65d1410be57a0d9908e5e763a2e7319e27c609d98ce1974b96c73bef3551f8bb0a5d0fcc13ffc237328acd85e7008f3e37b0a3c22749b2591ec355d39701d10b17407414742ed88be384c2fe9515231a669d0d000065b80abc1fd87ef7fb539655aa3bc17a8cf4a3288e824f38bef8acb32e2a66ee8c675064c1ad24662ee2adcce73789c629d7b44c01c29de18682a2e96371e43c8829db6f56be62490618453ba1d90a4fcbad8aa2c06fbd5e4e112c586e42b533616a232547703663da3734ce4f80b04cdeba2b92a5e41d7314bb8b0d3731fb7225fcef4b9b9cdefdc81daf6a1175f16ec67757515588f4d49bd0593d4f798188ea4a187b18e4ed6a6ffd363f98606f7afdbaccc9cd9a33f8c57392ca2167ff4d9bdf3293e8720ad12337b1cea2e527e183dd987e897b7e763d2819c35f518e9d0159b4c6cffab612ea9481d2de33b9ed21e40ec5fc30cfc99f1f0ab13745faf705f6061326f124cb3ac7a9502ded20ee3f2653f2e4f5c0b5291ed231af0477919c0ceb7aeda65851172034a5e760dd3c68f5c7d9adc1ce0aca7607c41ee1f1b429a818ea5e483a07c2c02d582fb283184431b9ab6dba7fc52c15cc568ea07ae6a16b475ac3487f3a07fb9d4b2eb11327ca9a910a15495e0617752f2a002d5f07eba356f2548d0982c462a6c60c8f8f1192876ea9ad12f5eabd2d19926fd9666cdf88a15785906acf9e4dd94598f207c23b4d5157a749ab66ab75782dc556ddd48ec603974a41970798a730d7e37d723f6b8e234d8058b89c7f228561d4ea109ad87cd8f5cff98c9deec7049f0c5ba79051459a1869be2f053b8dfbab8660ef58b92c7b15fb97cfaa762f33c729800f47205353934b080cb56744c2edcf1cbf81a0daeebca05291d1534665396958512d00025a04bd9da12ff6209dd8104958032d87afed21df38685f7f2a2fa9ad0a04eb5174d166c74943ab6f40959e7173a402f91a61b2d982ac7305e14a6fcdde92f372aba8cc16a25936b46adf1a0dd73ae2fb21bf589a9700fa714c583b7f411cfb29f45963cd16852704ad1a8eee6ca808fe526c75ed0a5bcd6164f4a7d9ae88e0d68231cac3d771ff98d085b1c07f94484a22ff554ad066a38a415f347969c668df079cbba28bec0a04e7f03fa3a711ac417813298052b1f8270289b9b1a792e59ca0ab52ac8dc2169accfacb558fc0cfad979391f5213c34ae4ab6327025c272cb2ff6e679df4b359e69679212974a9e06317697bfde0c925ffa1fc742dd5364f1c08bba0b2aaae78bba1d47a7b041a611e83ec24fd4f83e5db451d4259f664f0c4ba6ffd0011b09d1ca0190c4fef9e62d75932726aa2f652a0a469580ac05799d7b476b4a4c40aa4568907e16f59d199115de54bf6f09feed8ec7293c7ee31d085555c7737a33ac72609f04949aec2424b7609f79d8463a4e9e3425143b1a66cb2f78fa7598fa773f11c0f09813b5ff7556151df8b01ebfc05d9741d6fd30edd22b19d4687f0184fe9c3164da4473e88b6e55b7602ac88542cede0c5047c23cdace6ebdb4291d493acd9342dda5c5b826c1cc89a5ade1c9ed8d8293870278d7ea8bb05c28488a576004f692117a109b84771ea9d13cbbaaf17b753c575f376024c8636b18b8c068df699e17b83b09d0ba842995596648ba4aa868b47cb6c0c6e8ba4c90f794ca64090509f36def33c139ade7dd95ca0b3330f069f28253cba7a799d21ad2ce819f27a2455ea54ecab9563e9ca46542fdfd1a50e16626b0bf07db35292d5c44bc301bfda3052b992c06b791ab0eef3f96256d38155a78c89430cace9e220d77e173ed1302f87be9419dc11051096388206ceb346ceed5240e9abe6f9a765586fe336db56e68543ba29e52f8566fed010538d31b5bce28bd987cfe4bf7151af7362bfd4cc0d32f7cb05e9c927146dad1375c4511b009a8b3468a0587753f2b97697de26938be5f725ffa0139020f1bef0b5fe59553ac7def17fe254ca2f3c6e6d1b7ec08293593ca9e7b2d5701d3bc76e6b8f51f099e365d10165bdf466678815a2681b661fb8719d3bb3243accea0aa600ef477dcb77548006a9441a71b4940e7033a25628afb8f28b136ccbed6dd9c7fd0caec2d3477f5d0d1f6ea27ff5eb2845e59351742870ef75e843c5d1466f936d485815a2df61095c99afc103295f9b1012eb1edcbdd4231bed3f9f39739758377d7c1d132a5e936ca40b17299517fe7387fcc42cc54d4e9c08368cb7ba2ec7564c4850cb8650cf135dca493a32dbb4d1980a7dd97cd0a37163fa7cdaaa8b75ff4e16df5b2769565d085a2251f5068fc226588151d2c9ef8279fb6b8dc3c73913313344527653436689df1445175e70d0015afeefb8157d8e0633d01bedba8123063fbc2ac281604fa0c58baeab9b3d3f7cf3b2d2a2c50465273ca26f6870667b8f4a318bbe012555bfe5e8a06cb73cb47a3d62f23e8b09c570f202bb15d515cca31e8308b9f873adebc1cb91e347854ca421e8009999e118aa947f55c4066c56533d72ad1905e5065a1a9ccc4e29ea9fdcb391bc6b9c1f79a22414e6a3f50341309c5c739c7a52fc6f77c46d15efeb3df83a51bba8fad5d07f08d4dee8a990596734105bb65411017bdd828d63ed785ab897bdfced2e05a6a625d3f7280c00973029075e51d08d55ba1a23d19e83eefa8ffae2ac78c39d50c9c247b3b9e03def1cddecf97c1d56a4bf42da513f8f87fd6ae0c860880f00ea93dfa9168b6778a486c19de70306e9378862972945ada3b6958251e6dcc9a107a84b6f6c84b2ccb98095bcf104dfec5ae87d6bcbccc7698b53e472e09d8964203e2cd48b4eb9accf9f790a3959dc425545f4c13b048991e08d7b1a43a4472e369d616fa2b370e45244850d4237a03017d29e27cd5c873a3009f724c57e133ac717ddccab0a5a109da263848411122faf6738cff06194f6d3dc0f801972ef6f0597a77b04b33f1e94f6b725afd46e6a89db1cd461aeaa82b0c58d112f864700599bf01da2baa871271f7479c6d945343ca6b2ca0c7bd1e6e8df672d2e6fca53824e4d6ae4654500d9c1f76dc23b9d165fe0d9f1549903a90a8f0048a30b1b12dcd9dc2ad72b3d48871d94ab0b559819a003567af12bc0ca3bb9b859ff7712169af03ee89eb15a940dca350a0ce61a5259566701abe5d649f7fdecda08fd5b2eb7f6ece30eace879b56d2bb48af52a16a5dc3a4ed58012e1cda0f7b1b7cda95fc2836ae5eb4440796a98bc12c10b9a126408e67187485328bcf50a662124c8d1aea7445ffb76a7d615b490b47fdfae6e5f52795d5440e63c0bd40d29a38215a9700e594372c946cee29b65486495bd62fa425052c6395c9a57bbc460b76a3795c00a9b1e77ce38c0785cff3a8ce0fa8ccaf2fe9b9dc4e08edf18f317ec64f6b343d7bf228f89d2b88eb3313f1ddf65d2227c8ca13975e8cd063f20f0b1e7203efecb9567b5b141c4c333070229a2743f05dc1cef79a1c6d6867753582f1fa843c7cb9c61b2880a0be17009a1f6e4a1c3afe26a32e880ffad85e449a897c35546939f040159afc3436a9f5b1d9f3bdf7bf9f73855be4f8efe09f62014292d4820cf4baf85cc10e8ab27305b467515b106233563dd9ba399276056295dd73182a2bf67a30bd4505ca2115e0e8da229e5a2a3f82916bfaaa3732c320911b73958e245bc772158f29a047a8e4866fa003c57ab5334b24d9ac8189f709d1a0decb01072508682dc9ff0fc62f379c34b5385881fc027c3ca8177757b1f957514f4dffa74166d7cf819b0a9b071e76186412e9cd56bd9b4734950f77792ee5364fcf2f35817f2b30ec1ec7fceac4d8becf69abbcb803407599ea5faa2dfe602bdc9ae32f98a43dc4ec2cafcff61966526ae70b584a3ace3d8285577cd1bfcae80b52593ee21103853849a97701db1bbd0d3837e724508b21ea9a36b2fa78d995fd69e3378d9dcb1e6efe36986bfb0f2d46f99b2be92cf2c95ad33a206c8353dc603b1d8c555ff5a5707ed3cba8e7332223d733bcec2458d820bbb659ac19c9b895161bcf4cbbf75e9ba42ab9c2437932f7e1501957279c7d4f13eee173a1ffb17323e0fd76032fdd17d5a83bdfd5f3b5bac4b12c0ebf9ce21c2b3fb4e1ac792932bfe1a9fa5c0e4a8f77f592284e96e6f8bab2586d3577b74c8da1a02864006df65814474ef267f7d681ee069c5758d8d9b133c0fa5c72dd5d7951653572d324ddb9e898ad066c6cd1ee79334b50067aad064a821953a164425adc40ebcef422c8104a466fb8cb882ad8cd99420fac91c3d06fe046d3069c414848903bf3f4be1417f15663e9f6d4106ce6f3556894b2d86bb434faafab9e7846b305d92bf2bc858e44af116f59da13f26b59126218393661654631a8a778462f3f928cceed5bd640d6e716284bfb3aee39bf143a90ffa48399ac5714314bd1130850d3421c7fa21499cd8206e89ef52ca4498a322d8799a5c5168b221b72ae5e75a05e57c1c2f8b4f94935e079e58ff4fed486ebfbc8bb33a15a1c113cf01cf2eea6be6fd042e35da3c453b08a566615b0107817e8b48d9bb8b68d3fbdd1878f738cae6e0e3ad30c48a696820c026d938b6fa519b9915f74a20b7887e7f9ada3dbd8491c3990702419ceb65df8ef7a15cbb56e11b4f6dd7cf7431dfc58b4837e533b19594f07e4e7b3dbd6a7e719c29cefdc9e8719fd5360ce907f29270e69b1d55bd85e36737893e8c33e0c4fe671faa9e5ac8247db00095737a06f81b15ba9edd095e0f6b2121e24108c69eba04a6eb616073730ad79103c1db7b3bbbf0c681ff63a30609a9e57f2992853cb6116b57b984486955b73812cf3460818dd3f9d44a1339b9fb77d0aa029c7ef68722307900417323a8d4896835cfe8cddcf6871ac615e2a28154409b2e1d44be942a8689b0258abe052eaaafad7d743501a441dac2968d1f26e289b9966f1f1d19f2fba1c578abec521180626385093ba231ea569fd83b80221dacf097f0136e54ce45348d0074b6cf98b9771f39d2429d52f1308f3ee828c3031ffd316544f20385627a2bd1957efcd3ece2454b0c3810642bbb7cc34979765e79a767feb58ba850a7c3cc6d7ce201cc2abdad7685810176a3b2ce92aab1036af37021759498904461762c545314961acd1a39eb7d9f784d7f0ce302b2daa49608f0bea7fd615ba4d629c85be1cbc581328c57edd69dd16ee3531f350cd83bcaaf30e9a1644d0122b03d8193677593494f5d7097246b1db5a02e40054da3aa04d74f6f6dd37deec6e7d399e4a5d69fc39b59e328aaa9e7ff84795f539aaaaceec49341bf35fe32a2bcf1120c8f39abe1aad5eb35b9b5ff915f02b096a50e4136a5902cf4dda3fbb9c1439c40ceeefc72e41a8dab6da36d6a63a24285a4369c4abe2fafd123fa72f4fff90275cd1ed04ed2e50ce1451aec2967af796379e05bbaf40dbeb20392b268a7a85175a84b23e65aeba4e02e310b6196ec4f268af86b42705be7a0b68dd12e197b120ad27311f64c328e53352066fdc1248ad92f2d4d9912ea60418c186abd6e5d2f59fe8d8cef71b439078cd2fe486094a82222724725d995928f0acbc200b391e913909d1348d4436a9ac0adee2ecb0494ef25e215c3ad741a822ff7e08b3a29f76bd12127528bebc739d5355605e4f2709b6208edcff396f774cff3f90d8ce1d7abedbca810b550175dc982533d3620ae3a8b80c655d76ee509a45ded52da07ad4f297dfe2dd2d479b85075b1f5778364ff11396806d81187bbdf4e536870d2728db2c20f05d98b13ab235e07b72a08ad253e175724c775c056e4630e2c51aa19077da6eb12310b395e5a2e3351d24e96501adaf754f2f31b1a7ee14f6bb051adedeea3d763441a9f77f2d11d5e8dc27bf434fab294eea94670a27acfa331f6851f9f4c30618186d44cbb1ced5c9dbfd6981b268cc9f5ede55552abedf64ea5ff0d61b4ae5e12ecefcd4d8010e35b97424b6bb6ab31a807f1649deac64617541e899bf68464896461a1440d66f891cfec2e71e2200f92789c668fd74796547568e0df5c32fc82f56380e15becafd2fb11bde97ab9bd561b55ebdf79ea752768f1a85863943ebd06e0af7540cd33dc08f9fe4cc8923d5eec8f29966c3a70ac839ced3d055ee46abd5c9ebcd940558665857141b6a0edaccfca358a99579e707d08207e44b6408031271ed640eb12dd84cbd5942785d337ec9b7c726330c8bd716467a729f2967ae1c332dc23c5518eaf8350e1caa1dd9a6b8e2b6a7e3fcdc1a826d72bf069abd7eadb35f1e172426ef0d66fd93512102454c469cc1b63fccc39c65dc598f5a3fc03a3cfff549ee0226034a9faa2d1e6e388d798308dad0ecb8b02ea5beec41ba8ad0f26e243b5ee783dfd239d17e0145cb7fceb172757d6e13f160050600cf5901de6efa3e0f2b551bd71077d271d5dc53cc4968bbbf20eab8247464f7408e901a5c1d1ea071f90be24d8e3f06460b07d2cebd4408959d228db0f986e82042d82953f59123c8f065df10e952eee1ee16dbd33113d346c616abe34f4f781ee85f08073de5004e38f5ba835eabfc292eb0988e1246e29500b90bd5b26893472376d8a2a9c8bb4861a09e9960fa17cabf59ad600560fd9abc5c7a3757d5ba1702252972f99e79b85fa7754d07deff4fe649bd115c799216bfed71cb0f89d835eae62989af00337b4a100c5490163e0bac4d2d03893bb272359af439d5807b9f183fc0853bc8a7fc481e7f1f67a32028ba336d6507e23ac88fafa539b422c2f237fb732e92f9ba1c46640c57db34ef3431cb245a39e817f2f28905597fb70a5efd8349e8f465f736e882b7ec742984f72f1a8402d96699458135e970c5d3647a3dda692df321107ff8b2311d4a7f604f4d0c25d352ae1b94caaf0836896d3f1702375465217b99a9b0d6c3f5f113f5c416fd0443179b6bbe3a93b34557a3b52f7fd4284d60e81ca495f94f3adfe96a87ee039dd18ec5930c14efa524cea4ea02913cbd63bca481fb4a8ea0e598c99c485f0ca813a63ad145720fc77f83f7c8aac22bfd536c7300d6f4e1d909d4ae31ae3ccb0ca4ed9b4993980834a51dbc8e8d3e82e2487dac505952948c53641c3e7579e5f91f591b03e8435258fe93a2850074fb793e4aaa1bca48b0a0c10d926bebb7799cf9b4014f4c5b0e1450a918c7f3d222530b2a22c9addae8e45d3e3d361d60b6296d23de0b3b1e3d21ecdce32a02fedefdcebcbf0d0144bf089dad9851b908561d4c83e638f9217521900c24d29d5adbddbaa85e235481a8ef1bb5d2259ef89895fef866301ca5e2e121f0c48cef10d56bb4471854698eddfb6b3e5a2458b0a57b849ee4d1c0f0cb6fedce7e5c0d9f9188da5b5ec75e853811edea1bfb84be88f64dcc70141463cad24ca0457dc082b27b224a67569c623ed8f00fdd00d39f4b2517cf929c08597af417549d719663c92784c54adaf303a4a45dbb86abc6ee4741572c8d0e0551acf68d4d9dc02fcd340509c74df039dd8284a96844b86e038af6560953dc0d3f9dcc925cefca54f84059e9c48c7a5ebe7d73f56286c0bd3d4428c3a447829c880f94c8a2213151f9f1e84959bba486decce4b238566266f3293797c4b959694de22e193524958f79907b24bb953bb1d7fd031b0f4650aa92a909fb5d64e859080e3be56d1eaefb46c9869a952048cc593fb6dec743cd13a5358a12a4c485d879442b815f0f37a885c7d6c58f3381ab9f38e92c353bec4963fd7b29cc0e1623791d3385ba760f709f0aa88f1d156bbfb9c449a5d77f7555b95cd6e93f472679f231da94ef3c2f73a2e28a7b33ca293fe72a47e9ddb9aa34469a4a23f6af488fe91533ca2c730f32ebaa653e564227c001ed796088ffe0048efdb3fc296e37cba371d03276a2a035c9ab535157dccd15388b9a301e98679a2e0fae2506acc5799505910234b6fcfdf923733517320d1f4106aeeea6da918fcfee020c6a2f2ee07309d250f72161e9842eb2966720512d313d5b32af5901227c27e63826f072f3e2dc396c0bea22a3d87e988fe4da7a4ea8c248b2641a85f2af863254a47fbd6cd55f97cefb15fbde772e9948f81bf6216519e8c52d893ddbfae8972830a282953879fdef1677e09a96094b3f6403dc6a505d4139b66bb1fc3808b62a38e7df64db694c09c5ef998db8df98980ab32bc5f3400a6c215aa5ffb4f8ab2c574ec2b90fc3429f0d9b37debf14916c1c8ba7b207c366e0aaf399eeffdd8280c5485945f2d84fadc13493265dc608d5c4f4d5dc085e6787568949eb547aaac38a4bf2152fe79bddc846158e67d40206c3b42988abf03702dfed56c57c8c42d8d09a708a5d98634f1ad0746dc6157ce6008a1e7867799b4d1059d937c226c72e01da8c1070062c0c281220d08cb5032f2e829e4a8719b9c06242aa90d0514479031162b084477df22184f3b6dd75be9f52494af416ee6646ec02fb55246a3099ed414753ee88ba1a92c60adf8289287d81e712ab93947b2bd5f43c6e535af74eb22d388922fb577617c397d51cab0ad3bea57ee8a06d65c7f82946cc65e66f8aec5cdd610697ee54b5d2549c3f057b9c44c28f9019e9a8eeadaab96a0fd2e5d18f7557a69cc667bad7575d62d125f33daa6b6a1a04530ab2402b29255427149b682f7fe81a9115342296b692f5bb9970a1e725d8d714acd66667469b3e1a9937cb05e558577a20783a996a74ee7b5eace9a103b355a002b58dd86cbb250d020df6443f007cc43ff692cfa6a68fee63b412ea077017440cdd8cdce074bdee4ba371e6658b446689acaeb45ec6230e8de7b56540cabb5c672276077171482a6386070dc6ba9407dfe320c2bd2fa9134c9ed6bb3508efebfec191ab3d8d52a2d343372824acc5a4e641266ff9f2c3226f7d01bd51c43ac95c21986bc75ac54cea34310b98beedfbbefdf63a43792e422d817dff56368a68d4b93caebc4a6fe2e6293b269bfb47f9ee1113d2ce27f3e4f7612b18ef2854d2bc3929392a8c9dacd13e6310a6830fea2828a55e1ffb41bbc94ff7b12ffbbf3d5a282dd4bec01bcbc5035045edc24bdffd8fb2ed6999f0e8993d051418f363d86401ef7d1faf5cf586712384552c69ef21417dd46e6b2f66beeee00bd47362b5793ccc17e189363172eac83dfa0ff13b8b3d2760b7ecca87eeb3becfed7e8586333b7300fc2ba75fec32c1cf39514f0d76525f60de2d657b8a0098368b273604034b6297a030a5747ff543069231278048ab1585e48cb5d3453ec89a0927bbda0bfa163d3f469ec45a4a0e1d75da09495d3a8431080d294b4ee640a55fb9ecb575d5bd8bc4d90581f42708841f715b87dbf410c72d9dfefbf8753a15fe4374bf1716c87e7d92af8e273a6b43c4072224b4b0fdeee78523d41578f9edb521c4d4b4ee9d24388ce055966fbc1ba428d635f60cb148b084e1836730754271e0b41c450d5cd543388e4a99d6563037964ebf8e692080734886dde6e0e0fb8fdcbfe2970e817b20ef13196d0f8cab07f0d8b1982ba9be9cb24519b36e4a8fb993dff75b0e0e7460eff819d4e9a5ff0b3ee80877433503876a9e4acc5fd2df632845a69aeb4d176952e2a802408cc11ba4d76a733830119a4c99645fa698e2fdf710cc8373c0289937ee9e711d57f8a33c5e683ac6538f71f2a93a8707668f95a88a3f9a8cd33da0da86c4ef62d5d60f719374a0e4beb33917b685c3979dc8fcc267694ba70e932108ef44fcc246d5418f14a78f5f62868c037f924f5c7c2f3d9e40ad92dcb02bc45a9cb31ca25a275b65679e0558187c930120fa56fadfdea2fa90c510e40f353d4c8eaa079139edc57e836b621533b573e41940fafb1818860526fe659b02be891309d691f7468d29ff6eca668ee664012089bd65eafbe698ed9f828cf9a48293b75b6a82bb439cffb589b22c14e174a3481e13bc821f45644d663ed06038ebb267c52903599e9b6b92490f1caf38a20f13acecb3c33e82abb0eca0c3925a443342126a52240551c3cac57911116b4b8c5e60eb0b43f24c454425327bc95f2e22ba431a1e058e581efd32573c25c6fb6c5d86821714339d798e2fd39440d6f7473495aac3e9a06957f1b4740d6e190d77185875081c05ed967cf2408408f3056db582d75f2a4228bf3b36c3627eb22ebac9000c7247ea809e05626f4eb3ef58b9dc29c31d6f0abf13a496edd6af8c305c950e6468de3127d82f8105e0fdfe40fb128d59caecd06ed11c4d871f7bc354294939adf76a65f4239e2385be827d202689d1d60e8ec29c756ef9b5def1b1316b374f349af9bb815a49729ce65acc3210433489d814c29ae6a338bac6140ab5da09bcd2955f2cf120422959ab2ba996c8fa54ab63210203d3c33f4d3cc8d078913bb71bf4c8469088fffcd90ef863f173cf40a5efc93d20512acecebc525559b059c1092dc92c792427fc4dd92a13b52864ea70325820b87d76950094b9bdee623ad7c33d2b52abd966d016cb7640e9b204991aee403d8c69f8c7dca555e8dc98fbf07f0787c3f544c250639c1bbef331692c4870fa49d5a89ac983efdd4b001827781b7165831eb56be34c6c6b9193574cfdadb40898726405f282ab95088a90fd8aab9d79ceed45bb6deabe6f1576174563ab64af6786be0f115ff27d3155a0a4f44ebbfa6fae54e4451585e6c66c44ab1f0285d6f82f876b58a95942dd95291fca580287932efdbd2b432f4a8f183a1fc13122ee3bcbe2a33d40c5dedf2471ab94fce276a4550eeb62acfeed8a63be9aa1def0ba29d763895659cd8e9212f70660c31266b815cc51078017bcf5bed509c7ed2abe3064eda013d06dffd1a8931aebc1d881b2fa6f8b1e11828b84aee3d4920089abe016d52c08e854c745851895948b7abb805b4f229d27310d6bb06df6c623da1e0e945423ee633578003394b032c58585d673b631e21cd7e3378b866e50904019e5a5daa939c2f0abcdd4a7f17b733100728024a9331ac5c617b52bd7a3823e48c8da6cf780173fa458e5a5c6daacb44a82640ab812fd30aeac72e4ab4de0a6689b9253b28e26692a563864699deaccd52808dffb759957344f7c463fcc62c2a51a4a8486a19c6b485a54c751af180a5f15c8a552deae50598634979b4b2313a27ca5316baa94d18039870e64120d2b01d9a68d8a268ddfc60a676a8aaf59bde1f915105dd441252ab932a9eb2db17cb71125c4c381505b9f1140ddd3c9c665816097aa2974524c2348b5c0dfff807e2214819e31c6514ea71060e8baddeb523bdc5e4e1c1a1604ec117efb5bc1bc106d26245380406efb9f2eabcb35ad1edbc6eecb14e82dc06221b386f685a8ccc4e7c15c56ccc055e545bcaa25218dfe48c38e29959ac35dce161fc01ea14ed9badc7ec2d8b72fbb4def696324e8124e57f700f82fc82c3f586a4a89bb2d9bf235721b41fe5e02e40dc8bcbd68c3ca28a3954529c004ac3756e0f62443d444159de1ab39d5e5bd12ec00d6a9cb247fade098f48408e538169285f1244f0a2bb8dcb272217c53eedf70872ccf20adf8523fbd6721c246a6d4a664728544a39c8e87196d8c9688edacdf95d3b1091a1f22e5ff0e43920d6ee68d96a932c97a19e7aa46f59ab0a199d3ec426af1654150c3cb11cd64d0946c0f88deb53e7011867f19ffa15bddaaaf1de06e1ba8bddd03390215b8d7a04f623fd0b3599a17d117ef2a8f21b4367f40b2a5c8d93dc3901935d036159acdf724ded286946f8ac5adb03821b6c370e0ed818d897ae472af9568ce4ce6190c2aaee26016aeeb3b6eac103a706b042f8caa31cb0251c034f33dfe8034102e0fed4db51a035dd241de6c47f69ef9bdbbdf96a2ccac74a52e725063d30d0445c5b02eb929cbc8832644788081698c39f98e3e053715c1acc334cdcb06bdbc2dfb31f585d5976d421e8652f3eff99cd105c2873d84b328980799f1b07b6ea7293e9dde58cde84fc8612098f949d917edb10e2cc5ecd1bca049725a4d77efc67380d08ed43d9180e2ea8987301d259fc101c465936080fe71bf1425b19937e63af09d5d7c21c8795b04b35f8a28c2bfc12f073236fe1b2e62e70246a9fe6ecd952310f75d8bdc648379147a1b6994c199c84b10985a00e9d3f3b7d57ceb7fafdbcf3a37d1dc3222141c7c9f1da3db03fc83c75cb9296af37be2997dcdfdce8d80b3fcf4391fc077768310c6bf3051304fcb1ee34a563b08001800bb5228a7d353446489fc8dc2a864a2dfdaad2fb6e87fdf40d14a86f9b66fe5d8c2d4e0d327633a9ad10264f7532f4afe6b73d870c2e1373e41fb8d8252424b12dffc2645739e1551711f952b106aa9fc12908a4a30e2b067e704f98318286e7c429b6c0705b738820c1212905e4247cc13256bcda7683fcde62417dbb2e54bfe6cba3e0aa1b235d1e564932738b0f9e0261d17c840986ee4a83b3681678a57baf0ba3e9a84333b0ca935f200d43f28b8f1a976b538538703b6ac09457a7342d38dbdcc481180a09399f11237bb71b0b7cff068349e21bd2cc9b0bc14da2787f7fa521c208ea8f099d16f794438c34d41e5ef68c9e052e35c68565399d5120b63f26f43fe5708ba223b672bd32754e82ee5cccd00e2a778796be87bdf6e06a8c8a790d40b0b2381eb1d5f756441975468a224c9b51413147e4f46a2a4b47dcfc265871115d9066bf5bafe2c7f8bb834284e27c465f7","title":"768. 最多能完成排序的块 II","link":"https://leetcode-cn.com/problems/max-chunks-to-make-sorted-ii/","question_id":779,"issue_number":9},"7":{"day":7,"pres":["求单链表的倒数第 N 个节点"],"tags":["链表"],"whys":null,"difficulty":"- 简单","description":"```\n给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。\n\n示例 1:\n\n输入: 1->2->3->4->5->NULL, k = 2\n输出: 4->5->1->2->3->NULL\n解释:\n向右旋转 1 步: 5->1->2->3->4->NULL\n向右旋转 2 步: 4->5->1->2->3->NULL\n示例 2:\n\n输入: 0->1->2->NULL, k = 4\n输出: 2->0->1->NULL\n解释:\n向右旋转 1 步: 2->0->1->NULL\n向右旋转 2 步: 1->2->0->NULL\n向右旋转 3 步: 0->1->2->NULL\n向右旋转 4 步: 2->0->1->NULL\n```","content":"0961e884611df7d4ac47a79a9e3b6f2a74993342b3964da843074a7e2f1d4ea5ba126cb6b71e6983b7c364be6cfbaa5dbf2242c49b6414deb063ea3cbfe8f124fd2d257794c0c0e70c6eceac9a8912155da73ec61144c917d450a23e0124585c33489e47213c61f0acebc1fb773f4761925fa4cbbeba1b498d393a4abb6cc640f19c25c7efc7893e7bc128bc37952fc3297d68e45d584c6aa4a61c10af9c875d783b7b003aa9d744236c5af8b457117b0ba6c1e37b053262a70ee4767afa3c3d58bf42f3576127e0695aeb6bc7437738a79120fed322b8bd076fa6258794b40ad2d1ef5ccae1dd0d37ab45be81a3ece0a2e5f26849a4420f457c866849084ce2d6e16b11ebce5cc92e521878d7331c7399a5886d981afc378d9c8c0e2d23cdfa0c2ba3e06ec283feaa2cf9d283996e5eeab73859f7dc0d9795f806189a0cccfd4e73e0dd346c0c46dbf34195bede0fc9e7aa88d0ca9fbb1e886283a06e5253d088f6ff76a8be74f26a557a2756628f942289a11ec51a2d6e5b4ccd3e87f3dc2225e43f082f7554815150fc6228e8616283795dcdf2e270ebed714fa177d60a40fe940b136d49e835ac8d0a4cc1d5b4eb45a7cce7a96bd82665b6f558e003f894e470bc7d289b0fb5ca33e4dee4bde3bcd141e87279316b2a3cf10253fcaef93614e5247239c753845a0356b0ba99fe0514682da86871be202ee242d397865597a64f9a8921bf1bac37d118e1de85cf52a5170793d47bd075a7865d1f28666e57fe665e634627016b8ea0a223fcca927c717839203883358248b5ba7c0febd398f6d6886632451f73e0bbb0c6f850f78a875db5724e05aa20cddb686c2e1cf0bc92ef0801a9f77c14622236b56960eb94737f0c016e767857a8a916a0a7342e63472f1c3f09a61c0d23edcef24588291f7da29322f742ab5199902fa462a9bba75a8f201bb04b41ae631799ab23c7e9b65f8ca70ee840627a7ec31bfa27c147f2880cc65a345cf70fbb6782fcad6ba72212c380ee8c5ddfa55446bb8d272595ceb65e9660415a1cee995019a2fd85c653af01e86d76b5d684b44a64906e0fd67b85fb768fa7519633d61bbdfe44c8beac41819daa88e169f867115b31e7c50cb2de5fd0dfe6ca609775e907e16b58f94049b9d426a8591cf1d5fbbd70663361736a4b1e6557e3b698395267a6da8a07c459332d3c24f7ec74bd4e52aa48ce11a1e0c463082680ed339427ed9ba9b010b3f9031e9ec738d00ff638947eb2136fbe72e3fd219a5e02cb0ddb2a37d3013615e988c6fc721a1fcfb3fef7b9e3d1fdfec17acae6270efa25ca3f73f09a66c7a48315c07652b89fe6cffd0eee7614d828ed5c46b15f9af9732e79d8ffc4a71d724727885804a796dad8ae79f50222b252b0b89cbc1ed29295edab3666a92ef106ca5bb23a61a5820bbf88253bd2947806f990fec1232ca2aa648538ba6bc93ba941761759eb5e08aa996dae5b92fe2d1813b6474fe56938efdc0a5288e61d1378fa2e1ab8c1d695f076e66c748c8aabdd609b61511d97a205816ce8357b05ce05cfe75275e5444d61801803481d49f95069352ea7f1fd3a1d7305a6f36b5ffdf712c18fae7db0ab6fb789a9ea3f859c77a50678652e2863133a00c21c001ffae0da039b1fb07f663e3ed1c33fa28a14f8b1cba2df8155b0f67488a3b51115cdaf3ae466ef897e7d5b2c1e1d4378e55e1fa7b83f67ef11882c4e4c8bb70ec0621236dc56b72e836b100c64a87135d8193362f3f47f97bd5f2c624abbb8416aa43dcd1ccd88a282054120d74e56308e35bc9ae36d55ba855c578bee06a8b5d12677a32655044579aa3f7301af81f5f7ccdea89b807a97e064de1ac4dffd846d0b3bf797f6b684462a6abdd2af6b7166e562f67495d9b4740a2c3946657d923d6600e715f778d00fd1349bf42b2a484a3942d5d31ee53e76018e5b56338f1528d8b75dd015eb9d1588ae47bb7d5a29cbfb0af0b8767b4e4104c52f91399205d2530f8abd3b463b087ad4a76d019047fce750ad5c7024f1ac843602fe35f59dc801f1bcc74cd0bc60e165d1b55ad9a2d07e09f51b0c2643be48e6ca0f21b00ead13c71b5331a2637780f7d39ccde121011f879989cd51c3692139cace606cae61efeac2f71c43ec8052f1c280c39559dd2e59d7b6b7471263c93fb057b53003048c0101ea41e305ccafb0f46b995f16d157f1bada9ecb0f2616a24bc717fdc4597324b41adc98b36c6a6e4103827eb69b37eb5ad3d2399a47c1cbf0acb7a48a6cfbe10ec25c3866e77d0a6efcdf60e114f56473715067877ae98b32493a997821d07657f3586cfc8ac2b6fbe3043de3271186f2dbfe160fb8130ccda9a8d39756a0038bffe87a357177d23e8b24ffd3930ded381bba38acea9578ca92d120151deb63b276643f8e6c8beb3155d5c3ed2ab0374576f6c038a4e7461cb29650543f13e762f0482ff9e79db0a503d43526b6f2160c2b0a68fc0433d79e88a5186e4aa80e9333a57205d2cba02e12c2cebf12e131d01c0b6d0ba3bf079713d50ae6f5c7e65f967c4c6bf0e0d321a1ea6daddbb8ed38c31e277fd5c7d117ce95f9eed391e50061888d7210942c175b955ed179962207f1651af90ed59002371a3707cf4405cdbb64e2206924f01cbcb93a0b3cdb19f94f75bdf55218eb2f7c837055bce940d51e46bc8cf2e3a51ba69df0bb3938fe2a2ae6d7e0d53e207e7d702118cc8a4b69601a21b27dc7a2e431a4980ccd879e7565be44c565e9ee91145f68d92a1acca662d2d42b1a1fffac8f17b6e1feadd7c73eefcff32be50fbf946a4b4de3dafadd272009830c8ff990ad751b1349d97cee8c6702b9cbd9c1d205cfd97e0a9bf963f2e231fd03fd116478d4d6c1ab034b6c2c7ad716e679c934dd4f42811ddb4e8f2d6b114ad27027190ce716cb124fbe2830fdb9c02ef375d505c9418cbdbc0ade2dc9d95e4f42492524110a7bc7b4be30977a6c89d61b39c4e1c2aa95d453256218fd0f238f55de2865bae2fdc01763cbb7bedf92e293e8cb49ca0deb6dcfff1da2218bdfc2000f02572c7224ae425bc8b5a1b80464d94dc0ca01bd33a021958dac7ac7b6ce7aff907176189e26052f58334d1c55ce531daccf6fd02dbe60eafa6d8add7ede9c9c84a5cadbf6ff81319eb23781c5ddcb927add06f191c912c0a6e43558f90f465e4395776682110fdd97cffa63f644bef669c034da26630ce21650f2723130ffed858002bfce266ed3fc9af2debf28819dd5ca9724d143089198f7f3a658e0511772537529bc92057e48be9fc989ee2117133c12f06e4cc8dcd20576a5e001995f479d846bd755154a36f356cf85d08b4d284ced61f45626242d334f59ed14d3d75ffefe3b4746f15749575fab979c6d7547347573ab8734808e53b9759292834dd65b9a754d2b23b1637da99ae2a9753ad5e02974ea27ad50fa5168281a300a438c75168725f90e45d48056d94f15452e759b07a5defbbc248f7e07a45f66200201cc9d4fe06cc99c1a72afe8ffecb78b48e5cacdab85edd79bfcc3dd3409edf7217bb51150489cb478fec29fdba4387ccbb56a7bd646b444dfed0e218adb68c51bbddca899a852541e9a8074f8750f4abfbb43a8301b2cd9976773137e515c4ffed0ead524baf0d1e6b7ea9ad29ab86bd257e00ead3f224ae07f6a5302cb943afff99a2ce7ba941c6fd4405c32e19cbe043007269cc270ef1b99b6172a13c57d0d52d75f8b3eeff77497e607cb186fe0488bc22e8c97c31d843809a771e6eb89239d19f1d6597b41549e5542d7cfebc3baeb8281b3943bcc63c896f6ab1eba109059ccc3612803c7d7af7e44d1ef447b4570e71684000bae626cdc4d5782123914157d95304c6def5fa78dfe29074ff09f0e7e95a4c97d141b0d7ee5f803de9c4f80a01410217a28204a755fcf7962a15fa3525d730fc4fe0e45f09099c2cd23e1c2197baf6de42214947f10a2c72e73b7c6dab374af1e8d994f89df3d15253113b697c150974678152ddbe76a8605e36d35a86bfc9ff18f7661ef3f36ac7112f28ad663f2d6257acb18c4d9cfec34ae86d6987090e02d4a5d3fd671a16fd227d4ade26e6b600c9b9b0e1fab7bfb0f52085b78002e3f96be9395ade9ecc8c96121b4290797c1188e003820aedf2e92fa2237d81586e167b7444fd9dba8b8dcd4811e2e3128832432e003884ddd6c32be075befb30b047593aad3d5bd9ec6a83c31240f74d9762d43cb4f2612444f28eebcddcead53f67bc8a41af5360ab72e2eadc0d4aa329523c2cf221b12550cbd3743e7e393b2e705c5875b16b62c5126eeacda37d628a460ab13f102ffa07c5a8e4f3ac895b25aee66c5a56853422a0d78d4a34c89e5c5dbe1f599c0af433c01d71dd26bbb8aa16f923b44aad4b55724bc7f1644e24178632a5133325f2911a2f5a9a78d212fab8a6fa90165c8bc0ed1c66b37fae5fccec0c1a40056f385f07d0d626195b4fd3e681570dc2ac9c0cc1aad4f2ffb51f4a6642a3a698637a2f0a911b5b70b8ac1f3a9f8ae0a8c328c34da3cbf018855cbebc8bf96e3a2602406ba38795c56a077611d8db2afbb05d04cdf6c266719d8c71b06621b46f3d8b275deb9eb3dfa17b9b5b75b73754836f4e31e5bc2005c62c50bb2970523c1d8d4f1239fb82a84fe0185ef6f7b83dc506a897afce836b74bf5cdc3bf9f314e7a68dfe37f82b81277d9964efb618f031a5d6a7eecdde41b2d8fbb980c6bf91691c7bfdf3b8bd57cd12fce53ea2994a92bd91f20d5a622fbfa2d24f42587014db743a292002bdeb0f030e9acf34999975e625d7d029d774f8d60f14ae926f2c760c9b2d396d46483182205299ff8ff523082978d660cda43c6282336380a01c687003611ecca205126512bf8932899ace02eb5d6d8c686d47afdb06fca650cd0ef68731b7b74110c3a06c66f1f5337fab14e3be14614cb3b8c88abd1d52718bcd450c9f25b3f16e4dbdf75743f83006da7c6662c946908314b6433453f423f91957cb5cf7547dd190ccdd8d78fc0cc22c1d127573c308337030ff829e3a1c0fc7cd05ccb405fc637a7fc38b387f11cdc839e4b33552ed674563d547d210f53ea7a07fd75ca166f4e02b381949b5a1227663fd43b234a9ed20ffa9f6390a1310baf2127060a77126046755783c2d011b458c4205ad83ccec57adff0d7dcbfc90f1cf5cc86c6115439d1fdf5b06f26988b2d1bf117060ad88822f33cea5a6a8acec04ed80a6b2dd10782842fe91bc9803779e3f894a7e89cb5167507bd62ce8f9ac55e3c46ee894122c408a5a7d1a0decac5b5ca983f01206b5b9d21d39854fd6259cc83025b44e344918affa3e94b9b8bc8703d498e00a9321fa40652aba9be6d93abb77f81332ddfb9ee5997ff1c59938241c3d8460e4af3c1ec557971726b18ddc03b5eda046f8c0c6cb7eee303ae688406bd5066ccb1874479f3df579ba6b222a47b195660ef79bacbc4eb36ef040661fb3f5714e629307266e2ed73dc140f4aa5c3bdc596acef28457d225fbc4b82bd7e6c5517e3276f492a8fef4f953c81974f0c1adaf6096e620ad01d920dbccb16433808c0806491e681ed935e0f484cb99f5f68a228109a8338a3f8f12e6bd91326c8a7b4c1d651d9cb28f6dc223db5d5418457ee6e9f4cd388992a5661360f30168471ada82761aa4b166de91b723720c60f9c979fcab1af3a8cfa1d8931a5db542f66e5aba2ce2d1858345cc054fa8ac8135346456f421ca4d75e379db40ca881a3582071dd520a7fe6bc34dff69a081b1ae16298588841e7d4136edbf7e09f4c6887c68abc811c17e59ff6df72c93c0f18f7ef54999ee2f417fc173c49ff864055732a1f95f0809d35bb0a9df835ef217c4465ccfb83c7712913205c7f3c4ddefe3a921173911653952b2969a71771385cfa5b50dbfeb3892e4d0a420e29502c5d409ec07dacebbc325e08c1a779cf566d002f939aadf0891d804a96bdc2548d6d1d7d90563d4535ae498831c7520e8304289c47c7da0f3d7b5791c0649470ca3c35f5222de869d241ee831094725d1625393c7b7d66f559a638a05ac973782d56a539389f1844c454d7daa4392b42bb928be4cfb245f56da0d5b75eb073d769ec76216031adfdd9889f74a7719fcf53de0356e8a178d15390c6f83f271235b84d755da4244bf002a0dd76ac1650a62eb099011d71f7e1e3a0ef7576f0826ef963c99a966d21f7dea2795129e1e5c1c876eabffa4951c37b4f4d4845bf2737cab756b9019a5ccb51e65ba5225cc3047f8ef8acb8fc84a01ff5cc1d9aaa65d529ab4159a1c60b9e46292d8118d54ee15c5735832c5ff4340e5f6602680d66a1267037b094abcc8c79f35b5ff143c3267b6770d930624d59c35493ab4d1763610b04c79604290be86d0924d6fb20ec79d6757f1c118a114b4b7ce1c70874262ffaafa9cb2bfcf77c7f935ec71d8fd5047151bb72d05b802c6944fcae4c1cffb259c89853d91c6035016ac7944f1912a7f883358a2a3e7716f210fed5c0331579558a69d079e76ac7e6fade73bcaf88603ea741b84ebc1d73dbcca92d73183891904d59d0e8c68a6eb3dbe9831d8ef28328916cf4f31589d09afd93bbd41d6db84d153ffbb1e23d66c0aeb861f96f6b3319cb843ecc4783ed716c8647fff8909849a1100d6f97c2acbd54d6056df6271a4afdde85d1cfe376447a0e9f899235320c837ab7817aeee68c58f491498d6c8f35ef452cf362d5649bee268b07a6c268d679ba04e68bb4f2bce94292653698ece06d42934db8e037f59c0cea1f87c9585746ed28eb6311cec9a86c808b2addf26e9a989881fde15cd95f866db3080bce4c4becb864676eb099c2d6f28e5ca284b2e3e10987bf670e5a21a0961a8aafb005d282c9e3931a764ff3cbbcff41fe7994735e701a7a5d6a333e59572cafbb8a2658f1a85b2a8f2bacab6292935f9ff2a7d610bfee1119825011e3d7eb2f659f205dca5f2b8d5705fa2b32ba1538df8ccaa5b5fd001f118e8fdedee8f824a3cfe011eaa83bcb7d473a0ae48e56aaa458fa8778f7ec477101517cea951ebebaf5a3cf70a9aa5c7be38f4c5fc44b1e94688d66f6cc62483eecaef05b3c8efd9dfa9af74215b25c569fc775b78a12e906e58752a04fd323ae1c4c12e0e19b1caa8dcdfd8985847ed69ef6a26e9087f0955ac5d369662aeeb9d3404305f6828038342718aaae4163726cbf19c2f2db883d2b7161759ece7eb6394e89209026f88c23bb81d83584c49e99e9ad704ce0fb2eb2342d201e18a56f069e430eb68c819372c9c6dd3e33c4692cb5cee8d844898c68d9d4afd9ae99a2d612dad8a0afaa104e000917c961146725f9618c9747f8f2e6090b3655e1ee857e4feb67942d47942307e3e5d97fdcfe894fb23e987cd4b7c2128f4cf4c4c03d01caceb8604b3f35c866f7a96bf798a94cc44c5c64b9d817f8523b20277df3236d661865491421a6fdbc26b08620f3cffc83a381eb82c032792c68ece70bc9eba99d33967bbaf85328c74657816f68fa50c74bcb562e13c1bc14ed28ef85c3","title":"61. 旋转链表","link":"https://leetcode-cn.com/problems/rotate-list/","question_id":61,"issue_number":10},"8":{"day":8,"pres":["链表的基本知识"],"tags":["链表"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。\n\n你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。\n\n \n\n示例 1:\n```\n\n![image](https://p.ipic.vip/r1afvu.jpg)\n\n```\n输入:head = [1,2,3,4]\n输出:[2,1,4,3]\n示例 2:\n\n输入:head = []\n输出:[]\n示例 3:\n\n输入:head = [1]\n输出:[1]\n \n\n提示:\n\n链表中节点的数目在范围 [0, 100] 内\n0 <= Node.val <= 100\n```","content":"0961e884611df7d4ac47a79a9e3b6f2e719933409cb941ad4b0a63642131446523a6ec636b8aa2147f768c33830d2eb0626e65ad9d3e03c1ae76b561bceff835f3316e60d6d7cfbd0a2ccfea998f527d3be17095dbb21b9f24f42bc1e3a6bfc0502c821960bc893d665b6d3ce9914d58bb5fa4c0bcba15478a36d8e122a75a29858d4a6c750c116e13e549f53bf169ef52165fbc10580c30bcfb4112d0e4993c13011b4032ca83775c0267bccd7a4e0307d08bc62e5b0728f307a83069b74e1c30df4fb70d60a00cc1c52d03c22b2c19fc008a355e6fcdac7b28968768133ecda1cfb81be8a2739dfe3124f692cb85c834006dc780c368661b49cc3276451bd5b457fbd8b4f731903ccdc3c5493c06589a86ac608112fc29a293aa20eaef54f92e05afd753c295ef4f9a56191ce9287ea7ca1c3f9de442cdb95ae9dc4e8b7d891268bc9621275c4582af57e6c8ef768fdbdad1d3b4edbc60d254eed5470c17f8fea3f02efdb732856f183c1b182e80f290296ab7671b0f505971e2d1026d1b6c0dbf5d0145df3560d294a14141b2512bd9481799d181ff5724e90bf069556948ff96201f6f6de61d9f8c0059cafab0eb45634b7da44fed017f21c558c7cba2bfac12b4ce02a001a8d8f778752e18797760fb2df3876e2d0670b163947a172e9266bf0f175ac5c34dfd9080243f4873a4cee2a472e3f864d4df48837b9aa4409a996847187cc608f25ff87a9edfef957c3cc99bf99c675cbd2d3f86b59bbce6de26d8d1b8e284d8bf5f057d97f1fbab7a7e49d5bd57d628cad00a72191fab6612246319b692eec9e4716e077c2de970215d8911f22b46927d96d62f259f8e1d2cfeb41b58c3eecadcd283ee1cebb74539a597d8a88cc4b1a50d73ac1045630b1803244e8fab73b38af77a5425e51484cab3e49308f0eb4831b710c1ff79186fc755f3bdf03896e784736c166be79aacd95adae357a602756b1fe679df5d4db44d1bea0593d1e67ed461329eb63ba12b123892cdb0b4985f069cfd5037d7f3f74e47ab53d2d2e7ba4943c186aefaf82a16b4a8cf4afc77542fc2467a8c7c75af0494fb74bb8c50a70b10bed9aa636e9470dff4d58a17cc7550224a0a78f9c901d7cd00742d7f4f874d905fbe9916b49e791beac5a7828355dbaa743f7e5031604d63433e74db3e5c19bfeda3407e3fb2b8023b56520da6b84f4e9a8f326cfbab4caae7d384a2deba25e6a76595b8b71b92d3edac020192bb6ff366e74cd34a51e810dab548811f78cf840c9fa316e5addf453e1f5ea7de42c7d071657f536b342226f72c75b5d433e3598db56c0fb2754407cd6094fb19588cc9b770d13c9e4dee74d983c74ee2814a68f25ff2f5b8fec0faeecf7f4ac4acb89fa219932e53fb48f5c494de71c5ffded1c66e62ff9635cfbf48ff91fd63286ce5997963e3f6120d97ebe4ac4c06cef256e566a21da802cddcca1f71d65c37869968a9549cff2c2f34b75a56e74933eee63c5290f4133f6f32fbabb5fac19be25be5564d6020f88650fb354e76d2b84adb5b46d993f44ad410083860a6044003ec396ddb888f0ea5ece99549afd27c435b66f7c507c56431f7060b6cc45e61923b4b522d99d0c66cf26f7023581be899e5fe55b5a26efa2561ca198722fced92fa5250f9061ad3193f0d1a504509b9b02aaec0e4037a5616fd9867a4fc4c1213167eb9affa1f93cb1114f99365d5136c187bedd32fa816099b05cbceb11cad783327d2739951fef2f5487ce62356daeaeaafe1aa353e9978bb12a3cdb228adfcaf0ef490f4dd29c0d2c3072883e70c50c09d25c1fdc75328bb6d1c1926118eb49cf56b443e2888fabed3aafe4c25eb229a88fba94384e3b1093a2c2b02c8c19b2e702b6b6971e147f3ab240b3992ec695b4ee48665acd8e065d02db97af63c9602bd236f18555665ff0aad5aebf8aa1cc2c8fb0e9dbf0c620a805aaeaf59cae74994380f63d0b30afdfb5c350b5f11f4b40d8854eb22c4c0083ac2bea795f14f39b48548f7d671be41f9ea8f2b344cffb262f22e3902a0743a0db24b4203bb61a6df4491fcc63d73cc777c362dcb41b78e0555cf2cc677c1660507e53c55d592ce254a05ca9cff3f9eb2eabe4604afc0490581c801099dd196a02b3d5e0a8767488dc8a15be6185fdaa154de4509cb73ee45d56a2d70fe2d57816aa6b77568c5cc0add554d835297e5e2c89829a5f82beb02d64fca4641249a0f1b3017a8bca1d1fd207fb8a5d849e5d359ec64d603631c33396356b2be920e0bdab2cf4dd2d3cc2b5d821176bb21013b50c32bd0323bcd0c2c985647d07757f3fffc92e5f0ef91d06140e5be98790e8fb095fb4bd67ad00e0c490c48e81698fe46e690a9dc2ff613ad3920539a25f331ae1cb22268cc02376f849f853ed822e1baf6ef7d43850b18bff08857b6ae2119690f97aad446119d9e96b682fe43c6659ece5f57366139cd12908972089a0b3fcc911294fa397038c7407c2ef710f9b90e7205c4292ac29b003c2b830ef926d69bbfaa7808e21ad60d04cfee2919fc17a5b8fa7e431af91f04a555587152b21dcab6d0420e0fac2c53186b691de7307a85ab7c128107144ea75dea77962713fd6d19f83bcc922422113d07cd763acdfa3661fcb5a31c63205ef24a29b2bc7d4ffd4c34c0b09d83904ac9fd6b8647b284dd7b634de0930ba5afec73f6fa74d7900b475513b95a1843278761958b363f6a4269a433b897865cb5ee51f4d3c14a2f2d87013bdf87da032b3dd9737ddbe2fc281bbcb6c75ef7d238d38ef4eeb3e899355f6a29c005bc89594963e5ded6f32d61c117b5586ffdf050797c438e17c4d515273143303e4fb7a1b14641edfcfa7b0dd9779e78dac40481f490f33721012c24b02069ff2ff14ce035ea0ea13b9195e6f8bd51051f777dda4fa33e11c52b70aabdac9c7fbc61459555eb0c08e5545b91c70b0e6c00b8dcd4674e84cf8a5ad150313b66103bd52425085179cd8fe39de36e408246c04a01786051678af112035217264655267444cf3ceb48cd3abf0c218ee80dccf183a1d4f4c5298bdd621c3e25dce93e844750c546a962a32fc3ac410f1aaf13cdd21a587afc0b6b4b4cb6e796159262930e51e4188178a9554caa527973d39c39092d116b166551d15b01cd49494b0f6fcae422eff5994d9bcec47411e702395e2c8b7a1a827d11d0eacf947dfb14ebde69fef245573a0fb16560b3d8c3a5181cc0a56c95ce1941d0e8843d23ca718cfd8bcbf276ef1958bad8a0c9c212c7015443051015f2cb11e42bf2d799461681d2481e6c9b4e1982df8f88986cae18f3204bf6e954822706156bd3177c50180fc5ac8b28a8934a4a7f14b1a323cd58afc318a1de5c084d8cc7c717da7b4c0ae4da81c5bcbada806bdd810de96e1a453beb0efbf82171665fa90d17beffbbb33765ce8b4f65bce02b503ecce8b2c8d55f00d3654ec2a32cb7814c73b44efe59116a655e69998aa39a72eb4750d14dc2fbbac04c7ae3ed47f7900370a2fecdecb78b48cf0ca58ceea7ced1a2c2b34725805fd6fb4adf95d33e38a51442295160647380f153148e6414a6350f89c940f175c59b560a291c1e9b2f1fe6c44781081127cdbf35f4088d2cc4dca0e29ff1c9f98bafe9bcb707f595f2687e5f525f497204da90a42cfe622d38bd55103f159cf12fb63f22e25b2398dfc96641652ee28892ab6c1564feca158a200e3ccadc8eb27b6817c700dc29bd548d7a449ee118a8a964fd9e37d8c8c559659ac505f9226e032cbb37f2ec60b1979b0eabe00d6d3c98b8e2f0d5995d8852ab8cae9dfc1dfc7c9e39a7e8c7665b9f4423ef800306c1a7e5b84de606f6c7f2622941b9cf6ea7a9d399fed1f41168be3cb6d49431a5c72f64ecd53a6e691f470546d444d2291ac040cbe42d76516d6444411804d78a1f2086576c1c384e0d4ed0db39561020a576ff09430b8547a4a5d852e8a05842e4f92d232c358273628a9b5f89df3d15a4e8d1315b28db41ccb8f7ca5d01ffac4eea6d6e47c251112a01b8cc00b3c5407f00ebd2832baa97a6f8099906210274ec2378210d9c0982420b1924fc7eae2353ec5a2819a2e398ab4f29b6d71cd63c92dc898883c8ac84167a7e152e6828503ee1f576a5a73947ca5523387b84dfeb3b57abe501d33746e04abb418a9e37604b3a19beeaa9e104dbde73aa1a7cf76c32e3ead7633c93b9b140201e7f5c16317f68370ecac43bf4e4cd5eafce8cf6fa02e6fac1b7f953b93ed4b409ff3fd9029aeb41365a5cd352b03748cff3365b09a54960e4bbbab2239e46099db7944d98b06d77479600952bfd2db23e9e45a0167a0d9cc1a2c9e4486db53edb7f4252315841d8a32f82b3c5f18b8699e5a1542dce56a7be00a89eef6b844946f0acb5042ed72f6643ea407f6d79142d33117745a3ffa6e39e436aea8223fd5a1d8def478ac6307afdf7b3c485c5ac1b7dbbc0e2754c7b2a83a5ac6a3a4d24c72dcb8c9f75ec0b669405a1b86f7e687e907f88b0b273b0b60faea5dcb0faf420ef7d84349416db0e9f159caad6bbfde4f50b7755f60e621053a67b401cc9ac85a6059e09d839086203cfa9380b744721a7b6f775dca4fa12e1168ef2be567f292462a7ff3555c25e762a801dbed2492f8f849af57d9fe50684b04ed2e1213edbc11f629a15bdac36aa1ab0d796bd9669464827d3e33edbb6127dd6cc00a324db5665112677ecc3e41b7893bbf60b6afd5297edf19a63dfbb33956a8953fb7183fd54974b20c8e87db7de6361ac71871c4df961858e10008adeb530a7e3ea0cdcc37868587c17f93217d960ec4aa769f2940385f7dbd8cb61c677704122c4faf6033fa88a8d28498217a867677323204f89d0007b43e7eb381b2d146eacc64dceb7ca2eb5d6d888c9837ae0f36ed145179fa168731b7b293b0c3a548366600179fae30b68fa6c02d00ccc83ebfeff0e16bfdb04b1971f7ad97861f55f34138a19789fc8082ad87b172d1c1761092253379ad77ca8a42613dd045cd0dfda8298e64e888273397374c6601811f53c9ba6c8fd7bd67ec74b5fa879feb976ae8efc518ea9c56133552ed674563d5434674e5da7704ef068cb0b210b47a4abc8c75a5a62277bda756612cad212e79f7e89a22a02b273311e1072522e4b6842dcf3fa11b458c4205ad83ca28c29d6b49898fac95f4eb0a2c98254546290e0e4e7724a97992a21b01d065a818204f374af1b2e83c2c041b7597007d10782842faf5a9a846b72c8ef84e2fbd2b80b6043bb4886cadb81451646eee508719066eab1d1f38c9296fd92d9284321790d877fa1cc4fd76259cc8302370db043b38aece8a7488a8d9b3953489f09e53435ec4313efa5be3ed6babd65900f2c9baea70ac290440dfdcd58ac9e464e0ab3ebc62520256d6c1f91e67c5cd64c16f22263b3fbba28f0248b00a21c1585fbd25679eec219dfe9f667aa71194834bd37f38adefb08ea4a151ff36c1258a025303a23a3a9698f3d0556bfe99cce97e5ef7e5f3b2243bb16ecff24293710f52b551d44caf565953c81974f0c1adaf547ee95f278fe71810e7e3c107d4b8fce20ffa98cee9d580f515cb89f7568a228109a8338a3f8f12e3b8e5a699bbb9fcfd63ed7856dae882220b59b04dc03d033db14c8eadc6b124b360f30168471ada87424e9041b66d21a627233885beec39fd7b1e973dea949e77ee1d74f1866f581a2ce2d1858345cc054aad88d2a544b4c240c10fc9f5e6187cd49ebceed1c4e3e99171155ccbc34dff6d34e1b4af36cd61d8047b8905c2a9ef7fd9f0a21d595ded2ce5852feb5f6df728a735a56a3ef5f849eb59745af435206bbc3404873645acda4eed271fe11b7a827ef3c7c1477c2e8ec9f250313205c7f3c1f9baa6fc05f73c353008e44653ae20d061201d01b109bd499f97719420d403a504f1204db91579babb7720b51a8a16a814c08542fdbdfecb48952d24ad8f29654c5285c399e18311d7cb444cb5e93075ccd0460d90683f00f3d7b57d08e37946dca006ea66b43ef68d60dcda91094725d576b6a3235383ea159bb38a11f832a767239d76d129f1844c404859fa4242b54bd88eda1cfe257ac6bacc1a644d236962dec376f2431e5b898cc913ae2299bc479c30306f9af36940b8aa9a06b270f35f0083419aa6a0ea8568add26be164da67ea2d930166cfb9fc9bdef3b33a8d660b72691cebc0e67f78eb3771f6cb9ff9eba22e4f1bf1105c3664f050d04fb0d37cae31be901875ccb12ad1bae3f50bd04628eb6e9e0a8aea01ff5cc58d6f9208746ea0557ef8353ca46342dcf679b0bb9082f70d7790dba34461a244684b6f26790e0f11c33627e2453a34a51bf069b727b2a22f27f31083b8615d7814d1763610b04c7961c7e44e2284c7098996ee164c31b551c118a430e1f29b3890835682eb1b5b9c131d6e3716f9334e456aeff04351efe0bb53585460347ecbe2520e6cb61ef8443f25924235c2bc5ab5a1114b182a63b912a58541be44e90d2c1375b701d94029475e723c0f4fa9d32f9b5e66023ba41bf5df0596bcadfed713205709a8445189ef2d1f83ab3c6f48353dbbe9324c576b8b203c19a81ea85ef9c4531fc186a59b7e1b66f2089fdec0fb62b2e3945d3d13881039ef0612be910ff94d9cb1dcf5f1b6fcb9aefff54d6056df6352b4afdde85d1eae47110580495cc85357345ec2cb79c7ac6fa9241c3c527c8668f76d65e7fba0cd2659fa03de252f4c2758161a10df586a2fface31b970159c0b8e06c08db4aa1e97bad8b0bb11fddfe581913a164bb37438d9afc6cdede3b85be2dc18e89d9a8e776970aca21e35c59c7005588b36f7c44b099c2d6c3ed25f6eafda7ef0382ec221a4b6fa6bc73dffdbd1bf08ec2e3e67f320af9cbfabe12aa3adc211b2b157b1e143323591905bebcd35659f0b50531f667e3fc628f9317dafda6956e98f05f5cda5359b79bed7a3fc24b0e9e5235c3125dae7b61e2437b948ec3adb5af141f04e1d78ac5c2d224a3cfa957eaa0709622027017f99e1cffad69d08778f7ec477101513fbfc74deff5e1f6807de4a85674ba8a281a9c1f05e3428d66f6cc300d6ae4d6be5b78dbb0d0a397af4d03be0850b5dc1ea49e5fdd62aad5c33fc8159e0cd98bbe0f493dda147b86a4f7a297305571346bc4040a3179d8635bacfcac214920d5becb7f7a6cfa9ecb9a5f48cc89b9e11ea9070f3103f286a68e9d0906c95a8ed8409757af3376e8186d58f756001b03a397346eb9ab56a41eeaa984d140be974fbc860b60015e8b4e1f26bc9464f09b6a491c7aa7013b68d9cfaedea89bb1ca1ec5eaa98db6ddcdb0eaad5d62275c2af3578c896c3a204cdd98b4b057574ed4248c77c876491ecc805a237633b5e2ec1d93b276f55e7ea61ad316cb8ab11768b8cad2216b494ff110ab910ba09e01e6619190f035118fbb1f39635843946062396d58374626c5a8a646c49168adf0991d3985e18ed2297508782e7040b6ffc0d313fb09bea9072ea2086fd1d6b27a8c3e8db0584c4cf709bf7d92221949c3d1ffc58bdeaaa7d19ec865fa9c564997cdfd2444203802cac991ae325ebe23e520b42745c9be0c972cd2ab28814397d2865576a2cc35b811fea9596000d99c57404e02f6007aa040795fc4e5914e8ded0a4802be21d65549bda4196dc1182130424dcdcdee1c08ed6a5151bde7d76df2b4e395b412c7d1c1deee68c0277680d4afa1249559e77bce91db3a9a70d8f19bcf23f2241b579c434f5e203247ca03f8900ff807500183ffb0514c38347042e4d087fa96fb747426e2f19d23e726ee2858378e293784739ee363611d65d7ed9da12f3c8668e3f92e7aa1b17aa7dbe5402ed889ea8f5706e1e3b9f79520309e46747de0e2b8ab4f2cb96340378c0de4bba329231e5bc38b82fbd97e9e67c2504fcd418ff65ed51a72ae30b6175f3554faa1d441f94ef486c4383cd209536a3faf4f4ce4012dead8602b6415fc88e0032a7f24e7c28fd2940f0bd363ca1c11a9252234b808119554b815859ae850a37e18784962d90bd875f102fe04921a0311ae709609223385b8909236e52a5f371a86e68415ae78b7d8e0c284de28654f450530c349553778465382a737c40e1fff9367a6849876118ed66855f6bac170970bb3f0199b029257068172642f2d95828b6731fd5013ad5709d94736357ab2f841ca1b7ce569dade0fbde1b9a20e8b342a025a6d27aa0decc774d84462acbb02c9f0f1aea441254e7f5462bc963e85567e610c55d0b4a414a5b9d4e2123c3cd08b82fa932018467673e73dab4795503fe3c7ef7b82cea8ae31ba9b7583c501c162188f314beff12e831bfd898dfc1dd9903372a2d22f32ab7a251981672fb7934c790a21ac2ef1ab0ac9f8aed5167010c05a4805eae4064b51325aa6af74e5f986e88fd566237929d9481a2a4ff84afc558b54a1f44ed85cb828de01c6a6db7b8e9f4f7eebb6efe7676528b3ae2f152585a4243d04e2ad85a17ec7c769d1ba5d4fcacfa6c29eeff12e7fb764d06ddb6f5fd1361c54564573e4984e54e1ad8aee853bf35f45133d646e0bfd28566a6b600634382d9f6f60d565dd9a2e9bfb6f9ceba1452714a68b5e2936ab0a2afaf342d680d4a5816ee03e5d7be4019e235e4a7f88f49ade880d53003dc486e541132413e2c7222abc7224b2606f28b8ee99c6a99a7dbd9d27fc85657fce4dc6c418d3a83220fb1b33b3daf0c868e48894a97ec93b3e3c215405c35c5d8fe47853cd4c070224e6071f1b0f319b1f2bcf0146839f59c2a510fbc816cf957a73fb67fae1932aeb56f57502aae870cc09bedfdb7e3b1a42129b80629e6098db54278c64b16128aa869a97bd7d63834ecd863001036911114b8a1741ef0afab6c73dac9923bec19691541df40d13fc47c89bb648208021db0c998a09cc642a8910e52903d84a9cf3d5c75056a2ad0cace218591fd2a1c386c184da8dee9a8b9b9f4b67863d158a4899cf6eb794de1370837641db6c6385364d35d0cec66f59be85147d64c95c1db66c04846ed15d76aa4ac3b7c0a36ec976f2e5344f71ab42d953572b8229f6850f8a98c9301329a2e0dfa907b8a70cb57337aae003da5cc03a99865640723a715c140237f5e16e17ea8051e075e1e4338a0551041b4117d50bdd7ac7efae061f1846e5dcd84dab03cbdfaad3887e8ed6eb3bab98463e29873857203927743b9f113fa69bcbc5e493a587d5fdd88632551fa559c96ca6540b1c83b10f69539ddf793a0d36aa97682be3ba6ab48750e436dcf941ef88391f96b124951f98b452050356f2c92e18300e3675983b81474ab464e78ab42bc30d5545827032d444d07e2b8b1886dfc89fb0ddb0328b77d5bf249506dd8774e6484be3fb0ce04662e100efc208bfe83c7212406f92a849e6195f1bcc122c41412b6e759ec3a0f06de7ad5096514de6fbb9819f47e450ce3f33672463cecd2762c4432c8b4d0e2a889f6cd74c65c9f92c770c731938727336862b772581717e530d9f1f332d2e4f17571ef9b9fc73c35cfde68216fc22df5b099f5ffab510a1a2dc1150aa20ceb6d4536e320690d117ef47d94c89de1b53476e9ee15b227270d8815c37ac35ca0eeb5e807a20b4db3fac08ac60a1d899eb313d2f90d1ea1425eb1410541c5085b011998f49fcf7ecf3ca702f68db9d0a87aba4cbe5cf55a0e937c4d04304dc64ca48a877e5f00c242e364655f722edcdcef744b5b1a462d17eaa54c0dafb1d02a56c8e04b4c9d49f38f4f59eada004a4633c903a193f9dbed13f4b47e13e32af90b092abf390731cda51a785e0636d01cb980cc9a4f4416045bcba76ccb55637abbb58f7c42b47c02c52f687834694541bb73154da9faed940688b674d2f31db21acb2a9bfeddab2dccdc9b485d56b8ec3e8cd98f94da18f99396a1e50fd2120b3865050f04e3c27f1e0c19b106aeba34ef8ceecf8944230f33b1da03a0ad698873e9759484cba4aa4a716f0597071e1917690e283cb790c0524c960ea09ca3dbae9d7a8c918223ef27b4e31c61c043e5c67bb021de4fb1d2881ffcb21f4d6302bc9cd70fc12bf1f27985f6feda2448434a087fc8c738a81343b62669b6f76abf9ea3da747b04d310378025aaeef189794bb4176638434fd454fcc04945ed48f1121794d24e9b74bfde0500f889a5002a29e6c536973a3ab12fe696e37afbf7df94a7920561352ac1dc11650b5f13edc394aa5dfa820805dd87d1eb3fb","title":"24. 两两交换链表中的节点","link":"https://leetcode-cn.com/problems/swap-nodes-in-pairs/","question_id":24,"issue_number":11},"9":{"day":9,"pres":["递归","二叉搜索树的任意一个节点,当前节点的值必然大于所有左子树节点的值。同理,当前节点的值必然小于所有右子树节点的值"],"tags":["链表","二叉搜索树"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。\n\n本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。\n\n示例:\n\n给定的有序链表: [-10, -3, 0, 5, 9],\n\n一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树:\n\n 0\n / \\\n -3 9\n / /\n -10 5\n```","content":"0961e884611df7d4ac47a79a9e3b6f2d758e3d84c2812cf0556130537954472458a5a8244eccfe0314098752ef1f55d56fe5890764637dbbb538ee3ea3b0b26efc3b6f7198dbc5f64420cceb8a92503027f6728498a4018d7bba2ac0f1a6be991431c01b75b09f632538146be7c5c7f07cdf4a282953bed37be6a0887ba40eb273568dc7d7ca8af61ec768fa28f56ac248147bbcfcca92f808a73611acb8995e751a753f12a1df6a23445af5a96b1d6c01a1d2fa7a193862b909e95b7ef710365bb862fe616bc448ce9d722d837c1071a110c95371c1192dcf279d9165163fcda1cfb81be8a04ca9f5372ef689d785ce040971f38cfe4864225cc038794814fcb673ced59ec1368d0b206b6f8c44073de293ea1b956ca73ed2c7ac4785c60b9d0764c3c10bbf85a420a43c5e37956a44e4bf2857d9fb0190af1596fc1fd36dfc7b78eacf226d1244d9d5779890c003d0c2a188c6c9b79b10bb5c858f5c5370db83f3fb7b9a9778cf4e585a1554758d951d99af09e212135b5a61da3fb0cdd32436e6111a09689fa74939a07456bc7f3bd6761a9ec28b10c6a92f4fc732196f05b6ba41575633b921d4f11b1ab5e3d361d6a4d0dda87bc90c63062ada6c0dfe82e94a80a3b231c10b7a14d0ceeaa33e0b51917fea3d6e0a46f469c4946c07c136df7897711efa8e09d02462a8b74e5c96c2fba89c767c64d4f74b815099b16a99956746235525806a9b4217d4cd8ae95063a9a89dc66ee05ff2cb0324e2e3c59f6ecf97e5f2ee878f3e617bc08ae4eb385624633b56ee3ecad02a7d0026ab6c3b254f16b593f2cbd3596c27772df35b21689e16c42544a04296d51c24a18a1c3bd8b5235ec5f9ded1e8a9ed3df7b67818aaabdda998d6bdb30172a6084a68321602394585ab9e3bd58f6c1961f052dfe7de52152ee861a66eb9438ed91782f8cd50da5f31f9125702b7b8f6e0266c2f1cdd541ba432c9cfa0883cb30ca1c158ea8b23e45a0c58fb0abdaf3a5eac44bbda921537545bc74770f6cb1160cf8d2781c362e309522d6cfff5041e1a2b1f861bbd95cd57c27f53287cdbef58d0fd678f4419259ade0b9ea0016fb694f36e793cdb838e848829c32df1b68eb24313bb08769615765625e964c10b856aa402e3fdfa234a1c8e9097541c5e05bace97a9e8fff1aee4b9bf85fd7b6829fec0cd50d3014f295150e49033b42334a001b41ddc17586f432b5779b945814f511a39df13157c78c3c5380cd55dffe578d4494bf713fabe45bc1f77e7bd0dbc9cdf233f1bda96cbd650170cd9b0c1f3bad6e5fccde877f3d7263ad625f52c72e99d64dfb58811f094d21a5844563ab45a95b467ed77da8c01927549dde7d5663a6a012e4b49274dc88f613a723b1cdc229d9674e2183e705bfd4a395348c6575efeb334c1b353ff9fd381a8c322f240169ccf668b3d22929e2779c59d3cf21fd538e964ef47276261830336eefb6ecd0a8092731f58d96015814878b6d07d098eb373323c50c7dddec09be7fe118152283905a8e57c9a7e551e8dad0cb47604a3928019c95940272cee33296ceb6d09d1c7f315d088edf62d959d08771812c94d06c25332f3290640c45d5ebe397f482f97dcc663c66d7b3a5910c299e5f650bca0826c491fe54eda3584adb38f05749d75218d64216f677f1db93f77b124c1d30f7b6115f3906babdc67f0b89db5100dfb1db7cc1a371510018c172e654f888422cf7538f36efab41daf640e0368b556fe18e6afab451aba3034a8f88dc5ded7642ef02da449cedbfeb57f390d9f315d56dd16d8dfed07278fe60d7fe49503c9f3e17028b9481605241197ac90cc70473e094f151274078f110f8145af185e3124fadfdf67195c701fb5adac48153ac0f6bf1e0cd57eb18e3493d1ac96f8e6a172acc1e36bfe3db951dc3c8e3f79f5a787a3ad65c7c10321b5fac866ef9eb207d1e3193fa849cc73549f476063e63602b9485ccd527c99ecc8cfdb0fbc2b8057e30fc9f81936eeb1ab89fe4c038e4d15c259e577815e5426fc94ae3a28fa37c289c93ec55e5ce41fe57c8b0ad0d707ebc0a45b4e8c1f5b7b65cb2bf1bfb8877b88ca49d0693539e62a5dd7a7ece389c5b8e2589acdedf2c82e2018489fe81a36bbe40d645c3845777c6eda5606d0cdc604f85d03f1c5d2534519e071f842d7782673e31959b276ab9d596be7e20bf66d4fbb649ce1d4c39c334b4ab023a73589ae4b2a5190505325752577212004e826afc68559904b9d619620a6dbaf33356d06256640cb994f7402ea167f64a0b04a8d8a25e4bbbb9902a31a969f45fee20994d435f9f535107f9fcacfee96cb6056e677649490721096ff7cd470c5c9cffae2ce72825236e044049df64df51db3fdf59505f1301b84f237a1cd4caeefdb6a73038c19be0b82c08217ca79e8d36d301ba55de0633f3a50bd461292d44e60d29182fe1d867586d814017a2d39fc5dcfc3372df64f7298ab18aedd2f5a0f039aa3a42fc77776e1bd91364641c6d2402d52a96fbe2e93cbeae22049e8568e0b4ff9a05135f217b5ace265741a98566ba1524f5e5cb81ec1ea981a4f29bb065d0d670f3e3ab2965a1ada917bc693816bd70ccc17fada31bdfc7de74a55f9f990dbac0a8f89cdaa2d6294f8aa1dedf8f227d9a02358a203ba093ed1e40e7d79833500e166fb5d346c3747112570ef33665f6ea6e074f7d4d7d7f1db72ad84eae6c2e15e27e3a09bc1a877ee2a1840a34c63863d1751bfa8ed5bc5a06c4000f5a4e26cbcdb406c23ca802e544ba73c179c634b082b3c121dfd9ad9ee75a97a7299deac7300761766385d8642dba1003bb196e1bf05f4774bdda6eac9d3ce8618092695807c462df9ef29aa03ee1f39974470487ec98394c1f2218ffb37c229de4ff07fff5b907169665c58daf0ecbf9c0dc60a9cf27895e77d6a3d0aab3e939956e84942449c76d74a2d8a84ce96692046c7f8677c14c01f97a1adae96e0277044155c238bbeebc3b121748c059b1231bbfca9e25e22dcacf0df9faed6d99ede2b9e7ea51bab1488b83c324ddc89eca3d0e3c029e58c26382402e8a91cc4000f9364832cf16ef4d56bbaf94a813c1c918ed06faec28d91666c50d815fd699aa038b0629b25e7b722ba893684f0b6d7fca094dad9b975fefb00d5a68c8fb250864db0b1c01f858c813555e70f271708833f41c35811c0e9cfb928ba46e2ba11916e8fbcb2b869f8a276c3b9f75d7485e428c74de1b3471635790456e5687f510839a337918c190b155904c268c8de979ef9e57b02d8e43ca09fc2283dc952d6d0ed66c9b346081d6b52e1619c7cde9e774dc428dbc1859d169a8ace84cf042800f84b33ec82e2989bc0a1599a2e19df6643e0c78577a4a15e9a69430d9b88cf8cb4ef5254ea30089721ef9283ff14950f33ab9aa99953e580725f622bf5e8256d84c776f74e073ed1e8a8c8c04e49b7650687e2689dd60467d20bf653156d319bc1294d6a55fd0be09f65e584a7e9da0763a67ca069599ff83e1526671c4948cf0c60254360535f646e52cfc47c5185be54cac69a303ea50d520d1f25fbab171fcbb44afc9e6e9fad4e6b8abd2792d30e4b3e7a51cce9ce1759a824e5ab830a248632eb1b2cd9dc676e1341031c0a592c3058a5607824167e420559456941a6056de554b5c9b92d8c94dae05505f73fbb810de7ab98d9cf66d4a6ed721e7e2ab2cbac4968966eea083acac59e7ae3969f10cd12bb0d5dd650449ee14a206abc3756d25b181b91d23846e1332a204fa460b578319821031192400b86c6bebcf6a7a881b35dda17ff1c4c7d3bd23df56685445a6f3b6cc2a9ef2304b38075663b38a80ac13711b8697633c7a504e7f98ab3b292b587b427864a0609e46440fec50e5496a7c9fdcadecaad0b807d5f43a00e73e1a2da979df8e3e98639551d6e8b4a79583f4ea4b72d48ca9792c90bbf40bf697fd702e10c1b9a6920de867c73e5898ef220a32ac4904889df6850222047dfc3881fd946705d689aa366861caf393bd025fc9ef2ce3a4aa77a77e8714eae8a8779f29b6127c912cb81c6aa27b88683d73efee7264e1524b434e0679b739cabec7f0f1e0c869b1e13817bfb581a0f586a00757e8dafd290f887ec8edf7a3cf62242c7db4df309387b84df2e92fa6c788f15dda07aac135c97d8b1bf93f0cf5b766565823424e0228356f76c32e32d5beff80b19258aefd6c8fe82dfa93f000e0f749533794398036945440164a9ad9c80f900a734d7ef15f46745b72e2efa889de6779562c28e211d590163e5634ae7b8b9b2e705c5ce1d46ec225265abe89337db21ca74cf56db02ffa07c09c2006d86c7f64ca23492df74535f10591691ab1fc5f7b8d5b7b4d58fc4106801ca1d942ae897e921842f5fe6fea84a79d03e4556b9382c6d64146b665f3411eab0e8b1d35f7af9882ab34e73c8c50eccc6387bb5b2f2cecaddb51530b6c3f7315f353c9ebde3643b4722c63ac1e09e63f93b32dc76d5fc626f2968dc0688adb23bf5f74ba0a5d6acebe158a63a8025c00b95128d59c7a4cdb1eef4ab651b1ce91f425f61874a2600c1a6d2b54b9514db304e2b509bc7774f314f7af9c8a227c2f6f133ea17e1bcb0530d574774acb7135bc2004600aa0ab6db463adfa697f66bccb000f7b14dd0bb2634cd954d48916affe07fe94cdf8396f3d34540632df9e97a83bc5c61ce901aa338e3041c4552388efcd5471494a6cc2a61fc1780edf79a7acfdc7c8a05871dbe29d7e67e970266c8ae7aa5916924e938874f18fb63bb95064c91a6f064f2b1ea49cac25a6b4c6d4bac5d4f8d60f14ae926a5dd6cd1a289969b60cc4b6b4023a6fde00f1fe7f5fe12049206876c2f36765f03c580547918b9af775f68142e86880299ac947cf093b689c29170fda06fcd7f1d9f883a0a4f0f3b737f4e0eaa7b660759b5f50b31e10e1a8a6280c3c79d863039a6de41d8d80f7e5fa8d2df2e5e53ca5339c9892269dd7c447654216f01771a63d5cd3dbac22f138f4158d0cfd8cb95b36e8d817305271aa9604b46b46cebe781c3618d46e0574f833cbaaf3aa99cbd0887e1db0a774e04d674563d547d214679ab625e9e3a924e655e4da9f8c09b47126f237e902009609ed20ffa9f30dcee3143fb6d314a4d665d7d572d0285e88450fd14c4265cd87a8f962e8fc49999e79d0f1de8ccd28758187690f58bb07226deca7e4fff5943528cc044bc6bea476ad9828f44ff142568895399ae2faf5a9ad43937a6a0c0a7f5dabc006043bb4888cec991532208abbd5c7c8e28afbbc0bba68f96b5d7986c4d6f617ff9648bcc4fd76259ccf7501e018d589980a2adf5418c8bc8703d499e1be55d67e1433ce4edfb65c0b5bd7cd97f359ea7a211a6d51c5993821ce9853e0145e7e6d86965636e244bddf03b48cb5b01ca057fa3caf54b9e50cd1dab11518ffd815c7feb98569ba6b222a43f5c1060ef79a1de9db016ef040661f371120bef77647f67cfe03a880c097b82d9fad29fefb86e41332e49bc4e82e421257557ab5901066ecaf565953cd3d21b594894f55be482f20d9b35c40e6361696513eac024d1cce2a199d3cea4ce1e179af224edb83c458613f2fb04110c88bfc8a1f1440ae11078b63e5daaf4004a841ed17ddc3d7bf9cddcada5ddffb8a4d300dc6b1585a430cd9abe069c8685f85bac70172e0d0b0bfc1b6bd813b7610ace3262b9cee58029d7c4989a4ffb3e1268818aadce90e6901b5198c00b58bf05453ee4e6c44d9692e5e6b87adb394fe2def173aa5b9916b56639a9ca1d407656fbfc4242277a3cbed27f193247e88e1c5218efa018ca97f7f41afcd0b5d33631d490f787d928524507b37496276fae75f5cb80b24618002287c689a698e7a649b1f676dd563d981279bfa8d99325b7fffdec569edd5d3a2b24ebc9808692939584fb86203bb4115932afe9cf384cea36948eb7bb561e003634bf45d0107870f84ae487b427c2b1c18568f93bde5dd4c11fa8ee34f6034183f8c7df595fdd5dd766abbc4cfaa927e91d930125bd52fedcd2be92fbe0d0a26df962a0429962cc52167df44430d74c109407cdd5ab69255ca39284af99ab07f473f2d4a902c37d9d39ab7f0b4af82b4b1c2d37b20fc00b45df0693bb31208353bf5f295fa5e294977cd5df9a1e808250b06540947896fc65de0050fbc9ed396500005db0eb4244ee48a4733e50b3f6321435b387f6b9b597ad31a4bbfa8cea43bdc2c98fcc25ee805e269f44c73afe5eda6ed070ebce518b7f8ab4e3ffb280a063ffcc91764be552b16ee6c467739b5be08ce4229012f4459b8cea1ece997fb0ebdc9ae48797e06ebadcf004056f5622b003f89422b45ed5e6bcc527ba8aadb44ace5a1cd9d2e7cccdb96553cebdc13eb25174b9ee31ad3858adf9d9aa0ad7c6cfba415ccfce82ba3661352ef139279ce904bc42c7233bffe05abf7e97538a410d0db82dafee85b2f3365dce00c7e1f4a6ac2879dec2c0250267b75cf0f3a0cf68fe0e5e1cd6d8db84088a0db647814d2b5150d3113c27fff834f434b434d09e364862b1a98a9f185eb8d0043b512ef87b547d4b82293d43ce9b2e7434f34270687e77461da0c27d9ef2ba156273ffdd061637ae65d5a293f75219c70ada2f2adbc164ed5d3f32018f14805f56c9973753e65bdd9e779bada6484e4077236481ccf1f1754c30afe49609bc042cbe1f1319b90ad4070bc62dbe1abbe471db588e5f62b21cc01c66ad289c35e7134d043e2f12ef4a97da091852a9c221c64a31bd10589b45ba1540d090fc49ed54f9d731103cdf304ff43466d6141065566d62d61fdf11aa09acc452acc63d0aa9fcd376306f1e0c39b11910744d2fcd1b1aa4e2bda71b10f8151679a212023a0538c880cf5e563c0b826dc32db6a9af9d82ca8680939dcafc205d4e8c8f1829c98a1ae7743fc22db93d1e2b4e05a53228b9a8469cd56f341fe8c349a8ae2c97a871d4dd1fee9502dcd50206095a2537a9dadb0648647a2d47be65732591590db45bcc8193872d3dc26c47fd3f3ce23262fdb6bbf5b376394d366d386667f53f5d89e9602bc78d0ed89e11ad31ee3377fc8ca61b436be2f90a7a58740c768df123fbd1593cb12044b934e8021abd3ba35ea768bc8aff70455c9530023b3a180c37f62e646738f5556a231190603cc6e9ee755053b3ada32661cf38fdc9ef384cbbe0a4b97a9e44a1ebcd6ae0e080f45e3aa00d9b8b36ba04eb171d9d080b00d116711393ad30b2817721cb6c809ae5b98238b6fe0f88ff73525502b50e83983464a17348f14d08506e44173699e5f5a3b6f8fefa77b7e9e1d4b59580b1a6dd7d2f676b428b68fbd673a889ea7e542a35baeee911698103b0493eae6046f186b04ba59bbc07df38fece7abbcc398554eec7f32c0df3ccb97d593e33fe65c3aa6ac08d69b849cbf5da5b4ab0fa7e2d2c0c46f00948652a5b491010acc69c23acae21e1c9ffad85437ef28b2e0f615c5e2b71f687e18066c360e6b95141bf550bf4543a8c79ae10ca325e1947cc73ab30291d45ccfffdc8b2c4aaaaf29fce683277eac225732584ac026503d8080e66fde512ea4e8632b5dbc3920e9638fea714834eb1c0856c676a129f31ba67a3414f960c24585867ca25c0f04ea37d45c2ea827b8ced124415b120f74f4a87b0114bccf5b4700c60adb0f2799e830b5e38e6f3b30ce6dda992e645ee988ec9802afa482883aaf6bdb778e7472a2d564dbc12f801695c0eef454b1a1fc2170d0d313d068954bdd966cb05474d93ebb2594363263e47a78c88a3d9bf5d663decfca228ee3cb5394e62a26538cc2ccaa1301a0e16d280fbac411c9579e9ac276eaeeb72ecd5d80f70dd908cd31c5884adbca9bc2624d25f6d16bfa8ecf00174e12a3426e3629afce8474cdcd83e0c5129488740fc0df9982db70101ac57f38e2fcd3bc09cf5d82845559d6e02c9ddde3f718b0f733b21e54054edb2bb4603c78cadb97e8ff329244601ebd5b51a7f978140c5c7072fab3b0a37823912ba5c7bf968f78c579f56f6c9c9a6596d8b5a8ea56c8241ef63688735c047a7c7713f491d4e9aa1ecff9b5f3845b131b1491029b5828c6e641115097fa77824457c2521bbe446ec625fcaf51e9ccbca5a77d1eef561d4f4c874c9884e058f4e871fbdc801c3e1b69a0a808f4133d06010ae7904e34338247d7a64c945e49964c7085eda510e1b62470eeba18b96afba1d842a38a350fb31d5a25292f0971c048a8cefb83260311ffb7c285d8f9713a79ac14ab1f28ac47b5902ad4368f8dd064b195c448d06ee659e3e7aaba8916e90c0e238ab421ebf2352d619fef7699aa0258f07e639cebda7cb1e9cc67df56d18a7fc0a5847985ba0e13769a0cd85ab45db3e65f5f08b7c49c1674abc1b87ce0edd135a19755c2c729c8ff2d6e8a5bf15234823ce03505536f002f45a993af9e35d9406f4438e7187efc16dcfc64f25beb0e9f26a2428f6fe334b4ec1ad794c2ee2ff89b32b9d8821d0bd4a47c4d6f5cfd6babc6a23bc72867597214ac02a490b185432baf35754e187ccf78e2ca7584f05694e671cb07a0e392f250b7c3631d3376fe44fddd320deb26792bbe44f7a14e9ce592b25b57a25e6ed5dc5e491fd9945fb7a553cee44db77071007dbb1bdd584513503798c88f90d4b7f13edc7616faf3f24b2606f36b8eeccc6a8d567f8d873dc8f763aa135de9a5cdcac37028334219ed6b9ef5aa9d6a48354db3431226e4e01af4b11d3b76f15ed0b191223a3481d175456d25b2b925415c6cd30c2c90be7d32c8e837634e064bbace32fe457ae2f2bb0b724ef0fbe9ad0366f57064992c0629e60ca9e0072de63f73b2fa093c5bdfd4a238d5babe0535654693a1b4e8b03258012eef69970fcfd35beccccc2062bef1414e60ecf90f75711fa749940d0c913e60863da44ff3402d8249df2c8993e4aa9ba58f4a63c550dc2dbc2a1eaa4c9cba7c9dff5d00f22c4781c8b07938336b8bec31323d43711ab2d7c92261134c78adb4f42e4c0547c65d45b0f874604846ed15d76aa53cea6d88821857bb9ea351724b65f974e5e2696668e8c0fd1b2c930137be7b48afb49b8e949a3681da0f74891239372e6993d5e137279597f6c4ab2e36714ad887b833aa5a129a02f11445b114eb70dd07f94a1ae3d151557bc8bd946e97dd0f5aa97cd388e85bc7aa6c207777bd430046575333d6f820630e2d284fbf985b585d3eac9fb7d3a72d13dce70b67f1754c6bb29691dd29b3c69032ca5cd636cbeb339dbc614e479d3d30fa0dc392381b525f51e99a90c1f504be5c93e0e12472d64ad30c91e3ebc32a2c9e064df54445fd673349c4fde7e609651dec2accbb08ee473d92391fa2c9f5c938762f64156b88249ac006cb257ae9231b8a166724e4f789efc59b55c420181312c13047f3b27d08dabfd75a5b3419c1e67d1fbf1c4de03ce7ace767d33242e87db622b911927c5474b7fdce678d65e1bea9a287c1e105d7c643d5d943f2c4cd121543f44cc4b5d16384f583902eabda603d05ae0e18a67b53fce6246af48b5f036aba7dd101ebe4e8be5af1e6e307b918278ae03d95194de5506596d81e1043c62699e9d196be86b9b12fa43901674fa8f05b6269344fdc4dfaf262b77c5d0f0553ffa5954027f3e8cab3b99e300afa382bc8e676a27c9d94686b6e39eb1870de1fe63bc840640b041d04f8856c8c73d26602a4753eb60a9809ab302f7e3e63adc25aa559195ca3728a56c8e04d880d58e02eee395a7f203ae7663c5755f40d3a6a3362f2af33127d5baa7983d207ce5d139dd6f502d988e843a6642ce9090c0a395b5ef5c222dccfe1863d9241fb6ff41a78d281023f9be3653f6b39c03106603c0b472deb7dfbb14f7780413764d6824043c407a701efa6f422813504eef206452ad84a1bc60b7e90412c79109ddd3cb3429021cc7beafbc0badf5a5bc1bf4b63fbe77e21b4daebee663a13a2472dc308c27d470d1bad3bee97cf590ac8e3b2c475fcb3eb735a169aa8db9aa96623e669d491855e756abb0dbc2d95b1f42fb1c378dcef728d0f53e13cbc267f310811627926b63c0b045980362555627e0086fa1a1a18009e8c83bffce324bf7124f221f7e2974add73f95b48643586d822afa4456e5049a72d79c2d2e7b49ebbbb33cb7e42b75b6d21722d5e372320c48f6f21ca62e4258fab53cb17600b5354877f15dec4b22a5997ccc5d329d9cf63e1e36bf6459bed552","title":"109. 有序链表转换二叉搜索树","link":"https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/","question_id":109,"issue_number":12},"10":{"day":10,"pres":["链表","双指针"],"tags":["双指针","链表"],"whys":null,"difficulty":"- 简单","description":"```\n给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。\n\n图示两个链表在节点 c1 开始相交:\n\n```\n\n![](https://p.ipic.vip/bkdl1z.jpg)\n\n```\n题目数据 保证 整个链式结构中不存在环。\n\n注意,函数返回结果后,链表必须 保持其原始结构 。\n\n \n\n示例 1:\n```\n\n![](https://p.ipic.vip/bzw15z.jpg)\n\n```\n\n\n输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3\n输出:Intersected at '8'\n解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。\n从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。\n在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。\n示例 2:\n```\n\n![](https://p.ipic.vip/26cojo.jpg)\n\n```\n\n输入:intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1\n输出:Intersected at '2'\n解释:相交节点的值为 2 (注意,如果两个链表相交则不能为 0)。\n从各自的表头开始算起,链表 A 为 [0,9,1,2,4],链表 B 为 [3,2,4]。\n在 A 中,相交节点前有 3 个节点;在 B 中,相交节点前有 1 个节点。\n示例 3:\n\n```\n\n![](https://p.ipic.vip/2tpyar.jpg)\n\n```\n\n输入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2\n输出:null\n解释:从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。\n由于这两个链表不相交,所以 intersectVal 必须为 0,而 skipA 和 skipB 可以是任意值。\n这两个链表不相交,因此返回 null 。\n \n\n提示:\n\nlistA 中节点数目为 m\nlistB 中节点数目为 n\n0 <= m, n <= 3 * 104\n1 <= Node.val <= 105\n0 <= skipA <= m\n0 <= skipB <= n\n如果 listA 和 listB 没有交点,intersectVal 为 0\n如果 listA 和 listB 有交点,intersectVal == listA[skipA + 1] == listB[skipB + 1]\n \n\n进阶:你能否设计一个时间复杂度 O(n) 、仅用 O(1) 内存的解决方案?\n\n```","content":"096221cf5b628be1e73e8bcfe626c7347481238a04fa3ead0b547d2954020e2d18310ec8ab1a6ec9ebd627f465eaac46b8280bc2d829199fbe23f761a0f8f223fc3b6776d4ddcfe70c31d1a08a89547039a97280d9b51b9179b52cc0eca6a8c0552bdc1d72faf1446a7247fa4f14415d9751b4cfbcbe22aa14b6fccbfb27c824afba4b4a510034741cd849fa0ae46ac9601c538112782e3392d64c32ede6ad361e2f09a5bc684b2045672eb2b7165a774ec0e99104057a3a8458965038b83399b714d13b0e46aa0de7c7c1874ae4751a957da6541a59a309c2eee7bc335f36823141729a50ae4db9ff31041a0b6b4192066f34c6fc4bc1a181e1c12d4e4a3fe3b664eed4b2cfd426c3a791e18e60243fc39fe830bc6ca208d8f6b54b9ed305bf1c66d1ee0981b5af2aa43d731ab26cae684df2fe58b677a4059a69199e2ee6f54966eddc196c0966d9c25599aada02d1f9ad8bc8c993ae128d6a8e8b7a5f7fed8ed9cd7bb9907afa6c59612b575784982f94ac33cc152555595ee53888c2de231ce72b3c096d9ba7491ead5b72bd4d2dd8651397e28e11e7ad2e60da38014408a79841616ef76ef45f07bf1fa2d73cebaadbd6bae96fb75c616377f80378f8efa05dfcdba042a8091f9c63cdaab2f77453f420ebbc83bcdef46bcd9c7d14c1369c3bd79db45c32f946461cf1e7d4f507052a2eff2b35e3400dc77ef61d4a921210bf8ee9b448a343b2029e165f84d06662bd8993ec6e0cd83c8b879198b0f3fbe0b3e6e996b295cc48520b9596bdb80a18555b530bc66c96e562370247d2415f4c5455d39d7124b86d217b7c449275483796449e3c11f87be7b53152fb9d6950e4cd7e74a2bdfab8bb9cb66ce5f63c06c8d8f8f602bee7a16e18b771286a757e3d4d018ece2fa2d58d44d020e8346d40f34e93c0b745f832ad2105701d84c4228909d79a52d7b6d37a5f0b72f68ef3ab5dc2b94aa6182c6a46ff27994f5ea05258f95bd6d3b036b81d27d0bc41cc08f08c6148551b9f5d0f101681bd191afa4852991283d281ab5d5dcdd9ebbdd161de371b71f96aa9c48db5407a880d6da35ba082e75d168939db05a0063ac848a6b4554b05529e03baa1235f2a3ce4d413a0b079f7fa9ce820ca5fd02e2af52d9c5a1be1c7b6ebdece02420d50f59ac7e1e8a7d8a2c98b7c379538736a9cc58d04ca5b330b310dedec5f974c508149c125a3ccd4a7dbbc446db99311e79a98a115b7f4e6a8230cbebb6eef43e46ef3487cf21ed2a545bc1f77d8bf0dbeb3d3360417dd82c7ed471a1ffb754bbae3e6b594ee4377f2d52625db2be21a72c7bb6ade8c8209de7b64ba9dc3fdfd3afd7721f022eb764ab27097c855e7b975fef29b371a5d2b5ccb976d2e7104611eaf215fc769faffb81bb560fec8d20385e6353eb61700ce3b0479beff0d8299ca61e5dad4c030e6ce894420c6f341da678828a308cd31424100ee356b94f6c11b92e4ce615d3ad10570ba1e2b91b9041c3d14da5b6c77aa86d09ee7c59e4ea506470467cdd82ff6571466be03d91d125a95f3ef2c883e54544acca82642d36e35e3e2c9a3dab4cb1fcd771892f1ded912498b0bb4a7099ec1e53694b577b786e2bc7e100cee75e990e6d38e270d3851bc3f400490caf08243ac7d91eefca2779771e6c646f0de88f6a9c0dff7f4af241670a3f184e16e43c3704fa9ca9e87ba02012fb11e7981b873739645eae9ccc73608a51bdcae4bcd5621fa41fdddabb01aca37960f207fb8bc22a0fd0e4680feced55734f02db2e525187f7a9fb9e144b1b6f454e27b1d50accbebc64704ebf876f181a85974e47b516d2c7bcfb7c0ac66255318145f2a2baa28d76fb225f61b126f209188e80c526d144abed7fd715676f3b3ea17b837ee374947a582f3bd8b8b8505f1c58601d067e94a54ebfb0714ae8ae22bf0d47b0ab341e6d88b12cbf2fb0e9dbe106ccf4ca82e49f20077fe3dad95b24c7dc3437b94fac6072496bf09be9238830c4288e2720c63072d4611818863f31ea06404faea46adae2e84ac70e0432d727dd4d6622fa3a8cc46cda4e94c9af8c13c75d174523a20d14fb6ac0b57dc25c96bf3ae88b6e53e5bdb95eee2a6d95d5426fae6a16f19e96a3703c3c1796dba56e3efd6f02a5b0108da3a6be5abbe3572899cbe9bf43c26098f15ee2eb1578971ce2e55b3668d85ce60e3d2e9768fc859d7797c037a0cdbdb866ab618b84052e2aab371d5d2dcfaf8fdf6ddf979f8460c57a913da3d837cc221531cd1b9d0c3457e3c92bc8dfcfa088d9e89264cac0458bb3c2b355ca167947f6fe24969cc4f7ff67355e7e0f05a031b7b672ba6e741c5c73043a6bc5304a75a9a000e7063355ae81581f277849daadc5cdcd62d8aabb158be0d8be063e06e200488aaa6421f60b16ce62a46763ed943882318a7cd876c9a6bebc8f4c737a9ff4a13a3985e413f1bc16afc7f15f6d6b37f58afd6050d7212880a37c0cb2a0332f793a19d1477626cf13efd37279905120c97a683d6da83a843f957594562fab168c70a9d92273cb0e53ad8682436d399a100c0b471c881bc9a55f85679555f4723e343410b6e006357d98741f56f72e7094b11ba0242dc9c2025f155153cf00d1cfdd9d95217a6d4f086e3344694354dd7682777fc7c2fb382708917a6a9342c988f95a9b3ca14ee78f3f0f4f1cbf6bbfe2fe8f6c7de6113a9720a48326d77fb53502c380a6696933b1b6d84a766b94c188354a60028f83d733f460ec8413bbedcee9ec7e225e989212aa60159e8b0ac38ca8e5bcbdb9bd1fb9a8c67c1bec439e02960ba8d3ceb90befb85acab11ca2b69938e711721711e905d5bddbaa485d195864b0969c4cf384869bca66da503ff1f78a0441e4b7fd88d90cff17593fb379d7c9c65942da603fe6d666a046a96a3a6b187669a039bc578c6fe7b750b04fb66d5837c30cfa4c471c29f43259ddcafc5e0ddbdceaf042f40f0501e67223a630eabbec0cffefe02714fd9b33a66d0189b0931c1bdb1a3d3f64fb7caf55a7a314b753065d265b9009e0f6757ba7241d5f092ab91733d804259e6ba9cb10d75f0cd041a8077fa2afe7bd1c727c9ab1bd4241c8d94b14fd789c491522e179147801dd5f87d92648c34859f3ea39423a29cf484b9a9f15a2ae7575a2de8487055046bea0a95713d6a821b1607fddb79c7a9df8a13d7c01a96d76a620640e9338e467cfe76ff4068fcd72fe3e73a1b335699ef20239c1d08daee045135f8e4a028ad82d7f69125e55e05b683f9ef9d59c360115b739a997a16ddce62f1d98783db20d04b1a6c8a441780fd632f10a5ed2faa535ebb6bc944573d7d35f579067c78a467670aa3a48044477a345d1a527bf8685b9866985d7a19a162c77d973bc0e567dae080fad81edc699ece2aa026211d5bdc4e575d217b4450b4091688f9ba8e2b69fca44c5f857f99daf15044260235cfd43f6567872bdb0349cda651d252d0cda8a00b66342c3ed02cca2723c7236b467c32a0e5498633cbc14775d291caaed0a1ca0a94ccedc2e890ffc644198e5186d45f03b2423463fbde4655640398d33d378dbd0428e63a1dce5912cbad565eac5d59dbe1cff1bc022138ddc44cb90a170bcf972ef72e9de45854a3f69e39519cc28fa6c89561a899aef1d69a9dbbc8bfc916cfa567805e445ea61b401f7ff1f171d12b5fb7766d2056cf07862011b8d8b3e7312d00540ad2e10a9eba0e0c1dcc470268c75e8124eff77497e60722b8cd0fc2fd9811d8cbcc564f99cd3bda085943ab77f1655e84345b50c61c42848af29685e2fc89ba5d875dab8c938bfd34ecdbfb2df092eeee81252769cae45f16acf7c5d220e65893e458e9d0892858e48d8384d1b892b1d486e36da88ec42aea862a840e5496627a114a006636c55aed828a0ad0bb707c1594273f757242fdd68cdd06a695d48fec0f5ce736a4d8b74aae188413c1ce35f661d2fa19aba1312cf459b8a3a4a568a32081de6519478dd1fbfe9a7c59d335d946391b685f25c440f056a8dd2aae647a7f0ef6a43ff7b258fa881223b5e20409a9f50d98013e0345cb2378210d9c0982680b1924ae34f576c53dd48c873b2556ca2a3cd7a129be4bbe97f6bae887a8fa7473f88c9ce9be8dca7c3ab66c49cac31bd906377b4047aa5447edb13c8b5360a13e81c05122592b7c664584aaf6c9555b3cf448a97cf46f31e3e9c06c3f8bb87db2d9d9b6f5da9acc42407d0f17da773c59b229290504187bccb6d9c9f917aa2fc1e146b17154ca2e5dbfdc95ef6cbf7cccc73d0a1c1328e56257fab8f7e7ab49ccce463cbe67186abaf1c9768265ac5a8808db02ffc17c14c2616386cdea5db903cf81715e53325352dcc14c88a5f2dbafa0d5cae710332bca1ddd6ce8d6eb6083221ef9bfe65f1b9f761650e646793f2a14097d75341188b0f5e3f40561ee9e7ee62b6aa7bd4b98936a35b5fca7ccc982da5b3cb3af8952493e6fb8bee12f72225ad23fc5cf8760872334ed51cfbb6e6f68269269dcc4fc6fb0a518e5a8cda1e1a164a0398d79ac5fc615a65ac5ef9ef4f4e5af651659ba277f43579a716a168de3cdfe44942e86393f01509bc77706774f20f4d9b631edf6a261ae3cbe909c137b212437e2f634768658412aee3f9af70c6addc980ef78d1e36ef1926d9ec5457b8395162f806fa1c07ff9029bccd2b6d93d126427d8ea20c6e51977cfd964e67c8f4d18596f3ba98fa9073d9cb1f94d2ee3788aedbfdf3b8bd57c826ac253b06099b53bc51f2898e77bb2cc416da771e94e09f225e7c1160adeb8ab38efa6e50de59b16734e6c5cbe7e54a760f14ae926a58f29cdb29a9cfa339e197740268ed5be4525edcfd97d26da43c6287e1c380a4f898748625de7857f172d5537ce8102c286e02eb5d6d8c686d433bbf328cc6e1d95ea3510553f7c59497b42a43b35522afae20b7eaf481a856284caa2d4872103bcc84ad2901e7e5286c0f5757453ca5339c9896a2cd57e267e0164660036431cd88732b6d67208f7040c859dcbe1dbe622c18362036962cd602533d800f0cddc85689e52a43201ccf33e51b05b69788f016c36edf5eb9edc7e7c17597de7f1832b869e35f17bcdd2fcce722d5b07e016486e51dd3f09479e1586605687482be2a6749cd68fdfa6d3b2b9296c9086d9159e72c7235a1d936203d62513657495e30c1ff6cc4066ac9ce81f848bbd72e24355b9fb779ddbd6480b8235904d93d8220b46b134a6cce463af82c523af189a11919163084b61593b38e38543c744ceed9a0dc185827661cecc11af597d5c2104482c11121cf885c59e9271fd87cc8b4fe69d5409c4f7e32aa57501332860b55b1a78c1fabd7f854596f03e80971b187bdd3d3e75b011cbeb1c4b092081d5d9c420825de940c4dec22d750f96beedbbac56bca3b3a03bdbd538858f7f780dbf22b869907ef6d00d5e1bb79d791ff7753b1fe70caf95a3fe75b7668af2ae831ce78bb167a4b8fa6787a9f5bf188364dcbddbaaf1eff2447b3027fdc1b4d88f20c30ab0026cfee414b69198a7697da322aa4e0be3c98a7c3087080401bb74bb7ecafe918690980933fa596740abf2168db3ac6631cba0088ad7381af73f43db233b00b8be0d5379461fff11548f315489f92d5841c55bbe3e9f977f6715d9ba8c8d97f9b723be3104e2c9138ceeba75f481ff9764d9140e5b522b6ba20833ae17f9241a9389fe311b260997bc90a1cb05d3514262e6dcad90e5def9617bd8b92f27c4271565e08eb545d6cee76c7587413e52c6dfd25ea95ba515a97539a8f61f6d6458eef144662896ab1d6c9897be8b26da204059acbf51cdceba9d19aa5e6c46b4c2141e6a6911dfa0c7941f7496356d9c713c69dbeb6b9fec952fc78bba98e49c8947563ad31d73d3169539c9ac884acae0a0955bfc97615a742bb78992e2cba7eaeae5cf5930e5757173f5e1ac4a7dbb4485ecc885315d0f69961d46e2277959d845e2bcbb28f8b0dd886adc32d45be804892e028d49c71f9f9bbfcf1506d915b979f2ef74b7eb0c8554be5c478a10b5e7b2edacabbefacd3df304ff4bc305f5fffbe702ff9015def2499b4b766d8ab5dd7253c7b0cf26cf6139e5cd82449173b42923ea8da982333558009f66a7b5574449c34364f9a436f74b0b704315351c357dd0c65de5248d5ca5696f8e7b86eb6fcd3c5fced029b2cb000142b0d85647e055a6793459b8cb3e291eb291d67d2c7627de7a7649d79942f34f5f48820583f24e77d343a340fe028f74b927de9e2cb4d149632b7f670969be5809f6703e9b5bcb0cd29e1a5ecf04c2ee8f18d749e227d181b660ef0dfb3480b6808ff0a5af008bb5991653116844ee1e8dd724c203e87b3a11b7742c6b73c854f1eb828bd84b180ac753e497c2168e5132d6208c03f525999cbdbc4fbfed8cc6450f9fc9e1fb243f640365bcc13124b97d8756a59e27b5c6003bb5db598c879f3f298fed60048fabe147f7136e23212b95c61b1003a3ceab58807e2b1b17e405d4f8ae215730518a28d579a5e525153327d2786c0fa7853f867ca17aa2ad9ed6c72d6e05389683015446103369dc1b1f7119da076819c3070eb1b25184ced4f90d4373c9c210cae7de726f0cabd16d6b10f130dcf5fbc41f84170be03a28e5f16bdc4c3f320163a1105f2a86dbadb67e9e402cb23c30213b7222183405e7f4878e612748b2b8d203f27319da463272269ade0dc82fc976f8d18049ab2f891e32a7668e3c04df171bf348a38bbcb1ab7de32be2c1687147c19a1db92931d66060ce2aac422bd9df468cef51c7d409083df72e4ccb118a6384d6dd9ce5a933f35f866db3080b8cc6a2057addd481002807660163f13941186b6e912266faef353291ee75defae24bbe8ab0f7bd151820fac8f9bed631fa4ef3b73d314d49306a6a11180ee98bd5431e9fc73b59dc04acb82795b93d9af3a38769bfb8504b82401cfef2e07b288b324bdd067c8c5c33e16f76a70876cc95c8b6b5e646514aacc79b9fac9928a387ec16aec279c62b6d2617a8db0baabe72e78730b2ad03100d7b7cea954db0f5bfa39a35bba27137c491024dd45649fb688527f6cd7f487cb884ab713c8efd9dbb9aac0307e6415682817ab19253f757a09743fa21b123b41c503684a4c348b1e18caedd88d8308ec6e0a26e8dd2b59a4b92b569792aa690db57766ba3c6873c7a2c05a9ca232633759504c2f3d2933f74212f71ddb03887130ec960e940c7827aed80d36db38bc7dc6864862a9aef3ce94e740a5d54b67901cb620ffa97908d42cf99b67a28ee3442b0c8a8b52bd7efe3093c3b37491f6c19983c1029555f12176f6f5cc5a7ebb4ad0a94531386771c10a2def4df71540591ac68a717eb977db5d7376f32b01c5f29941cf415b704102cfb05ca720277abc87d5a7de4a7f58828a3702fe72a43e942c0021d25d2917515dba1e990e936a7c0f7ed8ec0cba7286107fd0c4efe44503b372b8be14b428fbca8dea7edd1730e605aec07982e7e898441cf88048bb93f9c2fcc3296c18947b87be539e681e9055d7e4e2b716f786d1737996603abca2c3138c194596e0c82444f5e96cf00ea45867cbac90c5ce704c3242c9b5ea1561a03fbc8096d9c7fd0282280d27aa0c6dea0ab9a3ba6d340beea8b2f6658c24330e3d8f37abd39a5dd5a7e82b8277c65ba80aa031f1b88e028e18db97b4a3de72f5c47022eb6000c520c0ae81d8cba60202b43ff5be3182a072245f252be1c616043e00e381302d5177178565148da1abd8c09f607770ccdadfc6a6d1d17374cf5dbdcfc8bf9214e1ac1d3e24c9967a764470e95367ea2688ef63a645e65d2e2fbec781b8359b1dd6933f5f943ac86f2612c99de86dd4234aeadbcadb6202eb04e476af9faade41273f03426739929b0f9f16d367940a593e7b58d3bd03391555dfb74c7a210ce323cf47eb36b4c1571b4f5914db143f9b7902c71c66e0a2d21af0a09f6e4b14611c787ada87e100d85f0e4d24d4c00070bf1ba25a9029ca825f8e9b673a8ce028319b839fe87cc6beff6e3caa559f73dc34b28d444801f1d17d678c317007ce6aaf4d224f04e7d7555022620f913da3b0466c3b4e2295265878e922fece3396f755f9ab934fc0a1dda9166a4889f40094d1bf960d5beeb7dc5896e3f8262961f96ea03e5c6b79d1388a773f10af8c63cd9eb","title":"160. 相交链表","link":"https://leetcode-cn.com/problems/intersection-of-two-linked-lists/","question_id":160,"issue_number":13},"11":{"day":11,"pres":null,"tags":["双指针","链表"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。\n\n为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。\n\n说明:不允许修改给定的链表。\n\n进阶:\n\n你是否可以使用 O(1) 空间解决此题?\n```","content":"0961e884611df7d4ac47a79a9e3b6f2d71853d84c3930af0524c30537954472490514debc96472cdec9c7be126a0a557be330cc8912f5ad2b362f921bda5ed33ff3c666096c78eff002dc9a08dd0517624f030858da2009b79b02c818dc9efce19a40feee6784544437c47fa453d4e51995fb6c15107b3498d393a4abb8370e335134b57630c1370f148e0334cc420b5637ae507d5e38333ade74d1dc1e5853d1d0722a5847745e8207647fbb0571d4200a7ccee782631618b36eb5668f41a28598b4ef4546aca51d99c5b058f712773843ecd68702f92a3095b86c9132b7185afa3ef3a95e26a0d28a582f591ca87d51f0b68d48fd9646a0c73cc365f491ce0b771e5d5afe731902f2f71688c742232dcaeeb069f6d8a2edbdb9747b3e504b52c8b4149cf05e8e538c1415f45ff432eb29c9cb518338522c249959d54f622a2750ebdd9471b0a2e9ee304c0a18858fcaadeaab5bfb6d8579d2bd6b3351d799de2ef941db7df07e53311776b084de4c830cbc316a07f16343e5e9e7bede6b963009d5c33533d9eeb1723e42f42fa0339b2323ae896b861b8925720c3b9c8a48cfb8c26f0fa33b83bd7d1191483fdd145f5a7d3c4a87bc90d563927f3420ffeaae66f9da08605cd3774f8527c2d387b7552cb22d89f82b2d2f644d953b1e1b81c1ac6127f1fd58e00d4c7fb3b7f0667cd9ae4e829c5ba0ecb9e26be30ec9f1edf8921182e23b50ead05ef19cbfb82ce7662928590c54b0eee1c8b530ee0e4dc9f67de9ce1fbe9bfa7fb0948abffc49fb98ea4ac9755f3270e45b675262eab612127671ebbb0dec7cd60613c502fc5642260b01fe420469e6b90d0282aaf8e1c32f5be27685c3d3514b6b48d60ffdb3f21e2d6cde5c6e0d6da2813de3b2b3b1e5f453222e3aa11d4b5a62f4c4f8d0fd1ae89637d76ca05ff4af7129fa47dbab8bd598d0b30b1767f6bda879a813b1b5c34960a3ac056f3454ed839e350b5aa38dff767cd3146529e5ab9ff5463e52096a1d549343510ea060ffd91666683c837c8a64d79e51a03108ce95b5a3e54af2a1ab79bcc55e97d78137cfbf959ebe4678a761607b716fb31b119acd1bf438d092c89c093ea34902f67eec6c9843648be86f06afc99e68923d79a70ac27f3329f6e3404710f81939a81b0e3dd2141a88ff9e88c6b6f3ebeb3fb794537fff7c851c30240127d9bac9459f33c64dd1edd47e9c38cfbc9eeeed77efe1486ff96ef7ca19e8cb14a7a90dc30fd37a17eb42c46bf63f0ff17935e32dbe072aaf1841f7b6fece6b6fe1f503da7faf4b1e7c5be9eeeae11f0bc5931ba43d95508dadb3af2c1f721852254dfe3c490b7308c1705a376fb1f1ca427ded218777ebd90c8c695f88e9de90213d4fdc999d84c8f490eee3281d6f5837ba8bbd88fb95a3a8da079a6aefc251e756e046ce4855c61c4e111089deafca64c1ef3f146ca66a104ae3ac33e615001df1569b0f204842ae5ea639957e84515b85c7e8bd17d3a9bb57a3ddee96b1ab9dffe9be468e44355631ce74d23fd791643bfc657ae136bb2f3ef2c883e54527aff4459498e04248fbaed74b0adb49a0efff21a1c7d3bace16175ca3fc53d096dcb5f5d9d3856592d8de4c571e06d5e225a20ea99e7f55e9da08c704c1ffc46dc1896a3ac870b66b077389467035167592355abc874b685ba1f140a1cb5ed5fc18b4a77573139dbaea074aba9481699ff6d8140766803d59161a3727d945892eb1acd04116e3d8b1cac049bf0992d539a784197a8d2ceb8a3586ba71dc00de38f9a8a096534d46c46fe1f71f796863341e5cd4504edff7cc39dab7a68e66d54623c7dc0bffbac7e185220285e3c0b6c8258678002f7323e6d199380e92e9de1752ca241132d4e38afa2a063a65e7595a4bc7d06236a64677d95286853a203e626d027be6093b46d254f01f1cc4509bb4bebcca910e9fafb0e9d51c3b0439c4deb861c86bd8d6d95c6e54a16836abe767b4e4e0396be0c9757ea3ec8f12634dc87aaafd84c3e858448c11ea064c0006747b88ceb433727d84f390fbe26311cbf4d6ecc6f882135c15a6b6d3e53fa75611320d14fb6ac0b57e519c96fd5693539e61c75d69ac9e0abc35a623ff8f8b0457be9f3afcb400e90aa5ae4277552384569606fde4c07e1c0ca36d05f3ee3c5d146490ecd72c445d46d0f7ecb3cbb2dcd322fddaf372d82180924be34e1d5bdb7aa54084910b828e50a56b9b1ad38d889c6ffa8fdeb896e8e36d09ab03cd96bd215b4a8213976330d6005e3fb37958503320f67f5e5cca1835982941ae79faa960d8a12b081e93abb509807bb33183c0150393f22021923d5fa22f192794cf19a1317ac59994b4228372612a9128bbb3ae6d3f28b4e855be731670de826d978e273ac2a42894e6d66e5ee852dd66bf7e8bbca3cdf6ea7975c3a47a557ef2b55385bcc4678e1d42d7dd380fd8613c67d89ca7a4c117f39f212d8db212c9a5d0bccdf57ccea1a0e530d9db2ae64db7b78ebb482540300dff1407630ec2eb3688ec3a3ef244ca211cb015eb6df5e51a01cb4b5fc305e54cd4862ee2d5d501cd672f8a3861e0e0ef842564201697761d8810066b1fd7edd92996bdb428f1ffdda6af5ca73ef1301e4f79797fe20d4a3cdaa3471d6bcab1bacd0bb6990ce385dae4ff74c38d1f30f4c6ec03710a546a9246002344600257eeb21765673fd8231b690ccfdf1db3e8499b9e1e0e14d62fef09cd7e92ef5485d01b01f00ca781759f9e9be0fb6e4255c38fdbefa02f599053462cf9d73535aba2c17807e05193d753655ae8980ab21b5167d8bd9963c59334f2f6212a20c9ef95435ffd3b9bc56973b0eddaee9cacf998718093b8c83674163e79d7db129ee1f64bd4470043b9dca808eb523c6b57ed829cd41c762f44abf7763705c5bd9ecb2b8ca17a00387d87895b532256904e77bd5cd56f51b43569a2cd10f3c81dbd5ef256f11cee34d7c149250d8f5fefc9aeb3c6144537667cdede390fd6e23824bde4a65b7fcfdf55e3d9ce39f9b91bdd7c9c3dc2acd25f17eff0fa2e516720d9ca3c6c991e8ab2986c3627d3e28c2e95c844a1e8a76a972bd7fe8d56587f35e80737fdec0d03484c28dc16e041c9156fd1dc8e57d8c688b35b5aa6da6883f8c87d584a8d4dbe5809057b8f213c1e2e9a8fc5bce6bbeb18c05f48cc17515a45f777422c22450ec535598f4c5b338a24fa8ee208d7996abf4d46efeba5497d7b25d7ecda169d101b5bd3f58353d4256a874267c0566b90c9284551a215957da0786c5edccb0b33a3ad4b71c9c95c30372875483c6ab28c1974a1a0d1e37a5249c34cc977a0d81449ad184a159dfd2cebefb210800a33a19ec82e2989b89e7519b2d5893351bb889df70a4a3139278530bc7da8091fae95b5dbf144dd965e79b8a930f830f08b690ecda40f6c80c5f7f2bbdad6429889460fe4f5e7782bba5dfd50211c8370f9cc8689d814c2e9e4efe56016c6586c077186c19aa09a5c137fee8e6ba8e0970c924f46958d0bd3e013d65157c17a3607b0f1e4a131f24443e849dedd53578af295054b8b548f3c0bde16aa9d526f150304ab29eaa073787d84739e94d178bc6ab96855c5d249aab5ef86d3245bfb44592141b06d4dca1d985fce6cd8ab3ceb2a007f7aded8de2e50178085048d67d25a0fd731735924b1d111a9dee14b6281ce87b119cb6c7088fed880c13316f31002792cd50ee15a7bb3d2c1ce556eff95c9918a0e1fd6b98d311cb32abbd42f0b919dbeaeb5646a2cb10f4e7f7ae2d8a19f3ee46b3b79ec6052dc281ac92393b044831e54fe9258ea497f31fc9738a08a8e2e0a2db00441beb449dc50d2e6674e7837bf09975b6a5ae7923f92261541a3478671747853d8acf99368fcb2d6ae1f52c62783b400475d46e1481abc357cbe51a59516e6b48762504c19bd4c16fc994bbecfc6039c4b86272764995388b1cecce0beb62cae41d8c983123efb77f274b5d8c2cc06317b57510bcb9a6d4f33c7e0ad863e2b4c5db5321de42d755a9f238a373507014d8a51beabf77ca862f2613b01c50fad946fd3ea7ec29c37c161e79f91e1fae98aceb60cb8b09867dd42b2381e1ada54203bed719f1fb491315402fc69f9817497add704c430e12a862f2a9ae3247c862cda0ff4252ab98f060bc17b55f79a3f8400dd8c9f02a6b5948ac863dad43deba3889895c32c59f2bb2e02b60abdff85da0dcffecdf9323f599ca97f051abf38534a4a0f7ec95937e333d3a3fe47d51aae15bb12e1f9debbe5c88dba724c12b4222d686aeb343efaaed4a7d3708239868c417d316f79598707846bf03a530f2229bfdc74f0cbabe54002b89dbe6096485356294bedcf1b9945822892632e5d1245c344e71abac996adb19afe2d48521d76302bffee61b36c17fd0ae04db9ec5a38feca1c4b9d4431d207c2d07e92469ec71803d872aa7610ea7c0712a5246081cfa1156d996ad3187a8dc1f6921aef082b63ed84c3e7ff50be2bb3284664fb2e3c98b139b1ea177a64632e20d23334a694d932aed59b7789952ef47d23b0e5b5b396541a25d7f7ed39dd9be76f886e24972097e8a498a02bda29dc95d54c2888bebee311f30f402301ffb66cd703471bfe0f384ba0a02b89b2783e4844fd64cb12f678fd4d472ab1724841e398d092bf7db451997a57aa7740d916df46ca9bcfed35d12e0d0186eab5171feab446ade21d2008af5b5e3d2694a0eccbf7f6c5ffe8a70c5372a394411a1d87cb22f41a531ee7969b92defe56d23f74f53ea866de02f918a3ba32f59f4831d75728b3f2a05ee43358fe0a69dd120ca880bfbdb60e426c18fef3d781c7614f439bdfab4ef03012c9ecc075223fd0cb969ec29584b30421bdd8053311eadd57916385d30a2de4bc9a3f537e081cd85889e2abafa0ab54758d0e41059ddc3fbd7a9b8c06a95fce19f3224defc5be29672804b45301b49c89f4936c14d539d93b12d6977bde1c30de99d011e9fae12a182c693a28bc7b1abd91c2bd4343482d74580c9253059577722bb7e14b7c6fa880c60594ed86ce0e7e2a628d21246b8a703a9313ada41020fbd4f3c0e8c89f1e641c991bbcfb9b8f9d04dbece6bf011bfe75e67e8a094f85a19272837b73b284afadb0f321eb81b6afcc42e8db1efd3e484a30363035e505fd430df00baf41fb16701e02cdac6dc7873abda40584073819be33c6a3b1cba867b0de5fc3ae9eb97231ccc68b92fc4dd4f695a139e0a762dd9498f9526af2690d43154a6abc0c3fc9cf653508006eae4a55f7edefacb6a23a0c054fd66263b2f481413706b10a8d5ebf4f576a307408b4fc29f4002c5e0dc2ab67a001803629e651a57e6fbab7c855781f310989710177bf1333c76bf1bfdcf177412cc0c42d8c33f4abc4c40cae3cc3f6a019eb8ec9b83916707b3b806dadd068b8e6e7802a62a8a4a9254f4d0267817bfb37b33d47e3a1ee429bb9aa7f67b936c4c3c098d14eb443f36c3ba52aaeda5aae4190da14bc5819f6a696a1bd3c4ef685f75251cf94b82cc6a6c313db0780162670569c951a53e52df9ddc627ac1245960b333f368a9aa8eebf09d5044fe37e6acab56bccacd900972c4dd65869f5d399ca3b6f1233bd913fe7447363a36b34e76ef7047e19d17ff6bf01fff289802d381902713611ccbac9c40ea2e6fa7c065d7ef08961566777795469cd1de99e5af278cb258c8758fc1187d31f59ca28668591c3453cf9165010ee199c9a58d8be70c02fde14132ab6d31129da4e514f18255a2f33484dcd34eded578aa7aba19a7553ba3df1e474e5bd4ec414b0f96811cd1401d3073d543c1f293135e9a34303746b73a9ab963a286171d3a665a95351f16f31e885b0480268ed4d0ef6f727d07e28ebae6ebe9160498fefc3eb6ba23be9a36f3a1a278cad2a29a4dcd0bf1feb3db6b195f1040291e79110c9e8472b12d65b39db42b2f820e281a2a78dbd3e1b589d81fc15018409221cad4cf3892ece8ef15dc5e966e94b9155f029c47024584fbd7f05872cc51c07ba9975bfbb500ea1e80ee831052d7dfd0899ef5c9d5a345e86388479e5acebeb1f9a56412cd5d10910699dae2787841d99b87e1e5c854f820e54978c75df37643c6b2bae3f62d5c1f3c10b20bd00042e9a970c965035cd55d85236493574b61f0023b4ea8242880728af74ccd162ee93ae758d3e203898b89e0a5265cb9c46ef12b8cdbd2247aea8efd225320b9ed87e23eaffebe471f86231b4d5558bf696286af12e953c208ce12a615ae2f44a51f55c2bdf8b8bac5f34bf5d158deaa6c8054ab5c59e9834ada4f3207c557d515cb5c0539917905fc75154e27475f0d28f46a3c37b692ab8acd2af7441ffa5ecf727a6770f92a60447ac30fb9ab4d1763274a579396493b43e77b057e98a378f032d9740d480aa0114b167ca48b5b31262695fbfc9965bae2627bb9038713f0b32b6170bb11c235c5061048f3b90f51afcb79ce9c09f9167c241040c8db4c100faecfca7a843f654f5fa05990c9c839487006e561d275ef65c8e1ae9567a1f4ec3572eb48f15af9416eccc3ed633b4974c4ef4754d3e894bd6efb9ea8c706a4a5973ddd61b1ba17c59d80b8caf2d4533cf7544973eccbb66f0a81fdec61e46f2d7216c38a3b8902caf64b65ac14b3b7c79854a14313659499b0b60cca5b06ef166225a98bd79f86eb63176250fbc9cf75093dc33be1c07ae1e09b4980f4278826cf3cfb416dc432c86396e37ea144ea833bd2318007efdee8f8a6f54fd70173c0b8e03c0ad14fa4ef7bc9810db77193a71d5702a87cae2045eec5b920d88305c1f337ea99999ca9b233981b8f6de8220bce000ea2b36f7c0df699ca9eeae532a299afe3e45cceee6e424445bbbc308aafb005becb9ab7fd07775eac99b4be5cff35c5683c355b3e4640333e590a6ae6e8de4817b5ed51469534b7922dcbd61789ffac9a3a88ee595cc34355aaddef7c39d97c0ed61774870977ae2b33a715768ac0d1bda8e34c1f42e2ce8d8ae8f939a381fc1ba6a9709d5a472617e49e5faaff72fa8778a4a00826014c7cb9d902a5fbece68a24e1cc132cee91021a9c1f05be688d2fb0cc6a0e7fe2d0fe1579d6a99dfb87b14d13aa10429fda1ee4de1ff748a0df06bb65d323ae1c11388ca0c848aad68ce89cdbce3edd83faf67dde8aed8005f4f969662aeed59a13176bb9c6983271250eb8d1520c3328bf04c2a197c76a266f2f30c69a65ce7c1adc728d6af98e62e9d4b76dd0c48399a7f83c00b0af7cf4342d201e18f72a52cb1140b6c28d820d89c5dd297cee291bf5dde4bd398a86f6777969640c5c3850d7727e66111a1a442a4f539af3cdbea80bf51947b83e524484d4f1de667e4dd4ed2cc50debfb34e683592076f515086cc350dd5cec002a31bf41cd58513be49f745a26cee6f9886aa36d2faf6f02ad23cc02556093d5173f8bf5bb90f436f794f2ab89c9d6f3724b06e00c0ce46e503b372b8be14b428fbca8dee6ed9f3f003914b45f9f6278988a4e8a951cc3d63fd46a8d76f4eb8947b87be539e681e958777e0c2b6c6f3a635972c13203e28c2c736ac18c5f7942ca515a48eccf00ea45867cbac90c0ea250962b489b1f8b165a43d1e2374c977fb36766c5c850d8c3cab5ba846bc2ea45a1a5cf60221dc2145dfba6da74a956ddfe46699ebe26210b968bab4e6978f1f406ee99a5516a36ee2f4b750e5d95050a522b0ae242a6b028656a43d814e30745536706a678a15f256d0ef20f155513c85f5a4c7e2748ea0fee9022f8075005d0bde2047438286a22e8dacdb3f3b721206fadbff966e02be833477fdc236b9f73caae302c4b4596d5fba43d5ac738aaf73133e8f941aa9be32549dd9b8cdd1256aeb0ebadba2d2fd2132c39adfaecfd1e3afa30752fc706f5a0b8774c1b49a5c8cdb58d3bd03391551bea4693bf0d9e157dba37bd4b7c2149baa4d45da028bdd5903671960f07336fea520ea181e6460cc7d4e1e7294e21c0b5b0a82f4c1d1a0b9fcf49c50283a824fba8b453fb8002ce66b574fc8dc325dedce3caa559aa17e94b28d444d25a4942dc36de4727269fa3f49264b064577f5fc7a28d3fae78fe9ee0444e01aea7ff8d84b805e1e3ffd8aad02d63be2ca7837d19a33e0e50dcb34974f10edcba9335911bb5eb4bbb4d94576dc55864720795473b9ab92aa7d728dd8936a4b5bde3b2e541825e3da130dcd21baccbeaa6049d7025511f6d698010ec9521964ca71c15c65150667a61de8ff1b8a5b7fd8f7593472f1f2690601a608c057d4c68da969e4f2906f4856b0e572e3acd75ee06d17a3fb182e96b84d5fa25814713a2742bd90bea980795e27ddb10e61ff8d38dfc5e9ad370e6697b84fb590461925ea1e83d76cf99c0a454ec6774fce6830d00e94e3fd95fc2994cdc1a5e5d74143219d886f28daeecec414d5522d80d0a5329f75dbc02d836b2f458c325ef698e71eba6da7ce0cd0b7dbef2eaf27d7e66aea62f152585b60e4c2ee2adccb036868a6494f35f0ec5c7a6c5d0aaf62b22ad2c96779737599d62122c18453ba1d90a4fcbfec6ed976fee115307265d2c51f66d133e380f47703663da3734ce099cc932dea72bd4e4b7497e0af5ce552a7ae5342eebf50af4ce91fdd500af7a183cec44ce241b1e0288e9c99b96186e1b7081d381044b7013ffc76a6ffd363f98262e29a9bad194afdf72bcde5992ca213ad5679bdf3293e8725d99383ea09bf8f86bef9a8e8249893d3f25340b44b23511ceb72b53be034b5770af48511b541bc85364c85419cf85568d9e54b6d23dd8852459a830bbb1e36ba204a67d6ee3bb24a246bcdb88627e46065dda881c937ed69e0c739707f76960efc7de97a06063cd1bdce0305d5f6959540ace190faa52fcf38e75fe9976a1c1d0c61d72a05841b24780def75111aa21db0cc4a009cc08638801df3315d34abcc3e1ff2533bbc24cf1a27a36549c6a096e5f6d6362741c4e33398dd97e725ee46c1311b2e3dac3d7bb4efea235e5ab5fa3e5e0522c36c9bc5807b8aae72498d70de42eae63d19bc13ccd317b51498c4b8e5e6eeb91ea37e5dd741a04cf36f6880f4d1153f9a4ef2230273df41a2cd36be8c55fa029c967c93eb3","title":"142. 环形链表 II","link":"https://leetcode-cn.com/problems/linked-list-cycle-ii/","question_id":142,"issue_number":14},"12":{"day":12,"pres":null,"tags":["哈希表","链表"],"whys":null,"difficulty":"- 困难","description":"```\n运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。\n实现 LRUCache 类:\n\nLRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存\nint get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。\nvoid put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。\n\n\n进阶:你是否可以在 O(1) 时间复杂度内完成这两种操作?\n\n\n\n示例:\n\n输入\n\n[\"LRUCache\", \"put\", \"put\", \"get\", \"put\", \"get\", \"put\", \"get\", \"get\", \"get\"]\n[[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]\n输出\n[null, null, null, 1, null, -1, null, -1, 3, 4]\n解释\n\nLRUCache lRUCache = new LRUCache(2);\nlRUCache.put(1, 1); // 缓存是 {1=1}\nlRUCache.put(2, 2); // 缓存是 {1=1, 2=2}\nlRUCache.get(1); // 返回 1\nlRUCache.put(3, 3); // 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}\nlRUCache.get(2); // 返回 -1 (未找到)\nlRUCache.put(4, 4); // 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3}\nlRUCache.get(1); // 返回 -1 (未找到)\nlRUCache.get(3); // 返回 3\nlRUCache.get(4); // 返回 4\n```","content":"0961e884611df7d4ac47a79a9e3b6f2d71813d84684ff03508524a256a2400100afd8c74ea6410d1ec9878a833a0e65ebe221bc49a2e129cbe22b42dbfe7b231e23168699ed9d2bc0531d7e88a9c5e7732ab17ecd7e24c18f45ea20339c9c6c019a73ce1e46d77a6e8f96d32ea583b63f6178c435109b080f71d6c0ea92f70ca3b1347566d003368f148ee30889908f7277366ea664644429948aeac6622f1025c76153667dcd52d7f4223a3ab1a5c4146f2e293222e7a099c57b16038b133998f19d2f34658c544eb906915815c3f73851bc253702e849c095bbec900197091a8adcf3d97d872efb50d458a85a9ddf94d575dadf5da2202382997083e123da4d178889e959770854663560ec76d5b5fe1da831ff11ba44a9cd32aa82e4ecdf71619acf142c38ec848996afba910aca607c4292f9fc74dcc9852eaf17a8a48961365a494340c52538fad66d2cadb748ed1c1dbe0a0e09e48dd60cbd6423617d6f9adfd23fc801d856c17fbaffc9f5550b2c5d514af423e31225cb96b99a4863a79951d89cd3283d01419dc2e50ef090d88f751f1fc0d10f3972e6cd3f7f19ab55b6dc79295f7e73088842366285f7ab31a03093e25b07b8dabf3ef318b9b27646881606e284e992e1eb3790b5c3731045f9078d0d3dc9d83be6880f44eaea85d8c3ad4feca044941e6b38d221c4243be0a1652c37bbb3cfd9e0396d3164f825e46a0d4abad41fe69d307875f7588d47c63b8bb90fc6d03c13c4eceb925333903e0b0dec5979697c1616209958abfae011a7372580fe76da6f16f250e47d5775d47485fc7b19e83c93913191d4bc126785ef469de4c29892cccc44f578206d7875ab21b662624295d362f78f13076b0d7391132285b767855e6e016e2ccb0e5958b8843a3ab72afaff645432afc1882e7a60b2e78b75acd33be32c0dd5ad7e2a40ce12e75d76e0b15e6d2fab060687962ff1c72a36a9ef3dfd530d550b3b832e6de6ae112467a8856afca5571d3239eb0dd4e213536e9071aeb9d707d83c63acc9d4b906f7e590ed698791b6763320d1b8a87c94dcb7b68377cc9c55aecd2669a51143da6df3396688e32d39e4980261288fea0e925952676c6cac59f3c4eb5643faf790f444f866e9a668124dd0e9f4811e8f68246093182b9f3d01e4e4b1c6c2030020a0adedbe135343ea4a8f610b7262c554007af897bf02b6ed712d745fdc280c3efe2dcef7fea1d88e6afef66839d84ba4a69a4de1de83a876cb0057eb160f5f82d9fbd9a49ef569ffeae08724fffeb92ce1c6608a4c5ddb0d0c0b2afc9ac0fe17b8c9d6eea455602ebd615cbc1c3208c035adfc2c2939c118f3118a145c7121cb82ac7cd1a6075b389c7c5aadd86bbf2eda54b10ba958615ad2659e84d1854f88564a59fd5622985f1555ccf654d957f5577a782cc726eb4a65552d6f1657654088bbe2d71ae40af12ae3bf73bf4ecd8c700ddf92a53c10bc27502e9999071859777d3bb2a7effd16974d69ff6bd204e7e24762621c65cc2edddb16341fb22f6d2a1050fca0fabce1f4054f3439cb684e66e919cca49d1b9350c49ca01247121f03b58c3caa2ae6f3ad022ecf72190b3974c5262943b6276c04c0e56b02fa6dfe2c9cc21517f16c3594c48d0f1d64a934af478673333dcd23ffcd658ef97cbafce8d930678b23079566b3a4e7b9d88e94723a0aff1dff55b483df17871eef97c72801195e99f821a1bc57ba5d977821e37b91aa4a781e168ac58d71f2373e68e77e9f50e604871740bf0a130b1cf10d889b7900a442d10afe3e904eb515630de8262028c884202ec39337deeec32e8cea589d608d2c5d8190c2e7e3014b2eabb27c6ac2e9f2d9ac783c84c3217e1d4a3f382472e6de1c3bb703923a426f060bf46638983d2874e32168d1b1d2de30eeb34de04ae6093ae612a53082f4fdac0032da1fac766dc92ae33d1e72e3c974fcd75799c626a8041b6c7f067d118f021c1c78b9dfa59e73de30ef0568de3424bf11e34024d98812d52cd7e8b0ba076ed89c3767c6bf1f839a6472b06a5747448ea102fccef52d4b47aeb6460eace417674342ed273b4a6029b5fc47da239efd8fe64a881466b4431084086c1863f55266fb3662b693da1994816c5529db1cfa74567716fe66c0bfce3c711c5988d7ac7e3484931f778eb41d6691073c70c5795426f5ec9b26b64c34fd29b44d71f0f0d6445d0c79734a247e34713e5f8e33896dc85bca83a7b3d6c9b07140f0cf95c15ab23fa2bffbc9e892e494a928e904f458cf7a00a9a99c47611c14514bb21242a5069b469e9803d4967e6781f8f0618b0d5b95408177c3b5dafe141bed63c59d4b09bc858d671df0e79496616a86ce0b824e65804748b6eb27bb8e61d07de3df41e87659194048ea145cfb6ac2ed6e411557b19f2a1056059abacea45d520cf999cee53f7d3264f80eb0e7f6c4ffd02ac644d86d83b134bda125a0bc1ac17beee5073906a119df8bbc466522fc31cfaa22a750eedcb9f2518e0d45283aa56cf5b4d756ccdb968c4029fb604319bdb36c16a2700f79bbf0fc29f5fc380bd9360f45556589b94c372b6a291aaddf2af1a0ed0853753b44d407ae536cb09f62b4a99577e922a83f03a7d473f608e6e6c5106a2953e347ff5693875ff540fb1a542860ab9a3081c9fb79a4bd8c869b240b1b8edbda2c2e0a71ba7b6c5b50f08f70a390b53781e9b7f1f76194a34a7e1462f16006efa5688dde852c38443bdb2ce3f5d20ca7929b5daf270761da9206e898dce5a74823024fe136a95361f083a26441bf291fda725e0393a8ec4a87c5420446179408646cebe5d1fd5163f49d860cb8d610f7004025c0887cfc85c0a99c0ab3335bb0e992a87ee7aeaf9c19e0a4c5a227bdd3e22ac00a919de418321da658de8b9e7cd3c15733e4f8b248a427def531eade0ce9e21c65002ca598fb7a40ac217c9dd644c5368e1f7bb0d43ef563e932ba5fdeba88bf73c3e4b070c6984bdaad3f3386ad244910177a4a9bbad5d3e92bef0f55a4713495316a32f862ec952c91e45d2eaa7551e440e2b1145b42b04fff3f894622fe41a8df259ea35c37b860742f04c70ae65acce520670af427a02079984da2df63bab5823d641e878fa2159e82f67d7073276410d431d0c3408c11a7bf1020b6369dd7acf738cfd814b8af6d22f5ae85f29171ec2340ad45541d2b19ba629ee53e5f0139333f0c438208a65719d1f276699ee2b22993fcc284bd0dcb2f8d2aa2b9c93d9f58522fe71058eb8fac68f5ad25918766a7628bb920742876e764fd9cb4ba040512d970761b39ee6addb198d55b5051abdc302e701556d589f685f097e0788c19e60c191c6a8e3e3e681af05863b0b816951adc99866a4ae59cc7256568798d995b0f01052a15d01bd0b293a3257c64a9ef26e164f04d30e79e0eed5ef2000a2952803bd10c8edbc0b52444a2f839738f2c02c7dad263f88b52d8b64a65cfbde1b04acd7f8a814837832aa584021002acdb04ee369e79f3960afdbf6ed8793ab6d8fa4bceba5fce8a2e296460886585722be4c3158fbc04e90a39595fb1538a2bc0e11dd3900ce5b35e5ac5e6aa7597fdbeef3f3b901213cf2c56495061601cd9e22f62b9ceb4452a1d396f3e5c78981f3b3b32cf792fc81defd2f3d01453cda1f7cf46aa997f32a8fd6dce71210b825fbca28f3bac1c8d77688a3f26119184531190e92d66ee1389eb701061cd570026ff45da104e0f35f95e1092488fee3599fc1279496fe3b0ba5af63f888bc9f47f11387b05bf9ca8157c4ed450b3e13300d02492ce44cca218eb0bafe25e57d890aa8f4eaa1c1044607f3822800c1a2c2b65be405ccf43591eede5741803a0414047f116878228263c1d1ea7797ab7771ad9133300c291e504c5f814c89de9f67818c3f10397f2a11467d5efbd78bc800af9ad4baf60070eed93a6f1024b37bd62daeb1218f23c6917695ff4401b3ef494f3252e875dd0262ae1945baddece694424d4fa57d81ded4ad3f34ae00ef2cdcc847d774100b2fbaf80db3ca6ab7f6304d6bb7702dc5b018f05b10482fc649f8a9cb45eda0205f4d74af6bae2cc77d9dbee4782b6245d6940e04982ab4595c0c446809191516646b1426522a7011ece7616c6bedfa571e958bbe0967e9285ea8e02fd1036bee76b3843a2b386b443726b4ed91c909cac271a0139e79edf56d9a9d5362c2aefb11286e11667b5a5beaecb38abb099fbeed11c6ccd282e3822267315962d023fa0826e115fa810ce896754f0155b218934307eb86ab8f8679cf8c4f097d296bcc4378d8b316aee08b263666ff66826c8230d44ba63617f2c040b8ab700776943dee2623e3a590b991ff1216dc4f15611c7a465f384ad6d584029c1ced6c44688f5ea6b5263804fdbd0bd2d99e0fd6b7e8ac8af5a3f7a4d868082f5818c3a90a00bb5fc68d2929b95a0f8fef70365f46383b3581fa3025011b683f651d4435adf3acbf0ec08f86fd1a68c9df78bb1d3d8a83ae875cea3d3d75a05138d70c2e22686a779028d341b4658150fd40d330005a631164768bb0ef1e8fabbdc469b0eacf372f2931c36dc94995eeeefe0008ebe3f9d09178047db33f5b7be11295715836a4b1b493eb6233ddd23be799b0068c4e14010587e2ddbee5034fc41c53c60969aacb2b5c94da079b1263aa0606b4d0c5307393380c629d6f8d587eddba4e5ef1ec76a5674211e3f14e491ff3b17d5c5eefa771e114253e57f41779b96da7408607ec595cb63de9e76a3ff7507eeb9264e005bf851d8d2c63cd8a0d587398112b04ec43108deea5bdde2cce8a03da39e04be10716ee3f531d6f0dfa348dfa81ca0c09119ef12e5135e90cde2cce392a32fbaaed4d4da6eda92d4aebf3a1a7ed64098a5f1365e81c48106c2413d864349a3bedef4d2dc4cddeffd9d7b198c35cb4f3ebb8fab521338f4f5b04ba20061b7813e4c02d02a91554ddfaa64c125dcdb2f7659ca5654dbac45ca5e3b683dce8f9dec2d46b5fef4646a7961bb1bd463d34e1d6e6e77d59e0f9b5f526f78df71ea8764a46158c1a8c25dd8676f22271b97a677bbd366d05c7f5eda110ddfdf8fef5e6c18e279b8237db5fcecac9c474075001c0d5b6fdfa7bb1eaf63e1a895b588c772afeab759de88fd5b1db9186e4a22b2056b072f15ae7e07cfb604cbf274d1260370cbc9631540c028cf9b80d206528d8e94266bad25991cdd34b1dbf3580709cf80b0762903693c3e5708d443c8160c6361182b7602d446f6a2434ef948b20e909142300d09f827645cce91aae4e52512d3c8753067f5df4e1a7bddddaa236498759f29c5136c6c0e4278e7502062462ab541a74e5f99c7b887c81f139ab9536277af539366e8710f8dc1a7b3acc345ad4df3245a86141f4eece2b61039688e0a2889e5c2bb2a71ad6cb3689b14278358629bc4f55a5154c83385d89f526258a0b027b913af7dd98a817942928096bd81384fabd30ccb0903f9cf6bab46516ec1ad1d8d042333a005b6845c198dff2d652e64407f6a58eca75f7acc0d36830ff13f9110686b5b71f5d996f570016b55acc1f6a388ca4a40418c959796f6f08958e929f650dd0af2bb2d92d17fd27553793990d89bd0d6d4f4538fb1c63b83246843db1ba49ea5ebabf3ff3f9cddcaebdcdf38b86d918dd6a1cb6a530e592a5279c9fb3f475807e1617021b0dfd2e63d8399f6d0decfbda5549246febb2f2fcd3459c50280fe682caa08787e50a0ce4d84306886c1929908ad31af093b77902fc4a6115f39e856fc013a650d3707ad5c66a337b1385d4270e0c1d46a6b32327791add26b6eae76a5cc14c1f7b16b750d3a4e4393ecf90de9fda2541492eab738b156b874d1656d0eb48715d1ce283b2efc0c516679ebe7ab81e7c914606c1444f73a40d107d05fa9edd633b0f0134670a420e299697c986281bb51b493090c2cd22740681024700e93930655a2bda22d3513a599125fdd4ce0e9ef5cded2ad050b84f7824c6487bd95dedda0f3d7b1ed7c0a308c30fe19f33a4ac64b6351fee831094725d162539fbfce6af4cdd6084499f72c0bca4dc4ba1b257b2e603f64ef0a4392b15f3dbc7a10a4ad7329a61486de75fcf5fac5fdee4f89d657c514c07f960cb6b18eb43c6965d851c940bc4ec3e89b7d7ae2289edfd60bcc138a8021a84273c4da67ea251e5f2e109690e0276b0dc7047c669aa7a045ea5ef320a27bebce493b1dbe2762f03728ce26bbed7e180c437e3af47269957c42ddc5df868d070de22c32e7081f8ebfda8ae8a56b3cc1393a0200a8e1384e529dc219e46292d4987618b5ae2cdda75beaf23f1e6860d46420d66678cdaff1a366c6e15be24d194179652c1e5b2f13fbaa89cba60dcb9ee0144267b2104c79654f39a12edeaced6eb318e7cd7717f361289124b8fe7620088d50c577b607f5ee55d6585a07fb2269239450d099527bd9f75845002cb20426c3cdf9435f19253ff1c6a5a2100d48d5a2b05b0c39a26c21d795f1a8b6ed0dac43c4c535e8369c726e747c6e7b8d93fd0bdec2b7be32db85be87b74dac8ed76440538dfc5425aceefc0f23bf08fa6d115c5b786789172f0fe04c1c7d4e3e1efd40070b8034073e3a9ff3c428bebe161e46f20761cbd8475cc5a9eed6165f80fb6ab9ece08ed451a2ade97a8b218cb0506b23c3060fdde85d1d2e56b17381b83ccd9353e17e72ffbcd5082afdf0c9ade0dc832c73fe91962ab3ac921c7aa73f44beae8688131f31589d6969baaf70edf7873acca950f1ed04ba8ac208fc85ee31f9fac160412bf7da8375edf94b92dcdca2ac1f43a8dd686f3a9fa76d95f866db35c43875300e1f23f3d07f9cd9bd6b2a435e3d4f3a0e35ddb8867421f6fbbbc308afbf84cedc5cfe4b811415ab888bfbe0faa69a37316355b3e4640333156572da7b88e0159f2be51659a67a8b93b828d5995f7a6c31095ee1119820759aacfe6663ed7294fcd1a7882425db32b68fa3f768ac086f5e1af094b02eddcd09abdb569faa7ec16aea06dc63e02711780d10ae8b33796ce36bca9031d48022884da09b7fdecf69e3cf6e65d79a2dd0b309c1f05be688d66f6982a016dbfc0a51671d789dcb3d6b11e46a8191c9fe57bb19c53b224e9914dfe21bf6afd487f778ea49352ff87c0a2ddc6cf7cdfcf88a27390cfb5d41edead212f79e091cf5e5a32d18384763a2718a585093b337cf74d91afd392276b365b718fd64f9c394e8920c36ab78f66ec9c93298589cec0d3b9754cbeff2eec482d3d1e4cbf6301c55515fb8f9dac48c0c7b67a28ee345bdfa4a8f26e83f9e40e1f3c28405431508c587e66111a1a442a23488cf3f6a3a24ea1015ab9301a1789d5c3ca3c1708d4f031d80dbfb37db58d1a6126b4561670d336985ce45023499540d0580208f98d30152ba188b6cc2fab2360eb2a0bad78e602556093d5173fdbefa6d4ac38f792e5f3c9c2cbff3d611be04243a02b5e757273dfcb4b428fbca8dee6ed823c0b2b1ae71a947a399fd64599cd55d8b270902f8326a6aedf6db87be539e681e9051331486e623f68260f72dc324db7c060593884d80a2b0cca014055b3a00ea400de28bad40c40f71cda5c629b1f8b165a43d1b02f32c22dfd67288a8c15a0869ee0e89741a6bf09edbe9a216659b6061fe3cdde3ca733b3cb163d8ddb68320bf5c4ef0b731194fa15fac9b43e0131a2731872466789471b532f08f530c9f16c6b2442c506c94300072245f21bf852266c43af041c4b4bc80a1f457f7c0cac46bdc44cb743150c98f5bd401621297b1aa78388e796f3640a6fadbff966b367a72a0826996b7a9e629cb32d645a4c9bacf5e068178a61c2b22877dff92fe5d5a60f63ddcfc4944158eae5f1a8aa092f93116324bca2f9b3473af23e623ee348b0f8ec304c3149a5c8cdf2c86fd878d40c54ab4eedbf109e533ce963b34c7f7915ffafc805bd4cbd81d87f229847466027a7130de4ceea6c11c787ada87e406f85ede4826c0353495f9f8106814783b56de9e0bb41a69c438033f866e0b9df7aada1c9caa559aa17e94b28d444d25a1d0acd65cd382023888391fa21f1205f2b178ef18340fc3db3d1b643720baba9ddc3cbfc40e8ead5d8e3962d2df178a7db6733a36c4b0489e10774bf4198ffcf268402b2e061d502da1247c558642f2d95473bc9f565f0d770919236e5aabde3b2e541825e3da167949b57bb8eedbf198470295d353573aa10ec952196118d1c15c6510d1f1c2e898fece8a3afba933e840e771d4ddc355f698c5e574c68da969e17291bbd9b6548593337e73ca006853276e28cf36f83c8e52ad11d5fb60901994baab22df6e976db73a954b2c9ce901e91d66ab67c09a1e15e0303dd4fb4ac7666cfcdd1af458f7d78e2f1ce3219f55415df55c09908db1b5a193c5a2d3395c9a4c8c2eceb15775566c94545002dfd4bf811f27ef7b51cd80fef698e7187efca67c0d11b38f0b7e8f62e3766e7ee2e036a89ec772e63a3fdb7ac3b96bb0b94fb194f9693a6c3d6aab06a3fb665cd37842e41c127491b18137aed8c4f65cbad8aa2c06ff311004b690a7507f17b451562610304790b9f7670c61b95d335d0c579d7e8ab4b367af4cf487639b43e2ebaa83bdece91fdd500af7a455faa44c67757515588b198c895596665798188ab044b7013f0c86a06bb3676cc673c7abcba82d1b09a78bd9c7db8ca213ad5679bdf3293e8720a983772edcfb8e274aeb2c7d032dc37327e690b44b23511ceb72b53be034b5770af48511b541b94102bf612049b9e5fc28a18ebd43d80986c73ee65f7fdef6bf041eb3238a6bb70ea03face9a7f325b4854df9e46b46098db54278c2df76960efc7de97a060208255d29e3013102d1c5417ce4d47e301a0f28f6de18e02b3c4d39f560ae50e6bb24780def70c3baa21db0c998a09cc08279f08ce32029d1e9affde9d7658b5a041f0b22b5211d2ea8388dc89bc8dee9a8b9b9f4b67ce7854ce46d78a36e3c08b5a70da4843ee606581202b34d1d39a4f59be85131921910814ad4604846ed15d76aa0486efc08568de3da9f8345356fb1e9a5e1f67ec32dc850f8a98c930137be7b4d7d149b8e949ed2759e5a446c176cf3599b82e58192e741c7f2809e9e22616ebd714837bebe529e16b554412454eab07916fdcf9ae3d151557bfbf9703b129cbdfaa97cd388e85ff35b5bb5377359b7441656861367e80541aadd489e5e8acb8a7d1fcd9e37b0b55cb7ac47afa710101caab73281fc89a70100d7fec972664b7ba22f1c614b031c7aa01e89d6a1f9eb130e01a98b57b1f1e04f9d23f0f540e7e30d97fab6d4ab464e78ae063c41b036ec32976e84ef97f64815590c4a6dab9f7b0328b779dfa65d10893c22ce6001fb0a61cff4528c107efd13df5aa44211a0e2acafc47a8012d4fc5382c1c6b76445fb482efa213e9e915b74a18a9fb9db6ab608f39867a332866298bdc3636c6582ec7030937dcfc62c4580eadce6e3d5855127c762758c628762a9d64103f059f4b0e372942077d4da4f8fa42d015e0f7c07aa871c57011db7682c03ba5a0d05d58b24b9ef7971a732d0fb29958ae559803948e14544a6fb1a4093f2e639a831731ad6cdc0beb5fdd503da3db3ebb0eee60a0de98a026217793c2e84128a77f54453950c5f051b3c96aeef5c3bced7a612d5248e2fed5e496a5cd51b7ec06ad9c02578f08ef69897aebf7016b2e3e2916b86ca98e9fb651afe3935a952eaf54dce0af736da537a404d88087cb56bbb192e9f44caa6721e37509019faecc701e00b37167ff90ad929cc8986d27de5c9b99ac752812d6931ec8baf4416045ae8b5ce6b55637abfd11f5c23d06972117cabfca15df591a983a6fd0d1d8975e6df5180a7d7e8e71b798f9eaaf96a8da8ee29688963e85c2ded6dca145ae889f6a414e3f8e2d20fac85615db4d2f25a4f68dd8040eafb864a5e4acb8d4681af9319361cecc763a3def54c5fbc07cf414ad1cda737d712726e00f145b5bb8a1de9914f331c350e41b057e080fa48bf658d9d4b95fd9abb4c8ec3cc7b3423fd5da010827ba2d7a9bdd0f18ae26837ef5a477f1aa1348c952e5e1ac9aad3ecbb53978e4ac49e3c1223c20d536fa7ac9f8cddadfb0743adc074c63c390e74dd22cc98531866a945c42cef6c6d0370a17f9387db294614cd7fe57599fb9f8d46d24fd2ba3eedc2756e216cecf2999dfac22c21a8ba22150d638b1bc425e5ce9c077d02452f69574fd551690ac0446aa9fe5b39a54fde00a04fc23ddd5f530b09e6eb4ba31a9a95faa8ff5ef8add0f5247e50bfd2bb273bb3b8ac3663b0a793c1134b58eed1968b4762d440114069163705ec6917db395db93aa041f699d1df6e00e0261e887d3587db99b004f5a68e9cc71fa3150f4f5f6e770e3c9430419beb0c1c8ea38504bb011f25434102d563e80056d81beaa0216350d66ed33d46a46d4b2ffdbd019e15ff84181ead7c65b48bf0976daf67bda17132e5efdd31e226583f871a99a1ad786517b5f363fb2b33bf850182a5c81aa73e906bd7ee42f33ae0f779b68c154affabda9659f41ffdd511e5164cc70d8a07de83729350bea01e9de533a310478ccbac3a36f05255338d22218ab3f74e51ca2596b06a1c6a5a452c68a3395d890163cbd31177b1fba9877bfc4cac4f3c5b3daa4176df597a42788f4f969091d1de622638fa0de0968678e9ca5747669e7f204f8486ceaa3aba2dcfb9062701b2f5a14dfb826b23810cccc071836b3736fa792ef76951be442ef2cc77468a3c2042750f1cac2ee2282e5dd11b474e03f1279c59aad917cb2a485a241be9e0fe5455bed6b23bb23d28db800a8d05dd004548db865d82703206b426612558ede6f14084a18ab96b5ead1ab94d9cd4467d14d5cdd0c4cf46cfb9b45331b1b3f8f55713ebad93758a66f6731957f8fd2f5308bd99ad20032cd6092122d0d1c86164435119fa682d2f4dd140dd7bef669e455f88210fb6670d78858c0684d0a2d9f6e10a971c92193beab0fcb2d22422510161d31e3ba21ea70f87a13cd0e34e000f16c729b5dbe1025e76b8e45d3d1d642dcf8f12abd16f1f230fd51c5beda98a3b57c7a8c8b4a7a4b24a5b4465fb3ff09aced3b550142792f351592183bc582e4cb4b62a3820e60c84f6916254e74654200212aaf84d8cceb651705abb1113133fceddf2bca4bd265f293c8aaaaa5b27fd18980bd9aa329ba5f21a5668c3ff5aa8828f772fd943840686728f80beaeebed1bd906935811626a6c1c5cff87b78c71aaa314bcdb2f051cee81363dd97e1a644c9387d541e2bc7d13e2fe8e094548f3edcffc10112c762a46827aff51c8920a45dd3b220aadf67566ff8e2565cac68493905a4eb787a67e4d794943fd18c38b041488a7a8a5b8fe755b4336f4aa043da6a74bf2a1c176db7115c0fa829872864b63c2dc992cb66af3ece030754193332fffbcc5fe8615405bc5ca05e228c20058c35ed55d191f1d877bf23845d126e1f2c6f6ca5aa009d5e212f0b907a0a8c34de65f2fd041f799dbde59b30d9fa8d855b4013baeb2cca7ebd8d5d5f0a1cc09c6500aabf73aba6fd42a60b00cc19aa8df5488a7bb2fd7073ffd0f68a998ac3563f49723abb3911d991a47435d8552ff0b1f95ea05751e89217a015a91b9c69e6d412b421e28cb6aa225d639871c4f9ee3c8f849256153cca2c08d77f426f010ba93b0f0f8d2c36458ba5587450c4fd32a8c7e9d1f85cd9717bc7464abdd6617232c19be35403fc38d1484bbb1f99a0daeaa8791641c780ab2ad9b7c9b1a4811de3af408a1a42346669014c7a6f2e94af9bc4346cfac1122997a7b7784e955d22055b35ec78fe7ac210bb850b0195d933335e7c32a52f18c9a87575e2fab8bd963d2a1c19a97ac77b5c273762e7dde119156597733c3ef470ca113ebb835de4bab5d88ccbc6fe5823cb71e898f35a0f9d764531a70738f511519a720fa7a2cb68d9442624d8c73faaeb3665d528fc4a7ddfde3e78c7580b8fe16fac270a48f845a95a955abfd6fa54626f1a1ae35d4430c3a1f3e181b8c74834d845d09317d461b5de77199ed03c6c8fec9f3605dda982853864c1b47d465f7e9b19b9d982f3e6e07146b35c00c0b25193cdbea444f1eb17a5d776b4c2ef7cd57069170446316fa6795f38dde0ed6b03c011a136fda71a6774c20330f25810bb690271dc8195b609859cdeb22ee80451ba3ebe361159a699bcb713f08f64cac270db893cee3c9fefd87782962b9c220db9291f935e5e34c830df0c0d28979234fa2be73ea6bf835501ee54da79118254f2c9eb7fd49825b7e6288bc55d60dce44b5c35ed39e183254bdf7ceab858a67dda6bf05e9df0e8554b8658947d8f783bce6046a493ff562a7a0857e026d989a47840bf5175668ca22103f5e8bf8f43866ea96b81a0fc335a4eb1d74542739cedb230e1beb6b5ccfabde665a5c0cd4d93387ce5d9075d17070597f199b11ffd1b7f78b899c1a93f9882ccc2f275f7136e685ba77d9f6c7e5e836235b9914d96ef371d89b63fa1236c2d7944899291436e86700ddfa69a21a48008d3af2894bbd62dbc682244639754829a96323f426eca8c0ff3de364e340dc8548a52c2288ca409c1bc2a5834eddd35d3f9a7a183d6b81b4185bf1e7835ac6bd96271511183af7d9a69ed500d085b9c6aeea1cf00db4aced1cbfaf7bfe4e5eba3d7656e83d9a68c7e3141289a38cc700780dce19a55728e6993fb417c11147b38d5df83a19b59e4fa188c9ac704f9554f12886e511aab6cb964e9eb036f5502e667aec5a82f819a218c8b6b151c356198da0d9b685f11756e002d7b6072dd43c7a1d8be13a31e61097af739c82fd73020bc225bcd8baf14d5d8ef416d5216457d24cb59425364f1750ea1daef53facf869c41aca023d506ba6b5c86ef1a36fa763bd7aeeddaed583d98cf9c04bfb8b5aa8940f7e774516046998075015c95498282419f776de2dfacd6d3ed971d242902649dc418c2b7afe4e28277993fc44517b7d9cf938d117fb412fda3dfe7514e2f92ad4f9d07ebe06f7f6ac618f1700e599439c8aa6fcdb4d0a5fefae8505e596cc02599b25c7df147522b068e5fd7e4fc3e4b4b71e7ac9b70a2ffac641e916b31e5b0ad62df259319847259ad8c28e75583c9ea03bd779a25b21f4f7febe908802c0ccd9bd08969a48497ef1d90750fb75361676baecd60d6afceaeeca8891a3490152aa14b381ffa913934df2c0c5a530dbbd9c6b98c4ee860c1e77f2a93d0f5125c18719a7f86d14f2e54e4b786eda310ff9b40469f0f4f2db93f3c1e16eff5c2d82317fb3420d0562d72b8d79a16b6905743fc4d4b3989b296e95f04838b3e0b05366e0919ccda0ff50267a40baa3aeecfdf437d3458802fdfcf738ff660378f6ddfd030ec4c9f83866f520d3732e1556586f48e142cfb1464919a8b017f3d7d65801a547865e54d314e0f90daaac3ea8b92cacddace302b2dee4873c20bf258e11ca64f56cfecf121b65d4709ed3fc067d4148e7c03bd3ef98eb7f6871cb01b5ad05b6557c23372221479cd8a9f4c60568f950f4cbc587ba70da00921bbbb84488aeb686346c4601427fc58afb4328aeecb32b51eeaa178e3e6b2e19ec5ee73a173f3b32b80f50f6c6a42996cb205c1279a69ba37cc87aff547d4d4d9cd53e15bd14359fad159b92566298acf50347b42c0393c8eeca7df85d56d242b4ef5527427e69f7d72ca2585be7be56515971d58ae99bc79f75e9732c33b07844366e6e4c1b647880f8fdd500cb7a23a3a87a17ed60ecb805c52ac370c719ab27ee9a7bc4a84ecafbf2eb228331668c33df13c692a6fcd0348b8b53525380e92c34e0583d9bf8d90ea91f0f19faae3b58510d009b7694086f18d6335efe237ce45449faee74b316350b65c69c75c3e8ab178240afdece3ae444ef25e215c3ad741a82df07e1bf4e457ba5d96ea80e05550f03f99c481812e5c04a75d8ec2ff78113105b174d59ca25429eab585c54e550b3b90dca69b7fa6da2a387be2e29f92548d7ddd1f03a3558b6c5913185879e8eb0140baa197bb998fa71ea95a42e965fbba541667c51ed0b9b61e979e36dd309b68f761b5293ca0c49d17a4786c1a3610532b95ba4ec549f58c1e916e779bb57a35576737c493da4dfac855628781bdbc7ee2e44cb7b10035d399d671e5c9c76f10f5e895522f6683954306ed2946a1d13e7562f4b3604b3b2eb2ead45f0c113e4ba0f285aec4ca804381b268cc9f51d1551e6fe7dfa167e73569934ac4d12ec1f8d7fe3ce38f1db1890373fa10d320cdd3af0ccf2a2a300584d0ec3c2807d2031a1e0e997c8455af87ac082f3ef423cdc259f4357a4e7d5e802f85c978c83156791415ed9ebc6cfa15c097bfd6d155e31ff1a2dba74f76d95bc9d37c58c1d03d5eb61747dd7c90dfdaaac5ce36c5c39597e62e86e64eb731809c9410e718cd868cf1e79405586605575157394bda97d6a358a9c62da6449b8c46b41b2e49475175bd4eca29801dc1059cfef39a4f5aa7d1ef5b5223e08d14e3bfcf28edf82fda92a20da0f9d25e78e28d98a91bd3a7bcfab4bfd7fcc10d807479b00981be589bb07f1c1e0d1ae30f61123bd1e8bbc189d6025b59c95e334baa0cb004f4c152cdef7167f90c82c484a82caa4e6e1e22a753c3489a93bce8bf7abda0f352722b436aecdeb0a420167124b02bbb90971ef964489f87b1065fb8231f2c00cf59019720ae77046a0531cc3a7fcc6eedec288a123ca5d128bcfd67202ba55cc7de4e421b1ee123cf6eab58ef7a422a425486a0f25319d4d43dd0b0fbd2eb2055d9255de7f55d89b929a01df702bce2f75ff99a7f47d30fc60bbbf80653394cba515b1c22ed471166c3ffc713b5a9217af1d1c21b5dc89500b90bdabd685ae684b370326d501bc7bc7327589b78d21d3b996bda9b8a68614bdcd7c0d10876d580c2a48b5c40fa15961af78abd7a3af2518d25e1b3c926de3068b777a64f5781eaa74d2076e1bf84aa564507c478714fe94d274dcc6cc2337a1611950e009d1ed7b26266dd427419c8eabc89966ea8f87ff285bd9856b55a564334e437fc5545f867dfeb0b6f7e84f2a28cbe58ca34a5f30caba5dc6ad0757971e5e18b5c88a7545de76f31c56bf9742e7257f4ef0938acc353880eaf1ab57874f80f7b088ee4fa7eb18d21ade49d7f41d590d7f4601f025c2516f53480034f850836d4476f454b6115316461faefb8d790f4fe1fec8e16e2115331de23e82089a95018e8df1779ca6b013ac507a5bade7d77c1c97487a546c4aec08ad7496ba2e474b1bfcf0d91fa15b614764379b36a042a6a5862a1d3f705dc52c759b885b7359e071f2d74559c3ae9c8d1d03f7f2e1b88187bab5dff42fe712b2593036efbab5ae1d7c7c14199c8487dac50101cc08c10254c7039307900cc42627da90019586e646408a08b71adc5f244f07a9c59243ef25c8203fe6483fdb3267d121e1d5bd254970b013da39285edc34787dae8e45d3e3d364f25fb663b66a1457413360ae4d1f93c47eac5849afdfc460f10f058d4e0c704ed47295509c2a247f16f3a65d5053ff89255db1a7c27b2a5f54728478a403fa4330c1441226589fd91621d8f5ef8a0e0a65e9e2ef02b51073de092bf7976192652fce121d0848d9aceb5863fb997763167d08c97de5c7980599e0656a0b15aa3869784dd3bdf1f555063d7d208f5083099fdfa3e630e185b822c7bd3f055b461ddcf04751fc689b64c0c37b94e2bd534d727b62a9a8b0f82fa29b9a413f4c2eeddc44741572c8d0e0551b1ed884bdbd02fca221b019918e6658be5ddd62001f92a7c91dc7c0953814873ce89c938a08e11f55e17ac9cd87a43be2d21b034aadcb93f4b3db9f114ca94c95dc6b3bb0e7d1cacb9ad081db6bad68c89b2b2250b0629b76c2cbdc4b959343af904333524958f2fd03d607d47d639151381dee5cfac60281cda538bab65bdc3adee1afccb61798e4d4a5472a3b7619ce01b1b57ec088334f332d32e3d7712ddb0bf7199cb8e49ea9f82c59233cfe4db2fa1662e2cfa1d2b833a6a8700456a235875c3e519026ed14fadf14d1011adbcd26392bd706c50e67be2f92d423a238e70dacff8303e61afbdd1625c847b2ee63c119a8ff5b12f4b90093de3c010dbe90863f11b532a6ac1e32b6a56527db248a52c2ec3eedb04b1b2aaed35557adaa476ff1c09ebbb2994ab433e0ed5cd4e128b9a3072d129d16b19873800aa971090148d3a3faba6b8d53a7326233c53505a0dade681d686cd8ab46e55225132893d5dca0c98597fe18d35dad9286c516462421d21ac477e223c69e91268a53ff3f8dc783e0ba676ada03098c4a1830500e7860dcd2954da8d6874dccb49e770f468860f077cca0e5bbed209b675f4668ea2a3111ba277e165752d01aef8082e29de816652f8c22f5d12f7b4befce15bbaa1d69abc279e5476b7fef36b716c1c9f5d9dbc6a84bbdcc9b89ed6dc0af06a89b00a4ea4c0a5632c497f7bbbbbc1677dfb11f364c61dda3872805ee7f5167c0ac642a940021966480329055961ce81837703b23f18954fb6f90985244d1a714af183e3779e5ff3529289484c03d270f0e7204c3454f48e62ea5ac4c9293abc1b3d2ad70ad5a8ca59850ab4295033f769fe0fa5d9fa58b2e6ec356ae24800f7e2c28b5a220a73f3f16b8d0288b81d25b8fffca0cbb5fb5ebb8fbe4d3624cdd01a16e80a0cf9de693f32c1b9c8d6a2af2c448c1cbf2a80f4899c48a5d31e5a60af3cee6602a944fb2a5b237ed0b93e385bbdc2f95c586ef05e4009e19760639d107c04dde36b59f9defbcc02ac3399d709d7618fcbeb41745bda17aa163a22bb486fe18e2c30c99746d165aa6713d677c92c97ee54b5d254cf7a493d921490cac619fba7802a4450405c86a492c475911e404a8b4e1c9ba6fd3f8121a168e19fdfe8f4cdfe522c3b66732e6ce9546cf1158f7d8394e71231110a59b30fdeae6b91836bd3de35220add321ada3fd510a65256713a6573846a3cb71a50feacec4ce510cc40e61f6ec1659497cb8b4081af9eb46e9d313056aaa64b7cf3704cda540d232d55e30e1b5ad07843fe6be116e967b0ad4357c5f05edb2360c2a3f06d50c6bb4c6e0876503938046f638e551bdebdd91890e33fa7ed7f930500d2dead3f08b1b799c18dab6ed913e1981e352136ceccb2f30d2128bcf1bd22727d52f81d82349d1d68d441c75ac54cea3431589fbae2f6befbf23e40213b7c298429ea5f7ee52492b774ebfd0e45c8e6293b269bfb47a497545f94c06bbcabbc347b18f228109bff3e757143c793ed957a0f51f58442e53b74e1046d840dfe874feab16cbaef7c193c79c8d8b95ecb9e291400abc20c9aa987e1a825dffce8d2780f5a59f966822c45a60f5eb546a9d20e6e8d4e0669ef214134926e206a3fbea7f32187362ef377708358f7f6662b58eac83dfa0ffe348bfba7c8722f3d041117657731fe7477f9e8bd8916f138b80bb22332d5dccbcbf6fa98da7ae8e1fc4fc372bf5db8a2f9c1c189656fc44ef68f6ca0a13d1b278048ab1585e48ce7c55427dcda4830ab9306fe5c2b7f36dbcc5351241d75da09147767fc341c18512f24db15cb30f7fab473acbdd0d1d512dcde710c9a4c7900f5b8bc458966ce8ab48b3a6841e94220f7451e9d3d2fecccc1693a6346d3132b74bacef5bde1862b8b4133efe0ee62c69afde2e60f62eab510ca20a755f86d936ce845df1afed1e0a92e30694230b2e612400e12d9522995039edd0e7c7b8b6af3c1266b94234fac9cb4b29bb2f2c795e2970e816123a35d446b0b82af5ff995ac9a33a7b0cefd1a52e0383197a88be1b50a5d5a3523a4f65591eea4ab0f7bab00357b795b8967d805dc2082d6633558a68ae14f02331fe0a52f0cd48f52da962938436345db0fd26a13e3d5a56f15ba0902ea78b727f37333b680d96741d7d58fa30ba85bf9086632498ef21a79470fc8411718cd242b2c4e1fbc542fc9b43ee8b8b3bead3956bf8590c3dc8bb7cc646357e909da4e45a012b9ca15c3598859a4c44e73db8a4e6493147f67053d9e40adcfdca622db5992a972e65249142122c51a5c023b9d0734e54bb797de93d090c510e752da95cc1a398358d83659aa59edc8e4a056a985170cbfb51b09881e5ee633fe14bbc16a6690dd3ec26ea0068906e62223cca7e6370d6fe09589d9ed0a7056761d5a197cbdf96f62c8493d3f1b436d229430aa4cd18f1047bad3ee9aaf7bb030ae367eaf3efc9c963a4fde43c3d1df62d6457d4a862b3a59f7353f7568434a6bbd8fe78185a2e670381cfbc3dcb6c3f2eaab14caaa235d07f288dddee0872ea4444f5787156c1a4bcc707947867e3f250052a1dd51377c7ab30d8a0ffb1f5ef7187d99de5b0a4d2f15f9906a10bb919194cfb8d289ba81c6f27b5192789470c123effc57250fdbdec8fc4bd7ba42a6e436e8174b95f1b8fc254412e6dab4e6506ca85617e72d9bbfbbef857960015a2e48aad853a3e6e33efaa64de400c7303b4ec26ccc5ad9601755ba30f1d009d8c16790b1cdae7031eade30a75ad8484e72125cee0b685cd940410efaaa61151a693bf6a0cacfee567145439d858f0b2ef6d1f4fab3b56966dc541921199c7f69d5816a1ac15c3c179dae28b8b2bf847f75e218195ed246a1cc864b625d3a431b2a6a13c936fb46e4be11a8e596cf915ae11146d54aac537b088da298cf464a76daa3b13d852c84fa0db6fbd5ad178c48deb11cd2916bb9fbdacb5ef8ae3e87427c2810e0932b0897d3b42704d63ea64fb0ed6b31fb7bde0a9ab059856a002c6a9d095578523786e2131a32c90e83bf29c23f3b94b689d1b460e712333e0c541c56b7aa91fea48ca0b500ab38af3a89fa87501e9bb813310ecc05eda19b4516756a883a6069647c18a63e6be5046d4d4c8794bed6c7aa60e060cb4a3280d6e556b9ed94223c39cd5a62f96fa267d9a4082f1eb3eb6d95cd091268ae42bca13ad8cc18338cd976f1c71d3feb84b0701928e48d29061edc2a21db0c0f372e3c897373df1e60a38fcb2719890647c42a092b2af45fe1cda4b39488a712e70e93c9624d32f974bdab40c6e237fb57c7e75d96081d281ace4003e03da6cf2b158315fd6e17101cdc42614d78577bfa6388de450c6a6460565e896a7e58d61596e726d775aa07da2f7835c6741cf78bbb22b0e4c8f85aac3020f651c3a41d82f168b2d930483d146ec20a74644be73cfa46853e43954300cf940ac4f548271c25b804453b21420734ebdcbad99849d67fa38b3e44c057e06d4c03ffd80e26b2661c86a163b5765c7c1f617dd117c8cf06be56da762df0436cd64461d23f54ef114b67684c080c1e198097a6e6649f9f9670e83e29cb717a38cf50dbaa354588a48571d0c69ce94299289b86bf864040a9f4cdd8f75db9766d81f7e13e9e57b79267466e3b39f31d64d5b78fc85b1e4a75ed06442c8aafab416d9d2f391b92c1986b92c0b75cb3667797ca6aa50230c9c38d4c639f0d55ded8e3c66fb06dae8e2a4c604f097959697f363cdee5ae250bc82ad2d05a8486063f031fd1f507dcacef67034cee0462fd04e4b35c28637010cf0462b3dc2ce1c672b00fd2d3b48811f82bca6d30fbccb9d5fcdad2ff8a410a949756fe50bbfc4a6cdef1058ac060d8cf8e5080405247c76a86316614bc255840f628be04e2b4bd75fecb0c7de92ce611bbb89c9cce796ae7463ab98082c73ffe8b25e4496a1468c3e02ba09583895bc337847cca60efb15bf3fc0b2c42be2a21319e04883c445acc876d3c7a6150a03e98cd1b5e2da4f48c6b835f38e8eedc2dacdb35ff248a7f81bd3939ca1d0a668a224c6efe1bf77afaec80dd5b60cded83a3f0f6f5471edba4bb23cde00d55ba0c5fc081b8aefe09d5981063d01e0fbfaaba9eb81f2d7d81a6778d85d807b1542ca89843313fc69f8713b098305ec03a392ed23ceee47e3b2584adc4c324347d00285f94945dd59718b660d066e966d3f6cc792f2b1ef7275997b112aaaf4a482196402348da66bd848dfe31bd6b20b81624064f00b34de9acb449cc6ad6d0c0ad7272c3d0d6c44933a6526672f9c8c70703b86eb0c562fe12bf3455fd1940c68a48e963240db86eb40165b6e0f1d6e8dff5faf9d635b27a3a7e29b5007819fbf9719261bcdaefb390ff6d45ed75cb68ca1d64bd","title":"146. LRU 缓存机制","link":"https://leetcode-cn.com/problems/lru-cache/","question_id":146,"issue_number":15},"13":{"day":13,"pres":["递归"],"tags":["DFS","树"],"whys":null,"difficulty":"- 简单","description":"```\n给定一个二叉树,找出其最大深度。\n\n二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。\n\n说明: 叶子节点是指没有子节点的节点。\n\n示例:\n给定二叉树 [3,9,20,null,null,15,7],\n\n 3\n / \\\n 9 20\n / \\\n 15 7\n返回它的最大深度 3 。\n```","content":"0961e884611df7d4ac47a79a9e3b6f2d75833d84c0a729f060673f60565b7c085684842767c9fc0e2909b27d2085c35aaf331fd4cf6558ddb829ee2dbfeef86cf330246694d98ee31b2cc0a98c904e303ae5658f99b401d330bc35daefeea38b1420c60760a782633d23027ac0bb8bfe3e5084cebc872daa14aaf2af55da70ed36d5025cd7e38af5dbab57ad4dc62b58c4decfea5840465bbd48aebe6b22f03e5f7a132669d6ed2f5155c11705df105930a8f6d97b051f63af15e54e6ff61135598f483b8d875e936a9e51098e6608728235c56f7f22ab810a5e86cb302b739281acfd1594ff57eeb8134190834c4c554e4275a2cbd922022024b807311627a9e94b88bc9f9a63be404773e144fb5564e7d99427fc309a4685d1c93f938855a65139f3824ba4e6dd24ce5a7244f27529b1a07330d2b75da5cd4d8b9e66e52180710c92c54b082d20a7e40fc1b1845fd2a6e7acbbb7a6d76cb12ad2b339395a9defcc9614a2df13d13b0157673041e4c817c5d13ba2703a303570b45b8ba5941a768139455a67dcc373be4eebef750527a63029df98887ab5b679e869b7dda8eaffb73d1f5e4de439b38f2756c6efba04c0c98efddc3aef68230e71b76d51a382b71385c7ed0e856d4faf3f576f605713e57e21f6bb81a8eff671f8945b0a2d8b4dbe0d315ac5d342ce97800f15404d91cfd2b070c7dc68d1e74b816f9a8c6696ab4747017dc810cd5efe7e9fc0d29a492ac399f19d6660b2082f8ba487bfdec326c0c3bef288352f33435acf81d439b91b4469521efb60a4ea60182344d6465e4e7c50e1be9db2d73b240d1041ff2e466bf663fc412b9223f1e9494c9e2cf051deeb7f5aa7bdfaae58e8b31da1f0435df7bdbcc2abbcf8ada8cf05b894f0a2c08ec6d36945b85f467facdcf25d9a5017de5215c05ac162f633992f61d2187108b56397b061d6cdbc623d5f26a6dde6a452ee9d03f6517e7110b6778127cc68f78818eb590d54f82893a12c5cae62a5fe8543486a1850d2b59af877d20b09ff212cec50cf17350682cc43521d6b4d8f78003107edaf187a5024e65cb77362a3d1496c7ba899be1366901dd18c7d8d3c0086fc9eea0cab204ac8cafb943e60896a0daf75137e4fbd65997e8127ca249a5d232e9eb3185626cbd4c6bf737c2e6368574b186a55cba19a2b726587c6873de35b32373a0bc5ed56a84e5d974ae004a1d8c0aae39481e80b9a30ca99aa931c8ff7edac150da3b96cc857ef6ac8a6cebd6ce1ff15a75130d2e171abf38e3e7a54e8e6affc1f4335a6cfffb3cadfb099c2ae28dabd5d31bc43e75815d1d82bc8c0df138c0e44ddccc692a2148c3c21a16dc61f1ca429fbdf145b78bdbccbc896cc8c89eb022af7fcd4b1da6d9a453cd63090e7ff877ba89afc8eb34234adac7dbca81f978bbd35330bada2260df9946808f798f2c1060cacb44b8b008f6ad32dab6e401e45d05f178c9c61ab579bd62d1814bb5d6be64126efe2105d9dd41f2f5c3dd192b5f9ee98c766e773686e27ec844ccc3e487cd4a36837fc0a80828c29e35b562e2fea052448df6e30e3c7d21cd1b0d1f20a9a9d1e621602dd845eed274dfe415e45a02c65e16d70ece03d84997ba6197e6b072faaedd99e05a00a4e13407860f70eb634aebd84094796772489652e5b67753e5bb6e97db8a8b83b100a06b2e54dec8a774c573b21d7908e7884ba4a16aff965b3a2c3155ce3d222b1152b9407daf376b209742c1fdf43bd50e1eef36664e62454dacbd5a6c88035048079ab11a8ec9828086122d55b7d308e33bdb0e86346a984535c8af12aa5aaee244490ebdf611c5ecda6f8ac472e51082e91b8720a98120fa4448c28522f25f9f8f16936587e0aa1ae98531629cbfdba0ce265c4792d59f8d6f8f1cf8ff85bcfa7d20e8503dd16f455f00215a8a4fec69adf1367b221b6d2c65bf099af23dcd9173eb25fcf6b6f9c61458e4f9cc6e77b17a95526fcd9642d8033ec55b921852e85930b67b182c3d5f8384491e118eb77e656a05d403dfd97b33907f3f845fe9407b1faf22e878008bf47a4eb6d90cbc43d4ef877721a20d14fb6ac0b5de924c748ee6b2008e53d54dba0f5e19cca5a623ff8f8b0abe373682f17c4f7776da357e0cff6fd0d49002af23878ecabbe3cb71c1bbc94ef31162d42bdb44db3300211823a0fe552d6c14525bacf5e9a7a18dd65c97d3ec4a4314670b9219b1f86b5622a61805e410676044420113320ff1c5052b600dad4099ea84b6b3819e0e288257549cb82437b19c3164f74a0aa76808414e89cab9923931a969f46ece70ba7f639c5fbd9b734dcee9aafb08c006941f8de6e1994e45a57248c73a596e7aa91d821c4727887445818538a6d9b769cc6de45f254973d36ea2a5883407d61b7fce865822bb12d01227dcd27fb90523d41a157e83b55fec73ba9e5521389b9507c1910c64af15726f9f3adbba102d73804b7f6390667cc19f7626ac2f2d78d623144fc509e9b8597df76514fcd8f4976bc31c1f72e9b91a4e53106fe16c9115ea4f5c6c95e59a6e8fc31114e96486bb35314109a40f15679709b97c572a3809fb8d8f2901a04dd8ff013b625196fbc5ffe67961b1339b5a83ca84618ece0d1d1ad589bec99a4366dd3b8b651a0bcb43296ef384de503f64f389db91bec9721517f688270bfabd5b2a5e9e39e1fa4a9d3bb3910f52e3d0b4274129f5bd0acb5480ea7e36708160a57f45b90dffa50cbb666bc8aff3f5131c96d10b5dbd8717a3cab217285a4ce5f7c90de9459ac8d1abbf8fdadeef1d34d673454d160c6941e1c5ab0bdd47b0d75094d822030ed903b4b132db66fb3d051610600553835c193d31653878ecb0d73e63def4eb1a024ecb7bbbe5422754907d1407a88a6469a4184e53b9b3b9b88eaf4b95322097651e44c8e051ec51471a9b3aaa44551ff08d0578fb8be06de2dcaf17c4d6655e0c0870b6efdb4be30977a6c64467b61d8b281a8e5a851412b0f49ab983c4bce4aa01a6f380c98ad7515f0f59cff9349500fa21e8dc07e3b94212296d3cb282c0065307a1d93f69a36357166d126c028200f936466f31145d449f765d576a4427fae99847ccb8c8da27c6a595eca4737e2a53d9e7d864ae4e409ad9b3a8ed5abcde79adbfee59f7dd3b211c8868299ae509a5ab4b0c95191e2c43b7fa443660d1d8b044bce494594bb81ed57f60aebba07917cdaa3bde043e8be6e909ba41838c3e828c747fab20f58416f0740836f7e554535e07cdd895e442573049f42c8dec7ccb0fa7c56d3ab1cf288c80926971784d1ff6093910f4b63051da5249c349bdf61049011c0dcd1e259d5cf8391d645374cef273da1c3bafcded9b319da3917d43250b1829762e4e157c97e4a1fc097c0d49eff4e4cb9125ad86ebb9cd1da1a8e0f54edf4acd9558ef94c1e296abdce2b6dcddd0f9141107e86a9b6ccab491edc3655879127d1d41867d100fe4e7e3e659bc064187c58fd04e0d02db1c2abfbd66d68b370bc612cd0bd2f3a206f5012308043342c433b795f646e148e972851d1f81ad9da816a70fd48064d042ceff6571fcbb44afc9e6e9fad4e6bd9f13a8087461923360e80cd805201fc3fcfab83570e8632b6312cd9dc673c5661040b01370e3549ed3c7a2a1a7612444f647b11861f20f275b5d9f2699a9ec1be5753fb32eafe62b7ffd0d19d29c9bdac74597527a096a55463d239a22a588f84da76beef8e75da5be00d77bc2344fdae5c2a3fc21344db5c1a1cbbc032088d60287363bb76e97739c02e7b4383442c858be0cbf6f5e7cee7778858ab294c766fd520f432c5200f222403cdde85634e9680537e3d70aa0599301bac782419f0e502f2e790cdb891bad4ef75ba4a1e55b07625b0df6d1296af9bf6c0cccae359cf295452800b29b58dbff5ee8cebe88621464320c31f2336254e95d47e1cf69d82d950f14dcc285fcd49e9230cd6617bace23923b1c186a06fa538ca92429b8b291963291cada7cd4f8d0e780f27d5f768d407ad253a8b62fcddb79e654afa615da8310e84a0b45bc797023bc11886a7ecac26ab91d39a14d3e429584a248f3eed76c33a9ba0ad600f6459c4d757509b51fb0f52465d615433729fa3b694e697a4c0ea7b2dbd0248dbca5dd95b7734d0d62ec9d06c788f159be129f85a079f9fa2a388aa881e7c743f992332b418987cf76c32e32d5beff8425721d8e69393aad18ee6256b566b31c567314bca4c2611494c64a3bcc894e279eb7b80e15bb13f11d4607afadad4a13fc12b998e3c0e447f0cb53702efeaf6fdb308db9c5451f6335530c4b0c737c621a43b8141b456aaf232098f4135c0c4f74ff62592f96f51522a1f52dfa35d9292efdbe1f5c4acb30b42418a5dbe00e2d46aa57aa5ad133b2fd1bc3ed9d0bc131826474e196ba0e8a2d85d242d673bcd920903b07bceab37eb61c4a8317f7a2e5e45200f3483f1f3eba3f5daafa7715362c8f1cec502bc252efd3dad88f424cc1660efaec5ea688e4d3734f4694d4fcfe3d1e1aa209643b86de7048e1841cc5d85aa5a6626666e90b0ef1e8da181c66eb8e1cf212f391bc06de34883c0edf33e02d1da314b60b89c30f8253225d2ae56a5f83f8f8bb881e9632ffd14e84598b21a825c39c2c8164a612ae5034fc6097ac73279a9fb325cb6c204930b699e3a9f461d5e725bf2b28442bda53dc670f5bb4453fbcc564ac9c8d4a8e128161e8ad7523103c1ea25cd4d59371aaa2913f050e626b07b877121c4338d965163ae4f1690a13ca204c4eb24e0776d91e006302883615e21810b03d38893fd8232b3d212a745c2209e1a4a8132327a629b51e56af099cb0d0f279dc52d5310f9cb6ecb03b0a5f3a9a88b1651c68a9e653fd35f0a7200ac4e8a186a5db1707b4b03295bb95d51e53ab89c414a733b7d0874d7a48bc25dbef1cf8d3f0dc6ff79f596499e4b4c0c136fc0944930c262649cab94277b74bdebe802d2950f32b6a11bbc83e5baa394e1b39cd51202d1302e8439","title":"104. 二叉树的最大深度","link":"https://leetcode-cn.com/problems/maximum-depth-of-binary-tree","question_id":104,"issue_number":16},"14":{"day":14,"pres":["递归","层序遍历","前中序确定一棵树"],"tags":["DFS","BFS","树"],"whys":null,"difficulty":"- 简单","description":"```\n给定两个二叉树,编写一个函数来检验它们是否相同。\n\n如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。\n\n示例 1:\n\n输入: 1 1\n / \\ / \\\n 2 3 2 3\n\n [1,2,3], [1,2,3]\n\n输出: true\n示例 2:\n\n输入: 1 1\n / \\\n 2 2\n\n [1,2], [1,null,2]\n\n输出: false\n示例 3:\n\n输入: 1 1\n / \\ / \\\n 2 1 1 2\n\n [1,2,1], [1,1,2]\n\n输出: false\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f2294143385f274563c504b5b7c0856b8952d7fe710b3f0987cab7ab5e61db7220ad3962513d4f02ff460b3e5f06ee02c656797d1cce04630c3a88cd0496d32e132ecfee24fdeb279c2492a7dc6e71462eb2f52dfd66e0b173415e7914e7d8fbc2e6a780a7a3aa062684d198357e0f19d2228507ca3dcd861edf62dd964d247147f8b115412dc22738abdaea2845c60177a0d16a1f066227e4ff9907f1c5e03aad6db7a021c618f10e86f51f7121b528b6d11dac80d03d0c72e37c1202b18fe1f9c356b640b668ebd77c0313b7391b1aef51097fc70e0a12645ab98a3c5d24d4167aed0f22e102e25900f32152f4763c541db99ce3a962d21517a8e41393cc5acea169c6f8026d4fbb247b0ff0b9e136ef7e60a8590a03aa233533b975768eab83e59e5f60293a616b5d813fb68f35772e0fb28601365daf5639ab1e900fce7aa88d0ca949c1f97568e8a4f5c6ad783f2f375b88f976bf79efb661255e7eb34c5c61baf421fddb4bc3cbb02a7801c7baf2f445571dbfb5b50fe4429da65639e465dcdf2e049cbec4f7b876f3d2c58b2e923471642b067aece795fa2bc9c6daaeeebb9f679b57c6a625ff40d70fee29179fac78aa0286e5e9c3c7355676f350bcc6faa97f5c2fab836d2e027104fd844d1500c0698f9288192e4602e112b90beb28a14bcde398bfe19e845f6c66dc6c4552c645eab6fc9048d42fab0e5eb162b82c3cdc33b44d67610cfc89df7bbe178b0e3d19590bbc65b6ee423fefeb97d40401d17825182248039097f27ebd398e2db96733f5b1f7efea9bdd8eb5de9e4e31bd958898130e453708aec3306a6965a71bbc40c7269140e0528a4647ef9996d11797f027a780fa8b416b48deeb0d0829bac0f09b4111333e0d0e333874b781dddc4e670c1628d2286176dc165542201d72475df4cd7ae26450a638c1a6d3e960c1c03e44b454ed828c453a881ed434da3559c83e63f92376790fc6be6223803f88df09e50c1b55958d5f84449bf0b06ef53cfd29cab452de795a2ee8500de2a1b0aff66b8c895b954769d7061a317e9c39915169439a010ac1636a255b2aa3c4b102f9203e9917b030569b5980dbecd00967b5239e570c5d904a42ad20ab8abe9df96460e31a5904d0f9ce44a3b5b232927d4937b1d5dbff0a32a6f4298709c8893f597780ef5358bf2188e7b81666c47633f264475b95c8d4f530b55f9135b29348fc93819a843ff20f6668ce478d7612a8d3d97a2490dc92437169ebdd345541e42c8d2961c795b757f3467385d65a11451c95de15080372f671fe41e4814c860feb85a726e5539b48f1619a070f91d3c8426d0eff7cdd575f3cab3f2fcfb0d40c74af098b88bb318922053da51187330de7ecdfec8c5c6645cfeaf34c3826cf388d56d015be4bb518e7351d7a1f982e4c1160e401ef941a0126acb1fa7616ff2ef81240defd161cc3f9591513156d05114b0647192f371348fb3472d3b66c9d2e3e095faf6118466293d0ba8da479b627913b7b10f80640687928d08ee5b5917c0448fe10fe9186ed5b28c168feddeb642abf4716c516bedf905e34030d4240b47d35d46833866492f91d529f163637f1e591ddf95effb51a18882707b1cf252da16afaea38305518a7a0497663d586464155685db759ea0b51433043082ed5fc1874d63541e21dabab37488bc4b1192fe59ab406b5a01f98d6fbc6b7f9e5190ce11cf231c6e00af1e81329ac8932d78b797f01fa5e8d2b88d4266af12cf38e38b808c0b5434d9437c3d970ebea8ee6e6c9388734385d001aba9ee245089254f214f62ae3f73ae4c3c5e373d5c0639639a6565b33ff526016103bd82d23350502e49b0c7fe537674eb88098e37f16fbf4b549b8eeeba8abba604e4d88715c36af3689b67985c06f5eff0adf3f571098354ebd7a71df6d5f7178fbe037ecf5db82d76d60249cf32839ab8607dc56c4999d4ddc2c826bd29ab57f315c7e01c36ceb245015e898de4e162a84b9329a3022f2db62e2e3a22cf34cf88c635ccb1d26cdbb85627dc60b776c3abf1570be1340e0865b24dc3cb0f20b02f9512f52db19c22a5d213fbd7a6c3c033e2b7f7d5a4a7f349681b01caf174659d744d065e38f0a092e20cb1d187f1aef633ceddb59fd297fcdb629d1d9e1196ecf20f7b0d97e745459def353be90a8eda19b4000e394a41e7dd977fe51fb70957a2a0b771d9928abbf8fee4d8a020e23e021db012d31fa86c823d253618766a06bbd1f30e06c4e0eb198a9f8265198a4512bd212a744b8b2bdd7111834926896038a82b59fbb7fc5a4f52783d1fe7b641a3cb21568abe0516a013cc67246d632656a115b9fa6aa3e9e5990bfe4ebd752b50967d9160a07ae9645ec50f2f69cfb5af2dd66be29bf2c338ff7dec9a153941bf5be927083d5bc6622aa893657b9ffea8d454dd1f919014177b3f138562c4c33a26d41521af901389b4717052439ca6b346d07278fcee990d4c4cd78f093936b345f76893c3afef2308e50cfd1847e881513eb751b3a5e238521ac81e2e8155585532b31cd7eed00e146dc354561d450c736491cb4c2ef09561c79ccf089842cc53bc8939f5f07aa3081af9b88997e44490a383e53024c5eac858acbcf23ac4a07719eb4fb35b29c0e5096137f72900e800e077346c7b0245257fe8607c1027a6f831f9c2ccb3be8f3eb9cac0b58eae0927fea0d384e933f5525d14a15664ca1e5615aaac940fc5a1714054b4edfc29ee88126462c9da765b42ff750a9d2f450a2b395e55b385f3bd30e53c3a91de8b32503325752e4c805c90b51173abdfb9ba1092320d89afb9c4d2dd86564c399fc1621b10fdfa38c57bab5a6ced4a224d7cd5d7ca8eec7bddaf70c4388065c46dfa34d4546c75150bf5f0fff405d03029ad9838d5ff7373282ea437949e05f53a494e9a2ad64022ced3e4c5256f119eb60f305dd1509abaecb09ae621240d5b2f2680a897c2b82b2bf6199b0f0bf8b8b8a34762d5c3889ada92dcc98e8c34972cb17eff0fa2e516720d9cea80c999e581349bc32c287264c2ef5a841b4ed838a921e863eb8f6b9bf352813a1bde948261c1d9a7c1332e1c9156fd1d81a37dd67ddf7dfae423bd913fc0c0a384f9d4c6a5aa8328defe5a819a869fa2028008b7b4854c9bbdab3555e70f275e4e8b3e42821441d3a28ebb7df717ebeb4d827b96e7fcea62f9bb689693b11c38d6a133bf08b5e61558353d4257a8746f420235a431ae815d554b0b41da4a98d08b89f6e73656ccea04b79cd34f728b11d6ddf84680924a2f1b4058ad749266d2987b15c844c39c83ba1e969bc7cba44d6409a33c19b1a8c8d8dbc9cd7bb11b289b0511b982cb1cc7ad17da785609e499cdcda9e91e6bbe565dc368a0dc83c877960e1fa897af833fa4d3265f3d64f2e16460dbb464f644246c89ade8f9d34f17f32a42c2e868cd8d4c5acc0bbb7b1b7a2091c065443e4f9e47e09963e5c2affc8e017de339e96916d7b426043b79151464cf5d60385e601d0a282244dac52151cafb46dec7803e24b20043187b60a3ff0c35cbfd0cfc963e9fb0536b97a424898347196d30189bb680531cfc719ae7cf5a70d43bb663698d893520137310151c72785e1da532376b423719051f503e40cf5766f576b6dda877dfde93b70a53ab6eb2d472abe7c88d9d6f86bbe772456021f4d9ed183b97339300728f84da76b180870ac855a07750c80605d2e1057225b9341acd5d1c4f97c9384bf413633e469f65fe737c9078115d834716c6cff49be8ebedc7e7548854ad49576048c13fff46cc2b1f67364b81d1e6240ccda6056e626eb50d861c0af5374619ede544fa838e82dbf4b494a70ddf0f40993480c90d7de1ce1062611f49267af44ef80317070af0b67c6101306a212d0761b08997a15fb53c732d20c1fab180081d731ac627c0a1070b41df3ea4d46feb80504ed6d1222b1734957aaf647c2dd0dfe79cf9adea61060cb21ffbd298f21c6cfa3c4a8565268b6f334a1b4adbf663e2fae8394e6a124ded3726a6ce219417350376e0287221e01493ab68ce888639eb0eea36de11400b110f370f859bd8b33cb36c80786cd18784f589533f4a557040790e1e98ae40e3c22f09906291fdcb2810b23e3fc3f246a93b29af59d6e913584661017e30d99495ad79e5b82c8244cd44aa8c47eae0773dbbb579d86f7e5138671e20e89bc9b5d052a8ca8526a7affdcb9798603d27053ce347b41c4d9e1eb5d8218ee67c29584ef3539d0948f1fedba1ed23ece522291b7741a0004084d006e8999b68777caf039108f821b1db283908cdcd598ca86707769227ec3214e3bc93b7aeed110bfb4c36511c4f655c174cd6e48003bc39ef467860bd7ba689273b09dfbf19d0d08e22d783dbadacd4a3dba0d44f132f7716cc950f009d6bc497342981780ea6d8712a7646060c369bcd343f07f8fa8aaa5f6560cfcbcfe412b93d0312802b8be51ecd0660e98acae9538e4e130eff6d5a8f384b514f3a209643ba73e506b8108957a1441120fefae1a27232961ae9f396a13280929b03764c0c8b15c223f0c7b6960946b1f3988a870d5b59e5486e12b836f2035b64d6b7ecece01372cbaa86110e7fc58956392f408c8fd7baee0460c7045f2baf27e0f64b1db6a475b07b009765ca4fe9e5ffd3414b7220d8e82dcab63673d78342850cff67657b55778fc0e50ab7414fb26e6ef812c0be95897ad9d535825cc650fb5d85a33b9756208ef37ca384646bba258f5141b77ee2c10f6f91f4f975f3e3e71cd6fb5371597578b76a4ff6308c51c326a5c36cd1f7988dc95fc64f7a4905caa9b3203ad58ca74c0cda148e616f7338020cdc826c6e47e7c9165124513debdc4a99aae62ef6838aaac3823fb1912ed36e169cb03b501b205e110c3a068a77615379bfe91a57a4101a87478cdeabafa87f7de99a04d2941e6b16aa9e872118169c1675ab893f69ef475f541c642e4534483086cd7cbadd4978dd190ccccee58a96a34194834b126a75cf680813e600aeb1c4e349d212cd4d59aa73ecb93a84c7bd5bc2f1ca2776036b9a155a3d1a38791279a7674fbc17df10455e0be8abdddd5a1a6e3550bf322311b4d20ffa9f30dcad3359de64220f09411c33036346c0bcbc54e21d884141f23ccec57a82da9489eda54a4ab080e4c60c5431d5f6f5dc37709b861c54d55943528cce08b670b91f6ad1e4c013f20a6b2d8342d6d17de15adc957564e3bbeaa7f59cfd0e1e43a615e4a59ac50c7912bbb74671c434bfa68f8ad194bc9f91cd220e3b751a9d64c29f3c962f1cafd6503701b55291cdebf8f56286898d215c0bdb0fb07b59e15017e7cbb26dddbcaa7fb824359aa7ca068c9b5901c7ee59bfc0202c03b3b0ec25206c7c245e9ef62676da4800ea2d22bbfbf46eb96cc554f34d15c0a8807c75ead401d3a8fe67ea78085869bd6dc48a90ae44f4061a60a122121ee169637f3889a96981524619b7e2a081dbecaa375f346b0ce85299b0296c255ef326536a2b9cb029f432cdd2014b4e92ee09e2c6ad1fb16eee0e633c43714ec08865d8b5bbeade5324464ce6bd1c3df04455ccc674c283b85337c8506e9a83b4d6d737bbb0618bd52b3deeff418457be7c9f03969489395c4b704e7c45c16a87a82761aa167f22bc552674689472f3c1da86d0d473f1fa1b8f31ebd70c660ab0d7e7824c1608610f885cb9df9a285e594c66232eedb65030c2d858a481e00d721d98044f3387c77da2f881075c02a765cd37d015fdfe503b899ba5c90924e5bdc3c1811a11e5d1b38726e6360c13ef8d51d4cba0961fbf426e25bad00519115156e8feccd873ef069deb72bd503942328ed7bdd6580d41691b376844c5d43a924c59911601d03a3068ac0d0f6a09bf407a86d499cf7b03491647661e2c1413edca30f485b8761e00cca768c4634b0061dcdee892801ddb6096bd8b128d651c33df12312428f218991a891d4ac666219c1cedda0f3d7b05d49431c63eca2268b17a4ca0318e18c4cd5fd0373f0d0f393c265766f50be36cbc088c6e367338ca5836c95908c449cac7a4776451b6b9c9f78eae4cd123e582ec44c836833cbe38212e7ee9b8b8888269ba71819117866106a5f3369c458ba8bd5e271433b8033a19e1464bf604a09369fa532ca828e3db4f4534becb87efab3014fed42fb56ad2b0cb0e27b7ce995d6f35edf994ac65eadcb50d14d951650d0805ef7e1d89af5aba52872fd40cbd41a93546f32e7f8ef8acfcb9c2a056a6bf199bbc549d46ee490ae48a4d92467937816c870ba4324a3492750deb2e466e7503076329e5637937bd8aab8ec336ef507bbf069b727b7a70b7366a083d8c0093fa4d562d250b4a88c2546b1f8c285170d6e620a43c9731551c43cf451e1932e1b35a216357bffbfc9965fca33166ff1ec912f1ff367a15e911d1509106121e96ee0f4caf983581cb07b75324224e3ec089555820a3c69937e87e361b5fa144909ad5671f641d8c67d839a260ddfbb5db29b2b0e7316be2498a58c11c119e8ded2d6e0538df9413159dbcd7ef22ff9eaad754c1bc8c7ad561e0e7148cb585c5c2c5d40070b8034073b7b6fe260085aee970f92e257745c6966fe65a9eed6165ac47fff8909849ef5f1b6fd297e3f3058f4e7cfd6c7c25bb8a8dd8acad2244364bd1898f352317a934f8c53f90afc20ccbcc039829df3aff5178e66bb721daaa3da107a6c2688131f301e58bf2feadfe5e827d328cb8e1715fdd4ca9e969ab9e1faf05f6e3585746ed28eb63118d9cfa6c9d8b69dae537d18493d9cfbb3a8a1aac6db3080bce000ea2b36f7c44fcdc8482bea876f0cdf5abfe1882bf670c502bfead3ec6eaf651b2cbd4f8b9102304ab82bdf6468079897316355b3e4640333e591b05a0bccc4417e7a416628875e3e162c1dc539fa1ed817fd3ba1d19cc481def89a07d249e295ab45235c3125dae2b33a715768a89c0f5e9e1464b4ae8ca988af9f124ddcfa119a5f4708a35017205ed8475aaff72fa8778f7ec477101517cea954da0b0f6f6803efa805260bdd4281a9c1f05be688d66f6cc624877f784f81573dafdcfb3ddf95757ef5c359f897aab8a1fa501e79752a96cc909ae1c1138cae19b1caacb8caedd889a30c183f6f721decfd395528dbc43662aeed59a13176bb9c6c5327d2f5db1944f7222329504c2a197c76a266f2f30c69a659c394ed831cd2be78b6beb8b95219582d788aed23c00b0af7ca91e2d201e18f76314cb4309f18a90d517ab839c7a28ee3406f58ea8f26e8386ad5d28786a4d0c681599367634585d52103b2a30c9a7a3f1ec4ef54913ea3e4f0d8a91fcdf3b005fcec72cc50debfb34e683592076f5155f248a4d8a52a5002e26f104d8144731ffda74707de4e6f9886aa36d2faf6f02e465cc501c27db810525f1a1e990e936a7c0a0a5c78c8ea7696106b11e02a53e007e796f83b30205c7e8bad7ccedcc734f6e14a95f9e6b639ad64ecf83078cfc6ec56acc38b0ebc708ec7bb42bccaba9451d5426412d397b633a3d857719c8a66c3378ce995c6a26894d4f49a4e573a509d328f386420ef97a9676629b4fde54160a92e22829d833f62628c58103f9c7d3a59c982ec9b77dbffba00e6d59874927aa8cee66ac3999c15b78d6a0613250dfc4ef0b7352dbb446df9cb92e0569d63c5d6360619e0c41063310e90dc9b035652442ca528f0a4e4c67019e52ab4875360ea85173131fc8171f0d3a3d01c046b5944caa5e154285fcb0041e777b6f4cba8388e78cfb6d296ffffaad33e129a7301537997e00cc27cab330640e049bb9fbac6d5ada25aab93c7fb9f973b9d5f70f7ec09bc2885e1aa7b0eea0a734389c552b2bb5a9e8a8703abc71267bc948b0a9b928335e47ea8e8bf0df33803a8a7f5dab15c7bf109e536dbc26e64037365bf2afc30da50ba6ffba3671960f07336fea0515a482f44619c6d6f8ed2b0561ccbe81cf7f1844120296cf12ef0283a86dbda8f212a8d402d30fe762f5acdb7bb1dca583f70afe17f44b798101871f4712cb7a8f4f687ce6f7de9264b064577f5fc7a28d4bfc3dbbf0af425944bca996c2cafc05fce3ae8da6c36823a137eb976f3ab8140e50dcb34974f10edcbac1708c08e7ad0d9c50894647d845643c52d90b3bcff365a39276928f37e5ec8ae3fcb00dce573de228dacf1ea79efcf161ca70244c1f3573aa10ec9521df0aa714538f0303613633948fa2edbab7b28427dd51320843de241a7d9105331924969f9e456c4fa18f2b40543722b430f52cd17a3fb182bb2ed080a86b815d19ed2b47d019f9e623a0a83adb72b45bee8ce499509e9d65f77558e8e04f045a8f54e4ae767ed9889ecd008f3e37b0a38b6149ba1a51c74ec2cc039a10595f3846617591d4a1d9cce9fa5377137db70d000065b80abc1fd87ef7b54d8d4aba2c803ec1a9cc7a86d10a7bf1b6e8bd626f20e7af7c7a64c1ad24662ee2adcce77ecf9774d1ae5c41d9d5e08684a2f62323aa75866b9b2845c06b522c18453ba1d90a4fcbad8aa2c03ea654550e67456709fd7a43396666083e726d887e73861bd4814cdeba2b92a5e41d7349918b0d7e77fb7a6bb3f3548a9bc3b3d554fd2f5d6e8044c677570c7fd5defedb901917651af1f8ab67043456e5ed402fbd767cc8304539b1fb9fc7e7e97cb49027db856f3a8e4dcb8a70dfa13110fb5b72e59bf0e968ef818eca07fa3a3333145001ac17659cf26e3df1470e5d70ff44516f065ede7164db110ecf8713c29273a89c7880d13f73a879fdb1eb3ba219bb7d0096d748a240fc9a8a3663460675eeb7249760ca9e0072de63f73d32ba82c5bda06063cd1b81ca3014196951040ad3040fc427c2dada7cf0d727f2908291682dcc3448b215c58aa25e75aa679a40cacf12e60863da448b66479d1b87f3d8d6226db4ad49dfad14595488afdc96dccbeba7ee9a8b9b9f4b679f2d11c01682d97eebc4ca0823d4371ea4072ad765457b9596925043bfce4a6672d90045a45d048461de7776aa0486ef94cd21da7bb5e734172daa0e8c5e1c2f8b6288dc078391c96b137be8bba0fb49b8e949ed2759e5a446c102927fdcb533591d7031507b6e13c2fa621da48e51d26fe0af6ff2605f10531855ff19c47e9aece125585d089b959703b129cbdfaa97cd388ef1ee3fbe8648333ede30562c32292c5598103be29ccbf8f885ffafc8f6d3db3a511aa564d57afc6a0b08cea23e43539ddf793a0d7fec972664b7f364f1ce15a83cc8ad61ef987c57d5f6609a0394ab4e4b6d4bf3d8724a250e7e3fd655ab6d4ab464e78ab42b8d480d11826d32df4edf6e6c8b089b90c89fb0ddb0328b779dfa65d108cee82cb24856e3a849ac006cb257a19d52fea16e211a0e2acafc47a85c4e09c53024400d6e2821f0c2a1ed39b5bf15cf5704bcb3a5aa91478b7a9263336f682688cb0c79d5546f95550a3edcb431975e06a4d2731243541371293f5d8a623e6fd17a7e3f44cc4b5d626a0a1d574daef8ac038247eae1df28fb71cd740a885feb9f58e4e3981850f10aceb6d4537a5e06989952ae03d95194de55065a778bbb59777d64d0855c30bc569b04eb0bca3678ef8f78e244e030fa85baeb63787bc583a4146dae55541e633f8be044caab08fdeac5f4da5b6a2cd8d94698bae282ec9c10eea206eed04304dc08831bfc19aab4187b6b6b5343eb24a18196b15692acb373d17eb658dfc6b43e33a56c810bf28087cb56bbb1dba7a04ce12229ba30511086a8c1636649f4393391dfe9d7f5ba836a2bd34cfccde830274daed648c4baba043811e88b5ce6b55637abfd11f7d22b1f8c2c17fa81d61e8f365ef6752bc8f38c8c2f1a9f584a5754847b721c047950782403084352671ecb708cbab3b2e94d21715da38991bf538ce60e24c78f22d4f2d3f5dc8cb656206024c860413a7c4ce51a97311cbc0d0aeb8b851eb5544a48bb568d6ba94ab0ddd30d2be09edc8dc74a35061dc663cd2dc03b86e0e2b20bcb838751dd460ff31c0e22515e9bc7c242fb1d1281e6d92bc0cd3126fbcd72f712a13427995d6ff3a345bc326b745827c60663a6826c48ad625992f8f22aa96cb7403422702578a1f1099791a04353498a0ce44861d8048c63d5b31b2f747dea9cb73cbcfa2766b4d936083873d5f4ac1197c063f6222b05c9c178b20b41935d175ead17ce1967901e9072fcf407dc921b4ca55f463d7278d5389bf81c52b3a81812202935c312068fec12e61f0147c8421b984d75f96938d1530a3d0e0f17cecdce549f4b877bd138ff136ba3f5f0e7e195ef360b30b3d971df80819bbbcf738fe5f07d548c5e01025d26cae9bb16b0334ea8c5fa5b4162ebf55e42c7b097e01439be2ed8d812767111bb263d9081db7302382f628ad48d338434d485d4fcacb87f9db5315c2cf5b47b4b2ca07b91eab318313a72f32803d07589094a1172d4da52e1f5465111e75e44447bc7db7a434ab4965da29b571101c15175767ff2f968d24e1c3918c6b745f01ff817b63e37e75e6cf73d8f17fbb3f2e765c350ba910e47037ab070c5e37ae325392e71b844a68c4a55497478d1bac3a468063e547dc9641ca7784acc1df03d3f06a9ccb2fe069df061d097c25279ef40730a56a48177b4f8c1c5e4cdac99e02910e18ccd66cbfff3291d0c49a7276984ed80711867939cec3a393beaf156f8562fae9dd6b6dad1de377f186809129aa53daf2454848f6d322bb33a21e8c0ab33c81cfc08ef1cff2473cc9a4d2641a99fddef74cfcf9445b420ff6d1f73d69ae88155bcbb99a241f19c44b81646bc3960aa25de8da444bed6638c0b1b8db86db264596820051c38558ede265a47185ca38b93a1efabb5d284026d9602058518579722b4c90176496a31975f6c25e095351fc32b2236d8149e9c9a01e78cd4915426a80492427f480381104d2e5acdbf82cfbcdd050ad1bfbf7c9a55b38e0ff76e6bd6930c96341c4268d83b07cf78c97ab9beab0fcb081c59650b060a17a4fc64e837ac1456cd1334f104e67165db1aba167fb704d74c95d1d6429daaa324ed43ebfc38a750c5ae91ceffe4752ff3c70623193ac0e6021ae1f75be3a26f5b4d0730747454970f698d99808e1c5cbe830432c54c3b5723017f7e09016823a884d489f27e16589a9b113161b9b98a79844b9337c4e4abb9cbcab044d08e91f49ba87e9d5e2ab222d46db3bd9067c712b49b215725093c964ee2ecbd88b9c2703b99437eb2c7ef81ad3734ce1af11b4bcdb2f053ddf955768694fcfa4e827f2d43346582865032e9f1c81deb3e9dad931a38c762f94227affd168206af70c4fb36edde760f4df2e04759b7031b6b0cbfc1787a26b6859ac461899779b84b1cf474dc1ac3ee4e9e336f03ee0cc16831e571070267e3010e05ae31da243fdd6e7fc089e166af6c8b575206573373adcdbb3cfb0051019239ce7163882448a02cec54bffa92d437e269974e1e0b46631107ecec08f0004d6645d92e43c37ade23bdaf045e79dff4e89b21c8bfd7855b485ca2e160dd35dac2011a1e3dc399604de1b966e3ee8442d259458977e5c9b048d151b2f77073f2dda58a8d9bd82a7e056910bb3311d991a47441d73a6a9efebd1ba01b14f3c649c646e61bc743e6d466e664a7e2f9ee675d319f79c8e8fb40cec2c7131521ca0e1bde6f693b6f4ea1320f54d006364f8ba558391fe6ea03a2c1e3d4f95cde706b821910dbdf61293295d3aa075080799d4856e663f2ecc1eaf503440291c1ff6fd995d4bda5ef13e3ae3c8c3c53757420292c33553794ae9bc4346cfac3182b86a2ec261cd0184c4a1f70ec64f879cf4ae2d7157d95ce337b1b3d76be0518c9fc3d3cb1f4eeb29579721201ad6e8851412d7f27a699ef57503dc33c5e77a77e865478ef8308a1b7b4909695b4aa5c739934be98ee5a41d2664863de096abc5619ce7212efb5c36b9f5e78568ccd22aaa57921cd19d6407d82f46358e27221ccad7ead3d5c7ae34cfc58935cb5d6f33b2f204c5fdd47423982869fea80bcce491bd901dcc02ada68b5a37e76dbd8483ecaa9f1790fd7ed97876842d6a7366655628a19f5d0cce788a57f08f60454db985e9ccdeef601beb91dafc119ba8caa24817e39452d596226ba5e5e28dda9f86b58965ad973a9f55b6c1bba5071be2840f4201a75dfc4f4b2148d81b2b632ea5d3bfd5fe05d5551c2f5f5f958b5a743d6d229b28927ef3ed3e6ec77d2c46ec8704cef3e088d504400a6629b074031d8b723a1719452efecd7491fe65d801755f61b9a8caa3bdc8638b6ec73d4aa0f688ce816264da86db3c2235cc479eaa06daf029c22be15d8b4861a0f930a8377907328d91c56e1dfa70d34045a16b6638bdae53455da031107c9e64f4cb1adbfdd09da6efd259ab3f13a0634e3921359599cedb25ca8ede2a9f7f1a4ec74a5fc9c099f7e7af2cb58036f5444db8199ac1fb30c6d2c8c99dde834b19884bcee6bff1a2868068d579066747483047c938a04ada10f2abb902cfc6b60636254828197453d90753093bbd82ae19e46e1a93b9bb6f325bb797a5a2ad00ba8d9d77e73072acacd15bdc231493945ea048c52e714ad9509d4b13d0b3ae3e73cd5d3e9e4d4d6d46934e6b7137f22e06dca3a611e589eb820d302bb1f5f1254841bb7fbb76b9635dfd1d6fab8fdfcaef8b3d12325ced0fdd200630a7e9028d53f1ba583ebd31925c76e87f6586a1007016a9a84fba08d5c9c833acbe0cc65b4180338a4281152a172bd1cebf1076e5543ce7bec89e163cbb3398a9e49095078288da40f8f7c560a6535665c7062709d04888bb9d14ab834615450dd70867bd73633b9215f82e4af429a91cf2d744e184f6b0cc7581e4979f07560e4cef816fe9be3c84daccc0eea1be8495796c61420fc0674c7b9ac86e64f368d98bf04e492b5cee509b9ac31154549cadc4901578441969f5bd16964f7debc84f5edc15c687c476c8dcd14c2e7a9f3f5dc5cbe00e90015f6d3cec3974c5d8d778a80dfbc0c550592ad4f9d6387a973717bd726f6387037db7d8da22683e08dc4f2faa11e0a593a813dc2f31038e8514a6f43c61793baef3d515a77e7ac9b70b5d5fc365bc7635f90dc9139966a8f1899745991b60bdf52cfd7f14c9b2ad55dd90a466cebfb44e54553aeda93c12ca4dfbdef1a977614b00c196f39e18258aa88e4a8e7b4c012298c007ca7583b1ff5d17647d62c165a4d66c19885f0d847c521d4e77b2ed0cfee02111863fe30d4950a7c5c90e5cca7cd9a1365858f4a8483a57dcbff4d06a6d1c1d5669814c4f9729bb98e6b5546e53270e88514ca8fa4357d0a45979b730bbe9492e9b099817c00bb33908271c424cb01404686e3919d04bb1a5fed470890b17bb14919d78a42dec7c2671c587b3abd0302df8bc6516dbf6b648c9ac5447a784d5c9b1a0417218904621a61df9eb2e1e390b8cacddace307b7fab4374cb03f92fe712a0572783b4b73bff0a133fc020cb7ec211ae3c4bc350b6caf2fe8e079a4f08910d200591727a791870d0fd85466e46fece504ef01b05a710a04d74f6f6dd678cef6e7d7d9a181c75b317fbba60c3edd62bf447c1a778fcef9fbfc1d9b52ddd73eeb36f88921f1f3f4a9c6ddc50d0075fed17f12c0f6a6fc111567f0bed5118953d73b094cb06fae1ca1e4191c0b4ff39d6a608233b6581ba6503644a32cf93a71a76fcb20e76bfedc075b4964ea59614665ed3559935ab058e9747e3c4ccbb84259b40883844849330648798423bf819922c6ec1cd6b8384b50014b57e2a68de2becaea8238329311f64c13eee32561e6fd10d4a8b81faf2d19229860711c28482d0e3f9cd9fd7f5cec73d408a56cd2ff34082918a0d2ee52d6ef22629a3c8b864a8cad7e9015b91153cd3c35d6465dbbf88940ad1629d81fe10","title":"100. 相同的树","link":"https://leetcode-cn.com/problems/same-tree/","question_id":100,"issue_number":17},"15":{"day":15,"pres":["DFS","BFS","前序遍历"],"tags":["树","BFS","DFS"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。\n\n例如,从根到叶子节点路径 1->2->3 代表数字 123。\n\n计算从根到叶子节点生成的所有数字之和。\n\n说明: 叶子节点是指没有子节点的节点。\n\n示例 1:\n\n输入: [1,2,3]\n 1\n / \\\n 2 3\n输出: 25\n解释:\n从根到叶子节点路径 1->2 代表数字 12.\n从根到叶子节点路径 1->3 代表数字 13.\n因此,数字总和 = 12 + 13 = 25.\n示例 2:\n\n输入: [4,9,0,5,1]\n 4\n / \\\n 9 0\n / \\\n5 1\n输出: 1026\n解释:\n从根到叶子节点路径 4->9->5 代表数字 495.\n从根到叶子节点路径 4->9->1 代表数字 491.\n从根到叶子节点路径 4->0 代表数字 40.\n因此,数字总和 = 495 + 491 + 40 = 1026.\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f22961d3385f35e6c3f607e596e3c5597b2276efef2331a0b8a62ef1a79d776d08b1e7eafe53d32f01344dae2e935e02d302ad4d8c4f61d20cda18cd05e7179e7728bdbb11e9136b520c3f4ecbf98546fdd066ea1d63a267c0b7aabd785b36bdb462c2959bcaa14a4f1cbf60cdf2996ba455d5b0e3d67f148fc3d88943afd2b4d6beb6e6f476ea8a50310afb99a5e7f2b74350aa0cb59227e4ff48a671f7d07a1d2fa79331361981ee4637ef615175baf5dfd4877c855cf906a36805e1473931bc2504e2f92880b768e258794b40addebd65eddf9dd0d37ab44b0904c4c55eaa9824144618fc4f1cb22acf58d4dd7ee0edb9a0775f30c477f5c0cc452b7d15d1c2c61ba10fd39939daf2de5d25d14bee12b0ae6c2bade458840151bf0287ea7c82c339ddc6cce8563e3c476896899127081950107507e95ac50efcae25e81ccf8d1f1b4eea448d176ead7681030d857674a51b8df07e532286b6a1d5aefcc16c5e61ba1600e330552ba7bb1a5b3357b8e03454045d7c97353c6712bcf686d897857cffaee76e0ed72418b76152c5898e81c501642b0649efc7c7ca05f3c05f1cb8dfbcf3aef68213c41b44a52a38fb11096f1ed07b263729c3d6f706b603e0aca416c064919543def5a53253568d45df351020e98c4334e1f5ab674274d2220b2ae37bcf2178ac020e879c6c47ecec44a166669bf62c33a857ccfb2f9ed180db6c0effd3863d57437eac890e8b9d757b1cad69798b3c65b6ee423f1f5b77f6645e575138e07988d2a0a7228cc0e3a7b1d2efcf9f7a9b86c287b64429864543a9b7b9f2b18f75ef7b8204efba44355fad391eecbf6fcd0ec8428b57e54d351f3a2bcc887607867b9b804b89e819ad08288863423b411133ce0acc94896556a11ceaac0b85fd13394101f61c00d54c04eca5e17d2cce76ae9b999a63f184134973d21c67be1a7ceb271d50fc5937886d307558d8ee92d92f3fc1334ea6ee48d821700479e41d3bb739c4e568dc926ceae7f9660445926f5996737654c1cc849a5de944966a9c58baa54b206f3a9229f2f6423fa9b2339b103a23cf362c47835c5888c8354b6792fe7b88d9c6211b300b037bca2de8a2bd74ed004ff6b8c4cf3abe9df96460e314702443f9c061c162d4309b8cee86f1144b3e0af2e6353e55a9c8893f5834324f53584f264a47b817f6c4863530ca6f5b65cf165490b29d30271e1aa3c0c9f83b251ee30e461a62cff54a89c2727bd74f8890fa4aed3362d16eab9cac36a162dc3b2f9ecb7d8f9f1d2cdb37d76fd8c72fd509071e69c6ade8c8138da7b75ad58504f2fba607b2fc92bf74346a97e9ae64b2255c5f2c0a3f0c3d0efda484aff9e7d0511cf2a808865f7f6e5b3d356e8fce5d8c67344393aa31702fcf38bdb6d0257e7937061f6c4112c80eafca64c1ef3fc6dcd668c086bb662e8f0d801dc1b65a9d707bc02e5db5c958463ccf8e66a37ecf13c5ba1da1c2a643fe8adbaf9c798e87821d3edb2b97a41e15feecbcb1708ca09c6c2023b549e5d8ac3bdaa2ec2cbec4aa9ab8da9e47688a6b68a08ffd71ef1f5af6f25a52ccafa5ae6a8994c97fce2576829709889a251a6047986b6836e5d1b3ee53f2a47d3e3da8c7da270a3e419140b4f9d7618ba651b5267771156bae277a9b4bb19190525b5e75dc98b4b71572c1adc919174a8874b108efe5e9d4d465b0ef1bb618f717c9c6b90fd1ece103d6d2d831c930699c4a02d53927a47bba4dfefb88e5468962fcd2bf18a87ad03600ed56d64328414bea8ee6e4cb0846b4283ce15a5a4d62b4b8c26612d86bd6e6659ae721a5e3f0b542e1dce5ca4a0ea148f4e22264282e7b12e0e2d0e3fc6c8aa2c7a22ac838767865d45958dff3e46ada2cde4bc6043428a39ce64f171924fbb5d11cce5dcbb5e3c1a53af8f6f29401aedfa50841eb408547a895ca38117edd32afe33021e9f954feacf763b0e4706c62bbb67de02c0535bf7bc324b3b5a1fc78d766b8038946da54782c08235342eb6f128f21c6c42be697458f13520cc27cd293f95553738b6a01cfd8afbba28e5055cd7d71bc74b9250aec9f96ef2d813646625044092c89d3f5a6d2928e1fce0c15851d5ba08d50d75523880f9c6aa43ad871c3850d272cbc9371854f48cab48ea5dc711f5a3b61cfbd869cd2b438ea70b3a8619a1c75db8597d2a484bc783d273ab56b70157a1eae363bcdc8ab3a8f2e489a969ff140a1cab1b9c43a03cd0242d634b69782ce0fbf30e06c4b2ae0499cdc4644a950a40b63f676016f52bdb2a3b821b3b836060e43710b4d5a8534f09023349a6fa41bed63c56dbb05304b95eca6a136d2d731be84ccaaa37e696b78e01b94abe2738578e6abb31ae36ac220acc0f296fe5b5fd688277e3a6a8a47d8b2fa9df1d694fb038ae6f5c315b976c78a5927e27c49be78050d87989cd6a5b3b316ce212979763799a0d219e901898a3450c534fd5edc06c933e39afbd997e4746d1d3123937fd62e93ada84a3fe6908e20ac35900ade4137bf959b2afe12a5304ce4562fc1c37105cfc58cfc88d44242df74639724102616098a80e74b5cd04a2909562d2039a1296a37ab9f86ff04626e2f48cc3ec459aa39680642494f0b20deef0bb79c4e9394deb0efd5a77be9a5b2f37832b00ef66a93434253556457663e30e671231e3fa62bee49eb8b4b571ac95eae7c1e15d2efefbf984e933f5001840f4406c99704516b6bdb20fd5a86a6a54b4edae6cbadd407827cd8172540ebe264486544b5c6a75033ed7c1f3ee75f92f7694c4bb734b3918636b4dce5f968d0670babdf6af5bde250492f2b585d5d7d20545348a9b221349bcb77db129ee1f64f402785674d2d7c693a075c1b37bc065891dc179ef4cb0250723540b96bfbbb1ca05cc0bd59737c1bb7e602f50e766c8cd18a0054a02c9789f5d2381dcc0976c28599ae3506114dc0594b9aafc848d6f2444085c67cdede390fd6e62cc18de4178b7b0bcf0436edfb7cbcf9ff793df84c331907aab18e425a2e516720d9ca3c6c991b5817bc397372f7033e8e95c844a4ec525a932972fa7866bc9b606d42c138dc8827bcb96838d7668489d56b15c9bb17dd42dce70e7ef6dba923c9492a9c5e4ddc092aacd7d92b25381c8878da4589c47bea1c74d97e1c96159e743660d1a8b7d04930c11d6f49db832a204bdfb0fdd21f0eefcb827f0c467f2d3b71d5eaf9471c140faa8153b7a79071fc70a7a500c65b448dec0745579104ad616819189ccf6fc6856dce40abb94c6142b8d4384d1ee358f904b1e472f1ea567d075c88c33359601d7fc9eb71cc4e5cdd08e4d6409e72475ecfd9dd1d5c0b32ead630bde2a18f1c7893ff7c7549a3b0659ceda818cfae95b54b7145ed66def8f83cb77c55b5de4deec9915a4d3751a336db3e1216fdcc738bb6f1f7089c2e38d810a529d650687e23bd8cd0a20cc07b95d003e789bae7b037b3e9e04acd830b6c295f5c25c79aa6bba737282f86a542b6e5312319a410e700e22160d376647cbdb6e5d98ec5dc4c1d43e04b210436d1e24e6f60c38d5b403b2ca74b5ad4e6bd9f168c5d3570e2b365addb488004eb36bc3abc05f768f289c312cd9dc676e133551594f372a321deb7d636b103110510d006c0486027aee3aeaa7fc25dfd895b75b53b673b29a6ea1abd6969b66d4a6ed721e7e2ab2cbac15269628f74f268fd69539b7cb8116dd53f43d5d841510cbb3566f66bd6b04911c415f91c43850e82f767d55aa7b913674c0750f11c60142cacfa5c4b3f3fdd3fd5dcc14f8414c7c74d47cf677d83a566f2513cd83a5635589aa0e3f3d3fa810cf021fb0256c12eda102f4a181d6be8afa86ae60bd51465cf3785db0d5244586a7c2b9ddd785aa4a8468560ee64720b5d695f5ee8cb9ff9720415f6e87496b14770187aa721cb4d1fccc42ff678b03788524eb2611c40610b4c63c39b6a3c8a76ea9388d9149dd8c75580d3110b786da4cc84e221227ceaa66dd64ea6d22c73ffc85e2c27e7da76a6cc2714ee8df9968e3de2e3a8519dadecebe29a4868fca7dc5fa610b420efc71a123de35d4e6ac696a7b588f9b4539817bfb0f5246466a54666d90e0f8d1b6c3ec95b42968f86c4bdadb579a5c6a08d1922e8ffa2f2ddd1591e138e8134a97ccbfa393f0d75f622a41cc717cb441c556ff6d60ac620fe1b44e5f21d8acd0d5ff83dca93c245c4633dd677043c3296945445228e6a9c9d0f958f67bc3b409c26a5c86042efa889de677c76ed0db2301073149e5634aba92b9b2e70581884e1eec28137fe0fc8271922da478d4418257b2a96723c2006dc8ccf45aaa7bdde472184837511a80af4ccaedbda8b4b8909dc410685ce01d946eae8da773982c44bdfea55e62bc7f1650e646793f2a143833122f3bb79aa8a3d62105a1ccef79acf1304dcb5640fdd313744c308f93da31b86801a37f42f1f741390fc8afaae954df1e4a62a062d3d1be4da130b2b0aeac64eb32097bb04d32d12628394a84c507efbb7fe709a101844cb847173c3b262621bdcd51d543781907de332e9404734c0c9115c822ffd989950141b8d38b4b47b4d4fe71a6dcbc7fae30ad8fda39247e277f6117cddc11ca760045cc545dbbd6470340ba4ef9900042468e4062ebbe252ed1c94dfa1829f936fa302c2035669dd7b6ce5e2088012cdbfd1d6e8744ff4bd4e71144119f8f64dfe91b4d1781ae1a970a4f7952b84d58ff1eb32bd523af1e6ff251fa860d3a922f4c81e165874290ef71816309cbfe52541752c190a48c2b18de8481ff8b36beed0ea468e22dba1d4692203847745fae25df878aa1641875f4ea6e1f0ca0b145875f83e68696cdc12917bbbfd43214b1e7e7d3f6124dbb116f408c9ffc10402712eb5f35a006eef04b23c9fdded4e2d4818ac17c96fdc4b83f2feafc5be29a798a435f071d77e791412bc049549d95bc204352bcc3c70cdc960d1182ac059881f185a1b4f1b0bdda1039e03a2dbbd54ca6c9220750765e29be6d14bae4f9992ea5dae473d64f2f2b0def7c8b48a08403992c39fb560317b7400b0784aff9e87cde93b2cdb8bbf2d042adcd4bed13a1ef9ba67b6e3b1499b2854c15d738204a5a498c3d1f91f6c4a29031e6f4eb839493e8af8ccc0452ba627bc4684a1b8e7dc2b523d6929892acc56c6c85e6acac62541cdfeae47fee9cf4e03e0fbf131078cac646b068a315248a9d955e9c5f266f9455d18c7de015cedd396c8ca0c0ebb0c8fd00610ea655ce9f81ef5e3c0aabb10832c53486a6c2e5c08f8bb5ace577676f3c1c9564839e00983650ccd8285b44e3179e90fac1e2588693c63d68549344b7667af00f4981a9be30b9f9f27c9c282f9aeba349d987701cc5c750e7c929004de7a3cf257b0f3a2456ddef314e9f5000fe1840b2e8ff65ed39c52e934b3f83fdd21076f3c34db9eaf776a4765c0d60ad2deec390b244e5161c59b63a5714ae69757464f7e172dc314d12f8ada9abd3a0ef635f7d2754bc42c1e5326c245ef326536a2b9cb029ee75fc8c650c1adaf509ab84e016b976915c6d70067e5cc9803fbbe6c8ab93164a0908e0e00d66ee6d56ce8d6ee2b4f1333b8b4669c6b9b0cc9271d9da38f6d7227ee0874fc812f8289107928cc741124b360f30168471e3ed7f35c60e0367f05b76626e8e16f5c2cdc4fdea7cd8f306a331a592543266a8aba2ce2d185834158654f2c99d16155d406d0a01adcb0556879e0ca881a35820328800042daffb7c8bf8850f574aee6c9548821babbf5f6ed1f7f18f4c638785dfee8f4e5ea2d7a2d124cb3f417ca3ef5f849ef3de17b252641d93c316103f244fc0a3c89576ee5893fa6ea874281d6ce8b5c69f2503137d767f3c4ddefe3adb5773991710c03c6b76a74b0f385afc5b5198abe1877c044d0a5a20507777409e8b7db1ebf732085dcfe8279c0204557d9dccecbc9237804a96bdc254d0471d7d905674456bfb16f55e911742831928d2029f8e63782d12dddb4e9470ca6c7adf3f2dfd06930596c644c1201316766c7160573bdf19e678c370a82f2e7d7cec767cdad7d87e7efd9ae4796154a59aede283a304a82396c2af11ce3a9827ec2d0b6031adfd89dddd38ee32cf971d970355ace258c14686a9aa6c2f6667fd081b12e0614ba24def892fbe4d67a67ea2974f5829a3ba9ce5ba306a84d02bbc0d86ded33a67a6dbf6225a6ca4b195a721ead3b3071a863f23041b11a3393fc3f831e901875c9b40e815b12f4dbc4171c1beeafdae8cf250ba9851cdd320cf03ab4159a1c642d012297ed455d553e14c1e5afd790dba34461a274615452fed63703fb1c5fe89d93cad0302da4bcb26227279be7f772273c35493ab4d1763610b04c7df1a6f05f5610b35d6fb20f569d264101242c34b0e4375faed0874267dbffbfc9965fca33169f64c8755ecb1337a13bb0c9f0fde060a04a0ee5c05f5dd2e81820cbc5a242b216a95db1b5846e28aca72c27e361b5fa130c2dfc118503d58cf6bc127e73e89e3afd02ff9faf22f72eb49f813963f3b9e8ded2d6e0538dfc5011580bc94a027f5dbe1c048dcfc9331d770b1af4c848081f487efd20670fb56127de5a8f12718c0b3a561b73a277f4c97df5fcc5a9eed6165ac47fff8909849a1105f2ac397fea001d34031b26f652dfdd58592d3ff2c127707caa38f352317a97ab7817a82afdf0c9ade0d954ca576ba172cee629d21daaa3da107a6c268c877f340e0deeebfa5fe09d82b72ddb8ae3913df0aedf751a5c85ee31fdce3585746ed28eb63118d9cfa6c9dc83cdaae2fc19089d7ffbb3ad942862ee65a05984142a2b96f6d54b092c295faf678eec1f4b7a45fc3ee7c681f6fbbbc308aafb005becb9ab7fd55320af9cbfaef47ef2ccc7d59731d7b1448706b0b590ca3ae8a410c9fed512adc67e3fc628f9317dab3e3cd3ac8c43b19820759aa9bae2f6dd9610e9e5235c35b1bae2370f24778d889c1bdb5af08024aeada9292e1f87f89cfa957eaa070c670472617e49e5faaff72fa8778b4b9157f53183ba2c143a4b4eea3cf70b9b34122b8d04e1a961f14ae688666b59930466cf8c3b80f32d8bcd1e1b0b10346e65c4b9f8134e4de1ff748a0df06bb65d372fb59447dc4aedd5aef9984ed88da9462da81eaf67a8be5b5d41edef969662aeed59a13176bb9c6981834695dfdd109263328bf04c2fcbdc76a266f2f30c69a38b6134e8920c36ab7db2ef78ac938828a83caf2b5272ab0af7ca943077d3432b76a12e13b30ef968c8b439283ff356cab2e2cdfcee8b23edaacae5d1d2c22451271049e3d3066575548446b235880e9e2a3b54ea11b56af3e010b88d4beb07e540e98ac7f960d9fa971a3ed166433ef3f5c248a1c985ca0153863c03f99164b23d4b7750938a8a0f5883ce22132bf6302e1668a56480edc9b5233dbf3a0d7a162baaeefeb8285948d6a6106e00c0ce46e503b646ec7a74514cef0a8c3e6bb8d3f656d14a95fcc2e37cf84009c88049ef273912cd976e9ebc502fe2fcf3ae681e9055d7e0c2b6c3c7f2f1f7c937b44aad82c6e38d6914d6358e042425ba4b600990aca29ee804340b87a9676629b5bce505a1084af0433da3df63535cd9b15c6c092e0ba8524d8a50999eca0254c52860c7ea6818434a032a394353dd6f168320bf5c4bd4e2052c6b45684c9fc7b4075a26e18770e33da0d1a573700a451a6b028656a079d52e3120e467215b755bc14617a49ee1e550316c13d1f0d3a3d488646bd9304fe0f500c81aad60418717b3e4ca79e88a9d9b76f6f2be8b3af27ff32e2645a628d6b7a837786f67630060df8fffba43d5ac738aaf76933f5b069e59be94b26d3d7c99b464c84b0bce5f3616ad2556d6af9faadb35a3aed7f672b990dfebce46528540de0c681f0cb6fdc65d01908ee1fd6af1bd01c78ac6de5447570149eea9105f402bdd5903671960f4e756fa41d19a8c0e30f568fd3b7827e406f85ede4822f4c1d1a0b9fcf49c5538de93dededbc56a0dc4c9c3ff029e28bd377a0d0b58be90cef1df85b239a0b961f4714c57aca4e4b67ccf7de9264b064577f5fc7ebcb3fe037aa9eae495801e1a090cbd0b844afa7ff96acc22d63be3ce2d5357ae4765a4af6b34974f10edcbac170c54ee7a54bd502885714c553797251d40b6e8cff74e0dc7b928536eba7d6af98e541825e3da16794c912bd9eeba44b98357766357533ea3ac6f651e64cc45351834b7a1f766ec9ccbce8dcd1f1943a8e51773843dc354e29c34b7d17428ac3dc5b6058eef76540127627a921ee55843751e4cff96b82d3a01fd3511a836c45dc41aae062b9bd7fdb28835bbdc9a7d61eda937af03959e9e0451f5bd41ab6ad6367d88385f71ba53e37b0a38b6149ba4b04d34ec28532c61a5a7732502c39c686a3d9d98fbf15231a669d0d005131b65ae94c9076a5fa538c06f443a47187ef89288e824f71f0acace07b6766aea6774b4eebad24662ee2adcce729878f6dd1fb114ec7c7a8869bfae43379f0288862f86f0d9462490618453ba1d90a0685f98af18935b6111d4b385e2f1cf1720e622a3e6d703663da3734ce4fdd9a66deed63dbe9a11d7b47f2d148737af27a3099a111dece91fdd500af7a1875aa44c677230310cd9a9bdf95533d0136c5cdab194b2147f1813820b36237917b457afdbacc94e79a33f8c57392ca213ad536cfd162dcb87a03ca5b58e59bf0ab27a0cd8e8354897b7e7660020daf1f1980f86f16b31d071236fb4151407e1b9b1f2b9f5404cfd61ac2c959a89c7880d13f73e67ffff4ee75ee41e02963fded65ee46f187db276e5b0c1bd5940cdb6d868d156b9707f76960efc7de97a06063cd1b81ca305d5f6959545b9a175fff01e6be946fe8927becc1dad75251bb7241b24780def70c3baa21db0c998a09cc5549f0448b66479d4ad2b68d933e19e6e80cb1ab161c56d8e0c98694ce93eea9d2df929f104dce7854ce46d78a36e394c31323d43711ab2d2ad72b0a3fd09b8c535fbd884e3e3fc74958ad4d19847fc15d7caa4ac9abd1c03fdb72b0b05b1725ab5fd91b126ac632dc850f8a98c930137be7e5def519edba01e56916a1e14bdf24897dd18f7506727a311c3e2847acb52658a49351833aa5fc038a2f11445b114eff48913b94bcae7550545af7959f02ff668f9aa789817dc8d1bc7cfde80639349075097b27283f73835d7eb981c4a6ad8cb4a8dcb9d3c0761d2ba535803ff23a4458c6ab2569539ddf793a0d7fecc47329b7b13ff1885ba03c83e759e190227dd3f0609b51ddec061f0304b79d7b4a7e535430d97fab6d4ab464e78ab42bd0620d11826d329c0191670fef5dde8be29fb0ddb060ce23c8a82bd15bc68f37984856e3a814865d77987d84d238be8b442b10cbae673afa0a999dc900908a87ff9b647fb4a72133bde9ad150a9dd7335153037c9a08da55f986f7ebff629f33365589f842bbf4b77402e522938a791ce4dcae3a7c7137afab50a280f214a5f9f9f96e8ec7e4a596a75322a6b6a507a818af7203e07cc61ff0c276dc4d179d7e655784eaf565c6e7dd57e4d4a45e25f26bbe76962e7a93a5aee76820cf9aa1ea4348ddec44fd7be9688665b5a1051dfc7d8257a630383ceb2d78be752f6dacfb6df5f6651cbe1d2ad50243c4360b453514fc92fc5850f5124206137f01d553012cea9e470419b82fd2448f6f05cbe1b2dacb8901aa1142164c82387b6df373f6219c28464a95ef07f549be7c46325b91003f1e1b288a5f83bf64fa99e3763e2ffef09818b7df7055233e3d0159e7f637dd5a7f2eb0998d187a8e493e7cb3aed60f0599492393ba1b35bb0750ddd319d8b36866139c2f929b61fbef0d741413bff56db40a79308163b3986e04751d6c304d2658047de2041b035f366c88685a03f599c2f27ce4a611429abe67bbcc43db771f5c5f6caf7cfc3f222c091de3a23cab5ee7376e411046ef1181e0a27cf914bc18f059793f273be00a005a71a6e8de8936db2bc458fa125137550ba44947d8f3a39711d6b9b488c64592fe3d64cc95454f3b903331fb8d025fd5169e66b6e1e74c2b5d0e8452a1b6e8e9e268f0e03936a59347f4807c677fcd3ae84f8cab47061ee0655350e2880eacc69f45f84980d67ad150b1131b8ba6ced63e201cf9443bb0876b4187f7494b8bf3acc93e02af20a6c4","title":"129. 求根到叶子节点数字之和","link":"https://leetcode-cn.com/problems/sum-root-to-leaf-numbers/","question_id":129,"issue_number":18},"16":{"day":16,"pres":null,"tags":["树","BFS","DFS"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个二叉树,在树的最后一行找到最左边的值。\n\n示例 1:\n\n输入:\n\n 2\n / \\\n 1 3\n\n输出:\n1\n \n\n示例 2:\n\n输入:\n\n 1\n / \\\n 2 3\n / / \\\n 4 5 6\n /\n 7\n\n输出:\n7\n \n\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f2695173385f366503f605659512a54a08f2a64fcfd231c098867e6334038d12f1bd385394d9ef220ff2ba4e9f225f573696bd5d7cefe4633d0aa8b91587224ab7b8f9aa5419c3bad31c1eaeea0885f36821d73b09e633f300b6aaf9ea2d73d9504acde8f7a209760426df41dcbca1c028ced387b253063ea28b7019835d2285358e24a4c4b69b1a43c32acba95527b00762a36a3f543227e4ffb886e1f7c2da8feea78093d6eb527e3685df60f34589944fc7c4ec952ee9e6c0081540c72ad39cc454a2e978c094a91ca02207392bbafe9327a4df4243a6d0297e6ebdf7fa2c2f1adc9d0c1af82836edcdc80840916b86b362e5cfec539791451cfd1b7f65edbb425ff2593a837580382e4cf75f92f2fade563cdbef7aa2cba91c37a2b7d94c938259ceb65cc9d58e8c276894993134a949c1204515a97ad4bedcafa638ed3c5d1cca2ec8876dd6fe6d5590417f0d7acef13fd8f3b896a043c15342880cc79a3cb9e4d1a0b6d5a62d7fb397a318f76bf264568700549fb9464e8ec67e6a51ef79d51220dd57d38e9c243e4b7c208a69f417d4aed0ab039a93ff628b2925babfee37d7fef59ee2d395cb76f4e7c0d0bd53967288a02abd82fd0cde9a3f7b1cf54ea6c6b6e074630f14953f3aeeb1ccf5197b79e5d498b4e0e48aab7fbc5080a7a20a27b7ca05b5b8e2eef7501d65e01e580a3eb25aa699842de56626778163bb5c2f2c3e4e0629869c3240f383c1aca5f507e52487976d1e6cd0a3a7ae51963236818b9616dabde6234044bd94751606350cfb39394f53b392c1d5af7216b5bf544d84f219e20cad84f4d86c24030705ba5c4c9ceeed2f29eef1ec0b84539a8a1d7a99adab09d0472bf2a485420163e2843b28f7c8f8af45a7426e80a84cab3e49323c74fab748b4fa3cc17b0d8c04eca5328d8125505583d522660747761fa0271834796d5c0d60ad753bdaa33dbed6bd430a9fa3f549ef95554fb2f80bbd64a2d381ffc060ffd9f59748fd11fcf9e659b65705b09dc7be7513a4342b456ef8aa828fc1701341491d83bb7ef03d0524576b08f50a10dd83981fe46fd7a20cb8ea7a15b815125f6a383a3401da60078be2877542ae44ff4069540ae04f63420839ea2245720e3d6cbb47146298fc2a6cce2e457e0991eeaa2cf7e3907d4b4041254791badbc55f01a50d024d946c4f58cfafce3d4e47fe4021d13447d1bb9f9ee9616e3fd9712956689b832d4b01492377ec1f90f2aa7bf62e1a6b4561771828d9664137f2aa4dbfd3b300b33340527b32a2eb1f93ab500dcb9571fa211411fd926fbae5f144a066fe702b7fa28a932d4cf44a80b40f7e7d83b7f32555b241f6201c9df34693519529e77c89826be75366412fda4a1d40b56ac9f7c78ff4a0ccb375e30f3d6a2676da5e855521d069de7d2a94f27eff062e865870dac2ac4315b4c00ef08ee7d0dad4cc4651a2f0d0ab44b480991f76a5692973e75da5b6f79a29add737699c157e64e4c6014e08746fe354e607d7005817ab2466f0dc10153513b802fd4a009d506c83870639b7f5b7156c2731d774765884501831faaa470d28fb866dcb569baa7a3be630f4e9026ec8bdaddcc38187f459653550a93b49305931fb066247c6ac4de64988314efde9fa29cd4c17931e461487cbebdb6e0756d971054f8da92d2f3470d6ff8590490b86d758a4586bf908b5631a90987f27f8d1372b94bf8eec7e84c9c7798102e78af8a6ab4fd444648607d10bceb6bb146c93318566d9ab9ee10e9f28f68ad511a42abe1650e96cd441efc393b26e2f120f1cea5cfd914151a3e8eedd3eecdd7bcfdef7490f4669630c191a28d3e1c5ea097ebb68c00286cbbbef73d7c6fdf6f8261f3cbba69466f3f4e6d79993d040bf408ef7f8001a87c93fe38782c44620a99b44a9820334493255f28a5157b94f80ad04bbe9c3582af0cb9434b00de8343b7ad087b480145d83ec970fe06c545178aa32b4d271b13dcdf410486289a5aa57996b8cb727c7af6a456f24f390fe35e7448ea1f728974cd7d7182003601be980cfcb3ae9575bb304289b875880fd719fbc9da64f0945f3f51254a05ca9cf17a0c6c2360c3aeafd3265dd5f8449a72271c38d2bc95b169a2d9622d42dc58b2ec235736bbc2ab2bf833a80bdf89f60af4c174e72c499cfc2c68b01383dd4db41c33704846d9ca916eec189d4f02ece3a77dd0dcccfae6b686c6fd74f6596e58bf00a556e569c7692a7355616f06b2b4bc5a0fde98ae4ddfcdcc6518da1441fe746e254da168926077c60a20857b23a96b1db6cca91f475b023349a6fa41bed63c078ef50612e2529a314b23272e04a7099eb20de69db7dc4ef61eb36e265f8e349160fb73f96710e60f296fe5b5af2dd622b1e8b3c238c568fd971d744fa157e0670d641ec22971cbd42d2f96d4a8d45dc635cc8b6c12687f24af43c8d2272ce1165cc2891680845b5a1203dcf6ea6c933e39affbd62c037f82920e762ae821b02d9b8faee4225ce45694730aadf5037bf259e0e0ae7e5e1a98042eb6524f1041fc09c7a7851a003df8565f1d6d173f28b2cb4130f0d72e88d0d5229842cc53bc8970b3b97ff6145be1fd9fc3bf20d4a3cdaa642494f0e258acbcf23ac4a07719eb4fe25c29c1f5556e67d33e1be922a3226662374703713f8460325f73a6a831b690ccfdf1db3ee8d0a3f38eed5c75f0f29ac3a167ef2a1840f4042aca781759f9e9be0fc5a1714054b4edff39ff88052423c98465544af72b42cf7019152d3d0a1dd7c1f3ee75a97a34d8dfbd2748241f27394cdb26deb9141fd5b9f8bd5f11ebf1f78cf9c5dcd3c753485f9a836a1b30bcc432fd7cba562bf3442b2e3b9d83c6e3fc25938f79d829ce0ad621d350aa7b6a66061596f2fae1ca518a4dc28f78fdf4616d0445b767cbc55fee630602cf7ed64138cec58f9d492a478baf4d6114824bf2f5a3fcdff73a6608411f6784a3b790bb276dc629911e31f8b191e6513aa3f6968adaf4e7df8ec90bd168af54ad40edb11f7256b6a3c6c991b58129868a247d367a8da608845753c56bfc23f126a7d42e9de3549a6845c5ead03484c28dc1332e70d818b6588c89348d79c314b5a1288692378582ffc0ed858efdaad07ddcf70481a48a85bc158a64b8a69d03c0ae882e7fe70f275e4e8b7704c6594088b1c1b639b202b9f50c8033c1c4fcb827adee3ad893be132085b66dc608a8e605431f3d4205ed203a104c62a52b918518117b1c55ca07c69794a9fde36e0f95ed41f281ad46728d17d694ab35c1df0f5b004b49a577d56ededf2e418001c3c794fd0a97958bd887564e09a36133ec82e2989b89e75194240a9b6e17b393d17fedf0578a200610cec681dfb3e05b03f153039c28efc9a9935dc65b5de4deec9915a4d3265f7f2bc9ff216ce68861fe011e7188ade090814e17cc304389b227d1cd2a67cc1daa1d5d254f9bc0344d3e14b447e09963e5c2e6ba8e406be32cbd69459ff87a5d6f703f1262cf0c60254360535f646e148e97285198be12d9d09d3e6de01b4947146ef5be402ee1b44afc9e6e9fad4e6bd9f168c5d3134b301c1e9be7805201fc3fcfab830a248632b6786ad9d4292157705f150a7137741cb832793e0e32564152516b04dc166ce456bbdea82d9197d1f2551ff335e6933ccdab98d9cf6686e9a22610326ff49fac54219428b14e3dcbc1d424aa829b0b9a1abd2713831c0897a55d3e70ad3745df583c0ec29b304ce824677d51a270f3627ddb5f0f11c60142cacfa596f6a7a8dc995d8852ab491e333bdd58ba329e6e5a6f6646cdc6fb3616d7aa577a3c6bcd44c1545ea1063133ada5048d83b0e98111686ecd0db5450a1fe07d25f3936507c5a7baf6c3cd9eb70b9c29412d9c1262f99fd6efc48cebbac33c5d456e8546765847019caa3151c89d90d874fe01f42c74c701f76a208c697f9ac93836ef89dcbd6fbe65c4852ddddf201563645df592dd5a8c036c293adfe608c90aaf6770823ae7fcb78f7e60a77a77e8051cebcfb964f3d26b74c413cf8ddbec089ebeefd11490a8680b1924fc71f02dc72687a6a5696a7b588f803413817bfb0f52461478487a739bfbdad0e7cda985ce7d31f0650e9fd47dd909387b84df2e92fa6c788f54d5b229e5131099d8a2a389aa8917351b6bcc717cb4088356f76c32e36415bbf858502f9daacbd5afdfc0af326f06066fbf33794398036945445228e6facbd5b01fae7b88b212eb7a1c90272ea1a29de677952b848e714f1c1b49e5634ae7ccebf7a26b8a8a581cbe240979eeadc766c867f674cf47f90be48a7c09c2006dc888b209a22992ab26161a2f18029bf34480a3c5dbe1f59986ee106801ca1d942ae8deaf68916318f2abe75a67da3a5056a31b066d64146b665f3411eab0e8e3960b2fabc62afd016683bf5b9f8e3038e0e0ff9ec9dcb64f75e8afa33142356fdbf1a56a680870927f858c9e76ad473eeb57acea78632f648125a2adb23bf5f74ba0eb99e8aeef0aef7dc871c0169510c645d4f9d6f6fff5bc2c6907f30c7e440aef142e538de985bb05d04c8f3964767a9bc7774f314f28bcc1dd758cf6bf7cae52cbaeb547722f6a7fe6f9231998131d669b60f69b056ad2a689906adfa32aaef40b406bc2bd3e37d3f847fa150af014e6ff89bcd9de31d491fe5e11aa0332f1f43c608b7cfa40d1f515497f8286a580e471303dd2ea20df8a83bf1ba31113fc60e83db976837521dc0e8d9558659242fa202433ac1dc8fa23ea6f6c92f833312fb6687f1e4deb9f672e18f6851bb2ea1ba469c7e957a54bb11f3e63675e9b34d08a9aa250327cc7c76e2b2da3b175847c8ce5959dcfe91c16b8a4d73904b3c5c4d1dc054e8228637c82735b5c003142bf4f5f20f12b9d6b48bae18db4e8bdc99f9002aab85359fa75d6a127c6ee0c9c280b017612c6ce2f3a9f146dcb153ce7d8df111220e0793aca8a22af34878ce9934e0483f7b6b96f3dba4f2ee3a373c094255517671d4fbc0479b791809046f7cd8e2af52c5d256a8842dd12b4c35bba7f50c022531dd11f025bdba2939659b2ffa393f1ad828d42f5927ab07191a8f09b2f11305dcd83e2fcb91287838f1a55c8403bf8764ca1a92beee8e68dbfa5e7a481c42c6015b41c9d5e8f9379910b6bdc47744c191e73c08059092350d4dac154362c75e889176bd38a51ff87cb3356a77cf871dfa5166205bc78c3d78d19812340b012921575fca020686a05323e649688cb63e75d473067999edf2b4ca5b912ed2f6730673c295318445dc3c2ac9cf7f9a12e5b8b4ad19e4234c4c8f1278f470a340162ab6b1a52c2f4a676894b8f35f6491dff6622c1546266ed7ee5a7474b6f920613a0f956069b2f12fd8b90352c7c81e58a82edf1726ce8b65790d563d199313115ed75ae0dff4c97b71a3a68b4f62b00882b207dbe08fadab2a6038a2b17236bed0b8be49734ce8b9e37b4f5a0a56526dd1ac4e6dc752a3416426575e597fbcad46cc54d2ccca991e776c895c0d85a33d935f90510899b8b1f6f8f6e7f0ad12a8602b0dff5c2a1cb60224ebbe5cba893d2d18acf2314754266b3935d0399654c7ee89769dca77285824f0ed7a9927cbe936cf229792bc501ffb303fdb0b0ac413821450f5359c03462349d4b800b1562f6060c7168885de2ded084b1e973c2be7fc665f1dd195e23b3d5d48f614d1d3c0e8f1bae83c81f310f09660701a4861f24e3db5cfcc9a3452061c6780a7faaf960dfa4961d1b57f33e9952841babbf5f75f1dde09f082ed4ced8f3ce4819a9dab08b7e8a63534d89ef5fc0d8a0d645b3586847adcf071d27261f85f99bb71fbb0acfed73ba6e32142587e6ddb50f03136609317f1997b174925535c21e10c03c693aa6480b6c14f35b0bf1feb3892e044c42062813790f499ed057b1ebf7325b08d0ad78d450091b05939aadf0d437804a96bd811bc33e497dd30326216dfe10d11bda524ac6547cd447ccda1e26515791c064dd36ca6464a06d49e57cc74dc49d10d9330572606968337466ae73a638e95ac26e357d24eb7c68cb5044d954948ff65d6e45a793dc8bcfe257fb23e5dfa6179a6ed72ab9242f3670e1e6f3889f74a72ce5de53c30342bffc3ed75e96e2b47a614639b80e200fc0611ba44aa9c60cbe164da63ae4c4471b7cf1c59be9a83d22fc822dac31addfc6702ffe9599771f3193ecf1a236aa95d03908973300034826f06372d0c931a941c70cc26aab59a1295be97730c2adf8f1b3caa850b7861d95ad29d529814159a1c64fdb002952fe519b07b5237a78843c41fc3d5c302746420d66a1267064f5d8edc2de3cf04a4cbf16b1727b7a70b77f2c08208618d5a500563b1e474191d3183b18a6387b5ad6e620a478d277555a58c455290428b5884518633beb8dbdd530b9ab626af5588b5df7b0282e53a13b9f1fc5064304bcee5c09e3de3bd38e54b74e24224425c1d54d190ac88aca72c27e361b5fe501d69ac0304c714f8067c079e76fcce4bfd973a6dea2603ea741f108bc153b9e8da46b6e4b778bc5535acfe88e8a6eb3dbe9831d8ef2df749124b1b251849c91ec9ebd9a2a70b8034073b7e1b66f4cc0aef127f9232e6500db846bcc09dba1276be106a787dcdd1fe45c4500c397fef3549e402cb23c3060fdde85d1d5e86e02381994da8f282345e635e38f2cc3e3f50c9ade0dc8668f76ba172cee629d21daf978ed41a88f29d94ebf0df5cef0b1f4bb03c97d368c92e06c5f9303edac7ba5c85ee35b9ab0500509a27ce52f54cbc8f66cd1ce3fcdec638fd6ccd083fa76d95f866db3080bce000ee6f53c7416ffd696d8fded31ead0bee3e64cd4e72b42146faab51a8aafb005becb9ab7b9136102ab84b5ea1eaa6980593c355b3e4640333e590505b2bd8c0617e6a81d6cd235a6af48cfd357f099898c6cd4ee7256c6424380b1ee6f2d932058df78768f530efd2b40e85923de89c9bbe1f4231f4aa48f9790bcf869e297a94aeab06bec7047261789df0fb6963caec23fb2be4b184f0539add01fecf5efe28270e7e65d69b9916a5bcf5768ff389178fec579623eb184f00b69ccb1d4b99af84d12e61a02d1c556ab8a4bb805cc9a40ef13926ffb59194c98a4de72e58fc9ae8fc7d5649ac6f9887390cfb5d41edef920202ae687d55c436ba4dbc57c612511f4d15b63677ded4ac2b18ced6a266f2f30c69a65d87f1d81728c25e3d73eacd4b76dd0c48399a7f83c52f5fb29fb502d6d5f48f96d179f190df79acddf2781839c7a75c41e06f58ea8a421cac2ad193f3a6404286a15921c3122541a540b6e661680e9f7f1a00ba30c5fe3656544cc91b09a7d544d9dab2ccd43a4bf71e69e442038a059132dd136985ce4507e63bf40d0580277f98d290f2faafdd3886aa36d2faf6f02f009cc02556093d5173f92efbd90aa63f5ace5f382c08eba692d43b64940ef7f4b11372b8be14b428fbcec98b5e5823c0b2b1ae51a8a7a3b8cd152a3881e9db036cf408d76f4eb8947b87bac7fe689aa500f12497d29233a7d593f806a03e48a2c7275c58804684384554f53b9b66baf1c8e3fef9b604bf415da7f6bc0358b165a43d1e26a66977fb3672b84985edad3cae8ab9f39e0fa5fa8f2e92e6d59874721e7c0932fc37cf78e1f3dd6f168320bf5c4a24a2b52c6b405fb9b903e1630ee7532260e2eda495f06621886588cb028656a079d16a51008496d01b715aa552e6052ad090c41738d415a413326628646bdc4119d69482690f0bc2e32120b4e568db4c8e999f4717045eef3b835e067d42b0b37882c658227919960314c489bbce18e3d5ac738e3b93d33a7bc7cfeffa60f63ddd2c289121befe8c3a1b6313e9a55706ae9e187b35a3abc2769328d48f6b1a22904541df18780d9c87d8445d01908ee6a84f042db5b48bb26f66b763d58beeac34abb56b1d5d97825964b42633ba25b5db6e4b14611c787ada87e092985e5b6cd6018100447da891dc55edfa83ff2e7a61fb6864b9433e12eb099be3ff4dce3caa559aa17e94b289d02d2521b0dcb62ce592d228aa3d7b864b064577f5fc7a28d3fae78fe9ee0065a0da1a8b7c2d0ec4aac8fba9eb7e06c61a43dd8982861e6365c1f93e7446abd4b9aeecd70810bb7f103d509da034ede7264720795473bc9f565f0d735948773eda3d8ace6e85fd0177ae9339db157e9cbb9ea4bca70244c1f3573aa10ecd368d808c55341921e1d597368ddf9adf4a3becd9b348f477f1943df34177ede4c3a043cd696da52794fbcdd6e40037f75cd75ee06d17a3fb182e62e95ccfb2e814f75ed2301994baab22df6e976db3aef5bb58de2864a92932db67410b0cd4e155f8952ede86c188acd85e7008f3e37b0a38b6149ba1a51c45ed4995b940d50562919776599cae9a7c2a5bf15231a669d0d000065b80abc1f953fafca589d5fbb218e6c87abcc78daca5412bef8acb32e2a66b3a66750649c8724662ee2adcce77e92ec2194fb1912bc93a6c3d6e3fe3e71bf68c67db02059c02d046a5d036fd798461a8ea5fef0852a9d5e440e630a7300f77c426a780f47703663da3734ce0994d422bcf57fc6eaa9713652effd4c3222be0528fcf354d69cdeb2810caf6b116e8044c67757515588f486de840c6f0179d3cdf81f617013ffc73745a02d15b2202f3ad790c69e221e9e3e78d15750a7ff7dc15d618299e25820dc71b4520d391cb365492345e92bbee4f0af9efeed7019a0be2f9c22af8ef2e66bd0dc1b3a1b5f87b159d4b5086cbe0a63fb6f3ee14671a4b51da078114141af0461f4f42a0cb067c2575c6694bbc180d407614cf168d0d250e8108132ccf62b5f5397e860a75581474a819ae5cd90dfb20b838969f20c9c","title":"513. 找树左下角的值","link":"https://leetcode-cn.com/problems/find-bottom-left-tree-value/","question_id":513,"issue_number":19},"17":{"day":17,"pres":null,"tags":["树","BFS","DFS"],"whys":null,"difficulty":"- 困难","description":"```\n序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。\n\n请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。\n\n示例: \n\n你可以将以下二叉树:\n\n 1\n / \\\n 2 3\n / \\\n 4 5\n\n序列化为 \"[1,2,3,null,null,4,5]\"\n提示: 这与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。\n\n说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f219d133385f155623c4f4e5a461d5782802779e1ff310f09844ded3747d754ca8a1d7aafff2638c00ca16c03974bf82a7e75888e8ebc0526c7b18a92597a7ae773c897ae01d124ab2acceba6a19e1631ca1b68b4972733344a7ea4d585b97bc5413b324bffc964e2ff897ae71bb26f1ed6bfb88c86dcf161ee334df928bb4e7a089d70273767224895b368eb8f051f29354b36cb8e784a035199cc47780211e487d40752230bf3028a3249bc4d1b2cd0689f0e46bc0ef2ea222fff211523fc35b4364479ccb8602b86a96b2907ce81cdb906e9ae5694f3293affbdca84e5240971fc8cce64661964cc32694a30e5b453c5dbaaf238ba1a224d648f461833d99ce90eab67a62ed8df8747a3db0b831169e4ff048a94a23081d0fb8053ec20adab7112c659ef050514ace9f041e658b3b90f5e8eccf2953541c85f0d897dd6aaff925626251013ae7e83a96eb0f85b446a9a3180df06cf323254670f7d0a7afa43299ea2472032364bb9579ea6a32a7bb133445555dbfb5b52d1782ad84262854454effae17dcbe149678678042051b9e41956165aa2658bd17743bcb28d4ca8daecbbe241b46d7c6372df0d71c2e19278fdfa94459e0710a14105490f321e40907ee9d2d4a18ead7d8ffe636b5bb21bc133712bcd8f29c0cbc51d722567cdb6f2e42edbb838c49d38893dc49710f6b72d200621a90fac15fa1acef882ce7260b6ab93ee680eec0d4eec81e1e3f99340cf9be2f5ed82b43c5772cda5faeb276d2e570756e42ecad0077e2208a64719255521b583c1c9d0716c3f7b24c1452d55961cf73f468b7c96df272a8a9f1f0af5b81c69caccc2d1ec98ed0cf4bb5726aba4e9abaff4bbbc0a9e3c7c026b785e1c4008a4cd2cb1d7ab6a176dff50d4dfd7733c2ffe7fa558a34e9fcd17b7d7ce49f8500adc135701b7bfe8e30a6b2d3cfc5718ae33cbc0a1b801b23abbc757e1853cec55245bfb0a9aae294cae6898fc8f524a4a3a955b1a9cf062f844497aa4ab2ac96017341c80fd7b522c5943936becb28d25e7140135229ce82cbffd0fd3745176909c5d8500d82ab7f246f97637e083888f569b632ef0a38e935012811d75853377570fe855d4069e4dae36ee382d989f94185402e7d4c69f734335626460483a5c56e28b99274466abc98a07c9581019301adee379b34f6a8a4bd42ca3f6e7a6eb9181d90f9815d599a5961694f0ee8e2b0fb8a86fca4ce648d34f44dafd4bfc09a7532ec83d2ba41d3c5a20538080808a415b42f1d39feefa8bee9f88f31facd44a53ff528a0c0f5735a25f04479c60bef81a57442a10b44aadb467ed64f08301ee5f49d2e7a45f3a6a01377549274dd2a54bffe7bed97984483ac233aae43019ac7136424410f2bd6c62f60a42837b5c79bf8edb5f39ca62f6e21325aa38b4844323d3f062eca37ee92ef60cb9a49dc5802323edf66ccd0fbf915f1d57c96614954872b6d37c0c9dbe7d0b3b66c9d2f3df9afeff1cae59280902a6f94fbd7abe9f5257a95292871ffedf218a347a5246d8467b6a8c05028e80f876af8cb7b511f2c417187f00abdc439a79619339702ff93f35a6650c4b4df2efb534fc13182b3146dbc4bac439da9ce8147d5a8e44a07d9be4f7a54817981544a02b5e6e341b1a25d2ce16e2b2e5652e787abda106cbdc1a452b5a2e99c48a33c386357b9f98ef3b40664501f5b5b3eb507eae6c9ef410cc30236c19921eaa0d9bd1922e7692784ca76c4760b8b5786bae1108836b8587910a5c03d55b4a3db219bda7c76e6c9b8466458bf82fab9bce2d708c2548254163acd0c3c41929217d242d770306ff780deb179f4d321e4192f1b32e202d2539c5f18d215d37ad81ac62917fa815183a9de7ae83eae09c6343280ee2678972d3543d942675faa54863523cdce52920a8ddc76bcd909b3ed0eb323c9270cc73449d5d558c5a91c4fd6116b05420d2d78ba2cd52e13de13dea5580ea416efcdbf3bc951322e8e967a87a972398342d26a3f19e5176dc4887a6a8be16123beada8f61e257cfb469e2a1c14d01d51c002151bf75dccb0203b3308012f0155d1fa2635fabf9fabcc1da3d0d35889f85d9bd691f6834a89b6333c45288b1cb904f65796ccc4b07cecfcd00c8b2b63a433ede8cab48b766c711f5a3b94ac8bb2dcd7d05ddaf6c42c35ccf8819f25301520704938fc63ae502a26542aca3c91253462576004521251fe4218e021f8245df05a52f8e2f2c7a552b2d53acb7ff1a0ad1cfac8e7f6fccad8763818c16e4bbb49619a41b848a46e1ce099cd73dd1c23427589fc1feed96c16260ed7b7995905b0197ce44dc56decbfdf2e0ee67835a1de37e3d7344c430a73df0ceac05cb35f5349a698da30a8f98a86439689969e505577613ce4d87191a93c58a489a6af5f0f4f43eaaf8501399a7524e0e17fd641fe6953e929ee9fc21ac5508cbac0390e554729174219ec0bdc674412fc025f8911f7903d8c68e2e1ee5febc33c332c73a056b1baa94009b16f2c31077c7e7489e7a6068f3ddd938a604dfc28db69864f85b606799b7e37ea6a99eabf2f2bb370ee987357b984c484fe716ee09f6344da3597c930a80d51c7d473f62847466601fabb838354dd2643a53ff5406b090718719abab36299eb28445d3e56b936ebe94d6b3a8e7e29437a597daba1e17f432340b4d571e937b15453a4d0eabe36523140448fc69ba326ab4446a9a213d1ab5a8ed5cc5c23e0411f7f78446badd402a26dc9220494bad2156d137111962261b58bbcdf3bc3ae62e3dc2a7f8731d7651276b09d90c83f9177ab39ffca84a9738058ea8fdc0cdccc30d722796807f356a96b77db129ee1f64bd053e573b8083c18997758fe6378c6c894fd365f352bb3e7c397e0b96bfbbb1ca4c8a0387d878d6e060257404b675858206b90c4056c777b50f6cce88cec5256f11cee34d355292138da7b9d6dfa76f2444085c67cdede390fd6e23820a901965bce1fdf0433cddf48f8d91aad2c1c28c6e9e2be653d50fa2e516720d9ca3c6c991b5812986c333737f7892ac12c0420d9077a723f869f38f41c9b606d46855dec0d03484c28dc1332e4d9f17ad4d8dab39d66e8a32e9b624af9527c9b6ff84a8d4dbb8aacd7d92b253c484908eed7ace08f1f5c91fdea6813555e70f275e4e8877cd3b98d547520768c43fad477edb79fe424e3a38b06272961d366199ef33219a39ce0c68dcf88ffaf8a129b897d8c2a528ff680581b2f8e3a09f20aeadc70a2232fffa0721e079f08746728d17d694ab35c1df0f5b49051de46acf3490c233468a11dededdf473decfced08e4d6409a061f550092708054d7beb17efe25ffefe395f5bff4d5a9235acc9c5621c293d3e2192dd5f81ce39882a1c2050fd64715de4deec9915a4d3741a2b7eefe36468c6945ea10c4143e6a8a0cdab209506c3c31841af2725899e328b73939191ea5363a989a2ae71e8515ecd750d7a1648a19c27bc5ea0e5003fd0f0abb096d5e26ec9c5b386eeed9afdf8d0163aeee9177b822d534e8fb57afac3abe6a50f49ca9d7b70d05a5be03368ebe31d6bc4007cba8ded87d1074b48cdb838a7456d2bbbe01dbe71b9811c6cc9ab83a495c5f5ffede6d80da2f4cbe0bbf083d284888462f9e11db83f0946e14261520dff943fe97a30852009011d56d9427102e389a4aa6e3069fcdf17840fc4e829477ad42b5a6a9a3f8d65a9e310e8cb5b4e97abbe6dfd9823d9fcf956759ccd3bcce6efbb2e9b0df1ce64b3b988039ded0e561a53680f6f0f139825e764d5b2fa9903b72aa358d6d5aac8dd563a2ba5f8126f95a1a8ca43448f0112b02ca9b47e20eb286a733bdbf4304967e25a8f82da11e8922b1abee151176f71081b0c56f51781a0c165eae83b44524f4acc2d1272b1889dab6c80fc87a0895347bb92081d7304c625e164c6a243c715a5c868e9956349e0df2d163734a07dab6c48c2506fe48cc8adea6106188e1ce9ff99f31f6ac63c8675caa91edd39792047e3fb61c7e92ee0ec6b2d4de81735a7fb31981a2f0044d72c493a0c97306ed4a2d18e5eb603ba53e87a2b3abde09c9c43348dd71ad53f97f883bcbfc4ab941a656f173a422853302979f8a99b3f4ad072cea4cd4170b9515aceb12d965f78813d84d3502175285f5e4586a4f9c16eb6de2dcf39f230f0842682cc294084193c17367a1c5c52577fc0efab99b102b5bcce28cbc3e783f0b1236a0d5b41dceb6980eb5bf8f08d31eb81694d1056bf3f89432ce88a8c8a8f5dec4af5b8b3b2ae05cece0cd922cb9b8378786d9501833dfe118237ba70a03509cd007f0b281049a2e10d12e3b99fb699ef1b3fe0401a6c1f785d5c2943d5f2ae0fb523ef44686aae4ea78d313b25c6bd0ed2d0ba2cdb96f3a08ec0a5ff963bc0756e4150b5936d6e9b3ab5bf4977ae085eb2bc3b3f370411517193bb771f6b9be0f2cd42361fceafa0e657f2354972a36adce671990d33a4a7ada841ea240a778b443fe1022c3b716955ae2be54cb5589c50cc78dd2b08595c256f728dbef7398fafb8c670b9e8d52f2f3d34cd4ff549b9f3ecea3f08ebf51b6529c7e1ff3dd8a2ef2fb45dc4acfe5a77346771f1fe201bd715096dd20df8d1552d86a6fe7c822e279b083ba93f29c6d6453aa6a769af79369065ca4fa9bcfed32012e3c7006e946471feab4678ea22e40b89d79be3fa5c470bedbf7f6c5ffe8ab8408a2810483b4e67d0d13c87d811be1446dcbd4620daa6f74f47e58e56e225988a0d8b2f59d081097e70bd172b0eeb43358fe0a69d19a3778a22f7f18f5b8aa59a2940584c1b3b91a9143fc6c7687713f9a80835a76b0c93430387b4fe92a8882b49c791b5661df39bf09eb62138ca330e278c2c116262869468fdf920d66b581e4be459dec9d8114c2806cc327c533cfaa00e3b24e9c808862ee9811258e0915e0cc04f589e90992c7842b1e8e90ff5800c2eb8ae05a180e280acb1fcb187e91223d83715a5d45da5c31927bce19ba66291880d573c3083240e00b428aeb4c4fd619f5ec7424ece65ffb030eacbf954d3e8975119552ed674563d547d680015a6705eb175cb166f5945bde7d89c401275236b81696d4af09d41bfb530dcee660bb22174040a64597d033003dca98450ba0b946c138c34c9c97d8bf0d7dcbfc90f1cf5ccd4895e007f8daed5e23763b0853a0af7170c16c9c073e341e3706a8acec013f20a6b2ed1c3192aeb37fa5f7baef23a0005205e5b61e5f1ec318752235d59e8f9e9792197f056c765270c00441a0170721da5f5d01655d3648bcc4fd76208cc9e02180baf5b9886fce4e84090d18c286c529e449e2167eb4906a7a9af64eef0d82bd46163dfebab0adb9d5515d6824df3af6c4e0ab3ebc62520253a24569ef626169f5745bb4c7df9eef579a1618301e6593f83fdd21030bc914db1a6b222a73f4e106abd7fee4c28218131c5869f51abb0c16fb99cf2830fa97bdc724650f16a6e37160f78a6d0e4ae8b5c853814a5c9af9b3ecdc7bee10d61e750a03453d7961ac8f503ab84a61bb124c4c9d998869dab0714e45e7a64ab56b9d9c1a20172fdf16798bc5d339e605853043bc8133bc8eff180927bd9cb61b0dc303dbfd508845abe6d9f4dd38c99251a05794b75458d6bade47161b74b1b6df810754c2fc614b6de9fc7b1be47a6fa1d8931a592543266f581a2876b184a3456c01dfa96c8085e4101640d11e198576687cc5aa89ca3166f359801716de6b634968bf94e1b4af36cd61dd015fdfe13279df7acc94c699ac68df2d4505be285dcdf728a735a56a3ef5f849ef3de17fc177049e2863407366f71dab4c59579ed03b7a827ef3c7c1477c2b5c69f250313205c7c3c884e58ff0597bb3bb49437f7a0884e0d9eb6ff3de1f41c62054c81da0a500e2350655d853b0eb40954dd325b0882e82c810247002f939aadf0894c8e0bc6ed871ac96515319c56664522ae0d9012ed520e8304289c47c7da0f3d7b5791c064d72598626bb07979a0319349ee831094725d1625393c7b7d66bc1fa66abf5ac373783b32da757498026ec454d7daa4392b15f3dbc7a1cfe257fb71e590e330c8369207a332646863fbf4f3889f74a771cfde53c30306f9af36940bc7ec3daf81d79a2b85dfff6386d235b00cdde330b58a1cda650bf99d8634cbdba0e5753ff0896ee8630c3f13eddf48a4b3771f6cb9b1dbe276eabffa4951c37b1e430915ef62798eeb13bb0d874e9b4ae85ce07108f80d76a4f8acb8fc84a01ff5cc58d6f920cf03ab020cf3c859d70161798105d51ccb760570d7790dba3446486212175f28a1743f78e4beeb8ccc53898ecc19c023fdbfe2da7ec2aecfc9679008288a97c2a7b38b030ef9fe8a3fefebd4197a8c618717f5cd86d722a08fd0f0245da7b18eca7a574a5edf586586b97cbe3e980069a2f4e47f8932d97d89868a102baac46b02994464ae71d395bf97c65d44a29cdf5d4c72fd06e69cd2e22382382b41c9b4bd8564ef2ed123bf26757621b91c5667dbbe61cc75c11db2fe361d2abcf5c1a4430d9eac463c0367d417dbaac24ecbf21ae400e02d0897286c1b2471c5fe010bc50b0827e3b1e57543cffeb628a926283d13ded47a850fd0a27421a20dafbf99b263698fe6ee5a28384bdb58e89d77959da9405c4d5e126f82f9f2d37b4032b7e78c2abd3720bd380b1a96351ba57fa323c07f8eba2afa30e76225f939a76f40df44bf5f8d0603782b457ee025edf3717a40d09829a72802c46073de20bf7ec97292e37bed65ddd912253ef4174ef72065e6191e5a5a6c5ce516c32a6d7588930b9fad6a2cd7bafc3f5d5a7c6619f4642c03241e924518c38bbdec7c3b9d4f142eca2271b09dfc2e4f02b19faeee41b0768623187c0b77054e6577095811b6bd991a50bba7016dd54dc939c719569964754b7cfe0e62d4b60dc3c22f54329547f36c0e59e6bd078af46ab3b961b9d143722e304909ccb7c16223791b5849e2165f6ecc4e67fc4ab4df86de6507903653b5760bbc6d408ef09894ce4652c17e313a0a1bf163298f842b17a0dc22a3c033d048da7e0bd8ecf63e393fc795416131320508cae14a9bff178164f511835b18b2109a1735c02368a194fe4a4653923a04100218203cf53b4d6a23fb574b2f11836d3cc0cbef6a715da3b1ac03620d9896aeff641e958af6b50cc16b0c5243cee1df89f77c3ead369b892bb904d0131eb9230a10dd186e215e0561f9b21c6ae11adb848ddb9c53ede26dd6fa120a6e66ca231a5bc08c2b9b953003183ac421410fc4bac9c626513800c672b8e9bedc96c5eda4810c0d2b3574ee31d4be25a2e314de917528d1541dc7edea4aa22d77b52104c2e5dc7dd1c7a04e81359f44f2546ebf10c1564e32ed9c7d477db4f4e2883ab2637de6284af923d10205735075b515d6a12f3c48f13c4d643d6d453325aedba22681892de4d4fc8cbf4e49db42dfada819617609d9c7abbc3999708ef27f2ac36f6f62f2398454ac00f230700a8038da20a9774571a894c492eecad6ffc4c3b65b94c0422ee9dc954142a5eea47dc4a2ac337e832dc527b93c6bc896099f0acc48b15fcb560a1afba62f20973bf63423978111c6cfc4a5e0992ec0f905edfaa4346314d86377a68c9a7daf7cb3cf4b7cd6ec75320cbb91a3477448dbe603fa9cae35401bed205d0c0e2eda4911492600ff5891b06c243e469301b30f49532a42fe1cf136692806a118165c4bc80a1f7968780de809f98144f90c514983cbec79115b7b3e4ca7cf88b4d9f46e6c23e8fcad2ffc29f46a03278d306fc45c98fc7f30730df8fffba43d13c725aae74333f5f92fb29def4326ddca8c9c5c12aef9bcf9f32d2f9c5d2325bdbffeba5a37bc633c51c948b0f8ec6d661b0af09acda88d6ade63de0511ee5393b719b4533ce963b305397951e2ea8c05ba4df990c34d389604072212c0525dedceb14611c7d5fba8634021caa9a1d154051d110b8db263c50283a86dbda8f25ba8df1fd3699f27b0c2943ff4dce383e359e641e94a35d4439c0f050e832ce9476167ccf7de9264b064577f13c7bf8d4bfc3dbbf0af42594ca3badca784b805e1e3ffd8e3962d2df129a99a3763e6704a5890ba6374f10edcbac170c54ee7a54b9657881c0b801e30721a950b11c9f565f0d735ddc13aa3f1c5b5b2e45c825973f42bd89c4dc3cbb9ea4bca70244c1f3573aa42ec8821e21ee2597b8915153d647880a5ecb8f6fbb2d87bdd02774b0cc16e5b30dc40330860889fb417291bf4dd654012766ee775ad5383746df8c5f37ad09da839ab3e5fed2301cb0efee77fb8e924943cfd71fd89e7fc34120c8a72a1db2130b297b453d25d75f0961c081c71c41793f1082c4eefe57fbfd952812b5ce93d999fa8baaecdfa5a3e35364c6a23b9e787c05bb58fc5c82ccf0eb31df05b70b950cb75c54bde2e2909994b1ce7fd1d57632f82ecda1a63c7efad6839e1e88227084423e463038e3d3d99fe512902066a3a76dce83a812a13f86c0e94a6d285dfc59a8bf3ced4486a0a0306db7cd7aceaa6969b25cbe7d7c6537c1338792df01d5ebd4fbed5229b75b7288fce5d3354f1d8273d38b5293fb3f2548c87d0b19c5aea7a0575a216893803585595ead4c0fa593d0c36cfdbff041a2556aa826a72fd4d6dd72f3b07e690cc94abdf67f89736c1ca3c3aae1a80f53293bf3a439d3472edcaa5ee72e5c3c2c61ace2f367f60596ee91f11cef4641ded574b193feb0d5106544ace5a7eda5a57879f5c96c150b3b67880d13f3aee30b3ffac2fe70da62644e3bb24a246fac89e65700b5348d3d306d124ddd50266c024ec4360efc7de97a03136884ec4c460080c21511a458a5c01e617e8e2d33b86d776f28d9f91570de50d04bc17d58dbf0475e5659e02cbc34e845c6ac16e8b66479d17d2f3c1c07b19bdc20cb1e2501c5ec4eadecdc98592efe698889996504dce7854ce1bfd8a36bebec31371916344f9632a85201675dfd9db4f1ef8cc183a3abb550f876c47cb20820976ee41d5aac68460c17aa6ee710a25a31b984f5363c62fc28554a098c979557beff0cbaf08b8f454ed255ae7ad469333946fcb957c530d367d07140247acf66916f7c751cf73f6f529bd2f55050f5040ac18dd72c0b4ac79525d089bbf9703f266858cfe979f77c1d1bc67fba642207ba06241201b2e3c7edf1837b1d5b0b9d0c9eac39ab9dec07c0b55a564d57aa77f4445c6d077261cc9a262100d7fa0d27264f4ef70a28946e4648ee8148af6395784b829d714dde4454a5157f8cf7b567e4237638d71e72804f330af83b470a7480d11822e7dd252c53a6b8a199b8bff9fe188f567ce79ceb22c975c9bcb37986256e3a849ef4f22e103aede3db8f51860560e37cab00efb087c0c906a7f0e1356755f9e8de5a87aa6ad469a051fb2bcb990a842827ad33f7f2e7737b5dc3764c25e308b084b63a1ae06bd0c4fe39a6e3a0c181a39713d6a87273767cc21563c46c54b06486a0a1d574daebbe34dd141aff9cf3ce11fc47103db07f0fb1db3e3ec4a15b46481f2915b6b3140ccef13e20ac27b94de55060b2280fa4d6720609d8f4d76f5389805e852ba3579ecc05bf944e030f58ac1be262d3ecbd3f14725a61911096214caf45490f82aafa382bcd31f25689dd41192ffac84acc058b5db6da2d04219dc0a8019f519f19e492e2e650316fb23e79e87f750b5a4bf62b22fa0549893e0796df26cfa569dc5e98412feb989eee704b55439a37c446ad3fb896b3400fd3e23ba9effdbbfec8523719b4abc91a064460dc09353eebaba043811b5f009a3e01339fba842ed9f2d03992a43c09cc71e9d0774f6752b9584fb970530df5b5f2f2dc123b793b4bfffc1cb998edbd0c1d82785d2e5cbd6e41fa8899f71145861fd6160f3ac2865fd4f2626bfb3e7971b61b5924ee5a4ece88d4219f9559d62de82226e0beb5f9ca6a52ef455ad5e933d3c237e26b40b10520eb3ee87dc658f738f46ed417c2d087bf6ceb33696cdd65796e9fed08542cea9683c8588485e66aa2d3cf6e3204d89218344cde976b8e631288044a7bec2f7e27a8eab393ba5ef01f584737a60c620b61295abdd9d9de068539253092486c2b808fa068e873f857afa0e06e5a7809c062317f9387de2c6281a96f9571590f9fe9d7925f36eb2eef12948bc16e48c65d8dcad6bf7149ba2622e9071fff7075e77e08461953e5ef69d31a7445f8aa5532a8c9fb7fcd550a1b86c4dbf23b1a78053f19c68a2b265e7fa58c3cea5aec9945b0b4eb405927ef773a63bf1912927175e531129b59ef63368b421650d4d51068377650b9e8b14f2c59ad0e3504672b71df6e0404d25ad87c1576da89a554e0175ebc579a27d3bb0f5b7a934e38d164954e7c4c9c7a65c1f0ff50bd854341065137fc4057081f0ef551651616eed2b9125359ba5ee81d14c841bbd4fd7ab9bcf5b17fe4736ddc17b9452442e3a919a506920c7963eeddf438bd82e3e51776fe2f675bc1013245ccaea7af414e96ace7b72e7436cb168c154affabda965cb00e7c41a1b462fdb2095e57be97e236165af0fbb9749584f0d52ccba93f62d496c10389b6c4cee3462f40ec1173f06ea83fcad529da03395d890163cfc7f20175de9d335f8a682aab6c5fd95e0526de8c7b52f85e8b426000b32f46437aba0ef2368678e9ca574763bebe051a24823efa8f8c4dbf6cf4a167d0c70469aec73a43356c199596173e13a2eebdbb5339247e848a96b826929b2db577457a99886bb5ec7e59445b420af3f137a849aec8764b2eccbeb08fa995cb1441ef57132b477f58db845d18412824154c4f665fe29142d75032b3811cf8a2e1a5b1a54af8deba8a9e3f5b68c006f9f021898051e986cb5d4113355547b98433f6bbad26343bb6522518c7086adb02ba1d99ad2006fb505dd462d104ca7064d393cd0b48893fe92001dd0cdaf5ab97fb3c749f7663999dc09c36c541a688b6e30d13e8675ee94ab0fcb494e0b6b5b50599a3b6ca371917182ffcd417bec15b2e0ad33d567e8e817ae11c14c3f4decdce9f1ef21b67d339bdf1f8afa9f98bea87c7dd9da066261558fb4465fb3ff09acba731c4d0776697848d6117eca8ae4c15849bfcf4b6d81187375714e302a07532164e0d0d889fd63001481ac116066b9b89a259a04826d86f6abe4e1e0f6119ecdc5bdd4e67e984665fd66df70ffaa8c53da639eda73052c0967bc4ee2a5fb88e3c63f69cd0d2ceb9fbcb4b17b73c70bd71b4bcdb2f0128fab5b26d3c7b4bb4c8960244a346582865060aca59d4fa53edcb687015e9162a57527a8b75fd77eeb3596f364a291220101b7a61355b742053918a49f2a3f228a98d0d13c968978c00453a07a8a5b8fe755b4336f4aa04393623bf33c5b016df15b5c51e935a4283f9c3c2dc992cb66af3ece030754196267bacae518e77a41049c57ec572bf44f48c363a811a5d0b89477a2239f5e5f731f691a30ece10b935f212f0b907a0a8c34de65f2fd041f799dbdf4da6e91cbd1925b6313a8eb2cca6df9e80b1a4e6881d5290ee1fa2aa2bdd742a6454f885ca4dfbc0fc22fb2e07021d8dda5c3c3cfd87c3f49723abb3911d991f52170d03a21b1e1a91bee1359e79b78ec46ec1bc743e6d440f175b7def8aa70122c8214aafca02ae4e2cd19d0a567bcf439ef9df2eea30ffdb1bf87261c6f86a59e8e895b0fd2222b015601f652a4b94dd3eb93b9691c3bc5547ff89b73ae15d0c6e65bb36442706ea9f5cf2b6537c57b2624612634cc644b96ef7f07b2abfbac97a7e4e17c2d4829b5b37c40c1d7d6c1e423479192bea99e907af229b3876feb13d6cd5c7c8cbeb38abf0b9add532ebae94e3c04531cc4c0d5ed48e430de8481eae11e1629ccd1f959c4d3915db64aa0f1272fd32c7f3761544b2c06561d99f10e3427e2d71daeacef2891fc6d9c51f472cb777d4cac66cdd9d8446d806d07e0e730a810ffedf5f407349e58ce2a77fa70d09aa911c83e831e8a4410109ee8b1d79b118ec7cf6f0a0304cf350db89f11a3533be85fb86f1098bb5b7991a915435697e657436144f49a4d40f0cc838e0b82271e4c1d6735eece4e8b9c442197135a791ee03e77e3c0b943e3d8e26bcf7e5a0a05552b588c77503cc8b7977a0ad759d8369ee85e7f1df22930f25840ad651230db81c7a907809184ba69ed0469b35afb251a1e96fcefd358b5cb0a858635db8336ec79c6e6b738d0d26ece2a5ff6340ed70b2271a67f9b490566d8d671f3308478a6f1cc0101bc1bd4694fdc1b9a8caa3bdcd66af3a32190ef5d60dcb653224abf77e1813b4cda66a7ee37a619b622be15d8b4861a0fc30a836c9765238b4753bfd7a5103e040601a16ad089af7826df1a3b26c9b61d09fefffb9854dd3cfb2481eff93a124aea92185909cea8fd62a5fbe4bdccf0bffd3db2e7c5418239048a8a0e463d070597f1cbf44ba81b742cbd99cae63f999485e0a03ab8473a391c8046ed4c5e74836835849b5ec4ab1e3cb98737a3276077730e90929e5162d17d00c7e7c264f79d1489e143daef9f6ce82d66446c9654c78ad76373436b9e8c52a0dd2f44281fe058825b8470f9c74882f46f587bebd273cea9bba19b84902c66eeb7542a5aa4289832301258d7f6748143a41c0d0815d677beacd80f9e7b909593a9b1fde1b9aca8cc296095fbe6ea542c5628d734d3321bd792c3d1102b823fd2b71439180f5138dfd0a9b39e4d9b823587d8cb67d85e447d882e115ae83ce94eaaa7423c0650cd44b38bfe6ab1a42d9ab14a1e1d782f8cb4189d515a253f5e2a2d7b6072940d93a193fb4af238615b35b8248837922035f06a1e86f3ea5b879cce7f2c555d0b39598b20163d2bb5300eab8abd16acd4e79041feef08ed41a6695e8ad75378ae4826d6a4bf94e64f6d86d4bd04aeb19fcee509b9ac31150c0fcad41b1c5d8414d9cc5bd43028e998f38bf5c7c15c687c476c8dcd4687b3a8f3fa8a49be16e71e5ff2c582dbd06200bc54d1ea9f96265f0f5729e25bde256cbbb2ea2ad27e9dea3dd157a7af2645574627456e649aa79f8723ac0a3489e10006642b238e57182e11b7bb98bd2960d717ae3b64ac9d47d2982a7809c171e27fc51a93c10059e6a15183553e825e9d15ca1cf1c5831a7f926a91e514defcc964addb7223e4179cd030d1c66723ae09943e1c2d5e685a68dbf66684b064c5f4f27f64cda86b83d1e0b48a483d40564dd12fe74b15b1a351116ed7f9dea734b931478a9cf8e4d9892713799e9813129967120ceb632e9352d4b84b19b919d12720c86b23659fd7b62fb59c7a43fa70a5","title":"297. 二叉树的序列化与反序列化","link":"https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree/","question_id":297,"issue_number":20},"18":{"day":18,"pres":["DFS","排序"],"tags":["哈希表","树","排序"],"whys":null,"difficulty":"- 中等","description":"```\n给定二叉树,按垂序遍历返回其结点值。\n\n对位于 (X, Y) 的每个结点而言,其左右子结点分别位于 (X-1, Y-1) 和 (X+1, Y-1)。\n\n把一条垂线从 X = -infinity 移动到 X = +infinity ,每当该垂线与结点接触时,我们按从上到下的顺序报告结点的值(Y 坐标递减)。\n\n如果两个结点位置相同,则首先报告的结点值较小。\n\n按 X 坐标顺序返回非空报告的列表。每个报告都有一个结点值列表。\n\n\n\n示例 1:\n\n\n\n输入:[3,9,20,null,null,15,7]\n输出:[[9],[3,15],[20],[7]]\n解释:\n在不丧失其普遍性的情况下,我们可以假设根结点位于 (0, 0):\n然后,值为 9 的结点出现在 (-1, -1);\n值为 3 和 15 的两个结点分别出现在 (0, 0) 和 (0, -2);\n值为 20 的结点出现在 (1, -1);\n值为 7 的结点出现在 (2, -2)。\n示例 2:\n\n\n\n输入:[1,2,3,4,5,6,7]\n输出:[[4],[2],[1,5,6],[3],[7]]\n解释:\n根据给定的方案,值为 5 和 6 的两个结点出现在同一位置。\n然而,在报告 \"[1,5,6]\" 中,结点值 5 排在前面,因为 5 小于 6。\n\n\n提示:\n\n树的结点数介于 1 和 1000 之间。\n每个结点值介于 0 和 1000 之间。\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f2a9c133385f155623c4f4e5a461d578280275decff0317058956ec014fdd67ce65ad9d3e03c1ae76b561bceff835f3316e60d6d7cfbd0a2ccfea998f527d3be17095dbb7098c20b026cfebeea39f5d27dd4475a79a382c23147ea69cc7bb33d7092b3244f2d267aaa69976ec70ca3510822b7d6e4e7b4548c73e88991eda2b4b63e55768a9fb08a4040c422f355d74017615014c61ebe6c42287961a4240a34443567b053260ba3606def2308b7638921b9b6101bd6caded7a876df5beb5fc25a2356f42cd8760288eb26a2d13ce83cbb501daae759ffd100cffbdca85cd280b69e18cff43652b78ce215c4a3ec9b96aecd983f938ba1a224d648a5b3f3fc3b9e830956fb403dbfbae46b4e508bb3369dac30bbf85ae21ab3f7f259f704aeba4075bc3ff0cab981783d71ed763fd6142e0ec146f1546d8d16f95aced02e6c9a3a2e5c9b4bf10a86b8294735f74cb6d4050b038d13ff9332675693f42e8cf2a2943f4279da5300545b97592a481097b8e3c464d44d0ff7d52c84129cb6e6084585bf0f3e27bdbe17676864c232d65aeeb1f691755b964b3d77c7ca05f3c04e0f98ce0c031e96ae5af977ecab26f27e66f9da1a725c63352f9617e2e016e796ff82de4b78b9beaf554df9676282eb34fbe1a0759c6fa43ec978d0d11424783cee78d72e1d2a04623833ff55f78db4f08e54511480fa2119353d2560c4043d766a6a57f733860df7613e3c898f9b9e442b2c9e296b1b10583ccd30934336dff97a5b6c3ca4b6f89d362103247c659989adb8b7334124038b7e7f48cb25d26785ef756f74c1c832cdcf54f529ec140099ee9150397c1a1b6ebe98621acf97f5fda87b6f1aebcd0ad6c2f9a722155744b2c4c1e8fcc1c81d7ab4b1759ec5fc6f0d454162cda44a747994d9ed215bae7cf73ed5210e41951060b179a9b161b69039b3205c651fea0f8b975d734272e32c5ef65eb20476fbb56afed5767d82180a1d64f203703de060ec19d655484d513ceae569a4964590eed976710675f2fc7648edc915ea11a515019c8be03d3a433b82a7111153c52950910d416f364f47838e68e91b557994622f5bb8e87471dbc1277a32675660fe566f504be46ae36ee3500a698ac205615e8d4c69f70640760594c45015355c7b499275067a3e58503c35b2a0a3037f5e15d824373904ddb234c46624984a2deb127f78d5e939793f9397103fc117afdbc2d9e639a8d6480fd74c57137c368dbfc6f699c687b1a8fa8df52522586446d42c6ef94e9c5340d2d3165c87a77f28002ef3e82a50013d948793aa782397bd3ffee99a60e607a08ef29ef774799699acd4c227de3fcd38ffec0e4e1ed4048db9ebbb2b914951852ec5cfde29cdd7fd1fecbc4c6517cfdb53fc3ad71ff9eeb6d0257e5a05363fbcb103c9de6ccaa8bb47a38fa52aadd30d188a852761d75e95731849a619556b8cceb8c90b47876e44a04edde21519aec1d31643fd9927c51514c56d42cdfe4693cd46b2fff6616428d03d91d1370b33b549b4f5b77332ef606255ec36d30fbc7eb28d080d7f025bc9d1f41180cff847fd7e0ff4a88cefa6f9a399552c5e4fa3b400eee6a654317b645cdc1bbc00c151254d02760ee1a840bf3c9aafb6a44f81c13d11f13cbaace8d931865bbeb98c789786d2efeba596d58d21d283a7188befa1f93c12a22f89455d43461d1cf5f17a904c2b3f561f458768c377835061acbf40ae6411cc2f4ea234edac9cdafe1aa8bbf33a3049f6758363dc0eaae0789d83c8b05bebdd8647d993abfd9315ec27f466399fd2cf4d9b3fbd573062467a796ebc5a2533532639d7d6fb2371a4e1a304293c9b33b2e2e3836c7d19d2f642badb88b6bba53aa1f1238a5dc692c4ee68e6d697e4e65f707b548d03fac117af69987a3ad8a7255c44bbebabd5db4e69f4b8ddb5065a71795650df965d38e51aecadd7c1e965c20e0f388adc053ca3b249038820c4e88e5031c6fd7c80442b1ed17f665e64e9d5d4a1e35212e3911ce37f3b1ca17d9bdf568d0bc60e276e0b559cf6478fb0bd91f0c24467bfbb2ae30b85fa2c978ea691f2cee3a6b39158aa5b587286c5aa4e9eecde22f1b3f4a97f61130afce3675978a2cf9d7ba53efc28cf4a955c50c5fdaa1543203048c2ffd2a8a466414d37131b109f4ae1935d168d35c0a3ab5fd426d681704571679f3529674efa0c6a3a378bcf689b0a8374d246ebd37d3bd9831db753d833182051f45332a63c04e493694a9ee98ad4edf0b6cd8d04dca3e91e6b08a983e8c1885964af4f60993ed3fe1d03427589fc2d4ecaac96966ed7b4e9090670b96d36bd644f7cbe2fa26328e35ca7e954a9dd5ba3df6db24aba98d6db72d986aac0ae6926ccaa7d5220f0be94c84796f304ae72dec097d37438945a36af4d0f4fe3faac56413a38f53781e10c566f15420f7e0b5b6bb17d13d35b7c83dc3a76e16d57469e0d4d4915d3056c5d3faa2017901d4c6a8121fd8ddbf13cb3ee909067105a3a2299a3ff3cd3646c4d96b9e5a446bdec2d504ac57f5c2a0a09a7cff5b42629aa9c2789aba18e4df9be62c7189976313b7371647a35efe6513790f9b33078067ded1692053503eb91301546ef989536d6c9f1724378a686febb52ee70ac0ea2275fe87f129fe901c8027cd90abe0b18287af6bc0ae97ed056da119536c5fb1dbf95274230c3e6ba1b13d00714251bc3198b5864c8bef5ae9d1d64d2120ac022fd185f9012934ca7541ff004898af5d1246ab3c47ce6444533a7b1744b482fdb83cf9757d8ec7ac6754781b772c00a2265b7ff6f167797c508011ebe71b0e0841071543aa83bc656fe3cec27428c679a842dbfc1d82fc85fd2d3f011a3fba134af314c14cc90ce92781398aa523306de57027190cde0bc53b71bf3c2cf4abc3c357dd1279c73ad5aac467cf5b97cc0620420c86f2d7766c4d1872e19f445c6c607362ff828ca2fea06f74261d45ab810a8e76daa12f5c393b9dab661f1f47333412050f14e851b046915a99667d9b7246d9fac60d092f49832404c0e4f99266e904848fee59ea35c3eb6eebd32ec9729e4eaedd54056d8442422a05abb41cc9563aa76c2dd77cea7df92244f12d75c4081d774b347c1f200708fb1a75e7090e765b30cb6ac0707d0e9b44691d9c9647ade2c3cc4ef1a64d80abf7de8fb73dbc59c1e169d43adaeeeda227d6ff36cb9fe3205e85e4289505a4fc152320406858c70a7a500c1fc77cdd06a580f9f48a59fa47197962772f8c912740876e7643dedf48a57a5d298d0664819fd7aed828945a88321a96d20ce526b8fb34c2710751774ad5cec01ee3f45626271c3f4e57f71df7f49baec1440349bc2b5ac15f9bbf9c615048305a7298b9349591529247571b3f9547d3997c532b23b16266b699d2a57532dfe1096be123a196b24d2e4e3f4490fd55fbb54245f2582cdfeb31c13db5f6144fd48bfbd192d132e52627df2d5d5f7e1683e97ea432cefa4662cc9bf387d3bad30b97ece0d3dd9bd0d1abbe0e53b0fb5103904c2f6afae864919e8998d9133aa4a30e1eca3806c45a03d5a8795342efc21d4ba9adb05f7f2a97a96cfb570044b0804fb32cf4b6761acdebd684fb9ed484a4d684628893aee2e29099bf793e846fe7ee209d332d4ee078775a2bf279a47db25fa1456d26650bfe022d3aacd7a9dc333d3590f57fef248eb5341c1fc64f0a4ff35fb319eedb6095e13627b2eae05993c321b897d422089a9b62c0bebb9d48f22b99b760d7253b03a4d10e550b517a2b6c19139910d862f0aef69316b11a905bcbccaae8f8592b1ea7df156faab0abeb628167f99b4f84a981412dc52f6d4b143478591d659a3081fc993293ca1a5fe0cc3662581b49254f36c351ecbc940fe782704b1730682e2426795f39512e83456b367e64c8fe7e1cb5c2d6d728bf4da1690b8547a46f46d2572bf895706798a38ef220ea6cc4de07d0cc2c6e761977dfc3881fd91b7c77689aa3668b5ff06d35a86bfcd6b78f7e60a77764f27135b8f7fd2bb7976129af00b6cd86ac4cc11a1c73f8103faea3a8e067fd689a13b74e4868b4bc3454865db0a144e154c0ceead189adf6b04732757d73524e0f248d68a16cc1313d9243a6fdd6171a811d39ccdaa53f5e47843eaec450225b2b4b72458482f5f346b8c504cd2bc034cc902688cd2a76b5dec9736f7e453a49392fd5a8c9b5d05080d18600afa1c4cc95b3553c22393cc37abd0f55932f9cd7058be84318597cd15ab72848d9fed880c520c5e72237207747990360afd324c899867d7568b805810611abd55199381ad8cf7f85a5471c7d950eef3a1ae28d96b7aaf21c25ed4127541360595d1e47d6e4800cb326ef727160bd7ba6b8173b1ddcbf2ef0d38d3a12746da1a9dba0df93de761cb1e353b69f6d468dfdc48521efcb6c5afbdb1798d849271a3482d4353235f8f5a1aa5f5c63d7cacdea14b93d0312b4178aed0fc01076e5b6d7ea7d9d4c363efd48728e084d5f561e2b924fb950da0f8a2f6be218816f2d56793842e9f6dd7cf796d58742fbbff14a5321bb4e95158fffc4b094034db1faa18990335a4bd5497238ba16dd0d7c41d49dd9e1f13a72ea9245e5fe008d4a3328adaf17201c3ba2586f8c4064ad407ecdbc393116298466bd6a9631926d09504643f7aaa9ae1717f97c1295b93907d460bf2fef651c26b25f2764d7d4157410818e24953049797fa04260e314b501db06a61166cf50f184000c902772b4e241b544a1ef9d052f58eb8001657388282b2bdd4124bee28495d136ff8837c437ea72e32b16e022581e6a37f503a8f8bfc30c14289cd10c5f27c4cb78da009db3f080858a397cc99387653fd39cc8b6b61708c4142827a72f1f6f524350d73b4e825ab1de1f7ce9591f147c7f053ec95a9e3595994874d49426fcfb0ea22105167610fed12c1e831a7fcffb8e7edbdb1b381c8d3d3d06158eac31ac80e691644045b39fe41319cd343482db77a6cb2704506b402097511287f5161a80634b822fef2c672085021a890ddf8b67f00e73b04a6a72893dd9c71f7b1a6019e8fa5727b2bdea76924120da058f5f271145e8c8dbdf1f080d4c7f947b7313b49143bbcc63dc9d2947e7753d050b28536c496840cce1ca3bb458c4201e9d7ace933fd08e9e9ffe857b4eb49ac39442153398fde4fc342ade983100ab5059788c9308f33cea5a6ad98b855df2176b6e9e4bcec16cfb13d59a6a39e2e586e6a0d0a9177d00f240e48f9ac55e3c46eee508719066a6a2d9e2c8ce8cb594d720012a7f019a2bc59f4193271f8dd64e0f00aa5489cde4e4f45acad6e2473d07db4ce52935a44217eda9fa2bc0f1a0649b356fdfb3b61a80d54544838b06c3856c4e0ab3ebc62520253a241f9ba33a55cb1e17e90378ed94ba29ed24c555ee501583fdd21030bc911ff4f2e770ea155c1060bd36ee8a90ae44a6431d70b6226900dd5e69472de2f93999360211a3e2bdd5ddf6ae2f56576b11e84282b0606c395eb07345403dc2a72ada688fdb0a4a4ed6f551a6dcaa16e83ed507493c433808c0806491e6c8ab93520c5a00f1fa103cac7a59ddcb6caff8a9252ac41362c3fef8aab87bd9cb28f6dc223df193128c05f133cb58f9c0dc6b124b360f3057ca22adb5271ad7615522bc5526373dc61db6cf9f0c1f1dff1655de29908f92543266f581a2ce6b570a3404c01db48a9b0b495b4c6e4a06e18e10759db40ca881a3582071dd520a7fe6f07189b39f4e064a8811fc1dd015fdfe136edbf7e09f4c6b879f8a7a2faed27f30dcdf728a735a56a3ef5f849ef39858ae176549b6c840063c784bd0b488ce70fe44e6f05ae626561477c2b5c69f250313205c7f3c4ddefe3992d4d30dd0fd27abff95c80d5b385cfa5b50dbfeb3892e4d0a420e65157a180c9e8060b1b8b8600f4dc6e07a814408522fc59ae4be894ec50fd8c69a29f6346074ba56744528ae44991bc7520e834566cf49868a5f783513998c21c23586650ddf3f2da02c9305c48342d12608446b397d352e4cb519e612c330b16e1b7338ca317ac6182497018291ed7022da6f61ed8b8fa217b170cf82e94eb073dd69883367297fe4a990c7d174e13e9dde12c3414fb7ee64cd0b90bebd7a275c7afc087b77a42e4bb657ee9e72f75903a60af0d20a3666e78ec1f6ae397ff0d944f969c99a962467a3c6fa24113af8fddbff76bcfeb6527bc3714f4d4845bf737f83b015a544c1089b5de841a8335be75636c9b0f8b8e184ee4ab98043fcf92acf5e814153aeec04944c032d8b18b51ea00e443dd72279e87103746802075066f3693f639a94a1ccec2be61e04ed489b29352f3df53a7e730eb829ce814d1d6c4b5d459596027e57f26112319a9272e56ad263065d5d8a0c4b0d29af845c3d6933bff3aed62aa8aa3174931e8714e3ff6f7b08f45ecb16c5540650e9bc414cd4e52eabe107b75c2b70ced7251d9bff8f592c0fc26abaad9e5ff944552734b09fded8678e53ee430989b2b9da34efa0a23071f441ec08e74820b48ded2261057c999601dc2111510ec87b714b44bf173746e259aa2177cc31085b170f775ec8da1ac4e2ea705b12aaf1706838c6d36f6b7703c48c278315cae16175a047eff18bb263a1105025c35260449136d0ea1b9cf6dc54162f73410fbb818bfb170928f093b966e61b44df2a6973a59a860d0ddb3fb03ab0e943c558bb756c9313c23c6d428131bf0df78beffebbef0ac82b6ec0d7a2261ad057e3e73efc9b56b3508fea725746ed28e5305edfc8f264dc8769caa96399c8ddd2e8fa7bd954c46499080bce0000eff23f744cfbdc9bdfafb968a2d4fdb0d142c7fb1a4b044591bc3085a0b0c018665d2c44556a0a3c764a78920dbe32ebd385f7f9fce4f5b1f690db422074ead0177494976ca1635ba72735d272382563885074be3382070ae5c9fa6a29d97c0ecd1d67975719a06672f71d7ecdc986e8ffaf52354aa48fde99e6ab6bf19ba15fabac708479473b09e4c575aaff72fa8778f8e347280194c15a53cd5532193b17c05621a988210daedc30b6cd14ca4ac46f09c2d4fb1c2335c19348532fd09ab10346e65c02d9813ca5a50f8a48bdc21bbb27a833d315116a8fb5ce4ee4cbcdd5ccf59a3d9384d9b30e8be5b5d41edef9696925ee102a95d2c30009599ef2c5f4fd8809e38e98798465682e6aafbcc0e99e74b0659c394e89208626e49e2ef78ac938828a83dbdce84100bdaf3dd20e503b3418f72a5296185b9cc2c4c40d8e8c9cbc8244345ff54b1542a8032168f3e2afcaa593a4fc1fedcaa3aaa4d2ee88e4b85062036dc64ef54913b87b1b119edfb0dd73190c84e5248041e2fb29f8831c6c0de468563fa01c9801ed4b5449bf40821d5622f9867d0932b6b2bccc7189472faf600dad29c6085f6a99df1d35d1abe39ae33cadcaaaafcd8684ad636b0cea0606ee645a311d2b8ba71e0ccce8e191a8ed88351c6646e61098223797880096c44883d63fd46a8d3fb2eb8146ea34aa6def81bb40092b5e65774510635972c16a03abc22c2377d7d856770cc25141498cbd7dea588607c7c01724a25096766d941f4f89e7865c5aafdb27b933c0a07058962708517c440ceb107a9542785def381db9107ba6dadb789456f78e1f3d86be3b495388cabf5e201ad3cf1fa2c9ae340f21ac38596a7327c16375066245ac1ccae320372548c95caf0646532e45aa1bf51c782406f84a54130ec10c350d3a3d48c200eecc1ef80c410282f9bb4c4c7d7b664cac9e99a5d9ee212d6fbcb6e24cb367fa4e1a79f6256a8c0de0d0401406468bff9bc26f1b897be3a4646ba6ba26ffff8c4f239dd8dc8d3815e2f1efb6f312259e003923b6b4ade8706ae9336a328a529af8ec6d66481df79d8ee18d759f77d47f5dab15c7e43a9e533ce963b305393053e0eac744b81997d5903671960f073326a4065db5d59b4611c787ada87e4026cbb9e4db34661d1a0b9fcf49c502cde729f8a0bb5cfcd454df32fb73b0ba9876ba88e3b3ac43fc56a5437edd488a52314b886fcb3e683c91ecf49264b0640a6475c7a28d3ffd2cbfcaa9451c06a0a3998dc7f555e9adb09ca6966c21bf37e39e6771aa140e50dcb3125ef10edcbac170c54eaee343940c826c05cb006d580795473bc9f565f0d735ddc121a0a5c2b1fce5008c0621e369cc807de9cbb9ea4bca702405593d32a44992d72fcf458d1c15c6515035362e898fecb8a4bee68d2993023645558c221439972f7d4c68da969e172949b18930125c762fe923af4acd3831e7c3f735fa80a86b814975ed2301991deff179b9bb6a953ced1ea3c9e6cd34da9333b6701fbcb24719418507f5f827228680c4bf58923326a0b39b7a63ba1a51964dc2da12db0d034f38573d7c8a9abbc396bba115755f34c944434129cc58fd499d2ca4f450d07bbd2ccb1fc8abcc228ed00077eaf1ace8042a66b3a6675064c1e9623526b0e283b372dfca319de0334f9693a6c3d6aab0393eab758078dc2d48d32b070e11497aaf9c440bc3a486e18d3ffa0a2a4b690a214fb8284b3c6666133f647f8c72779a008f862f90ee358ce4aa4e7b59fad355733ab23433b8b018c5e491fdd500af7a1875ec0b947f160401c7f48cc3ca183465798188ab044b7013a4ed6a6ffd363f98606f7afdbaccd5a9c948a09d7dcac76c739b3fe6d162c6bb3a75933031ae93a8f329f68cc28a4fa37b7e76600244e91f4ce4b72b53be034b5770fd0d054e06559b5e65cc4f2ecfd61ac29473a89c788087703aec30fff7b063d656e33800acff61a846a8d594627212484f9b8344d72eccdb0d2ea62df76960b4edde97a06063cd1b818376550d26160017d3575ae61efee2882986d776f28d9f910658a05841b215c58aa25e75b10bdb0c998a09cc08639302833e5bd0039cee84b93e19e6e80cb1e2501c5e96afc08ad788dcfff5b08b9b9f4b67ce78548700dfd228aed59b4b2afe3711ab2d2ad765457b9596924c57a298076b3abb0814ad4604846ed11c78fa51d5a7eb8f60ce78f4e53e5360a30d96544667d8649dc903d29490391a60cdb48afb49b8e949ed631fb6ac148e3994378797395b0c7669112f241ea7a42f438e9351833aa5a129a06b5717534301b01c9c25c6f5e93d04584bba849b5aba38c2c48097cd388ed89627e0c247373bfe1a0e6fb0e5d5fd6af6bb78070e010b064f5990b3b7a53f58c712a3498866ffc0f5001687acc91b10e5800910e4f96a2bf0d42bf5098848bc2b6fcb38513939d334f801975d5dc1a5a7cc1d3fbce8e7c8deab1fca3baeea164eea8a73a21781ba8547e99f5abc33ffbf43924231e6f0b8b3b93644eb313fc047cc0b4f2cdc48927b328f2cb1ab08f36638da3903f7e7ba95ec7f6c8408fe2d","title":"987. 二叉树的垂序遍历","link":"https://leetcode-cn.com/problems/vertical-order-traversal-of-a-binary-tree","question_id":1029,"issue_number":21},"19":{"day":19,"pres":["哈希表"],"tags":["哈希表","双指针"],"whys":null,"difficulty":"- 简单","description":"```\n给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。\n你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。\n示例:\n\n给定 nums = [2, 7, 11, 15], target = 9\n\n因为 nums[0] + nums[1] = 2 + 7 = 9\n所以返回 [0, 1]\n\n来源:力扣(LeetCode)\n链接:https://leetcode-cn.com/problems/two-sum\n著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。\n```","content":"096221cf5b628be1e73e8bcfe626c734a10fb742b1ad41ac640b4b4ceeb6ece4c46c74b1f94135d5fd897cb866ebac1fb82941c49a2758c1af23f822b5e7ee6ee429652888c1cc99636081e50c7898f6d70dfa767226f84f5ed37480a7277449dfd71f8db85e1edcc5b6fd9b2d0a27389b0ec3e1d0cf2906fa3f5f0c87219c4887d6065735461d3241c422af249929f52b5d59e4757d466cbcaa0b38af9db0527b00702f0c4c59e6e50c7484c17e6b0f0bd68ace12592402f127a33154b6420415de50830f7d8305f6f5230deb202801fc09a6366345c29e4d2886be690c3bc29dcab917c2a04d83ff042ef68dc188e720094dc281c05f65117acb0f54a7ae6e73cb889e9598458245487e03d66bb7d11e5f6c82ff33834793e1c41a8d8955b45214ff8c7995e7d210c16175831eb9ab7e0c732df4b75da8c14aa69f61c220ba720f85cf8efcd5b4582e9f9391ec0fc7f8a189fcc994981e9a6b8ca6605d49fc83f2de75918678e66e5849035475ba97018daf34c0182f6b5946d8328ae31b6126a5511847f5d9d64552d17823e9606087615aceeae26ec3ed7274876c112f7a9cea314a176c84658be0795ca5b6b66345a4d5fda85afc007e222ad36d03e8b9e75a96a0af27ca356bfb5f482c0c7d7553ee20e38e819df2f469e99779242c9168bd161f5dfdeb40d3a88e1d384873a4cccfb071e0d864d6d64b9e559b99769a996f450647c83ee95cda739ed6d096433ac1b3dd9d664ebc132680ae8752bbde7ab1cdd6480035c260750b87837a6dec93b8ff8a9330ba0248b0b6ba937fc598f3ceeb7f3f0f4f2cb9ece9d8f65df0ced8f462d84d19aae41d25c7bf4716a7965171f59141211d050f2f35a4767ef2997a11646d1b50beb508708d31456304153936865e19b811024ecafa25f51381f0a1012550b56bd9309a09cafd7a743b4d9d2ad8f43d19510758deecb860736c6bce28ff57a2013c7e1fb93bd34850b40c09e658dfcdf97cdd7a68c0ae24a46e7d5f8182a4c91fcce60c15ff30fafe7b96ba29ee6c1701198cd36b530b6d429d6fed80b62bcf180e291097d63fb5d405d3716b7ba29a5ca43dd82381fe78f0792bda829e9754b5702cc4a78d815a1b9d0079970276792ce44fe50b996ea303c4350eb99d9f0a5622e9d5f98f734a26664844a6e28ed351375ebcf065bbc88515eeb6a29ef552da8c30ad273a9906518c66a9e7cf858ae3bc0bf4a7655f08291aa9c5ecae09e31214a896718033da39ce52fd62388e3d5219cee054aaf0a91b755ce3052543da1b34c9b0c3d9b7cefe1e666ab06a7b2535c22bd21fb5701f64e5908227f194d2dcf8f99ead3b8f211ca063d71f2eb421c3e5144675b094ccc782f18f8ac30813cdfff288da5e9c490ed433aaf4f5bc4da794c08fb95af3777bf706c97eb3d6c326476bb4fe4f229dca74649d885644dffd3873bf16a31fac25f722b6e01e7dc85d1dae9b58b65787cc2c3b00b67e5ae56427ede71c50a5fb1f32673fca9556735f5e59d7210a762567efe0c0753e4959d0836bdb624dd997e441d326a7d6bc2fa8cb8609eaab02411ff015736668a7670dfa9796e16f028f1eb3a45af781a633ceb568b0c5b7c01d4003fc63fa8aeed0c92e5d3616c26e7d4484b795398852b07d256745b0de71e7ce47af9b82ec8b81c75426f5615075a3e6e7b23a22c36d4fd2f0929eb6130d3dbd4c4bdfb076749111c1e9ccc75d00a940d0a6368f033fe206e1f9e5ea4e91209615603de1f422bdfd1f6c48607d10f0ae79fe5a8422026e2886fcbf10bdf2ff15a7601a08abfd230f91801f5cf5287528b6a43be19fae8dd02215596bdc8196b8889bb2b1aa3ad7a067cb38c6cfe4d7450e09a09cebf8d94d3842a3afb2762423f067ad28fadaf5174669394e233cc169684ea24da371d054fb349bef287e15537a4f9b8a54e5673155ae0c0d7a831531c9e320fa08ebce59c7f949a77d5628829f0abea00b7b074911ed06ca29834f930d4ad9e8541e6f1350d4a7706b902d960bc6079be98135f1aa5279c1508aa3897bdcd28e54af0ae62acda7f85b9cd3f93e4ae476751c2de16b6b0e96fd7d9906d370a39b70963018a4ab89a1a9862f6a58a5dce6f3c1edc1a7c0724fdcae0dce233b56fc1863001fd33859eca4b703b7021a50297df78fab8e17ca25867a899c8e2c3be470edc36520b8dc4b985526df4defbaec85c2261b16a26fc402dfc577472482321a3c2a6d6e4b4f14a57cbc86db4fd9d357fd7dd0263c62192a6348b5b6b30ec07c3d6bfd590955dadd57fdd107a92b651ef4668e6c37838fdc7df0f676a1c04c5853d58bc9adf4fd2e3ff21613a4fa1331db9f62830ffcbbabca869054ef0f2cb521061815ef5bdb1d9fa68965b62b9568833ce7877bc0b5c3201d2beb60afb1a8e7cf2fcc6afddf106901b85fee6f9a89d452dcfe2473b7e838446e63cb09a9604c85c3fdd1bc69ad185ff3e15fabb20970d80f0ef9703800dff5e96c57a5ba683d3854290a881ef3debd31c33fe91b055325acb5129a16c1cf356dc4cf7a9e5a4468c9c8d32f90e85885da99c635ef06256afbc8db2ec38ff721491d0bb20fdab337578f4e645ae434e303cf06e378a3f816890615edb893d6f34bd4f8d4a7753498e1f00586ffbe7b97f3776aa403e65d25dbfe5b741da97b55ad2ab02276203241456c78fa1b4f5f27f1e742e3ddc4b4bf8f4595d0a4e0c3fd0527b7ee8784bd72a7475d14fd0471e0781759f9e9be0fc58b714054b4edae6cbab0017a7ef09a745f49ba3a1b9d1705082f321b46e3c1beaf25a9673496c8af737537026f0648d81080f15d2ed5d3b9eb1ede774bdd8cb9859c99860509759f8079486bf5f929b160ee0264ad5f704d3b818388dbf02681aa72c22bdd079f2df315f5372d787e0b96bfbbb1ca4c8a0387d878bfb532256904e77bd5cd56f5494f44cf76d24e3cc0cb818b712e5880b026394d9a1e8db8f08796da662d6e085c67cdede390fd6e23824bde4a65b7aeb8f7423c9bb7949ac8fcdac39ff718c561ab04f148e7b11e3c58d1f0bd80ecbc8d29cf9e79573e28c2e95c844a4ec525a96f972fa7866bc9b606d46855dec09d75d4ccdd94672648d004ba589ce570de638a2db49f2495d1738995e4aea8d4dbb8aacd7d92ef7981c8c3cbf750ce08dbf5c91fdea6813555b54a730b1cc5774ac74b1194ba9b8c00ad57f09043d43adab3d6e50dedae7af2b9f45e778521ac38ce0844d0c2b3f8eaa32b9e8a3a6638eda5545ad9a7ab9c803284757c025636a93a52f2ec06fbdead4b724ba0405d1ca1045ba29df4a7d83fa286349fb03b0fcd40b8","title":"两数之和","link":"https://leetcode-cn.com/problems/two-sum","question_id":1,"issue_number":22},"20":{"day":20,"pres":["哈希表","堆排序","快速选择"],"tags":["堆","排序","哈希表"],"whys":null,"difficulty":"- 中等","description":"```\n给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。\n\n \n\n示例 1:\n\n输入: nums = [1,1,1,2,2,3], k = 2\n输出: [1,2]\n示例 2:\n\n输入: nums = [1], k = 1\n输出: [1]\n \n\n提示:\n\n1 <= nums.length <= 10^5\nk 的取值范围是 [1, 数组中不相同的元素的个数]\n题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的\n \n\n进阶:你所设计算法的时间复杂度 必须 优于 O(n log n) ,其中 n 是数组大小。\n\n```","content":"096221cf5b628be1e73e8bcfe626c7347683248a04f82c98cfa5f9247f160f2728f1a65326eb995e2c4c21d103e7bd46ab345588da2612d4a92ff52ab5a7fe2fbe3d6568d4c4d3fc0b2fc7a89ad2497027a976cb92b3098f21bc2bdaaaa6a0885427c11d72faf1446a7247fa4f14415d9751b4cfbcbe22aa14aaf20ca816926eb7da005c3a672e3063ed2880209935de265247ea6c44476ea8a61c37adb8815c6e3b702f0ca3d65b22607df88e7d1e7835a8fbc67930316f9b3ce94f65f61b1c528b7efe6749c951ef914b0e8f5d0171a424cd475b2dbeb308758ac0313b70babda3ff0396c770ef9936448bb5a3c4c8475359aecdcc2d1f20249229321529a8df738e808475f30c45495903e44b587fd9daa23efd1a964686f1c506a48a779a510bd08c6586e7e82fc04d5447c84c2fafb47104ebb675a0c2498f9c43cc259a77827107defb8ee910278e195903880c2a685732026b5f9b1abe185cb2d69715146517f67f4af804f9d2bda2d1a32d11e85128ed68dd46551d35dd48e1e2a36d1e82500f723185c5150cc42c74ff0916b6320afd96a65db5a77907de425b5460f0b3351f625be61db3832060c6e8bb06f2ee8fc7c932d15d2a3b43ba5572a2bfab1d99c4ef289b6f41813f5341666f2907d344afb7e62d6c33f2499a63162ca752bd381856c2d9ae644e08e59d4074b1cee7a072e3dc64d6d1489b6d99b44698b4754738400fe43cd511de93c7e1964605c29fdf9f4b5eb3071b434525b7e0f628fac4b9cfaad79a4f0975b7fcdfb57d46663a30098c069e81250b7d2cc90c314fdbdd73f6d0b6b9440d787d489a7d6431917b9c1401f54bdcb41169faaa73969eea2002a8ddaf95e8eab20b64b6662da8aac7aa8fcebe9d0077b616a7d65250a8a241a193708fb833f1cac9625ed9d9d46b3cf0708f37bb608a1861a9097219c5589ba274c4c1bd0f1b5f6da6c0e9b6785a29b033f6f57e10cd669a1f79dd84c939910228f72d881d4d5862d82387bd08d2c3a5d303c1a85923c4854749f40b1bef42e51a021880f6578fa295947df4c89b20c7a01778523dceb901ca4b8906e9cdae3f58c174f31ee053789e10f6b85d5a103e827dfcc0210f8c865d11ae1a758a207b6029e56ccb05bc6d6be548f181e8ee9c450b3e8388d3d12e63451e70233c0e0929dfd8f81c3737bba8f83cb40402554007140e3cb73335a300bd34f6aae5ed87b9f9bd36fd4ac2e8cda87bd6efa6f01769f785049752a233d8092cf76aa9b419f20b1ca59259e3acb25a255e8086a24e91de43f9ff92fec786f48589cc10aeef6352c5478c2b13b8af0a99bcc848fe313c82f883ec9e9ea83f9e4d25e8614ab97890d5672345f5fcc3a1ffefd7efc34648ef8dbb82a916892950c361fbc9a4de53cdfcedeac6647539eb25a3c557ac10b1373a0ab895e0cb511cd4ed7f65564a82bca5a85687068468f32f6fb8025803ff176b9dcf069236e5d26c5000dc017281fb9d6a3cf8be1775d99f327ac2ddf1c7767757d4e44e4b8cad6f8744ed3f48753d0ecad8656adaa3e946ce14e7bde96d82287cd76f31ce2a63bc15ece9b84abaf192f1dca16f846af2276ad443716fae155a0dd4c8ec2f84e8c664cf625e24b68d6d98fffe50bbb2814a4ff047ddda27bfa29381047e9674289d89b1c8a1df4733a8bc12872e566406597494a705edd614771c5734abcb9912c598217d90b5018a0d2f7b6d84ac27c05202f36de0ba368b69242f698253fe06f3a2816617a005d7356148a8f391372088778723afd4b0ee796c65aa503b76a470f79b68a6e1e6fd4c0af8ed7fc58ba85848e96364630a58c1b2f5ae73375134049bd9b16fbe506794291aa2522705f9c9c366184472148aad8c791508cff0a115e073ee783458f5c9d4f6d28ffa69d8acd52e880cfe14cf7efd3c1aaa9ec8c487e71057af2daff70dd53a136a8fd1e30e3da267c06a469e7d5d8f40a8cde17c874bbcb0197b8a9fdf53dc0be33cd354baff4d71cfd8e39293292fe5de69a86aa9248a0a2e1b9cf0b67279c05b87a6a87aefdf8f71b2e36c85e74ab675eaa2c54b09f314013c59bd61f0c7353eb027b910d6229bdd21635594f8f681cbdc3e0c04809fb9febd51216926bd994e26c66898b3f091808da9da4394c281da8c55f0205fdaa1ba6c2c63e03bb150943d2c2285283deb65dec14623bac74c98540dd05de9b5e7a0c0080a16a24ec401d6c7704c25a934192505676e5ea38331b714c4b34b9149b86c8c2ca8d98cd1b8c4c174793692b303093a8b714809caae1dc998bb4a2be0d426ec6788f41fe5b24380a87cc79d683339dec89780a38c3655871064f9cc7475e3f929bc7ca69aefa6bae32cde50bb6ce690b7cd4e31a417faceb4e8639f316bad36e78a6acc89cd201d26ea62aa7754134bed24ea2979dbe6e02b9e2fa6ffac9334f1bd4e62eb933611387b9a7c910b22a7919bf8f633be5838c469d106e7405e91700e9ecabdc671652fc31c142aa1bd5ce188c9226489d6d16fc47eab3361c180a190079633dbcc0544c7e07e9c48466bd6d5dc2581ea6eacda8bf13ff830c8fa5c0d6d72b5bb9db3efffa010c087b16611803a154f8db268cf50bf89ff5504f434c97f877e580162b070a386ef3d2452486d9d0c203da668f63655be0ab3cfd41b75fbb3f00ed2913784e03c71357bc5ff81f306d7fadefb6508939cbaddf3f11e9655156d1e4b02bfe36600171c63f574961802a147618f2cd8c5552d26af0139fb85e71c2836c0725cc82a21d6816e4e4bad68df13ee8ec1dfb3eb8438616f27f718bcb859a7ea7d1db2ca89adb528c92e5790ad5f172161d85fe18e41067c02375027a8ccdb7f0890dca61427b81e9f2bb8febd2f70c0a31745731e975f91e6f211df4eeb12e9279e3aa792e6fb8452243e7557d34db70f1ddd0371a993afaa55be4f629043d0c0917ab103a36c0a1248038dd9d96e468bc49b55eb4c330d791737cce3f0809bf4562a782f3ad4878218911831b7395a3ed1db459df09fdfbcd9cc9dcd65c535e745ef03b3fc1b6018c1898585d0e6d229f58c2e286a618da75cdf6064c525a96fed7ae5ca228ab64f9a3c2ea3c0847bd4a9eb93767f49d418a91581ab29a550df2eb2a93ee4dd3a8ec8ffcfa1d4809280cd7d92b25381c8c3a7be039a1498bb9d5a99e3d32b55b54a745e538b3941d51c7d94ba84b2399a43b8ee5fca32d3f5d6b827adee3ad893f7313dd6b034fc46e1a3521d67233978ed626f530770b962c0c05e55685968d6119ca58999fde0341ad8aa0fa692874d729c6acdbeab35c1df0f5b490570e474805dd58b760681169e92b8bd0d9b888b82904d2746f62f67a9d0e2859bc7a206d20319c82e33bc97cd28e5e44cb0110659ceda818cfaba5857a31a00de6fbb92cdc610dc5b13b193bf903fa4d3265f7f2bbdad642988c766f4541e6a89baeeddd45e5ad3304b8be22bd2d4027adb1cf052116a0ac9a4710b7f41f813e8d736a8cee6aa870926e335fd7272a8f86a546f2b151262894332254b0d120f6a0b5adac5714df1f046ced28b6c7ce03c48571427e6ad12358efa1eaec7749fee013e97a52d97dd5605396447e8a2d45a08f53f9481830a248632b6312cd9dc676e5a7b055919762f7400a577793f10275142525448009e026da833e1a7fc25dfd895b75b53b673b29a6ea1ab909b9a25cdacf65d467323899fb149689c7df54c7ba584da76e3c5d35f9a1ba0275dd650449ea34d2c6ead6d7fcd5d1c3291d2384ce237221f4aa57cfe721889265b0dd8094bd1e5a596f6a7a881b35d8852ab495c6678cb37ee49c82f16126807dbc7a7260acdf85c312835b32f840d56f5257733ede544a7a9d399f183defee727f5054a5cb02d46fe8b241ff8f284b99298dae56ed2291a07cc4720b590daa7ee84a2f497755a1173c34d6d5f6e0b9cf03259ea9f82c402b24db0720bcc47ba7f54ce373abd8b717acf898ef220ea6cc4de07dddf205c256455b796cb549c120b14159aa27b8600bf21228b41fcd6b78f7e60a77a77e8714eae8ad72bf1d833748d14d2d9c6a92aae9f99ca7cc5eb234e4d5fb50ca878bd59d4eead3b25340c869b1e13817bfb0f5246142f00617a8df59395f2cba984db6461e346079f8f57d909387b84df2e92fa6c788f159be129b37d14da95fbf7edfe811e2e316bcc717cb4088356f76c32be0771eff80b1975d8aad69cb085e89b68784b5b7488333706cf03200b1029639be1b69df953eb7b80e15bf770439d2667b4dc9daf77882b949571061c0749b7261ee9f4fcfca0518dd51d5fb56c5501eeb0c737c621a43b8113f102ade528728b7d6dd588e04cf127d5ee721e53770d78fea34c89b8efdbe1f5cbc3ba453a4fca4fd17ef3f4af21d7634d9ba39f1739d6553c0fa3d49bfbada3ffa3db99d757122d7910112fafa92293083381ef0aa2c2fce32f744710420254d2c96c4039b768386f1c783fa3df9cb516d2433175f537c967be01cefc44236c20d528e6a976a36f31fe302c024c675a952ae74e5bea1596410da6296f06527421662ab2d51c8d98a2c66e9104798eea86bbc370f147aeeb017a5c7bdc8a99df287a0d55b0255bbf37ae965376f0dbb8c4e2ff3070cab040eaf3e21fda3e3c8fad2b1a1026905742b4425d924047ffbc371d16a74199bd6a8b2f9e6a385e727ff7bc94ad0d09fd661476188cc28952f48f88cb96eff67a4a21e9781a4f3c8ca1059d164176639b4353dd14bf21db1789115ad79730e67d36f76d67212432a906c7f82752eb04f1e6566f11f9047e61ec01529681d3a5b572d1e245ff4a82688aa5c429437b5a1d348545a79ec0c7567309ffad1b3a49fbb019e364022e36ffbec789159084d82313b2dfce14b4162cca16112fb21913774c4f68da35758158b0cc1d48d29c9bddb3aba8ff8241f7a5fcf3621189807580e74426c7c36e7946a1f86659a470f271f7895d1278d9b2fb7b97a2454085ce538eccb990e8eadfdbc0f9785fdc4e46b19c1ea4aeafb787c5db23b95b16acfcf8a823a4d3ccb43fa2bdc4afec46888e730b018c1e39e649023c8342293884aff9eb56d292a5d9b8acfed25895cc48fa1084c09a93626d210b9da883afbd65fdafcb5a4d8e3c3ebf1f4ec4ce3287b1e2f8e59b85c681b55c704ad63dc20780f8f22ec0c5bf0d431153100d97963c4e37009dd57ff3ae6e2cdee24664bbcf5990c2c48ce70835b35e92f429015cbf378cc9eb6fbb82e72fb15aeed83954a6667b3833317f53408c3ae409140e03f29d837e4ac1f006a36a4552000b47023d1438ce67453f56d3a0104f8857c373e64799d88363b61b71276b0baf0c43720e4d7714d0494374f2477881e9fe2dd0f2f92b8f7073d2fab257a6965018c0d11c9aca201b5efaa488257b0f6a711491ea3700b51e45a64c7ab2fdee66bf388c1bba4e15d7b2827b56eed41ce4e3fc76ac69195334f264f2c3defa5aa0430060be3f1e58e96b643a68aaa932f6784619f1adf281d3f5a12c0d392e43ad06fdfd213c2517fe270d4f209eeb65d673d4d91b5f01f0f509abcda616b135cb0163f4cdb9cf4e37ad13570e27123c4a0908a3b55f68a26e5fc88b71edacf1673bd213759da2a2899238969e66a28f5974c8de4a9f7dbe7c9f51d3c0dc6b1d4436c98cb641e1026da7c7804b5522bc5526373d964cffd8cd83e5f645ddaf58dc74b9c2157b34e9c8ec9a2151166042cc54accf8b10545d157a031cf6d71732d39245e6d5bd462c719a004f3eb2f966c3a692074956ba228211995ba9e00d70dba6fbb54c6887c68abc811c18ea9f335fd44eebd793064c98101e37468dfc6cf5cb4e40ccd4bcb6b3534510589527779d6d824cfbe7b0b85e190306b3c593b99ad2b2845c4ffc1e90b40a82953feaa0aa4dc4daae997afd9772677529a9670a420e29502c5d40d8c42fb9aaa2661408cbbc2c9b02044f7addcefef98946aa4a96bdc2548d6d1d7d9056740c6eae4cc815941b54c60c219c46dada44347b0cbbc0649470ca6c27f53f2da02c9305c483419a2208456d31713a36238a09e771bb528b3a766f39cc7676db14448d00d99ced6b7841fad2dc8bcfe257fb23e58de3449a73d734ec336d3374ada6f3889f74a771cfde53c30306f9af36940b8daaf8376e463beb083612ea604bee02f1d372f14645af70e4de1d0b7daacb928aef7576f0826ef963c99a962467f78eb3771f6cb9e0d5b239bab7f3527bc37b4f4d4845bf2737cae31be901875c9b40e815b17458bc573786b5edf3b9fbf05ebc9e509fad2e9c46e80e17e5ca0bd712276bc84a861ae8551e5ad7790dba34461a2746420d66a1267037edbeabcc8c79a34a51bf069b727b275ab77f2c0873c35493f6671763610b04c796546d40e57c1e22caaf6ef0229763104f0aa0114b4b7ce1c708747135f6b7b99134f2f07875fc168e54a5a44d7a5abb119f1fc5064304bcee5d09fc9665d4984fc81165334062c4d54f1716ea83c421873d79551ba85fba9a84761f791dcf289475e723d8bcaada2ab4fdb94a3ea741f108bc153bc3a7ed2d6e0538dfc50147c5e8c1f220b38dacc049c1a0c33ddf70afba03c19ddaea89aa93493eb00a4c73e5a4e5611e85e0fc69f0667019459784759170c3f64b25ec07d5d2fad91fe0103c6587d2f6b506d10d2cfe797534be91c1948bee6c4df9d76ba3a5756357e33be1c050c1e39e5fc9de7e872ada22f35862ee39b721daaa3df152e48e21c231ba06f7f0c1b1bdf41fe74d2185e9b52911c70ba4e22fdeb55ead4a91b054570fa37ceb28188dc7d06c9d8b6988a06384bb9c89b593388d1ac128e1040ba74e5ae7f42a2e5ab0d68195faf624e7caf1a6f9099fa22907486fd3fd63c2c2f155a2a2d4e3b8127758f5cb93f046ef3ecc21083d52256c40333e595740e6e8980745b5e518648867ada92f8f891794e6ae9e3395b53b19820759aa9bae2f6dd9610ed1117696400feb6570e24678da95d2fdaffa44134aebcc9d8bbaaa61ed8cec04e4e735921f154252a2df0ae6ab7ab4d235fbec5778015a7cfb9c56d8f5a2a3d270fae61371c4bb021a9c1f05be688d69f9cc2b066acaf9f09c862a3a11765e29a3827ed68e3a22f3705edb6ccb685e8e7dd043e435b8d6826e243b806557206951045eaa3f023a28b6356c72409e1a62eaaeab661100b5dfe43c0365aef1cec73a7f99e1898c79884367225740266f2f30c69a659c491cc06f9123e3825ff08ac828cc8dcdcddc852200e1fa39fc5b2d3d1e56b27d52bb4309f9908d9054f0d6d92f6df27d48a1f5d5ec66cdc3fa5d1a26295c1d6a11833d2c7a58544e3f573d12c0a7f8dbec4ef54913ea3e4f44cc91b0ca2816019dae2c8c43bffb77a9ce096124b01d166ade67e55ca95c7e2af114ab250239a2c826707de4e6f9886aa36d2faf6f02ad23cc020725c7804571dbec92819436aac0eeded6f1958d696106e00c0ce46e503b372bd6cb4b428fbca8dee6ed917a544414a95fcc2e37cf8446809f48d0917e8464e838a0b9d05bd135b17ca1c4bb095d17427f29287f314772847c57b0d52c6938cb9b497e5e98444059b2b60eaf0bd22ee3ba495aaa599f7639b11f8b165a43d1e26a66977fb32e2891c81edfcb9efde88f25d8ed50e3f9a03449589b417eaa8cd97bbc32a38e023d93bf3c6052fb83aa5f051397e103a6c0e7514075a26e18260e2eda495f062b03ac50dde56d302f09ce1bb906080e2258ef1bb31569732ca14a59131fc8171f0d3a3d488646bdc405f1431d5d85f5a94116213e7b07af97f3b8a4b73d202ce2eab732ba67fc4e4762dc652acc27cab330640e04d2fffba43d5ac769ffb23c76fba960a999ae0678f79b8cdd1256aeb0bce5f3616ad2556d6af9faadb30b6ff9246375860ef6bdbe65285e1ea58183e1f6468b7dc41851ab5688ea5eca0e35f249b30539791db4ea9105f402bdd5903671cb2507336fea525dedceb14611c7daaded32132a85b6ce822f4c1d1a0b9fcf49c50283a86dbda8a347ed8147dd34f361f5909c71b18be383eb0dd16ab2057d9948d2190617ca629e4e7a4dccf7de9264b064577f5fc7a2d015ae78fe9ee0061c44b2c6d58d84b805e1e3ff91adc25650f12ae28f672ea3704b07dcfa07208a45a1a1eb70c54ee7a54bd5029c5d15c5502d3c53950e3bd4f575ebd77cdddd73aeea97e8b9ac48820517a167949b57e9cbb9ea4bca7076094b4e3ad710f19570c309f2591b961e1c793e27f29f91a3dcfbb2d87bdd02774b51ba601a608c057d4c6888d3ca427b55f48f2014095c6ee775ee5bfb27159ba8fb6e90aa826681d2e87beab60d8e2e1feb4b4bb341f5b35bb9a6afb81ed0937ff97e3ae1b606500bb31e2070adf43f5d427ca4468ba875390d4b44baddd80cd2300d8310f2d9a4dfd1f3b5c286f6e2cacbb6112f1a62f309c498ff7ebf2cd843da3e00831d9569a612dd437712e008238ba0243d1f1bebb2ca7b27ef95f8616490c604c8aecfe47e09669c5c6c964f9b93635c5d6310d5b859884e925b452751fdc2cfb8fafd0f6bcfd56468251a07e85ede9ce7ac95aa8618978dc491e0dddff1d97ef1b4568a4239a06635e2320c21bae9d0232bc9e6fd3dd1cd7609b7196c083249ac6aeabeb31fd401ecf394fd2e304c01d019710a3fd5c8a7040b225ab88f3e2ffdf2a71ca4f7f0fdea8dc6b355af5400fc0b0eb9be11ff11df62d2ba260a14d7d72221546e82030a1a039121ddb8e4fbc7c04dd8a16878b7ff78b4dd9ec73b8ee994541ff417659f5e0483995d8cc05da49cbc1d77f9cb27f6283925cf0dcb3ad1a84b0ae039ca3f3551f0c6d4cfa73b13ce3fa63145918016e85ec46084c71a0f2aa6d65dd41d66f5c4c9adc1f9c372b9c72cf36b134ce6107eb36822500daa9e09f8870eee497e4dc4a40de770aa5c22af09aff9da2f8ba2df178c6726420f92dd7b77c92f5595b5f396c48d07015a07127e5328065acfe00ae2fa0bf679438b61948d132ed47c116fb5a011d0d5be380557ae993960b8190b54bab868d98f4dce6e9bd818c11c405377854887736fe9b7e133f21cabbeac7ebd1319a34f0742f9b3c42e14233de2312fc642e1d56460de6cb25c80507bced8c5c8f992a1e1f022b57611f2dc0583fe3d25ed3ea8ded8f7d9ee538e29b450270bbddecbda061b539b11ed555869376f12a4400ed63e778cbedb6bf6aad7b0fbd7ff4ff4b86216043501064d495f04324888fcc70690459967fcf3ce0f1cb1acd73019c498c8e56a519eeb7223b137708d27d92c319019198bfbd3a029cd1e89ecc1a5a7cd1734bde1f7c8c2991cda38a2d618a15c0a72a6098d83af4bd497599b25fd914d9946062424241834884ccd393cdd5ece1062ea27e3934b388f1990ab29f36929e03b2ef7e7ad8eef50538101f1c3d37ffcb1de869fe6bd110822268e2f70a00da5efd1d1f2c7dd030ae14df8b3c60e490a04e1f111b0a43f8c8dde7d7ab02d6f44e855bbd06651003d3f2f4e8926372a9464007c0b880e50212403d2cbe1c48b8629e165dfb5e935f134911f6c9b5ab0f608b4c9db5411a259cec59b1f72204fd7d752f5298904d6921c451108ceb509227863918d1927bb778614a650913969e6896da905a962e9c3debf6f78328bd7ba0a6bae03584f7f34d1b042cda252fbaf82f5c061252dd39054d4a9e195b1c842fde462bace45048e4dd717fc50e4e049652765583cb86ca9cdd3f702fcaab962dc30ad52d3cba43735a53ecf4a9c888ecb53bbb99ee9e44cec222bbb340d14d3f0897a3d00b87134abd1ffc6e38ed1236c9b18f5d6e8637f03d4de1ebfeaf3477354f1dc50e6e32d64ffbc43f1ea7651f44817aed3835b941c5ebf3b7f958998c14a64df050a2b05dd25f6cafdc2e389a4dac1c8bedaf275c086b09998e44dae889f6a774b3e927920ae865141e5493a72dbb384d85f24afb864e3abfeb8dc2154ad3191248acc386e03f6459cebea6def14e41cc66e7d346962fb591c1c05f4a198b36ba5708f05a1002f7e080fa4c2b058d1dfe816a4a5e7d0855989f742219888181730a13c73f6c77504c768d73bb2e125fdaa7724801caea4bba3a32a86fd4272ebab44fec1343c7fed6dfa44f3e2f8be85ca68539253092486c2eb4db64080cb7ac367b45743d3e3c5c2062017f9387de2c6281a96aa1204fcf7acd43e6da76eafb3b56606f93ccecf2999dca92ac453899c7260fb23ab8a0b1a64ddcd7c94294fcad863d72b57d9e01f6c809fe5fadc04a0e94651a223f8e9c416a9dd2bf1e12ca6af0be0cefe84c9945b0b4ee550d72bb273bb6ad98c343c4b7575117ae1dfa46764b43f6300444c06df223152dbc37ba6c99a9bea4b6c72b71df6e00e0261b587991b6fb8df5b210f25a49571b27411b0f5b7a972acdf16411da99080c8a60f5018e450a0002f102c1363d90539cfb4aa0d0d512824a8719175029bf6bad3d902cb5ff84181ead7c65b1cac056ed4bb2ec71a3b6c7bd2d1583f5b8eeb30ab96408dc9726075363fb2b33bf8185d6b188fe46b9b52bd63e47b72e7436cb168c11de9fab5e265d500ffdf1b0b5b21977096f474ff226d2521fb08e98524101b0478ccba93f62d496c10389b6c4cfa2b7ee340e3413306a3cdb8e80a9dab3384d4905372f93d734513a0df32b0aa8880be8cb3d1a50a6de597b4328aeee867455858e7603dfca9c52368678e9ca5747669aee92ef00623aee6abbfc1a6f4373c5726076cb0ec73e07646849e487d64af3a21f38cef22d544c662bd22d3782da8ce452241be9ec0f3688eabc05bb220e16a176f88dee49d71b2badfeb54d39e46b1165ba12460af39d490b245a9c156fd0c1594ea2cfe325c686f4d622655c19d2c415a185da89aa6fcbecefc9c8c006f9f0218de4a05de64bace117c1d1b69c7106b3ea5c43e16b201223fc33ec387b02ba1d99ad24f2ca41fc04068430f9607732a2f94fbd6b1b0dd445883b6bf27ed7f99c749f7663999dc58c06c420b27c4721bc2389b3ddaf0ff03cb00005f7545530f1ee0ab21b9259d3e56cd1334a341b26278c71af30578f861d14c83adcc4293bbb27fef44fdfa73b04c83fac4b2bea87c34d9c706734b7f8fb4101effaa4cffe36b00520a096239179d5570d28bb1a41c0cecc64b6081093475714e302a07532164b6959bddfc7e5818cfe50f3161b9b9c401ca4bd26596ff81e4b0b3b943cac593fc98b33b871c65f06a9169faa38a6dc010e7932940240067b14ef3a9fbdaf4c43374864a7885daefcff87b78c71af8741f98e0be12ddee0f3df9c7b4f24cdf577943344fc2c6104a86cfdc19e43ebfb0854408ed48e42867e5f50e8c7ea879d7a037a2e26d4d54e3ef5c1bb719633905a4eb282f25a89ed7947d948b0a970407ef2ae13ddda204e176211ea80add780fca791b1865e4035c05a72d8e63369c6707c992cb66af3ece036a15492f5bb1cbe551e3781d41bb5db05e659b3756c32ceb52f082ead139e16685184221072c4c2d84a75bdc284a7f17f9345ec9739b37fefd6d512dd8fae3886d99b698fd1e0d5cecae24983bb68d591a4621cf812940b4b72ab8bd9917eb5809cc42808df5488a7bb2fd7073f2dda58c808c8d2e6d0c3c79fe6a1f89c4f07c7bd03223f0feba1df50503f0dc11a915e25c8217898676f167a3d9fafe2a13369b3280ace96ac5c8d61a0e0bca7a499b2a07742b5683110f0f8d2c36458ba534704cc6a40fa9fbd7eda254c17f73d70a0297cb613c77969b82060c9761bd0118b229faee8e91d5374c018aebff6fd9e186f8e0811ae8b934cd1f46252c042b74617879b8a5a1ce376ca8835d049cfaa9150bc74322401561be6fb1248751a8941b05c7817d385e6e78fb4b4c9bf10630b6f2b1fad922451257ec22937b41277f27a699a619043d8d3d5b3ee9708f5f6ae9da1be6bea5bd87d796a35a73da7bebd6ba5a5cd2774e7edf5e36b25405ec3343baa28225cc20637c8cc722aaa579219033d61c3c938b2601e3194fcbe971bb395c40e254d271815dae9ba4116c6f1911d94f096ee1c59fa8cff3820c5aca2b9593599b25f0d72c7ad08447118fbeda624b8fed89ce3f36cdac2773515bd433a4d9ccbca2a57f08a7571b89cc59c58cf2f101a2e759fa9f33eccde671c42d3716084a747aaf371d7c89e2bd6b03c2068b26f1a7513345c20330f25840e9205462cd90c0b208cc8a9bab7a944125f556a65d7f51c2f5f5a90df78743c68663948e37aa28c5fba0238afa62cf7611f0350ea56c1671f03ed71c4035d4d638bd64cd6df2fed1010dee1dd56955b355de80aa729282118ea373d5bb516095aa42764da86d88cd315cce26aba553f219fd2bbe4ef2b4861a0fc358c6388b79398b444eae94b21b714d085fa9688d80a47049924c73239ba70108fee0b7d406df6ebc2e9ba5b572544db7d3410d5997eda339e8bebdb5cdebb1fb67fb848209d6302ea08a0e25724b49d2b2cdf850b31a347fba8adfa13b9c9d82ada179f7437a014dc8139c662720c23a61c9c532eeef5b6ffcd57ee26b60636206939e84583ad12441c5e79431e19a48c7be3dd2bccb2dba796f3f33a40ba8d9d77e73072acacd15bdd963443253a70c804fae09ad861ad6ef45587baf9735cef9e9a29b84d4617da8aa5d7970b928cb6671400cd7fd749058ed130d5d08c82ff0a48641df3ed4d8d6a192fdaeebace6836d25c680af971d774b20833bca2b128686ae944423cb36a9a66939061251689686e6b5d21995fa7b8791c767b6110a38a22e115ae83ce92de5eb0e794556cb44a9d8ed3992b738d78944160d3532cff014806e5600367f2a3c77603b9d16b9a193fb4ab83461097af770867bd76661b9395a93f9a41fcef28b2d241c5d003948820a163d769f300eab8abd16acd4f1b641aca047b94ff4207a8dcf1f20ed4c3ddca5bedef04a249cdce045f3edf09de909eaf870475803ca9d550a5d884890a8719f3c28bbd7bcdfdfa4875c6037477090cd5d8ca3b8f9b48719bf07e91e4fbe97d1e1d91911c17e91aadfbc0c5505c3fe00cf378fff60787ac727b42309639a2fd9ae26caae94abaafaac1e1b553ad32cc4be462fff56626d09c20bdbb2f67b052479b1edd779aefffc6b5b822f0cd5dc9a41d325dd5cdc2651c3f9448b5cc5dde5189f63cf5b98150323b8e95cad0c2db5dadac130b9dff4f10c97615df400406c62ae9626a4daadefafe0cc127dde412ae20a685eeb9d3916846942335e08aec08efba5178a68d4e7633e95caaf0c104c22f976fdc132357ee4b789e2a3d5572085dd05cb8a837da7b61e52bab88f8123df51dfa172c7a0cf23105df83779b98542e0dcf0742f5e459c9b2b44bec7eaa6ffcd81611dbb7dc5ce3dcd24902b4017d5acc3c90ced5b13b8020fcef064ba5f0fcec6479f928a6f1743737ab44a6d8b87c60328eb022ac8df9d4828761904c95c567365cc5c6217618ccaae99b790b3cadcd3c72b012dee0c268f46ab27b55def0374e5f1f16ff30a476d812ba42c9150e2687ab47a9ce0b2bece2db0711b861a1614907a66235957dbb192c6bda8dab25142b94a7c8d1faa475ef6fcdd578eeb736e74df115a72b11aeae649f7f79e31ad0ac6df39a0aaadbcc1c7fd7bf728a0e62297fd10681541f62dfc7aba5fdf3def65dfadf4bb1299bc9c9f289c4fb51753b2be5bf03e2829c5d47e0b2007ca4679c0b8a7c2859338232e1ab41c7162b7ae6d67d07ad1a60ded757ace1412e18cc52df71dd8678d6f54845e66bdeb9fc812da07c082411fd1e76e3ac9f433d641d0aa1207e1640571c19871e6a7ad07cb704151b556c1a3e8bd06b85dfcabedfc2ac9de6b6b60230057ce5ac18c4f43004a3b55735a5305227a9fc9558409e72809d4ad827e278ea0b81ba0d83b4765b0fbac9462cc8f03c6841a34b8fcc771336f54c564ef402127799814e676ac0543bfbde229e918146755f6e91db700017258481947f3559eceff2834141eac31dc9d805a2ef6dbc7811a59013ed683c99b62f4d43b3456e2ad8b9662926f833334a15397195235181370e6a64010b2e491b999bdfa51cb0c07e175c1ff61485e890ce1b9b61e98913618af10f3128a29dbdb66215b79e1753419391f5227c1de4e960cb99477c5663bded92e39573528cc92ca41aad2472c9d8abdb535fc9740b7f84e2895cf9f71f5ca9a6f55c2e8c71b682ed79c431481294eea94670a75e9ae664d264a90a19106054514108af285ed8b84d31781e2219ad00ab71b116fe6df79ea0fb1874fc42a3ca72c555e1def9d831de3c0443bae19c80acdd3cb60c52b2f260ea4dcb124090f9e1d1a44019f6a9259b2d7ae1b3915d322cdc27eb929232a2c15c576f89b14c8390630425ab9f7f228bf4d8ec5e68edc04f318eeb2caae522da51a85863943eb82780ae34509c65690dfdaaad5ab4a80bcc1d8d020c3af5a816f8187b91baa46bf8690ece7db431e351d031d1b3124daccfca358a99568ea01d8d84ee452770913737ea00b56b126d85db15910321abdaa6d7205d8b2e56a45a7d295cf28edf872dad7ee5ee5f9867b78f383986c9d22244e0330776c7509f313f1e329f7433797733aa1ff8991bb26bbc0ccb951210245116c9c93ae41b391d26a9f1c07f9ca51d3d97249f303b3c287922f44d6eadaba2d03821aceb9bce8f620f3f1a91bf8d5c5ff05352356e09990ef7ed16e135888319ca31f6d7c255fe3091f2c00cf1a4ed973fa3e393a442ed01144993fa1c361ca496f85a961fbb5335d308f5cc7de4e0e5e4ae160fe50e20ba47343005f1cf8cebd175c989b3d91b5f294a25050de3c79f0ce4c90f078df5cac14babc8b44d39a7f109b468a4ebbf045066b4ca651090720e85c4e23e79b8857f0d6292ef9de8e1a16a3dc52ea7099e83a279d94ce702c6d0052dab67e51168f16976276d83ba595cf697759c9d7d8d5076ea8dfdbb5bb1b1f954d9d11fb8afe2f68fb4aa725bc99e326de6d42b777a64f5781a9f27b4734b4dec1ee3a0c09ba163e0bac1e7a42d933ef34721a0099134c961dd4c24758c0657118c9defcc1e800e7bc3aa88bac9408fb0c5b4a27f54ea62d1191299bae53745484f2ffa6d51c8e0da4f230b7a9d260af2e6075e2969d1fccbb5446964531c56bf937613c04a0ef5d36bbd72cdb41bb1e836766d3287d58e1bd877eacdd2ea1e1b14a56ecd5d1de305e4b0e766dac49c6034f850836d92c7645514c0d182166d0bbfd85ddba9a50be9779ed4f3d0ed3229216cde7c2a37e72cca441a4e9b814ec337436283380ac62e9e70791d1487933c9a9406d8753614d9d91fe7ada16411f3bf2046563fe8596272026c052bb54a9571952fbc1465f3d6711953ec3","title":"347. 前 K 个高频元素","link":"https://leetcode-cn.com/problems/top-k-frequent-elements/","question_id":347,"issue_number":23},"21":{"day":21,"pres":["哈希表","两点间距离计算方法","排列组合基础知识"],"tags":["Math","哈希表"],"whys":null,"difficulty":"- 中等","description":"```\n给定平面上  n 对不同的点,“回旋镖” 是由点表示的元组  (i, j, k) ,其中  i  和  j  之间的距离和  i  和  k  之间的距离相等(需要考虑元组的顺序)。\n\n找到所有回旋镖的数量。你可以假设  n 最大为 500,所有点的坐标在闭区间 [-10000, 10000] 中。\n\n示例:\n\n\n输入:\n[[0,0],[1,0],[2,0]]\n\n输出:\n2\n\n解释:\n两个回旋镖为 [[1,0],[0,0],[2,0]] 和 [[1,0],[2,0],[0,0]]\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f2790133385f074703f574c55731a5782802456def33e1703b4520385a146af371c9dda651bd4b838f921b4efb022fe70696a969bd1e10621cea0848e127122e97f8386ec039879bb2ac1eaa6be8c5725dc460bdfd86d69b4e2ba2331213a8e30c3ddea20999130a737789b6cc24cfe920a2a476d4d6e7ba675b941fb00ba68720bb06a27377ecdf2157bd0adf212407a041b68cbc92e5252228a9c10446a4cf3fd92221d7904a45a8b6e37891f7637ac15b57f009e7fa5c54768e86b742ebc73aa501b52bae57761ebbf2b521885dcdff95ce3cf32bf966303b8e7dbc491147734c7ffa24b004752a06a6e214cecf80fdda4e8f348ca3471187cdd3e195698a28e6da22efd0caa9db80debf16df82801acc46cc08cd247bc5e151bf02b6180c82a279ddf73ceac79ead64f887c9c166a879435305269abae66e9c5d0648eefcddbe0a0ec8a7ad046ecd47d3315d6e7affe06fd8615847027380f32c70a53b903a036df1a34795853d333b7f0318ffe61d5aa0a6ea6a65f2ea1717fbc7127da6f3851bca79b7dec665b876f302d7094eb3e7e1755b96e8fe77d7cbeb0ad7fa9d7e3b4d843b16458a729ca450cd2b6e677a0afa902c52f42f940692c06547654f0e58e974c4e4a30bb4553aaa7099c13e73b723bcb8d1cc30eaa25fe656f08cfc88cb699fceaacdb8eea60f4c861cac65f246b73b26def03876cfa75afd29747860790eb52ca9732c0a18e25bce5f129c2c7bae88ed792460b4892fec1bb7e5342300b3b8214ae80211b7222cd0121531e33d0f8c0aab9440d74597198734b3dad709b29231ace95d9142994961c3ffab7076dc9c9d8d2c584e111d2b9433daba4e9a4a5d5bbbc0a708b3448533f14190d4384ae7c9f8d330250ad4850fbcad44a3e2ee85b62e3239acafd7eded7a80ff53e77da4f0a14d6d2e296605d4e61ee1a7eb47b94c3fed901e3967609e6535db3459083e62f822777edfcaf7eaffbb270a7da59d45b71c7f3cfd261637795b52af64ac8b6d03e41c185dfe2fe11d23a66069674b4d8e8c47e5c55eed266b073cb992d3cbef1279365b19cc36e7a20c58388a557b8572cdda482894f109936b051c7a2c09a5ddb24d308f2169222ef8d3e2671825528eb10256ea7c292d8e49d9eaedeee77664db3e0de464502d830b6a290f697afa452f2066c32a476810b2d1c2b692b44b00af448d7f0c3a85b39712a378f0082876dcb790adc7a8c20e05aa6b62417bdb360270c8d9ad1033314faaac7c17cf4ad6c759ec6d78aee9884e83b4376e351e76782322cb4a8369793fa4acc253094d983d88d72fc2672f4585dd783c740ed8c75501fee9eafb19fa4f6bd8a462fa685f8d9937719a79577f7f4de8dd340ef107a8d87443bb6b57e9e881f96bdbc293a01be972520de945203f5b2c7c23312ad8d678639b465e91aa9524f1759fd5d3db99979865489c82e320ab56b72e56d1eedf03e518dde1e075d3efd90bbfbc55d02d878c2b7693cc38473c93e4a6e1747834ede9a13624c930bd59e9fb262d8e80ed6136ccfad8e138cefcb9149afd27e6e4f61cfe30ad95632ff2c066cc75c44893944622eafc4c45efa6368385417d09af9c350b5ae80494812c45cd83683a4af84e7f4fa3d1ad039350c004681974d69ba7c1570fbafc4b6f5be6f6916cfd2cb8fba4a1f34b9c59821719db9018820e9d5830448a151dce33fc14b72cd5bfceefff612812a96516b6ff9d75ce6ef426c43607548e2ae32b1519e624c4473dea1ff14ded833a127bf80ec6d7081867e698aea36aab5d82459b0244c36406f91d3d9f2131d3a7e213b762a2ffc7f11ea16bc4f141e4ca9fab3260c2c0c28c6dcaf2c720bafa09c62b47eaa202b34bbe7aca5eee5bc58acc7d966d705b270f63d9c2a79f6a685aebb8b4e4ac67b86ba8f4cb7ee804aa9eb525b9915a07b08e3533ce34ef085fe1642bf3f79f0bfd7b88006ea579c1d852e859f1c797414ab8bf9402a80844ee7118f630e922922971e04bfff3cb80e6f4e945e241da853698f27842e25c11b3120b98b1bdf8edca734a0345cd3dc32db079e14fae0cb5adbd14370056b50139bc8c61570296f7be9e7e98e040d9ae34f9a74754f2580b793e60fff9e146d52d33bd6c8290d32b1c2ec1cff77f10cf5b1bf60b4912dcd6f05ddaf2d2d97099dc619ed4857520704938f9b74b102e50a51ecfee3288df6a0b3a8f2e4cfe672b91c4b53ad549a17b43c927a797f193b6356afb2bd5a55cafeeb039899847e18934e1fb221700f7aa12bdd2c3b8349748a7b3ffa6d10bdc9fc104f4f282352a6b041a2d66c1992fe0704e25f8f2f49392b3d56a24dc1b227bdb79ddc4ef61eb3396e16c2719131e770ac2a43cc12346fafbc852dd622b1e8b38e7d8b2fa9df1d694fed51e121087815c22963cbfe2d2f96d4a8d45dc635cc8b3e11742d39a75bd3c372229a1b21dcc45787ae475a424c95b8be3f9d727ce1facd361800c9d04b7f78f245dd6893c3ebaa6508ac5f8e590aadf5037bbb1fe0e8e57e4307984d2ea95b1d5b5ce14592a8d9750e6db70613582b43372198cb4130f0d72e88d0d561d70c981af2dc7cee9316a34655adb8d997a50ad4a3cdaa642494b9a458a4fbb76ea0e9244daa01f04c64c4ff126163d0001cd026e0277b253556165e7cd36932426ea6ef74e2f485aea59a70ab95e2e5c1e74773addb9af9e533a54f510ea0575181051e50d3e9be0fc5a1714054b4edae6cbadd402a6299d420484bac631c86544b5c6a755e14fdc1f3ee75a9271ed88df8731d7651273623880c9ef9091fd5d3b9eb1e8c321f88f4f785cedcd51e2328f3e57b1a2aeaf629f429a75130bd0335505fd4d092cff336caee7ec238f2328475b61eb7707958290bcfb6bbeae0668a0387d831dbe1327d7804fa7b8cb64688490b0297058f7277e488cec525265f9ae3146d148f50818eb281dfaa6f7c3f19217ce7c7e390fd6e71c71f8b182bb7a4eca31d6e8da6dad49fa5828dc18c3c8f37c009d54fe2a53c58c5031a035900723ab1435ed1b9a4860443f64dc8f6029e27a822b46f09da0d2ca010f0f517617dfb186e495c95e8a41e9052ad0c7ff91bbd4ea47b5ea8476cb46e0cfff0c4b1db7c306bb20e1e97187707535a997496345a78d870364782c32eb8b39bca26b1b920d98b5b32777879990285c418c767d3ea33248b87c4fe412c32cde5435ca753a004228ed4fc81e2cd6b81fe8cf4f041d4195b93d7bff8c005e40b7e650f1011f9f63fce623b5c3183d725de542c6c8e4f1780cf494b1d61bc16f33946f7d96981223e156bed19427a160fe5aca900a98a5d47473b5c12439853f19d01c991616b18946e29ce32fdaee80a410d4a461adb9c47df9935e47118443dd200e3d22c495d5d8d091588f6bbb11b62f8854d7ca57f99caf77048280b20cfe907a0883d24e73245d48e5ad674d2f6a7a63b621e67f7b3188e5d1ba77d46232b2cccb369e35ae69d2d77aeccc2eeba9da65489a4b9fba5ffe9a0f6b44a0f8394293cdd172ae414b545c3c38defa43b52c58f5572e96f51f23368d3d81f59d901489f8ed6acdb155d45f79738a7426f1baae01eb87193b5d9bd67a9a99197eed9f2c3cdd2399ef2f2d4bac7b1d1a3ad865ce0e037873d0b67e1474295a45b940cd77538be20113c1d57ec405c32e98c9ea6561c68cdc0148008c4e903414ae7256c4d9a3d81668efd10eced5b53b4a8877139659bd4c7f25649a3c63ffa2260032c8d1ff1d659ba93bd01a5d40f7f0b504b226c19139910d86cc7bef69635b5009658c0e8aacef158180ba6f4316fbd84a0ec466eeb92d148e9eabb2b4cda6201435d6b78f49ae7e36d8f82cb0dea892b1bbcce96b4c97e353c0d5cdd1db5b6ce6ec4e42c7e535d5f487036c97fdab1c705a4b1dba9c20c64d2d83c52112e9b79f1086945858023cf9268b5fc752eb3ef49402e5be641e503528b194789d1fbee9a575a4ea3704e3e5d659ab26f42d660abd81bad7d7ebd85bdc005b3d56bb5d7064f6cb17219dbb327c49cecc628fe5f1a1477f91633ac938324ef71669933b57d4e6b878cf1a30953bd8e44eb6ac9eac9142b4e393790f6c3d8b2c32b4f33e6f454a498264af853c198d84c669f5660cab018a85c67b23c8bdb978d3f706b361ea6e88dc204ffe4718c399352faf6789b937845cc9fee1d1b541a627d5b79d1ee96a2b105a2bcec30c6d2fb81fab822603a5b51e22fe00c26c00ef79f1ceb8b594f0966be179a4320d688a6bf8052ed8365007d2a4dc15f68d8ae05a8c0872b2d74f062b7618829d669ae3721f4ce7688a55d1f74b427e60e0ae28eb7b8aefc131ad14e024b1c5d5e5d1e45d8e6930e843de9487c850b10d78175641b9efb2eb8ad8c6b948dabf5b6affcf93e1b230c482b10aae70b65e244b0f2284cc95762ffc1117b731a40035f11763c190ff4f9b5a9567563d4d2cce80cb83f2811873b8add07c13959e289f5e44a954e2d25fd4b4d8f3875567414c520af3d8821993cd30e9a15c8aad7b0bcf2af6f3010b2053f0a29f43e2e53cba6d7bb4fd005c139366a1edc827f063a5e24f295ed5f8cf6bf7cae52cbfca052742e0e3fe7f75a3e4ee5f0e33cea3e1da4a21035123abd595dba40669f4a73d551a9d55622916697ea79f856bc83dfbdd36353682fd2ae70cfac763281c24ea033dd4d05116f39ecdde0013f98fdd64d3492528aedbfdf3b8bd52c907cd437fe6997cc549448200d03a12964a3e356bcad2b40b7eb765e93f119310698627b0881051fdfa5b8fc9d13b0ff2ba753d32db92449880addd6d8d5334781b5c3d25a711cedaf301349fe861cf656ef9992fdafc74f7eb2eeb91542f0f2af85e86a308d99a8bb4fe8a996b894d0b5615fe406949d4b75b5e1947b3a6d063248cb233c791df9b24eff7ac5984b87a6e96f4f56a3d7485cb05d1ef79ed97861df1f35058b9ca565f97b3ddc750a6d364e440421467eb6d638b6940c399d444ccfdcc08adbbd33d2dc36433021946d5a5ee946bbb2c3e3619d12c7565fc678efb134a399d253e5e6d10676076f983305351d33753d68994c0aa03a9f453b0d02e8f0beb15a12276676923b2b1ad19b41aecc30c1f36645e76d384a197c1c7e4c644dccbbde5df116837412d820d3c5688bf0d7dcbfc90f1cf5ccd48345012ddeaeb1ab580cdeca7e4fb6171752ded65bf321ea4a71a0cec013f2672a7dcd6eccd06ae81fc8d8395ee8f485e0b0cee3537112f30982ecd590106846f3e54634c76682a2c7e8e1cec6a9c9906556451655d3648b8a0085625185cd565b0de30addd5b3adee0edfdf982274498f1feb6570ea4106e3b2be6698b0fb2b8f4b49dfebab0a8cd51c59d5cd4ee98d25005eb3a1c638203521241cddbf744ad0570bf21f22bbfbf46eb96cde55e55b5f8afd893a1abc914db1a6b222a43f5c1060f478ba8ad4e70af5170f7bb0291245a062756e47eafa3d9d36055cf9fdbdc89df4bc1816006711b80dcbfe343f4214cd7a1a2c6ecaf565953c81974f0c1adab058fe8cea75fe608a5a6d6c166c0084c92ac2b289e5d05346094df2e01e24c16745d4d736e4bda54169ac567d89babdd49a3f90857ba29d6c7ef0d941945ebe779f40dadbf66b124b360f3016842c87822761aa4b5522bc5560786fc616ffd9cbcaf2e06fc2ae1d9331e0c301732a96cef78079160e75109511a982c14d310f092a4255a4cb5e7c879e0cfac4f0582b6cdd11452aa8e834d5f6db0d541fbd38d610d004f4e5396edbf7e09f4c688783dbe9c05074aacab88b7cc93f1f17f1e7569fb4f3de17fc4a1663ff864055216f4bc0a2ce9d67fe5986827ac5162c463e94f492da254a5d745c387919bab769c6503dd2535bdc2031419f0d03345cb31504a083b3d0274d51682429502c5d09d0df7de9faf72f5b51f9f851810f47585483e7b6da891d804adff39654d47c1d60900f0f5455ae499943bc4373982e029c47c7da5d782f02c38e64cc61ca6627ad2e2dab2cca14c48910cd63463c78137c3b3d4cdf29ff6ca1158c7d785f33cb7c22b53204841487838e7a6754a088c7d280ae02af6aaac3f96e9a73d769a83367607ff8b09bcdcd1be11380911e865147b7e8659c5881a0be3327427af103210ebe2427b951f4a64af74519dd37ecc3322520a3c6d7a0a63b22eaa86ef963c99a962467b98eae775329f7b98bad3fa4eba9407bc37b4f4d4845bf277684b01bf40197769b40e815e07a08e94230dcf8e5b8b5caa04db4821f93f16ec619814159a1c60b9e46292d8118d503e1410533983541ff7712536808110322e4603162fcc0ef85cf2dab031feb0fb1727b7a70b77f2c0873c35493ed0245632b0b4d8996067a4be16d593edffc0aa43c9731551c118a114b4b7ce1c708746234ecaffc8465bde16227e951ce13f1ac1c3327c001e21fc806134bf5a05b1fd4d248fadb7abe532e7a0b7895d01b1904b1829a3d8b30624824e839eb8bf97612794d8061da21b458c3cf818407b5f4a86a3eb56bf108bc153b9e8ded2d6e0538dfc50115cdc7d0e93de7a6e988008ee3f5749124b1b25184ced4b8cbef924f22b8400f26f9b5b62602c0e3b637b8233e76169f8d6fe65a9eed6165ac47fff8909849a1105f2a82d9adf35f83406ffd697e34fdd485d9c5e2770a6246c080a5352317a97ab7817ad0ea8b59c8900d8928dc5cfa576cc448972b1f2e9067ba0407f207f45bee65350cbbe39165812bb5772e29dbcb5687406ac6070dc46505dce7375f08933ae2673b809c3de50742de1c65e72910607b6c60f016c33c69dc0045c70424","title":"447. 回旋镖的数量","link":"https://leetcode-cn.com/problems/number-of-boomerangs/","question_id":447,"issue_number":24},"22":{"day":22,"pres":["哈希表","双指针"],"tags":["双指针","滑动窗口","哈希表"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。\n\n示例 1:\n\n输入: \"abcabcbb\"\n输出: 3\n解释: 因为无重复字符的最长子串是 \"abc\",所以其长度为 3。\n\n示例 2:\n\n输入: \"bbbbb\"\n输出: 1\n解释: 因为无重复字符的最长子串是 \"b\",所以其长度为 1。\n示例 3:\n\n输入: \"pwwkew\"\n输出: 3\n解释: 因为无重复字符的最长子串是 \"wke\",所以其长度为 3。\n  请注意,你的答案必须是 子串 的长度,\"pwke\" 是一个子序列,不是子串。\n```","content":"096221cf5b628be1e73e8bcfe626c73476993342b3bd4c92620b7d4d2211716b1cbee358478886397179b73ea41f2d8a696e65ad9d3e03c1ae76b561bceff835f3316e60d6d7cfbd0a2ccfea998f527d3be17095dbad039033bc36daaab0b98f4a36dd006fb2d63920250f70bfc585af7bc641282f43fdc733e4ba8a61e819b47341d1e2d7e38af5dba748b641fc04b55e75089947caa9e706624c22d1e48d141c0f134912c68c734a014ea5cf657c0012df8bfc375a3510f230af3d738b4c0813d472990e5dbc0fc0d12c27f0211f36ff07a335647dce8376289680642b17c29dcab917d1a142b7fd1126ffbdca88f70b0845e38dfa4b661b49c021774b31fdb57ac3d3b1e03bbf2b226263493f05509a878c6fb70fff308c9e9013e5c35ffb3b0dade66bcc93cf4f9a561718e1294ca5cb3c289ddc46cd9543eae0558949961366829a3c00507e92ac71f8c9d8678cf7efdddf84edb870d64ee8d6741d17d6d1affc3cfc833888542733303725bfe973a2da7de56546753a38e57becf8bb61268a56206fdf3560d294ad6a54b2772bd8583d99c1b7ff5769a9826930065105b69640427033b82bd6c6081b8ef3d259fdafd4d1a57ae400782729db540ec1bde470afa3b007c63375fb4a462f1f5e7868f920e8ba818af1f77dcf945b0a099c1ac7377e2bc28c09fecad037550728b2aeb39529bee6268dfb2c04d398854c9a9f4e6223f515804350dc6d93d0c848dea747451618bc8937f08969c6bbcbb9fd7a6f536e78e29886326b641339bf98391a73655124cb61a9e5623e1747e37e5f6e5d51c99b9db2de371c221d66ed2d7c60f761d7898371a61072457090c073369eea3e01a9e4afa1edeab222a0e663997ed2d9cf2850bf983270881f8deeaafaa8401896cc11940933e292a10ad405683b062759b566f8ec339b2fa9559bb7af63539775c3560936e8d1e8a66f7a4461d63f728e4196e3e2d70cd350b1a43ef6d266d82c476fad548fe890fe29e4eda4be1424505acb4470fcce1c4dd48c258dc277c9cfc35f0be77b0a11382a1babde390120c7ae267b501cd16c9d7231f440a294e43d3c5ca713d50b8c2cd9579470c6c4d9883819e92fd18f8fa46312b62c798d11764827e55ae8048864ac24fd3b3d8e92b91d5517f7d4c68770760d4768e4dbe98b91b481f1795903fff4c75dd50a41266a52f3a231ad11f20b4ddb234c8ec863432644bd36cb4bdcd4cd8d7cdcc785f01249ffa30c96729430f62421e772a8ba16fb2f3f63e24494f38e0cbd14ff8bc6fb451b1de7bac7d97d1f217f096b51e9bd5b1abb7be5542df7da2fefc1dd228f164fd5c4e892a2198c073ba260c71e1b932dffebf7a7983510400234618fa7ea0002ff10571c1c149c2150d850fbcc9831da60fccbf9c6547bfea40dc3a3551d1d756e3166e7a34c6cd8dafe8b332156cd3122afae7c68891facaf3ae2316d71ef6d9bae289a68a455bdd82c2a15bb4d7409fbba2ab90b3cf8ee765775724f177c9cf3f19c7886075f0e8a456be95cfa146c8ec559a8c7d8d981d14be527e7bd2cc633255dc56f04c7c4d234d396cbf115a99e117b191ec68679fb257aea405678a53a5ee267532a79bf86a753a6025b6a2a0dabe5f09d2693c6df51284cd9d7157e83ebfa99601bbb1f4699145c4724183b371f7e749985b8382b0e129808e96e4cd1da560535d48d9c9720c0163bf8ba64d73c66176becd435b3d0d077971701f25ae4ecff8730b37ac01d3875ba9772e9fd7c230c25673adaee7ff142df41433022e6fca81094a2b547f7361a19f8b571088a8a1152ea473b65e28c72a481f0d497084e173e91c3d3ead5b1b2bba51081e17c8d7ccdd4eed0762832ccd8a5f1c9533f4abc90e13f6b6aea61ff72bfc8a973053d70016d3cc93a614ef967a3719c11af34c9f83e2a5d012454ffcf03a3612d01dd3d13678f5c7b89f81acb08a2ce45c7aa47b97d4c3a849911f0ac577047071ebc7b9124920fd6545bc9b22e1e72130bd4960741d06dd667a35698e2ce70602eb5bf61f206220ff4746848b9116c89698a3439da552e66f0c749ebe2bee87bed710edbd4758042960ad5c8cd6bdbac133e51380415dc8cd87913672a3fe0aef4a40c5dd5aa01ce2775106ac5b88db169ffc2486d029c2fb29c7a037ef48ce609e70cbe6abfdecb4aa991799f3a40c6857f68c35ccf884bb8007d650769d2db9a34a843ef4750a9b0ef38dcdc87b3e1f2ef89b829a23e021df9548e3da93cdf4b79364b623753b2b5f35c4397a98410c4e78c2558f06f1eb1e4af88961c8918b6bd46e1d20a8addf06f73d990fc9cf8c4e184dd637eec786b9e9341364957e87cc22f707f6a225ae84284bfe37e077251f9319235fdf6840bc40ef434b0862f0a0b86b3a652216aa97be40c4a7614fb912fadb0153a46e91eae6b0f359f0ff6bd6c63eaa3101d13729863960b1fbe93a3f5ff1a82b7bd716a9ac0975519c479bc419fa1ab196e46a412b639a4bd5fe5b2c5285387fccf6cc07442b9c0e8a965ce0ce246ce85ccdf2976f259e02735ea98b01cc0b655c3859a9a67e95748589884da72a99097b7eff2bc2b0ccb873578ad4c4858e522e609de0b4eb5737da40e8ff2007d5d3a63bd426c5106a3bf133779d5690c43ff6b33b1b0628a378eab1e079e80b440dbf78727e07734a9e6b18c84916bc8a296d40b6db51b55414a3657b8e890aef58e68beb1313c7f417995328aaf855b87ef5dfed3c77e2f0a99023df885fc24edee28fadd85a7d55e58a6de9655ae9b1cbbecc6addbced347653773d86ee7bad886f862ded6f30d6609880c5a61cef165757c749517d7f41b0f274034094388beb25549efd0c97a3bfc748e74d8ca2d83caa0ff002e011333ba134af124dd4dd408e815913aa5a8e4e08352271b7552c64fb02f1de0397db3adafb962b35b5d9368fcc08d60ba0785a9433f0949a3a9ad6e25fbecd135ca1f5b333b6503abb9e9cfc1e90e4d41baf06e23828e62c2a32c4d38099fa95f001f701c3532200e22c358997a9364ab655fb2ba923b644e62552d0cee324ba6e59eec5a63992bf287628a61e12dea3a33ac4301c37beb926464168824070946fa9b8354cc7bde684757f42ca41defac39bc8d20da93f0d4a69d8bf1e9c32bdbe25cd9809580e445c042a1b2c035f4a58236552394a499ce2a7f6ec34a50aeb79dbe2da20588b148dd10f084bdee66dead6891c3a35d17caa06dbf22f5a6551266174d0fe70a3a1a4c55bd238f815d10640a50cd0b86999acce3993a5c9d841ab78ed2143c8d4c98c1e677848d5271490f128f72dd669b93760f8310dafd979f1690888b83da3e314bf03561a5cca5988689a1049c280cd22910fdcf823fedb67d9a3b06598d95cfdfaeba5359a11a15977ab289a9935dc65b11a18aecd515b9d33653552bbdad642988c725e9014d3edce4ca8d810a529d650687af29c581512e8e55d43f543e659b977c047251b44fb2997fe591e8f6cb476ab76cfd6903a8f86a546f2b1512628c432e7617600310376e098eda6901e3ed69d9e8b3255ae05506035160a3ff033acb71cc5e58d023ad1d108b8c6803688d8ed1be1ee0ab8c5253813f093032cf8e0ef53c86e9765fa3f69ef0f6c38899f35e1da532376b427e5f0a1800fbd143919c36fd66043abe6e1d3f3f9cd901b61d19e2702d5c4748a91a45648cba3223f45900f3a160807e87e94a2e52b34b55d30ce149dd27994efa821260ddc8bf2f97945ca6f48b0c62ff9f2960297312c137bb3674c0750f118f4742c29feac5f6b9b581ff5d8e54ab1951603b9c6fba60976e166f7b46cfccfc634f99bb1e154570e744c1545efc2c6316ed23ff336f6509f18d8f869a2730a2d09b1ebdc80a7be0c93b605437a598cafe44d2291a07810670ce85eea793f1eba7c327083b6ec30f381c254ec8f1711c6c56574b8c088b3ad8ce2fcf63e8e31b83b93102fbb67526a4f220ea6cc4de07dd92614d63795d9882dc57d70b310560d7e23e8a4eb86d638227fcddb79e777b8d7a77e8714eae8ad724b897a7ef349836050166d12e7d000da5176ff386dc8b6fb626b851da5d2b31bb0f340c869b1e13817ba904595d3e2f00333f83d1d2d1b6c3be8dca7c3ab66c4aded74cf3542351c49f6eb8d00f738415f8ae6dbd396bd7deb0af97aeab5d6270389f710ffb44d602be237ce37671bfad49553c9bb0fcd5fed193af267e0e4331db742d0bf745050a0a156db5aeefc8bb00bf29c9af1cb96c45cf6760bd88ceef77ce01848e714f1c1b49e53604a8eafdf7b54081b15057ee7b1f63afe2cb7e8875ba3bd256b44ce48a7c09c2006dc888b240ec7d92e6674e6532531cd4be4c99b4ef97e1e89996e2103a01d71d8431c2deaf21d76310b1fee21f30da3a160af112306d371a382f057119e3b9e8b8bc0b2fabc62afd01378def0ecc8f7e7bbde1b7c5cb97b35429bdd1ab62396712d2f1bb6a780170c955858cd730ad4f7dbe05a1f42a2a682cd565c6f9b277b4a41fdfbbd6bbaef20abc388d3fbb45ee13b5689a809efebca0ee217755ba4b361003f43e2e1acbe98df7448318f0692b785085da770331492ebcd0b626d889ef33fd52d7e1f0412e7d7f55a7b7701486455c2a804af69b056a8f8cd4ba2a9faf0099fe4dc4bc3b04d3da4562ca3facb71caa56f58396f3d33112266897a63ec6b6011881c24ee67c8f4d4f112677ecd28b4f78ddf598442eb8528aedbf927ad3aa3094618700be6496be76da0a78b7ea77aedc2d76f428874d4dbc2ffac84f6f91f4b530a7e3a449849716274f7c5cf90c1cf6328c37e93ba5dd32aff7dbd89b3383193f0567cab4e15060b3bd8d660cda43c628236b120a4f89d0002b11a2d7320b3d463dacc543c1d3ac6bfbcdf2c686d47aa0d97d8401189ba4597318787711ca9abb0ea5ba311dd074e6b226f2d7c12ce482f89ca62103e390c26f5d9e9792226d52b3ccdc0fe3bf0f358ba0339781fab1a1a3f2b08bf81a05d03617b0d745b0cb311552537b22ba4b1488eff5972ca8c5d671f15e2f1438ed59b94a85a601ab3433ea4a031690d4ecca8fabd8eb71ee9193c4b9bbe0dc459ccf74d81386d899876e6408379fba9ea0944bfebef95b7ba23f12871876f4c207beb1d0c3e5ae824e6c5bf4ad9ed41bee029cfa1db84900da1e154b7079678adb486c4356b79cea076b261bb6bb730de3c1f55386fd1f548f68f44dc9a32d6305975fcfe69a168b0443950b9f2a7afdaf0664582d31015094a9cdac4201133600c7aa80444fcce83ba3434e531a284a1b021014ea89f4920696304f54c2dd689c6218cbe2c0e91d1e650a6b1bae066f66207c5fb709abecb81cc1e80f6c1ef1565461ef4cfba5634b62bf1312a6fd571ab12022c18b8e1e2c7c81e5a88ae0ce4f6ce8b6598dcd60e88331021aec5d8a0dca5a95ae3d3b6f91f42707852e1e7b9e04f7dab1a515b2283c1d6adc0685c2b43cf0be9d1ba5f4a2b96606e614dbdbd0731536195e6646c398e6d2d652e6473dd7a8a1cc75e493c1f56533dd1af8193a86abb71f71a46c7702d22b9307aec116693b0bc380a00a650f2b323c60cd932072dfc9649c9f5c2f996c644b2e5189457ae2c59bc1c43ad9a867b29938179f9501c457f43dc910d39bcd7a1e5a2202210ed95beee46632f94b266df000727e72881eedbd9fcab1af108cfa1d8961f0d0187b25f5c8ec9a2d541d7a1b941c95cca40b55484c791626f1890d28d5d742ef89d00c723893150a2cefbc6ff5dcd34e1b4af36cd61d995ba9fe5f2b9da3e0824c789cec8abc811c17e59ff6963cde731717fb831aca9eeede07e73d3c49ff864055732a6cd0a49cfe7dfa58dceb73aa6e62142487e1c682254d56775c177d1e968d7fc60d6d991f48bf44653ae20d5b385cfa1d1f89febbc060190a0b0e34503c4640d78b61b1b8f97e1e46c5bc64890b5c00669891a4f0d237aa4a96bdc2548d6d1d7d9056740c6eae4c9848820600c2406c9414c999477c2936c5c82d9d79c36c7cdf3f2da02c9305c4831094725d1625393c517d66f559a638e95ac26e783c7c8f3938d2591ca81199dab9394654a793c9ec8eba5fb662bde1a60a9673842cb87872296be8f5d081845ea771cfde53c30306f9af36940bc4ecf8686f5b79fd4d7d0eaa6703b150c1892ef2530bf277a29652587aad8881e1bd1422f8cb67f06392b0bc2467f78eb3771f6cb9b1dbe276eabffa4951c37b1c081c4bed627a85b55ee152891fd301ba74b47244ac422b87f1b792fc84a01ff5cc58d6f920cf03ab4159a1c60b9e466568c74cde45fa760570d7790dba34461a2746420d66a1262d1d9a94abcc8c79a34a51bf069b727b7a70b733694e27c35f8eab5c0c49610b04c796543b05a62851708bcc20a43c9731551c11d73b614b7ce1c70874267dedbea8cc37b2a35c6eed568910e4a76f371be37dda51c9061041e8e05c05f5dd3d88c21c9d5324700b37bf86311806a2a0e078c8bbb2b6991ce6550002b3b7dfdb71989e7fcd0984b23c22ec754336a5ba0a874caa798fbd848de942664b31db0a9db984f29064f6291e6434da02741bec03ed042d941e48feb5cb285d9ab90f9785f71a270bcd895a2877fd436b043b169e80ba50f69abe65a134dd3a75275fc527d9e48c06325d34c01e84b438fa85f0d7","title":"3. 无重复字符的最长子串","link":"https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/","question_id":3,"issue_number":25},"23":{"day":23,"pres":["哈希表","双指针"],"tags":["字符串","双指针","哈希表"],"whys":null,"difficulty":"- 困难","description":"```\n给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。\n\n注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。\n\n示例 1:\n输入:\ns = \"barfoothefoobarman\",\nwords = [\"foo\",\"bar\"]\n输出:[0,9]\n解释:\n从索引 0 和 9 开始的子串分别是 \"barfoo\" 和 \"foobar\" 。\n输出的顺序不重要, [9,0] 也是有效答案。\n示例 2:\n\n输入:\ns = \"wordgoodgoodgoodbestword\",\nwords = [\"word\",\"good\",\"best\",\"word\"]\n输出:[]\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f20940a3d41ad5d0658542135666a2c91e14f5686b5347f768c3ea41f2d8a69a8d32eff401fc5a93ce974ffa5f124f52a696a9fd18cf0076dc1aa84d24d6d38e6718399b2438d21bb36daf5aaa28a1435c61d69f898212732066bafdfc9a977d94a64344cbec172ebff9c7cfb1eb31c3981eefd0c2c7312c244f438fa6ac67ff9e53cd8e0476da2a70034ad90995d621d760b27afe875237c64f8b34f117c17a7f4c87a073968ab33e8694df7132958b979f35552ce6ac873f9a3472c2f0cf01ab93a5153ce90672bb6a36b2f38cf9dc9b504e5a36b9fff0734f689d785ce04084bcf8eef5c641154cf15524835efbf57fe36075cfd0c4a65690cf2755b54f1d7b33812827ac25d71c719948843845039cb8e548fe4ea37c1765747c87ee67e0c732df4b75da8c14897916fd323a0530d9ecb4b183821a5cf0ef1b88848e56f325b2e487bd376b728e38d353d4858146a972bb5de1cd13118666a3f62e4cb3fc4dd25678ac0a5daaf7c3fb0eddd0c1ee729290858aaab5e39a0707ebd6d11db6a1097f69712c78d2c4ff333057a0782884c4f4732a70ad7d6121b9ffbd561cd4a62bbfe7db5604a6262c20e53f4efa774fdff868a55e48a7aa9cd2d3b7a7675f020c1a28c88ebf57fe59644262eb045b2321a51c1e540d6838112234377a5c2d9bd70c7d565ebcd4ab54f9a8c61998d634f3f48cb37cf5cda739fc9ed9a5804cea7f691477b75e5c4114a7678b8c26db0fec89aa5b2c1635e06a88dbd991d176a655209e46baeea8d907d06f40d0649db87bca3e124b6601a787d6e92755ed862d945898372a50136c5a3684e9fd0153ef9855e3f275a702302f32b2cbdca6d0c7916003c3753aab814f6ccaeb2ada8401896cc138bdcaf5aabf3448f3a40d9493a23d76bad6a89a0c1fa7cdfea8a0cd522b068d6081cde17462663414961d53970b95294e2d4d42ee553a5a232ebc665ed1383f57dd36521dfb369e6e78abed28fb6d11f83f40b5ad53bebeb95c3985c9668485b11e1984c0f67742ac44687d2ad40ae3e6999b92f6f91601ca3d3706e758799528509d619bef154f07839e984b08db8c46d70ae91e03ceb1b9d169a00742d7f4f8552905fbec8389e44fd8379145ec6d7d50854195af98ac5eaa7a2cee79dc72c520ffbf2af11380dca34cf888ef5ec6b73ba67cff0148c3cce29284a6f41640126ed5e814d0b447b97112603fc117afdbe329e639a8d0aa6a438974b118e3e9776e3800ea9a93cb4b0d380a2b889565843f9e771787f8ad9988ac514a0c94bbf72e380231db8870e9785cfa760bdfb1a91fec8ff2ecc959e6aedb26113c854c163f7e4db75ffc3acf0fcc7e0f24247ee9c573b11d1f63e3eb16f9eb6b193fd6d3a95e7af385f9ee708ae26fc3413756d2273eaac6f8e739a4b19f69ad9c01012a3b6428407bd6ad136aa5c5b1d60c25e04839c61ab57a4d12f0823b75a78e74d0decc01150a5f21e077e3cc689bacae992c66e0be4fca8a0abda445fad9d885350cad87347d992ee41d3309ad8b82ad1e100e00a6df4a98c1ca0e0fe984b99ea7d736865dbfe05f75032d7330966e05e64b5febde0eafee0b934fc0d1a212b47e1dbbbc004d0acdd1945778c629a7f88c03346cd1b833a8347a35f532f183b37d0d328e3aaec67206075a7ace97f41d21e0930b6400df92598c1283df9936ede14451866e0de07afd0e93605cee07590207a020ddc65925fe9f4f37258e625671f641f2f2f54a3d52fcc06c02e027d7c84fcde1af4a5bb47f228140eeeaf64158cc44c9503c9fee25228b873d5dc4945a4d3e6ee1b3d3db8f19b740925ff6726eb22bf4c012c438ad674f7d8b9f2df00ad8c791529cfff9d00ef5fef783a43fbeed91364e69969aed4e565c12fb548f43cb3367bcd978896bb55d509bd41e7df81d50956f435b1bd236ec3679c2e52f90e4de933808d7dd88645a2a10f7502420bd12fd92d93439c0053d3bc2c5a3c13941100e8ec65a5598c25a3352f0698f2a27e79c9628882977aedcc41e61fe67bb104d7e504d1c9ab466c8c2a4e7a70e1ed1e06df937c840f9a5a6a032c21f19e417b1f25cdf50d0d07b99989cdb251386b17b49a6f0ec779b1bce5ac457d6b6cfe5d07d2ebc723e85e20f6c7e6594904c77fd470d855197ed513528d6f452f1937d4a17ede0834b23adff1bc9da854087ffc45bf7fd88df6e327a333142a10604b5540088d7cbaa4d566f3149f02f31ecd79ffb88aa6a846fba00ec25c2069f77b0b7bf3d16dd1d13f8ced98f264b15be8a3194970a33c23fa6859be9df75a5e5b2c3f49635fd77a4eb15695b097cf76139961cbe0d4e1da6e825229ee53027246c8fa1efe39aa8e5871c67efc72ff591ab101652aabf2fb65d65ebbe8e4c12fcf7ca793582708b95a61f3f0f5c228a9e8701295a09683e7861995350b319a92b6c8fe23945b37e9af2f96e26c7d9e7b2092d8aac6796523d81dfb85277903d0c686201fddc3bd01eb31de1ec3b8aaa2b2089a03e9ce35670302f29f586f6bced8df378bea6e82daa4cdfc0fddb0940c0eab0296d4c38f848d855e75e5f65867e1147c1296098656fdbcde76a7fd6fa382cd207d74226d85796a7835a1be123559c2693248f5580cb1b15a8b2885a93b3f9fb4b246ebf3ad53e0b19fcabeaae3e39e1ea5bdc6b63c1c31e1df9eb9a2a02e95195f2a4b348fe04404171c49f76d8adcd87ec1a77abc8fcbf9b9ff5d91f27d40911b6767d01a15c68ba73150e6ac83ff3f58cf3a185cafc7f214ad80a1ba26a9beac554a42d7d8dbe4efe4a44eb4113ce4b33b4b192f867eb2e7446f1c28593415c0a6fa16538780fc057eda1dee5a97a025c0b49cb158306e4b25d94767bf44ed01890b997f9167fb8ab993a5067937300cf91ac62a4bbd3a3af185cbc07fdb137ad031d1a6c657f45a80f50b127a01bdc2d5564982e0b854f47730126f181acfe2c98c9be060284b3638c7b144fd478cf60238650ed1e356705b5150603f4a500ba205a12fc442c72d50d2eaa6583b660e161844841506cdf2fd8860c37687494dc5e132ec7aaf06ac4189f646be29039fc08b2696ce9fd93f3d0c9c45ec11dbf070cd3b824aa4a82cbb8e73b3d3b3d1fc9d94f6aa9657b8b25381c8939eb51c874bf199804c8abae87b01a248620c508b314dcc586288b69ca32fbf44acb230806893a0bbb874a1ee498cc1be1333fe9928c247e7a246513566682fed203a104c35ed62b189434423304acb078f9b95d2b0e17f059df948bc9fd04613df4597cdc77c928b1345410c068f0e9c349bdf3341c444ffd381ef2a8a9d879ec9416460ed3576abc7b0869bc4a601d27658d52309fdaf9065a58016ca271851c7c1aba6faba1e18f11a089768a9928bc412941f0ee4c3f1995bf19f6a5f2377bdfa2b7bcc942bf7441e7998a0e0909c0a42944f0687e2689d814c2e9e4efe15067b31ce927a4d6c51e75ccab363e5c2e6ba8e092da56ba66950f1ac381d216c15452d9d48603f43371c0d203d1da497285198be128b95ce3e70e01847535f30f6ab046284e60ef09e23defd402c9ca50797b7560d2c6352cfefd71d53b833cfbb8a0a2f8623bf2a06f3dc676e133551594f7e2d201df65e722542635f56194c7b0f950360a833f68dab6a8d9cf9f21553ab73e5d575a3f8e3c9b268caacec61447a67fd93ac17278766ed006f8fd39524a796dd13df55e77315cd7a6e9ee1186f25e83904d252044fdc8e6c41ef603f7313f01d913674c0750f11c60104859da59ebfe9fc81fa5d9552bb521e7a3b9c72e95edb205a626611d0d1eb0f01d7aa0f3f2c3fb20a955455fc3d7719a4ee4faea988b3dbdef4d4e727f5054a5cb02d0fbfd0e1ca216261294a05793bed7fee90b009e8a3705b2232620a2f22515f13116ec30f381c254ec8fe7e6ff08a9fc245bf0ef43b0b9847f76c078b6e69a0d4353da281c7fe20a36ccfde50928d6479262a5dffc3cb508c08245473b0a366864eea6d6e826bfcd6b7e23f30bb0923ba3800e986d742f9c32433c00f828d92a92bbbd29eca70d5ff68635877b41ce0738b6ddce7b61125340c869b1e13817bfb0f520f5a7b00793fc3fbc2ca9ce9ecc89e2968f86c079f8f57d94f772984d73592b06c648f56ceb327b4560fd0cab8e4cee581542e3a76cc2633e64cef13b96532b80771eff80b1975d8aad6d5fed193e6682a0e7c20c77a370498542617005235e6b9c9cff700be39d3b509f87156956422fac29ded77c264d6ca1d0a521252cf634ae7b8b9b2e705c5ce1d16be675c2be1bfc7f26fab62853c39f102ffa07c09c2006dc888b209a22992e26016127f5b1384ad0fc6f6bb9aa8bbcaedab496056854fd023e1f4af21d76310b1feb55779967f1602a3122c6d641429341a755af19ac2e3960b2fabc62afd01378def0eccc6382ff0ffa28ed5cca4132bbcd7e73d42612a96a1ab2d2d5c1fc01bc0ca9665e11b75e94af3b0262a7825d52788bcbb20dff74ba0eb99e8aeef0aef7dc871c016954ec71544031438021dc4217755ba4b361003f43e2e538de985bb4c964c876d2166009580321b391867eed8fe7592f6f23dfe5c8cb9a41b7032763baebe5a1486455c2a804af69b056a8f8cd4ba2a9fe30084bc53c0ae2460a9951662c13fbdac36aa56f583cbd9f93112266897a63ec6b65c32818b08e674c54d520c2634b9ddaf033d93b2cc0c26b15ba0edbfdf3b8bd57cd12f871dbe29d7e67ec50e73c6e776a4d8642def0f87014db72febc15418bbdeb530a7e3a44984974462486c4bf9771dc833ea60e926a58f74afaaf198db73a933350fa24e1975e6c96d0d0ba3a47c857898293c12208b1254006511661ded9ae5a3b4200ec6013ee05db51f6d59434efcf1f36d9fefc041e42416493f2711ca8f9601a99196925976dabb25ded50d931ccfab9fd5a0cf735fa9671cc3b516b3948d31749647e4fd511bebdc0bffdef8dfc48c6f5d0a7e132eea3a39b2d659a9ca383f53515dfc22076dab9fa8b847f8e1801cdd2f7c0d68927ad500afcd55837c44f9235b1b15d4a95be381908670b0cea79cd6a4838c70f59056b3589ea0c2a720342d5fc0a9e1e8aa138187832b4dca6019f44474660fff217e4a0e24d3b2afe88c012c4abf72d76be4c278fa4050bc2a6b1347330fb3bc30483c0fadf4b7160f6733d2e0614f7e4bb1594e52c19302f377ee5aac064f0f8f5ecfd0ad178a06429839932d40fcb30b667d0530067b97acd9a64ca187d4c5543c0beeef083a99622943368a818f513c4d51dbd9aab8f815d92909d551785998c64f0b4426ab550130066396631944ecf899518b4ba6f138bc9a2d0f79d6253d6a8110f9c319672acd36711c0dd6cf4c2619c08bb1332d4ba120717f6906dd64cebe5897df6ffbb8320232ed76bf03f14196a215387a8bf91f0c89290b77a623fbc6be60b959e6c799aa48a686f5b535e1969f29bff98db7662dc41ac5e4dc6b2b361949a0eb0c573062152be2209a","title":"30. 串联所有单词的子串","link":"https://leetcode-cn.com/problems/substring-with-concatenation-of-all-words","question_id":30,"issue_number":26},"24":{"day":24,"pres":["哈希表","同余定理及简单推导","前缀和"],"tags":["前缀和","数组","Math","哈希表"],"whys":null,"difficulty":"- 中等","description":"```\n给你一个正整数数组 nums,请你移除 最短 子数组(可以为 空),使得剩余元素的 和 能被 p 整除。 不允许 将整个数组都移除。\n\n请你返回你需要移除的最短子数组的长度,如果无法满足题目要求,返回 -1 。\n\n子数组 定义为原数组中连续的一组元素。\n\n\n\n示例 1:\n\n输入:nums = [3,1,4,2], p = 6\n输出:1\n解释:nums 中元素和为 10,不能被 p 整除。我们可以移除子数组 [4] ,剩余元素的和为 6 。\n示例 2:\n\n输入:nums = [6,3,5,2], p = 9\n输出:2\n解释:我们无法移除任何一个元素使得和被 9 整除,最优方案是移除子数组 [5,2] ,剩余元素为 [6,3],和为 9 。\n示例 3:\n\n输入:nums = [1,2,3], p = 3\n输出:0\n解释:和恰好为 6 ,已经能被 3 整除了。所以我们不需要移除任何元素。\n示例 4:\n\n输入:nums = [1,2,3], p = 7\n输出:-1\n解释:没有任何方案使得移除子数组后剩余元素的和被 7 整除。\n示例 5:\n\n输入:nums = [1000000000,1000000000,1000000000], p = 3\n输出:0\n\n\n提示:\n\n1 <= nums.length <= 105\n1 <= nums[i] <= 109\n1 <= p <= 109\n```","content":"096221cf5b628be1e73e8bcfe626c73474822a940a3d41a850084c70200762692294ec417e86b812b8bc283d9c3b20ab7f6e65ad9d3e03c1ae76b561bceff835f3316e60d5d7cfbc1931cda78598506c78e97c8d91ec1f8b39f421c7f1aabf845b2eca4463acd63e665b6d3ce9914d58bb5fa4c0bcba15478a36d8e122a75a2586bf4670440c074c1cd24b384df500b572730a9f7a273952cdf50378ee9bf20069760327844c48ebe50d6985cf64560026c186c92fb795e777df06336a8a4f2e1dd34a9b0c5e870ce7da2d18d3220525ff0e9a34484f0b6d9aa37dc0313b7f858cafec1997e06cee832f82f69dc686ea05cf34e6f9a75e32457aac606a2541c2ff0fda99e9c7640c446e4b04d5525267f2dbb137fd368d47b4d2c41f9488689d5335eb8d76a121a232aafa1920cd2464a60ce69f9ec651c1bc56eff8784c22a2780f80f246260ce6dafb6d9ab8d403d0e5a3a1eccbb3b41fb6738d946b536bdc84caf19912d032d630007b670f59e5eb04c7f434ae612f3f185dbb7cb3a9a221799b31467155d8dc5c51e9582ac05c62855355ebfaee60e2ec73448c6b312d469aea3a661640a06780fe794783bd8052a6e2f0bad67bbb4244617ed00557caefbe61fcdc968a0fbad8fd5a6fc389323c7f9250fcd0dfa346f57ff39778072f8446be390858e8d943d5aa8c3d3a4f70b6cde1ad71c1d864d6fb49b55d9aa475999565430346258043b2855accb1d3f9deb4c99bef73d402eb014ee68beae4c614b538007d4f2a6416f7ddc21d35685eb5debbff8a935d82c6d6147f1d18a15522f3f15ef4bc92a9d431350796be10bae436a9549d2c22f770d3b53840f89e40964b617458a0b6feb9ba8cb56ce6f5f9c96dd7ccf9cbc3fcdf0816d01c3c382b5c472709e19231d694a82969678d1bf7aca45e7e71d4c119e24e8acafd7eddd7810dd42e75dd750a3af2d0e582636f4560ca08b715f692cfc63a71f30cc99a5c435f6cc926a9ddf70c84a23579a47a9876479fdef08350baa3554bd9ed475bc20706bf53d2d285818dcf7e5005744a9c643831c26ae5716f3f76c8cc5bd8d0678c651704bfd0078c679737df8f5d80252385daa5eb0aa32d72e0caee9f3e4081682db5792d7b4f927b97418fe2729e9f4815e7e2884d0c3681acfed12a76441371200d0a082bf4dada24391abfaacf28b62918546e33695fe039998f1841e72da3c5c1a7de9f81d01a9b19cf9893b3d3684d2527f206a4b56de353e46eed8cfd7814c199a7fa132aa7b9622424d90207f96fe791fd1f7b02aee9e13b2a0225345169c87877f1996c9e4990e57d02a24c2e8f13f97b5f8097d8ec2a9e823837ae4add151fbb2bede51b4648b0bff7c5affb49314d0813cdffea83db4a9c4535e93fb0f53008d7a68fc481ba7a37a38879a6ae109eb0b13007088a8a243fd5964c0cf99ef6cc0d1dadb3618b1a9668f039ab6b551d60e45f39a89c61abb8e7d271510ed8c2d2371e2b9056925ca3c51f3a7135f9a0320c110e5ac921b5fcaab263529753fa82da0a03dd371e5cacfee2148000779afb444a6645800d01879cf37787a9b78924f3c3231f4217a9f75a99615f9e19512ff82d3ba0650c556ef2cdb33ad63a18373845ddf3baf11fd19dfd1545798d499f7f8ecff68c6116bd398303a35d7e36163817d6d4100ec3f8397953193a370cf1f5f8f05a0005d6a8b87296bec3ed7269c50c8892c0d75d0bb919c0aa26d15a63a118bdacbbbd0ac92b9a4d7b26f8ce32aded0f7c356c7d40f0b33fa22244f5ffff8f56333eaae4d8de3f70d4aa852f7becdd7ee76643b971266facb96db2dbe9c3974f41116bc09c96a9988e98a0aa26caa060d87ddbe1e0f93e5b69a086fbafa6116b25f4d2e26b253ea437ef7695cebc7d6c433a4d23fa41ceafc33c67897cd09152995c21cdeff2ad1e42d509b675e9e4a5ff7c565ece4133bef50a15bb430bc16b31c87d12287ed3d1c34a7b99e1c82d6f9b7b55bc1f841ea971aef07d1eaabafd4e10a3866fe81eae4a2eb2e782f087863a27d03aceb125b374b1f846dbbd75e243dab671f3a1c25109c7100d135dbd43f9cb1d0e5f850f12f3035c2a816363bf1566260740546820f7cda64551202c1749b7d31210a50883da94983d3f7e258b714b8ec5b358e9145bfd98b74d086fd017b16384ffa970f614569240a79a6368e4e506d17f4eac6d94e6dc0d0e5c137efe789d72d1b5294a6afc0e774d090c3451196cad0ed1b0b13dcc4917e23c45dbddf0acb3a5b3703e53a3c564108467197758a0b26182ae1fe78b989836a419b79644ede20a8ce23cdbe33705629ce6f2ee8fe06140e576498291403d96da5cd57ff1c9f6c7e9ca44816e2de256337f52cf319004f1f1a805ea1cf423866a979a0b948da85f116a9f7a22e2bdfef12fca61ee9adec9ed28940ca9e28d9d22fcbf7a70ea953212084f987499ccdf71037a3339a212cec23f16c8476f8b9a570a16d45a59031b4c4eaa26aaff1a2d5cdeaecf1e7789d4fb6df65fae3b722f31e9cd3cce4bc7bd685d93bf68ff24780ebac6905d80893da4b3dfc05091334f15f1a8a839aad5f18b858b885f71e5f57d67e83d4012b93c8d50ff79268f303d9b6be5fb6920545119aa131c406dde80515d719d0333319a6665eaaa2ceb25ccea3676e593f111fa93118324ecafa8e6b780a19166c39c90ef0a618d16584a5c39448a2d6b54b583bfca875c8af941748032a48e8f68a8ee52d2dfc6692f08960332c485f9272933f37f77c0eefa33118990c841d5d12ae882ebfeb0dab93b7c512bef2fbead674a43ebd8f9c8eff5aa41872636c899386f122eb64ebfc956a6e1855a2c12ccb0f11653878ef21e73e008ef5b8fa330edb9b3b554017e471ee84a49b848f70c8a149072914bf68d809cb22779033e0ffc0cc62857bc0e30f6b8f6c353f31378c630c480c657f358b5c80b386201b8d6d440598accb25dcc74321f571a0fffecdbb69bfc40286e203bdbb345d07a8ff52639522cd3f5507f7a7c5745224a7f04a037812dc85fca1049deedb654226a0d0d0d44853000c2df14020455d04dc8f6008a26ab26aa631bf40e028e11c1f8195c70f1366e8dca33ebac3d9260a40d6bc7199d79a8785fa56971b75c243a281e1b470280e7709275e7100d6a6630cc6ecd43590fb76f621ab992588aeefffd4efab444a9811a6f6bf71c8d43f1f03ed4fd604a390a8b687eab1e2b785d24d7a17bee42c8e61858656f07569669370131fa71ce186586d4a7d404cf108d8dc70828293a379d23f2561f2eebb511b7132607f6617d255649c2a934e12c985f428a844afe55227735f16f0b555c49f2e1c002d2f774062600114f6fd0d220585ffbe73b7241f15675922a97c1e36a1c341c3f37a9df4a82cd308e200e2f56c3719ef57419563dd0044fe3d1c5ee1222a0b20d0fa730011b3e0a5d7444388e913dc72cad26f23347f4a151d252d3fc8fa1004cf1e2b1d02fc22509c5206b4b7d12a9e8518832e1d982b36a93d58fd18fdb09b9f0251b6095ebfaabbc1e529bf95d26be431446fae86d9a9aaf99ff1a3b94bf0e07e23906c2572cc6ae4960ad6076d6d6def2843d2229ffc6609f0a192fcd9e22fa3183e4704ea8f2bff3ecdc87b9f3b18010f48bcb84c8cfc2ada4fadc6b919d303aa28d39aa461d0f039ce912b72a31e1670c574563ae087967bba5f4d354591ac4af688c7ebbfc483e7eb05b4a17c700df3a819b7fce81397bdfe3a32d89ac539af189006dffb8036a28b5bf4bf004bb7ecab2b5b50e9efc0d5428537b176e34239a13f668e9bc191147fc0df40ddb9ef7cc89032f69cbf55d3189fac0ff23df4491fb54e4e2982a6bf3620e495f5145304954e04fa18ce920ea94141a96f896f386edced4ca38cc532951070bfd84714b2c335b1c24266fbd9d81aa5b953848641c8fbb2ad338741f2e817bd409afa334833fee936488fd4f08baf3424c1e63e652e3ced4c17441e5bdf3a0c55505068a1fcef15d239a64eb2f8a70c36ed62aae91f2db7ea71ddeb265c1881b1a10b0139d6bb725ff5a1e4e2ac2441d1f66f83819ac9095ed40d169a536b57b5e689288f1b00e5eadbb44e357c7d3ced0b78df58b403f4a71725b66c8840342b82c47cfd67d8223387b84df3e88fa6169a548b1a169b8396b530575295d4a4491b7f5f062b7c924cf18f230f8b026b1eeefe80bdcf17c6f4a753b563823c79ccb82c45386e98403a7aeffe0948b433f3a083af349718a27c839f9b532e1b24040025fb12da44016d18b84918058dd8f7f2070154acd436fdaac1aa1f68b2b2740f85a8d6cb416d65b833a3fd9cf6cacab670971a90029571b88dfa7fcd0fa656bd3317c774124711e436086aea854d90e8c2d792fe876d0d7206571cbe551c5b2cb21aaebd6ead0f5dd9ab0962f3e7e240da8eb324620f72b1d8eec0e0a68b0be3a2e3a1f225e78b0b36f2d6481e4fde858361fceada7ff5ae8164448976bc2f977a62931828ca7b07c06a2acc946fdbf1ff4bbcaf2a1e05ae13498388318c308981a97eecabdfef6e06b2712b3611c1300f4fab5d04a6924912f14d70cfee48a962f48b1e39080b4069c9d34dab770e00252a88c801f57247037e8f97c14ec367600ea0ba0da0509c0c891a000b5e90a426d894a73d57692951362d53f7934aca7473a1f3a3b739dd48ed9533db2000ae3f43d798a7ee68f5e808d8ab3741565d5de15721b81882b94076e774b844d60ec17be25d92390107dc153d380073a9e29778ae340ad876c0ce367e587180adea6d87fe32c38e5431abfe2ac95dd2dd98a28c8fa5ee9e30322ef0d76dbcc9139a933faa8f40528097141e8d7cd255c8a698f6677367e4600c6826d6455aac638113b4073e5c6569faca122b5959788d5807ab4bd74992b1ad2ce28731b7b74115e7f5293607b533fbbb1453ba34f5fce26ced88189ff2417a9b02eb8990d7e1687949b30bbcf70791389c96223d56c057e47753b49651473c78f21d9c76b4392565885d7d79d9ae87795986b59362ba94a080af53fb8e7f2e0648b46c75745c66d90d676e6cbbd45d2ebd202705567982056701d33521357a36358b12cde42210a7095abdace17412b66769a6f230197d254d0b530dcee660bb22174060a6e5b2e576c5198f5d001af72ee205ad83ccec57a829c988ebfc14652a1ccc8c60b5431c5e3f2b95826deca7e4fff5943528c9308a77db85a6197ce8e08d8206b2dd10782842faf0edb86392aa6cd81f3bd92bb1f7b0cf42581cb92911f6e4aeeae016aba66eae394a08c8f96fc919864192e6e55ce798bdc46d7301c98d6501544f30cf7c5a8ada70ec3dfc8007c57c725ab7d70e34300a7a9d723c7bcb56e867f6392aafb0a91d5521cc48274a8d624234be3f7d82d293e102456dda3741a9f1e08e71c22a7ebee21fd28c558ff590ea9d7d21030bc914db1a6fe6dea785c4032f870a7d290b344b60f551ff36c1258a025303a6aedfd698e3d1519ecadbcd49ef3e12f1a332c45a059a89a606c395eb07301062885a7659d75cfc34f451ac7f519b0cdef16ad358a5b2e6f4d744d8ec730d9fdc8e2981d430953899f5f68a228109a8338a3f8f12e6b9a567d81b7f18b8f7b979e65a5a76b40aeff418457be7c9f51d3c0dc6b1202785b305bcb35adb5270ceb1f1d2cfa1969786fab51f29fcf98f4e973d4f61dc238beb87e1866f581a2ce2d1858345cc054b3ccc84c564e5924011aea9f1f35c9cd67edd8ab356125955c4c33a9f366b2b997464b18b62a9f45d018fdaa523cd7f7ab964561adc68abc811c17e59ff6df728a735a56a3bd1ad79eeede7abd437447b2cf0e5d216f4c99f0c99d38bb47dcf829a879281c1a83e18e91634f5c6f0e127309d6ae68d7573ac9165e953a2468ee0d103155f3407adbfeb3892e4d0a420e29502c5d0ddfdb73e1bea33a1647c6e42cc80b5c2a2f939aadf0891d8017bc97c2548d6d1d7d905626007cfb16d71b95175d8319359c0992975c333712df8730dc70d56c2ae43f37a07ed656dfa91094725d4b0f64163b3d26df73c533e25aa1213c7966a51378df58079404fd99e8787846f3a888ed9ab61eb46de5d6c914cf319b20af6c0b6031adfd90c6cb74e13d809101ae4c42f1ec79da5890ecb470695533b80c795de76b05a356a09169f0514ba63cabbd4f5829a390e3a0ef7576f0826ef9318ccec37629f786f2771a6cfbb1d0e234e3bfff4913d8514f4d4845e20d37cae31ba04fd35cd609a666b53849bb563ed7f0fafdbfd0ef4de9851682e726cf4dfe0c0aadc642d012296688188e64e15c0570d7790dba780954604603412ad2733d37ad94bbd7a679a34a51bf069b723d3522b777654627c554ddfe0017796145518ac55d1105a6285170d6e620a43c973114505df944064b77fcc746216b6695fbfc9965fca3312fb91e875de4b32b090ff6119a02c54d582e96ee0f4caf983581cb46fb1f5725466a88db5d1409add8a73d8676775713d211dd96843d166237cf289475e72389b2b3d37ab4b5ee2c4df20cf115a1152b978dbf683a506a91c5110eaabc94a06eb3dbe98348c0bd8d30d476f4f62ec98f84a482a1800c70f14d146db7a5ff2c18db84b861f96f6b334597c03c8f0ee5fd1c65b147f2e98bb263a1105f2ac397fef318d10e6bb26c62258e8bc8d19bad325f1c4bd1898f352317a933f9d57acfe69160df900dd566c123f74422bd2bc764d2a3268b07a6c2688131f348e5c4eeb1e1f201d82b3ac0a5e07c44934aedb07beb9d13b0118faa02124ee433eb2a1a8695fa37b78b6988a06384d6ddd9a9fa76890dc31ee6450bc51d0eece6222f3ff9e4d9fcafa476a284b2e3aa0982a2670b513bbbf17fceafad05f887d5f8af387d4ef19ba8fb61ff3485735d3c40144640333e595740e6e8de4817f1a4127ea72aacb81f8f8e1793a8c9e73a95ee1119820759aa9bae2f249f6106da1b76971c1ee17e7df31d30c68fc9a78ce04d171af6caad8ba5f829a38ee51b99f53dca700c2f1eedb45faaff72fa8778f7ec477101517cea9500bbbbcee69c70e7e65e65a0994f53d27340f0648d2ff6c1620c77f2d08b1d70c1b2cf97d5f50b16b41938cacc34e9de5ebb04d38a4bb765982ad3150a12cae19b1caacb8cae80a29a3093c6a2a273909df0804b8cb7692b63a0b9df5d1776a4c68b67793a53ae9853633b21bf1bc2ac86c7702622667eaadf2b87134e8920c3379d86358f8fdd2dfaeef3c0f3b0734eaa8556e95e6d704732b46613984240c58d889159c8ccd26002ee3406f5caedb46ececfe32e2c2b255e0e7909df213b2a57161a0a7f6e49c5a7e8f8f664f54913ea3e4f44ccc5ffce3c184dc9ed7f9040e3b561abd0500a76f5155f248a1c9811ab147e7ebf149f0c433babcd7d1157e4e6f9886aa36d2fe62902e06c8802487d93c50d3f89e4bdc5bb78a7d08a8fc78c8ea7696106e04d42b76e4d3b7b6ec5e90517c2efa1f4e6edcc734f6e14a90b837a7683841dcfdd62d8fc3fd46a8d76f4afc004b866e562f69be9084c23262b6c6f3a635972c1744cb08c667371cad8586a428d440656b2ab08a410cb2fb3c01624a2509676629b1f8b165a43d1b62532d633b36c7bc58605c7d5e5aa95e06b8cbf09edbee560221dc24934f3de9a29e928b8da5e71d6f4687921f5c4ef0b7352dbb446aec9fc2f0127e52b4c26132ed20a0a546248ac15c3f4286e6a4c9452e6434b2d2245f21bf81c692806a14a595a59c8435e5f7d781c860ff3c408fe000f26d0b0fc0418717b3e4ca79e88a9d9b7216121febfe466fe2ee96c062c8f692a8627c7b3742d4d7f86bea9e3780eba3180f76933f5f92fe5d5a60f63dddfc59e6915fbe2c1e5ee6120f87f6d6af9faadb35a3af537263a871bb0e5f16d2a5e07ad8698f8de32ca1991555dab15c7bf109e533ce931f6516c2b53b4e7802ff402bdd5903671965d42673ab81c5dac80e26c5187c78782143375afc7a4c26f064e305dde9d49834ecce73fd0e7b612b5d4448635f673f98dda3ffc9defcae750aa4cc34b288601860f1b0c843ecb066162ccb5d7926fb0265e7f5ac7e09615f363d4b4a6535207bba59ac384f54caf90aa9aa2c47f6ca870e98e2a60af3e4559dce86374f1589de8c13d841ee7b84b9b478d122a84086c7b1cbf473b84b435fe847089c963e9f19af2bbfe6b825e6be03594c912bacba4ea059f3d774253703ded44a48e0b964cf15d47c6051167716bdd8ff1b8e6e098d87b8b43254b4fc5324813d9487d5168ca8db417295dbb8f65485e333ae73cee1bd16a24b1cbbb32d0cefd26d21a13a86d46cd03b1b264fde27fdb28835bbdc9a7825f88d476e2395af5b24405428e61ad952c188acdd8cd008f6a76e2e4ce3549a71a05d749c0dc12945a1f52663e693391c0f28596e4ed52664e6680101d0075b10aee5a8c2ba5fb1cc814c5698e37c8bd8920c2c71b38f7f8b1b33e3166faa67b502a94e0776862a7e38bb336d4c6689ff0104fcdb9a6c3d6aaf33f23ab52dd74d2720d9c2c1c4b4b3e72dcd9014f88f8d8f0b33abe18004e69413a6592284b6a237306223633887262bd1a909a7bdefc67ddeab6703c50b3c8582c25882f26b3ac118a8fc3ba9054a37a537cb16ec67757511ccef4dcd69109330738d280fb560e2660aa8a6366fd6d1598606f7afdba9ed1b49a2ef8a832c6822f779c29938d77c0e47243d17c72a8daa0a560e59986d306cc2d0d232d0b4df23511ceb72b0e94034b5770e2090115075ecf1768ca0656bc8357cec910a1875280d16259a830e9f4b73ef04aa62f2bb0bb39bf5bfad48e7b2d554a5ed59c1cd66087db59368c37f73b25bcdcf4ca8a20238d31abc03a98dbc49fe9a80b83896ffa08706490a6dd5cd84904150616a09cd92881354e30979f639444c9030cca6caa49f0498ba0f00b836522481793df5b4ac92b649f80e492c0858d90d4ebaaee5d020156fcf30bfcf908fb754fac655b5fa927bb3f5ce26322996945309c9f962b3cf9c31af49a09cdb13e8f863ca96ad3b936ac4042160a9b03fa7e13be8b8c8175c51a1f67c63fdcfe6487fc80665a28aef6c6be49cbbc0ba16e0ab1d94e8922946acac173121a337f5d6c7114e9f4741bec9d12cc77aaf17bef6d5d011642419445f572c2f5fd3c121856bce6c241fd60988ba397c03590af9677fb931e606fda30c1d7d9a4d7b41fd6f5e2eacb6f185438501e7e272bf7d5b1638010f8699e39508eff71390087d07676483ab8d46920f2b761bfc857ab3481a95def9e75129ea36fc8049fad544d425dbace2e072d033a798f36f82408f821eac8ed26c647043b8f6d4989138234250dc2604c7912776714f706c75b4ff5169337079e1e355eabfc1dfc5376bd58e2d73daae221655f036984f204e711081f97776e0d04663d7addc2abfc70a7b65a9b5640a8aeb3858c518f23c36c662a2b6ae492624d5893da4cb8c57fcca72297c5fb435f93f2c9b7ccb49efbd96af1fed1455c5c7710981b0e786505511208fabbe347c71becfb8539fa3fdf70158f15b8fd0aa7f1880a42fe5a9cf9961f623955978925f617a9129bd77f0b0b59d8a61835202c1f52a6be66b913de00c24ce7f8246bb74cd427ab514c257ba4c3f5b88bec4039fe064e403936c0f545daac44eaadc1f281657727df981d99acab95aad25eb5a078a6954e4a8945c15eae14e5f2446c6b245642f12afc81dea457bea2a5649d39b71e918e259e8562f02ec144224163e0742d77611cc029b6f02bedf58561574cc299c72fd1a24d3c690a586251b446","title":"1590. 使数组和能被 P 整除","link":"https://leetcode.cn/problems/make-sum-divisible-by-p/","question_id":1694,"issue_number":27},"25":{"day":25,"pres":null,"tags":["双指针","链表"],"whys":null,"difficulty":"- 简单","description":"```\n给定一个头结点为 head 的非空单链表,返回链表的中间结点。\n\n如果有两个中间结点,则返回第二个中间结点。\n\n \n\n示例 1:\n\n输入:[1,2,3,4,5]\n输出:此列表中的结点 3 (序列化形式:[3,4,5])\n返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。\n注意,我们返回了一个 ListNode 类型的对象 ans,这样:\nans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.\n示例 2:\n\n输入:[1,2,3,4,5,6]\n输出:此列表中的结点 4 (序列化形式:[4,5,6])\n由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。\n \n\n提示:\n\n给定链表的结点数介于 1 和 100 之间。\n\n```","content":"096221cf5b628be1e73e8bcfe626c7347d80258a04f436ab074f71275d3802341df1937624d5895e1a5521d103e7bd46ab345588da2612d4a92ff52ab5a7fe2fbe3d6568d4c4d3fc0b2fc7a89ad2507633e07183d9ae0ad320b12083ebaaa2865c26820568a68f61435b443cea542d78f736adaecbac7434af8dd8da3da99d6e96d62f583473173341e42a892c9902de287f68e464484056aaa42a38acba9e5d673676282ea3cf61227e4ff48a671f7d07a9dfcd7a2314629f39e95c7af5333c528b68ff526ac862cc967701827b3b739c39cc5f7422b98b007282c9362672a093acfb2e95c8740d10a88130e7e6e6920551db4144612e0d2e27a4083f3f2c477dcb88afb3977f84a9cdd2c8493227659b85aa8212a53a4593fbc52f9867e73d97a1a2c874c29ae946a955191cc0c6cc6d4cf6b59fe87ccd8b68e8c07a887eb0104eb194151b534486af53c60d0882092b8794bbb68cd96bab29c38935376791f4f49b32b0d721ed3c024f6a2b53e9e324cbe83ca0672b330671b54cbca7801679830c436d5735491412c62e52c90a19b7330ad59abf5fb9b1640bf4635a7373ff8e1d154c5be509aa832068c7cea806e3ec8ce7c131eb4e213f62bb7d5fa1bc92129bfeeb2aa081f2dc7ae7c364732b0bca4e6c068b9bfc1adb81cd526b4e9913e72dcc8f515b885d025ca9a2fac5c094c9e511e1b33cf49d03aa3cf7b61edf8921182e23b50eae03f119f4ec4d41deadc39dfa9c567db01e3d8693a7bde0f52fe9e90641260b09eeb1c723f1e5977c6555382d378c33bd8f05237f22f20d0078db8573fcfbac7ef66f287323d24d2361aa1ec33644bf7d9bff0f2ba7b51d34c3b4216bc9dad1d1de99e025ecb66609aba9f66d79697408a4a16bbd4e5c12fa441b0ee3ad1bde8f9f2678528c0dcba28e7a7c51ce05f850f712a5a54a927e64801ac3de379288aeb586c4e318762e1ef657389a3ec0ee6451f8245991a83fdcf465d50b4c6b85b87629c3f23da76e380fd29efc9e118fe6571690a01f47e94a4aef4ecfc690ab041f9e9becabdd54d0645e52b968ee89d9b94976887c61678c6c141c9516d577f31ee2536e8d4af0fd19131e61d75bbdea770f254995b80f8677ae26775221c2574d0c985841b4916332ebfe894d0c203c015207badd8eb1e4f380b4b3b9b383ee7a5739f4f3f85efd184d3b425fe8ac31ad0635a22abc1ad5abeafa4332447d7cc6228af4bcec7fa59eb4b64a5597d634eb8434fa6280f205de4bfc39ac532acdef46a1f2be297552cde9b3e71e4603a5edd1b1e7c2bf83d8ae28dabc410cb07fe95515e1da0af9c1ef068e26621a4b449388184aab7bfb41b17232c575d38142531dce84ad8dbba5d38b895f05a6a1ced6be48f02d345e15b2541add78d0fdd4d2cc624913047d9db513b9aabc181c06a3b3271efd954f12f780cfc23e2caeaf518639bc4eebb38d76256a69a518bc384f238956b9fd222204b0627009fbf76a3c92be3e75da595447ad8df373769aee5ce556696238e58746f8336072df8d5ad94e58daa4ce48e33b042542ab304d00ec286de4a78003bd2471f012bc9e147c1610c7874cf0267bdb4c5b7a6688fce1734023769b86a67ea50678652e28abd2d09e1a94c8d140e0cb4a1b923dfbf79ffb506dfa2d08d20f3c021077490685b11ab4c2c028785d2cfd9867abf8441f3227798fa1fb1888c2211ff6886dd420531442d0de01991824a808e5ec798925783320dd7ba255fcc91cc2df59c0f557381c302e0affa16fbf41dc220f347e85acad08a7e3bd59fa755012ece8096b0c42ed9401c3fdd97b2ab3541d22271186879df27542361aa2b1b1b2aafe4c23e90d91a2b06d1fbd80f401515f394aaccaf67568d818f6bf0856a63bf7c1b22e6c43533d235f8e2d2d548867e331901ea81e94b76700400b342f858e51a4637f5ab9380567e15a3fd1a50a984daa8a73c7f349956a4729858344f0be30321d532bd93fd479b843990f71d2b22c1e225a14cdc1682f9f299321f104debfcc766067b0f17cfa077c4efa7d7413c01f2080629960228d1a336de6ce41f689edbc7bf07146d7d3318114fd5aaeccfe68ea9413371f694b1792ce9b3f1c683c2fe9a8a98e4a1c86fe0f80622d063180a2ecaa43ffc20e2c51c872859c3c422da082e50def23e35fb0fbe2519e912dcd6f5691e02868de5c9cc456aa5d333d5f5088a5d23ab828b74f50a9b7b66ad8dcd9ffe7a5ffa3f43b9354425dd37ea34efd74cd2f6a367a682743fad1d94e4684e2f7679c818d364bda365bf7747f6c1fef31f72c3b83493089726db72c1db7d1b93400166d3b1ae3b607b2d674139af44957805a9935602227635fe84bd4bb4bafcee3b201b25ba9136e16c2719131ae36ff6e459b0f346fa3f4fc79d63fb1a0f6cf39a12fa9df1d694fed12f927157d1e972a39b2802d6ed890a8921c9561c2c57b0f6f6513af129d9772699a0621ccdf578aef080e121edcb0ab3fc73077eae5cd704d45da8f6a7678a96ff76893c3ebaa6508ff13c10e0ab0f55037bd0eeeaeeb260a3098042ef5071d105cae1dc6b782110e3efb4944726b03770bb2c14bf5747ae8357210b81e8764f57a3789ffb3168982ce29b8979761924e6a7e34aca51c3957c769267410eead77df5cd97abef85134f6e98a21becf2b30e0735b64350b410f3baea7bbc5ba113cf4323d0a40531ea46ecaeab1e1a6182efa8a","title":"876. 链表的中间结点","link":"https://leetcode-cn.com/problems/middle-of-the-linked-list/","question_id":908,"issue_number":28},"26":{"day":26,"pres":null,"tags":["数组","双指针"],"whys":null,"difficulty":"- 简单","description":"```\n给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。\n\n不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。\n\n\n\n示例 1:\n\n给定数组 nums = [1,1,2],\n\n函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。\n\n你不需要考虑数组中超出新长度后面的元素。\n示例 2:\n\n给定 nums = [0,0,1,1,1,2,2,3,3,4],\n\n函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。\n\n你不需要考虑数组中超出新长度后面的元素。\n\n\n说明:\n\n为什么返回数值是整数,但输出的答案是数组呢?\n\n请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。\n\n你可以想象内部操作如下:\n\n// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝\nint len = removeDuplicates(nums);\n\n// 在函数里修改输入数组对于调用者是可见的。\n// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。\nfor (int i = 0; i < len; i++) {\n print(nums[i]);\n}\n```","content":"0961e884611df7d4ac47a79a9e3ba8a0cd85258ac19505fc764a3f4e55595c03568db42578eafe01350b925fe00844d77fca86064ca5cb38d746f23aa4faee7bbf7166609ec0c2fc0d268fa687d35e703aab6d949ba3009b39aa6adce2aea39b5c6fcb1c71b9922d2825026ce7d7dab2739b5726295ef6c433e6a09972f055ca1c1081ed386c0c3f7bcb2a832e9b19e3c4f9de23d6252c5acece2374da8af1035774092b6afeeb2f62692cac931a666d46f2f49e30067a018e5a8358379f2c7a2fbff811cbc50d0ceafe2c20d9ce9ab8397dbf631470af09c2eeeba001511badd2d9d9b37a64f427f3111cf5bbe06b7f85cf36e5e9a44617a8cb0bacf64406d5b770cfda82f0369313cdfb8b09bbb73cc5a6e926826ca222d9c38a4483ff08a43b67deda0b9e85a81caa3e4c03995046e58a175ae4fbc5cdab6de9e44a4c239255039cd7470f39239bc60efb978769d8a8dfb0b9a98bd7429521d6bf34074d9dd9dd953c97dc25cb31385868046de5ff30c6ce2ea0731f33065cba77a9af870976be2145764bd8e44a5ddd6c29c56263ab6755cafae06fd9ef5f528a42022d5abeef2478fadde439be83397dc6e88906dbe881ffd030f772221d4bb47f5ba1bc8512b0fde13d966444923e506966681406d57ea9abcc07839e4e8cef71ae2f8352bd232e56c3fa41eb8b8e10274074ac0abfb920bec0288ac611e94dd701b95610ec806a66b26fed2e8557ccbcfac6191fa2c1e8d83a51e37613e8cbabd4baf250b6f3df7800352f3c4854cda7d123a8c4c1d55008f26d80f2610f2a45f56d98ac8edb203f460e05efa5acd4f920e5ced8f47ec54f34a021c9c44263b9ce45229fca0502bae2a1aed6e69d3ba1e47f997f1d79a89becbc841c71b80b4b492017192c866b5cf94213f45a7426e13b83f2950a2160b564c131a70acde359dce1860ffd0e74e04ccdbf7e174de5067fc38e960f37c76efca6d8b07ef137c5a4548bf41293291330a436f3ff1d34fd43e79f88143b6057e55e70c3de1048e5800289c155f70a773f6cd1d10e3500c4428444ee85a1ed74a2e2bf7ecfcf58fedba359bc9ce03f0b9442b01cbc1a27d555b2a94d551c3d9e10e5f9661b3630d3fec40b2dec09230910941fd046cc7ddf5be2434798cbcb383453f28f9b8f30ce97a9e82315340a0bcfd8f3003616aba8d93c70d2dddea697ae9e51f0225fdc14cf45fee68dc6e0e1d0f571de068bc385ef678a9fb1ae8fd93419b95dff32fa779fe878c3a29b2f17bd74fea70dbc9adf221d1bc38ec7ee79163ed0b3eee5b8d4d2f0d4e47bffde2632e525f3007cc88067c582823de47745989ffef2ff11e97820e72ed778a92bc497c6492160db20402bf3f9d3e3d6674bf892b58ea814883350c167f7deacdd6feffce5dcc54b63f6b216c29170ff8ec66e2554e5814463d4e6122098e4ee8b4d09faf361e666a32e7488453e6f4f03d4106b8cf00e953ee8c8585035f60467b3162c8eba001bf9ed5f5c5456a086c99ee8d599748c085b3f65f3ee2ec37a1b7aa5c470b9195eb3f3da37893862525bfd455c668c16238da7d477a0b8b89221f3c7361d6b3ba7df709a45729c315e2dfd3e39a867017644ffd0a03bd722170c3946d5d2baf719dd87e5175a7e897dbd921eafaebe0871b07618916538586a4e0056b3d17b878cba1010092f86e745cf8b4a7188b49c1c023df35f49deb8f9824ad5136c1367f1de35bc170ebe03f6cf77be34793702de45bb5ffcd9f1527ae11d5fdbf5f7a5ed813616b0798718a4d096ec5451679f6d377aab73d4b8870a5be7da5f09d1e77fc6aca776510aa89bf186954d5b5976dcd3d3f5c7cdf7d5ff6a9be96dcc64cdc9a1ca6b0a27a98cc19c830f6bfc555a77cca4e511b636c8134a63b380dda086bd8f04cced8817dd64ea749174ad5f27c3e2d0a2f3fb5d07a340e8c78e10ded9fb08b4bc2e5cc970aac1c156c73fc96cfeaff3144c8a375ff8bee99a8323eb59bb268628be9c3e57b7abf0d6ca0f812d845ece12bd56c231594798a4eb5825ba47dffe941ab0ecc52290a5059252a5eb479dc8ce3e75dd756e1b2fc149b7a73254c921ca72f9690f36e20673397903770448db86c93f1329727bf9b5afc70c41d5e644803c751b338bf0c6f169ffc2486d52ce3bd6c8724d2bb9dfd001ca7ef63ba889f60af4bb07ce6c051800d3ae6ffb063ab1d7797e7b0404552f6ff2728d9d650fec2457b052442a7730782c0632e615b3cbaf519b4fbb6da422a5e1bcdc81dac04c5c3abcae0d130388716b0ad0881ddeb07881890f5da1e27c8bfe2bd9bd6b99a87ec89e493939ffec95bcb349e632ce251090f11202fb17ecd65af0c9f6e4e1cd65836316e06106747cecdc13b3f0cfb107d901f5369b6992a60bb58daa401668b95622f12d1537bb2788606db5294f28823faaf59c9c10f7bc7974eba2131b347898608c092ebb9e99fcfd37985832d1ae0e86e26c7d7de6af20271a4b88a2ba3f893136ffb3d02e4a438c8d092677e226b327cb95e5e0354fa575a45a09aef5c7e0719e604184549a811bc3ae54c1a99f9a50f95d7e6a357da22baa63017f0b786f8be16b5a83d74dc7949038b2688c13fcc36adfb636a96c55a7b8b9c7e45895eecdf12a71d9b2a70ad7c1af3a8af53a4ac14fb9090cc6f50f7a65cd7b0ee37fad35713e2628452f398436730d73f4ed7cf9c68999a48b72a193abe1cbfd093afee686caaa67bc4f5640fc4a7f872b1e59a2c3be0f89e4254004a5edb36caad16a2a6299d470080ee268078654615c6a22165db184f3e625bb7a28d8c3ad3e4e781d62254edc4497f90f1fffd3b9eb5798774393f3f4d6e7c997780974c4cf651d2eefcc2da354e71f3f974470043b9d83969fb67e94cc378c6c894f8463ef53ad457d32290b8bbff5e4871ff15395a563bfb532256959cd7bd5cd56a55b0d09d4549f0f31e488ce97603b449cad4d2c05925bd8e4b8d682bc45640448764dbdb4b7d8b220308228910e20add6d7e3572e85eef09cd3bdc0decbff2ad279be1db041aaaa543848dff7cfd3bbb581298687273b3e7a87a413d20f2a9075e526fe6ef3c338c1e543982e59de8e8579d7cb97eb332e1c9156fd1dc8e77fdc07df60e7e46de8dd73dac8a6d4edd495ede79e6792de1ad29cb882b904b322f1f5c91fdea681354fb55b7e0e0b91774dcc483bddf4cff77df60aebb841d610daeefcb827adee3a91d5f7133bd1e466c045e6fc150a70691757a3202a3a6635ed62ddc010103f15089f10c8c3c7dcbcb32a7c9de448f2da874672da5f9fd8ee3593df135b054053ad6ac979c8d6296bc4449292d1f359decfced08e042209ed347ebff9aee59b88fa519c3e15c81d0c80ddfb36eded579a3b0659ceda818cfaba1e18bd1a038a21feb883935dc65b5de4deec9915a4d3265f7f65e8e03752c4ba25a6011e6b81bb9bdffc20529d650687e2689d814c2e9e1cfe1e493e74b1c0344d3e14b447e0cb26b197b4f48e452de824e54318c2b8407e6521d096cf09b1c2e0d9e696f7c2a8aa3e9d227bb27a890f95803eb478cfc0b6c1a7385bc5805471d07ab444591ad8a26e65ad417ed5f6cff3841dfd80566ef471c6afa9cdad1cfb01a5e95d71a1d3b1f0cbdf5537671b15b43b3341","title":"26.删除排序数组中的重复项","link":"https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/","question_id":26,"issue_number":29},"27":{"day":27,"pres":null,"tags":["双指针","二分"],"whys":null,"difficulty":"- 简单","description":"给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。\n\n你可以假设数组中无重复元素。\n\n```\n示例 1:\n\n输入: [1,3,5,6], 5\n输出: 2\n示例 2:\n\n输入: [1,3,5,6], 2\n输出: 1\n示例 3:\n\n输入: [1,3,5,6], 7\n输出: 4\n示例 4:\n\n输入: [1,3,5,6], 0\n输出: 0\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f20910a3d438573096d622133746935bde07f4e89a717775081d103e7bd46ab345588da2612d4a92ff52ab5a7fe2fbe3d6568d4c4d3fc0b2fc7a89ad24e7a36f67e8ed9a8028d31ab3183f7acbf844d2bc0070bdfd86d69b4e2ba2331213a8e30c3ddea20999130a73650996cde69f0ab0d2967654c5e7dad719f4df301b44274069f7e241b7bcfd82079f082f21c777422146bd8e02b4566ebf9906c114431a9c1f17b0105629a2aeb5f7df6042a598d7efe6060c555d1916a018f6b3672a21dcc46472cbb85007282ca013271bfa2aedd3c94fb4de0800f4b92a2a1c6f888b18d14374bf9ac8228b231331702abc84486928d9a53b94c7b7d0ecd7c5875c8dbb408fd26804a9bfac62b9e8860bf5112ed60e606226746865d160ecec6cc200c7330f4b569afcc608472d74c22a0790f8df5a48297e51fa271c2c8da4162456814bb8288d57ba0c46010f39a1bdaffade83dfeb712896b0dd1855776999534b9ad2cc719177d5852ce3eb2cfdd102ee60e240847b3a74934a07066b2772bd8773594febb1ae1852c7ecb31287807a38840425d31893fd6e32f1bb9fbd041c8a5e8e1a269df017c3127ed7e0edd99e470afa0bc08c7376dfd5a6f2c25557771e822d7998287e1f551d59779032e9164be2b3f5ac7e742fb9e8f3e13437785c5e68c7ee4c865f5e54ba05a9a91709a9d5f48216fc906c051c34493efe2947117c3a2d09e446eb12f268493abbbdcf8ca5f97e0d2efb08a3f574bcc98ddeb37402d4a0754d00ccad02a7c0d02a76e35275f3bb69af8c9ea7e6a1d7ac177a9a4b21b1edc1345ae4f536190c616ce44259fd43ede0c09771861233da87203f599783bb1f3b1bfdf86b2b4049e4a782a141c2364a51bae3b39fb7e6326ed135d6a6adfb5f97cd46ee04e860573f8d0e0bb0cee0daa78c7e769f68d9bb80dddfabe78b87f9d4594cae10ab60c870117fb5641b5289083e0155aa9d4555bf1fc222c3815096a5ace6ab54d42ffd283d70ccea36a49cfa98da7565dd899b4938900ce00d3945ea31f528fb9445cdd3021893dead2b3f9ac00fc0aab6a8583f36ebdbb4247d68f2fcb7e6540258fa459128d2d798b1176622ce669e5079c7cad2bc93a1a8a94902e5515dcd6f78b71420e617046483a4456ff9a99255e64b6c68602de9cdcd2a7d02c70f5f23156dd2ee744cbff8dcccce5e4d793768e4c5f0bed48909ca995a5e3fc822b967f8130c30322d476aea73757e49a496789647d45b4eb92172f5c0b9b8cc4291c15263a1d22345169f53c35a0c136ac0b90bd334aef0c0847d90becbf5f0c4d56619e4abff228bf77d2cf44ba5f00ddfad865216a48377d4969188adc6f76385f5b857b96963dfc39773040fd603a50484ab8f33160ef4b5fad7e6d75b59fce767ab2e31c06dda16b0856048bbc6a34a807f747fe25a226edcad8c54798f0025fc154b82056b9d0c426909c239fe2672fb6d878389dcbbce14f4767731c1d1afe0bc4e76324c28757fd3f485cd2ab6cdb687215316fa48b074997a46e46795c8f1f3b8f9bed78a0b7b4af0b1d72b5db1915f98874cb2573f7427348a3007a3dfec183e2794907d66eaa18250649dac9badc3bd3bde6157a5c50dd1bd73c7a3a3ae7f43cb183d039370e0a79abb91677b124c2dc1e755a3d100807f5d11642185a28b8c8b00dc598217ca79702ae0d2070748aa702cc5e02f25adab40da16b2e2a6ba670fc2af7a3a94f16bd043b9ffb8cf8ddd6712df8059d44eceaf2826e3b199e3b6e58d22dc2deda0b25bbcb0178ea970accf4f34e2a897f1d22241d94a29cc547463a044c0025772aa6183c8248b62a5c1738f9ebc8640f667216a6a4a5451707cdfc9005e36ffe7b1340f9def3fecabff972c8afd51b8524d314c84cfb0711a5ade2c5a8f81263bf21b6dfc54dfb92a818d3fb083dba7ec777629d5f628f5999c6e74a15964a20edd18688ec52e611ed19fb579afd4c6cc6d8d79c941423e9db76ae7683c6c11e48448b88ea623fb97dd6f19007b0ecc22faa8609946ca7cb6591fffa3e6ed574501e2ecc6db7a73255ca0dc04bf66a0636e53a6bd59fe2e19de8576927f0c69645512f061e4a97d11136bb09bccc96a0203d5e2087674f81da9659d20453e6afb7543663d710b3758a330f178e2e0bea56d6c2670bbbf7429a6e07df46c7bbce97c00b021b8d71c717d3cd704f2583021a3c236e67454e218b7c92a0d961fff93dd23df91c717e4d733355faf4fc5e088de2e70ed19b8535178a1700af323f2b1af16cd45133cb1d209c6777f56a14b6cfb11b061625791aa8bd08ea9e6914d5f91c58a156982c4f24272b1aa1108fb662a2d4e3931cf91dbc7c2a5f967ed468c47cee307880666320accfbc479e61d6aff4f818f96ceb967c2e268e70cc0433462bdb2120adae635ec597e59813875db8c06b3c282f75b866d1d01e31ce4756be9415abdb0b3371138886a30ef07b34d8d4c9114277d09e0d2435c61ce120c68a94e70a49d50d832a13e7a0706dba17f1a3ec373f5df1674c966e7e0008ea19c79bc5335f0adb75035542265a6e8d9b1420e5876fdf93986ed603a422a5cb4eb9f246c41e19c4dbc9d0c87998e08fe30563fd93803bc5dfe26ed1cc6576fe23e26e00e7a0564652f23440fd7ff062642d2c4022537bea04230b32d1da7af4f7b9ba9a825fb0bb9ceddbc76a46b9c9b6edae5f861354099e56669a3a0417b4fef44197d83a1438c0f9e91ec9970d6330f19a707654b32303f53206497d390c4684918b8961ee1357b9ca892a7c223d537f4ef97ac6ac3d569e94d08e6f991b38cdabd0e0f9d0ea666321a3b7411c1acbfb36d863be080df3363f7e4c8ccfafc4f23cf58141c115f139d769d977ad5763511b71e1aef7c7872ad342f0be31d7d2447f004eb76cbc803cbd301456813dd2167d8cc5bf8c4a267bdda22a3004e823b1a6cab2bdfe2e5355401f298189a182a53860cb22c8232cd99a8cb3610aa7fca396f39ff9d7b1fb0bc86ea726b74ceca972301fc4f58580f8a3e860e88e18304465b88e29cd262daf35d317d73fe6f10d90f373ba3e17b9d9895dce8dc4805b404ffa32ba4aa4861c8640bb01ab880e89c81d8988a6eaf2a5cad5ce8669ffd63e94a2b080be3cad62a6b684538adff95f4096423e0734ec015df30e088eb6dc9e34994381f500c66d9583b6c970c18d5bcafe942827ec806f8764ff8f06365148156a99676d7d167ea109aea94379713748e650d18bbdabd6ea7f23f7b20bbfa8cb0539e34194f3b26ca8954012086d73f64ff84dccb35020d629f1e7829a3d9995a29afb140b7dd2395e98c1f0f6ffcaab3aa1020bf2282cb1849f44bd942ff02e7714d783fbeb8ce36f0ae8494a8448a6fdcaf91285490aabb188f846cdb75f081558eaea0b4df19248f1424050b889f5e2e56b08f21673d78b21cac80f46f41ebc62326720edb278085666d005f2c135a68b8face74040bb49ae0c02ef9c0b1d03487f4818b86236670e121b1c2a2261f4ef6041e9ac0bd8d7dd57398f1c6f493c04c2a86151a2ec23b5c927dbca38329d96248d905d07184c66d3f7f14018af7ddcc2ca656dec6bcc234596b3147a02583538185a07154ac85656332e1d3e107b4a4b16bf3349f7579eecab48bbbdc6de3f18e31dc6fb708acff98ea202e7becf555b7b0397f5ff151fc764c8126bdcc6c91faaaa9a36d076fa4a07bb0a29c48851386cac5e728f583521c78d5f1bfe09683c4a826dd66c19991c5c788b100a8bb8b0f5b7b5ebc8dc14e118d93c70554a9008dd5bd739132c7430d5c1bd760fe8e75171063aa80da84624b1562163a69f37cefabad49b88b799956bb64f2f15df6466fab0503985caaccbecf183a90dab64035eb62056ecbbdc9cf8e5a2d48b0c647726ae555555492da2b63d52ce8e929e4af334d61b6fc755fc341797452c9dcf112988d3e3a84db0018db264b792620776742fb8a5dc5eae1e653422d5ea1ee524fa2e23f422b8a1d9c00418d63d35901f0dc7c3806cf3da172dff3afad8bf9f31acabfba06ee9df3f427547963ce3318263a1fce12d5f476590f25476933893481b2a7745534a48b4b790b4dc8b95daca672bb57516ddc22690667112cea55adab6031ffa01f2a87eb1510c8ed58a99adacfb47472702851f1ac518f53285274baa413885ad490b0794db9bcca7abf490314344403dfc693219f6590b20351b41b593d1f3aa179315909b23db5c508f6d6795c1f4ac0dd851c9f43c3d507200b22a33f5e0a8f1f477898d567ce8241159a2f38e5ed048ed55c96a8664b7cd26648b6c0ea2c3c87ed861d6dc7e066e195a0795b322dffa88c2b89cd3c9a779326c9070ce47b2b3f648840a5ec3aef13021da0e041bf0503f042d7b220f15594b87ea81aac14255dcb46487746fc59643ba954936d3f8b392c1c0b2080aa6ffc058545c26b5bdca0d1d1c0ae638cce0b45ae5366ecc53e2bf407c2b61a760cbe4db2d9cba03faa9faaff7817ea428a63ba904f835b101ece0f7eed1f9b9661921f11e584a40e6505a3e9f84dfde5cbf2ffa6a0d4f1788ab3d0466225cf78e9a11cfe2d118c31ea08f99404e304235e3d0694df7080864e900b9d26c7af9e8a6cf44f89149edad68c889253fe48c4f14a649a9e853c400b7e48faaba7b5d6f11dafe76bfa40f7beda124ae059c3f19526d2fbccdec391c9fe7c0126df13b9c84f29b62f1ad379843e477e468a0a22bee3c78ace420b8866e6d9d33ee4820ed42b1ac1d29f29eef71d0a7f130f3cf635d647109c66556de22e223a049ece663e8adb682f27ad4507d620183cec40308ea84c5054dc807a26a316e6e4906e0c669627fc4f467290c6638d5c16efac6b357c2bc9484e3be2cb8964ac96815a9a83012752d367615636f8c7d7c125f94e2255f885730b8329eaee1ad8d0a1daec36998a901537585cab0066040a40940d8e47810ce573017080e5d1230681a96cc1387ef7e7ca97d5bebc7d1dbb6bf5791b86e007572e406023cc3349e9df9e738af00974b49d55ff3933f8c82ff72e1e3df125a06479b2c007f471f543c6daa217be26c85497c374287e2fed21875412c7e8d527023d3c759bef846bfac7561f95b0c2021620e76556e4af1feb958da10bd573c905194a833eeb9bd89fdda7d508481d288604666c3ecb2d93b4997a33435b2230e3cfbf5439a75bd1328c7d7d06984782768b975e6c63df70cd99d5021cfedaaf48ceb93015d0af101b7f8f4d51f443ca6a16f3dc624a189c2e3c1fddaf69cf63a0f08250cba2ec485268d1b4ba2ca6b082dae719781cfe1b577bbad982f2f12b80df76d51e6140afdeaf7048590bb45990f04a6fbd140fd9c703af9d86691e37d347da6a1bc50353478533c91e03f74c95c22bf1545bdf1f36dff6c951189255cef9eb84a4acbff5df0d1ab77d572085e11af2fbdc883c70dc90a246c897e7810cb41556d4eeafe2eb10c27409dce93d8bdd49a3036190a448626c9e009256e17c90459161bd8832fd15bcdc10d4770888f19c59be471a86cad442c75072a4090c403e4afa4c8f94c307e66b3f42871f7595dcecd49b1e1a26c28a14a5282a0b8e9800194b162878b4f5edc8628ca25f63f8d05b082cf0159314e6554549629fbeb6e08bc221c4fad387c4570bf53dbdef3a9dbbf43f4944ff87cf1dc25207fa6c3b1a76477115d16af339f9fa52369446063151ce0ac3826c68f7ee4c4cb2a4d30aa16453b83d2629d91ca177200bc25920f9845b9996627b7948a8f3510e994fcdbf7085380f1a09d15932a331ceca61b96d6a39a70895e502a9596392d1d7869f28694d950c942dee5738b7e6e4c2181fcaf894c4e79732508521fb7b76ddb5514f74c12841c297f8a7f2b7c24880111ac8cfff83c5459001d401943142ad7c91ad7a1b66b325beba65ec94155545ae9e2e5e0f80fd81aefaf961cf4204531e1446d166abd2dd0748e3b44ee6049c62ab3a355543200d8b913fa608b145db9494ac676d215aed553d90011556e576a391a7fac30ec77a033981b22521bf57041c67117ad19b190e05e670789adb5e98cf0039862f7c98706882b812aa51f370978c3b4a3c5f267dd3cb6973fa06948bae27adf7ad6f5ab7d347b7cd7041f0ee5530fbf46c7997fc46e06ef12c1fd041a3bb687bfc7892f37e0e83c8373a7ccd4437eaee7f938562edefd95a31e98f1b90427d612061a013fd83e62b09569a1429508f802fb7fab007083603d9ca0fafbb5edb676b88801ac816b866fc82b13e28b478e376434d862b238b82d1769843b1ed37d29534e0c38401fb5491470a4fde29bc500b02001fb63f120016a1ee13d4b112aaa1edce20e5a152a624d90df105c1ced51293cbba757b170e6234c4f5399780224358b9e72035734d39896ca1c8bc97d6ddc70d11fc2e63e1310f458e6529d4e3a16efa7632fc5d476cfa151f4184e22717afb8d593f5fbbe3803d8b176c6e4ecc0ef9c3e93f762a74825ecd36aa3ad0c49de36ef891cc367cc058a861f65a72f7d7983c034f5186a8487cd3d5d9ce3dcaa387d96be984cb30f24da7db18e996b9e2aeb5b96411f16f2319faa0c1371fb6c6f436831b0a7a2adeed3fbe2ff08b1075d62096b1c7d133ec5c0c68a5e5ebb033eb1845f8737909efa4c8abcbd7693e452282e0c24f7355ce22c2c402e0e3b245f3c864852ed534d950768306ec72b3ce58f66ac5b73be855b85acfc1d5a287df3adb440787ef8d3614df689ec528cc8524b35dbbbb2d123e8f64863a789bf5b724c7c90acff80ecea78eb0cd9f21b43cf33eda6c40946c44d7ea000835e8f4b695bdca12e1c8d990c35aebef1d125d08e3c975f2cdfc6bdda28cdeb01d68489a8ca2d048d32ae0177362365d33135a5a12452cac81cd2673c0ba3e5e9b308ea629c3f864b3e08a8040c5ac7641f74221c8d7c05c04cf0843d60877a05509c04864e07802eb97ec86b6e8666b27f1e1aab7fd9640c697c70d93b01e9f05174f5eb3d725e7b321b8e10ae2af2004133836a5dc0c9a9bf1c8b637a98f7749b9fc616fcf7661f57ae12c9fdf0c2c4be6eb841c6be3a7d6b6f1c26a158f1131cfc353bcab5a8f2aecb15fd273ba6ee646535b8db9f478ed98e5cab8dff753e695cbc638caa3ffa147b18d183e479a96887d7328f5adb6582d2f2eaa984d5e5163c67cb0ede5b018762b48299ff32fcc7437fe789910cfcb278fe555f2690113086140b3c51537b917b5ea9abadc6d869763b78625770b58a1442c13beb36bf3bd61480677ab063165d3ebadfda59ab0d111cfe14c3b1919472ae7814a602350c66431d2902dbeee82781e7636dc9bd16e876d934c2467988cf096bcda854c0b6cc55257c048330e13956aba195436abab321e38feccd3c82ae3276ef92e28ee6f8d510660e09a5b6a8fe8a6dee96d8dc0a0a5c7dcdbe5252845e04542b06e037e7679c8a9220cdcf9fa8aeea48227341314e70a817d3bcfcd4e9bcd1c99ae78913e8476afc18947b87be539e681a0435d76427e213c342f1c3c86664be2913173288dd8586e589f53401afaf41bc06f867cbac90c0ea250df38369b53ce500e43cce27a7dbd7fb36766c5c8508acfd0b4e89822cbf75deda3e52e775091473be3c2dd60a17cfa8e0e26fcdb68320bf5c4ef0b730593fd0aebc9f4370533f66e043b0e7c930e17526b45f772a6b028656a079d52e3430007220cbc4ff851206c06bc4a1556599c17140d326f01c10ee9c441b70f504a84b9fc0b186360144ca79e88a9d9b721206fadbfb020b36ff325152599312ad22784e67d3775499bbb86ad3d01ed38aaf76933f5f92fe5d5a60f63dd9b8c915710fab0a1e5be282ed25e6d7be2d0adb35a3abc71267bc948b0f8b16d23571ae0c884f38d338472c31218ff15dbbf5ecb1e6f922efa4144701defc09105f402bdd5903671960f07336fea520fa489f91211da87e0e13a406285fcffa82f4c1d1a0b9fcf49c50283a830bdedbe41edd44b957bbd73f190d37aa0dcfed7a517ff5aba30659d00af5312688436c3476167ccf7de9264b064577f5f95e7d96afc36fed3a942076eefecd58d84b805e1e3ffd8e3cb072df178a7db6733a363247adcb34974f10edcba9335911bb5eb4b99479c465cef58647207c86d66e3b525b0fd1fb7b27386bed3a6a8cf6bc21e7deb34becd16bbcbeaaf0a98336c25516636f844ec8821d019e95f418f1e1e353e60dcc2bfb4f6aff38a3c98567e4b57ba601a2cc9517d002d9cc29e0a290bf8f7654012763cae32a652d1673fffd7f67ddecced25c64017ed2e01885080b22da1a13f9736a953f18ce1821ec68e33e47016a0e6035054f71ae4e83771c583d6b300c27773f4efce6154ba121dd35dd3994d940d565e35406033c698f29cd98fbf15231a25d243535465f543f85b943b81f4508d4aef748e3fd2a2da53c3cb0b7cf2bdd1a8042a66b3a62e1664c9e06d226aaee8baa6329a832189e6044fc2d2f48493feb96a2ad3218839d26f0dc6271d534a0b3bec904e0b87e89188c06ff3115d4b2c46720ab8610d6a2b680e34722f9f4175821a989a7adeee6ac0e2a1497a14e0a10d7e77fb7a6bffe4578ace8cfd9849eb3e5430aa4fc6664c7b5588f4d4c6d01c711c3c81d381044b7013ffc73826ba7e6b987d6f37b4fe88d8a29a3ef8d468b8ca213ad53ab1df32cec2720a833426b0c9beab6be58bda987ed460543620426ec36f489aff641dbe60041335b5627b5b145bcb4601dc18459c851ab18615fdc831cf9f2559a830bbb1a72ee404f5382fb1f86ccb08a9df896276084357ddd748d035d5884e27e064a43d1ba6898aeaac60378c49c68f64475f20170003ce1411aa1be0e2c00aacd776f28d9f910614a04541a26d80def70c3baa21db5e999709804d2dd20ade2b14944adfb69cb91419e6e80cb1e2501c09dee6c186919cddbabc9391b19f4b67ce7854ce46d78a36e3d98a5723c93719e72678de6a4a69bf96920116fac01a3321910814e40004ca3b9c0e0de74dc29294d03c8d67bdf9365271b175d91b126ac632dc850f8a98c930137be7e6cfaf1ceaa749a06e1dcfa446c176c03a99db7c1d587a785a3e6612e1e65d15edd72c8326a5f568f2685410413b4eff48913b94bcae75505413b1959703fd29d6dfe7de89388585ad50fbe807777bd43004657561787e9b073bf8abcba9adc0f1e99ab99d8f325801a535806df22744158fef2564538cf5793a0d7fec972664e5ff76a4945ae435a4b94fe0f61334a38060f81e99a91c352944f7dd381a2e243d7c982cf86d39fb28b2defd64c348563bd23870d048d2200fc55dde8babd1e4dde377ca25deb20c9f5bd69078ba1e13a0fc06fe1c25fc03b09478b0f42372160e6384a847fc1d5508806c25411a016e759e8de5a839e9aa5b9a0501fbe6f1d4d2039c7ad33f7d326930c0cc2b6cd4196b90296172dcb52c970c4fe3cd6f35405556747b6900db6b656fd17a7e3f44cc4b5d626a0a1d574daeb1e2578258e6f18a67b53d8b3e46d348f0b858a8ea970a4bdb0aceb6d453277406989952ae4a9f519c90004b585983fc4d5f2e31c5c94d37ba7f9114a706863f69fc893ff909a974eea0baeb63787bc583a4146dae555406707a8dfe44d4b07be2eac6c18e29253cdc861f91abadd6a9870de1e065aad04804cd13a91bfc19aab4492e2e650316b829e59e96dd02fce3f736dc60e411988ee03728a56cdc04c580ca8212bbbcdbb6bb66e12278ef755f40d3a6a3413400b37167ff90adc0bdf08471229b54eefce8302842d9fc15df90fa44783b9fab562331fbf1165fd43f11bae278a4a91ed98971bed8c5727565951d490dc3854fdf91d9b73bee72022f95c7d7e15f391033764cb0442b76243a21d761dccb6e510d3698666eba822818a4dce7f33804101ddb896905c6607e2aa2d46c75f120d120bd","title":"35. 搜索插入位置","link":"https://leetcode-cn.com/problems/search-insert-position","question_id":35,"issue_number":30},"28":{"day":28,"pres":["队列","滑动窗口"],"tags":["双指针","滑动窗口"],"whys":null,"difficulty":"- 困难","description":"```\n给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。\n\n返回滑动窗口中的最大值。\n\n \n\n进阶:\n\n你能在线性时间复杂度内解决此题吗?\n\n \n\n示例:\n\n输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3\n输出: [3,3,5,5,6,7]\n解释:\n\n 滑动窗口的位置 最大值\n--------------- -----\n[1 3 -1] -3 5 3 6 7 3\n 1 [3 -1 -3] 5 3 6 7 3\n 1 3 [-1 -3 5] 3 6 7 5\n 1 3 -1 [-3 5 3] 6 7 5\n 1 3 -1 -3 [5 3 6] 7 6\n 1 3 -1 -3 5 [3 6 7] 7\n \n\n提示:\n\n1 <= nums.length <= 10^5\n-10^4 <= nums[i] <= 10^4\n1 <= k <= nums.length\n\n```","content":"096221cf5b628be1e73e8bcfe626c73477842a8a04fb1e840a6471276d2b030313fe984226cabd5c185021d103e7bd46ab345588da2612d4a92ff52ab5a7fe2fbe3d6568d4c4d3fc0b2fc7a89ad24e733ee0748893ec1b973abd2ad9aaaead95502fda042edff16d6a71829a6f582854f926a2aecf9b99aa2fa9f20e9c059c4c91da30453b7529336bcc29ab289b2adf294254e8684b4c6aa4a41f0cad88bd5c500476202da5eb4a22707af992711c5e3aa7ccee78121863ab25eb6f76f4103e528b7efe7346cb47ee9174148e431c70a92acf5c592dbeb70b768ec60c249d201868715fd0c030aaa481a83d21a3eef94e6356a2fbc9c1af8227931e33270caafa7c84b3ae75d40f80e71871d73e077d743521a8fd13aa4ba7c52aa82e4ecdf71619acf142c38ec848996afba910aca607cb2d269dfd7fcc9d72e8c0508a53aa12518153c0fdd9b5d0f7679ab1e903d0cfa18cf6c9ac971385418e8b6a785213a5ea94099cde26f0313773681a5ae5ff39c7f21aa1681f300558bb418ca6a7057bb613445372d8e44a51ce6029dd5c63ab6755cafae06fd9ef556286580e2c5ebfef2478146aa064bcc17a738db18d44a8dce3b8c565b6786d6174c30f61eee0ab62fcc8ab4fa40e1f845ecda241777557de23d987818af1f351eb957a1f2eb654bc1d005bf2ca42c1a18e2936424082cfca9173d4ef67c9c04b84719b99769a9c484303462580a107f61bedcb8bc96f60ac8f92d3490fda314fdb83e2c2d89c5cd596f9d5efbf99386c6c231398a393f423602c5af33ec1d41d909046f34950414653cfb79c94e138093a1e5ccb205366f45df54f3c9221c9f64f4a99ce5d159fd7280281f6af96caea9813abe246b347f3f94728bdfc866c2abdaea7d6784e314d23a013b45f467eb3d0fe48ed566602c2b4fb7ccc71fa2686166dc4146975c5495202d4d686ae6f174c0c6e435a61f508ad038d4263771ca37b830112fb5430899d1b003e98382d4dbafc6b20b989d778053714e7041ada9f6f5c8fd412cc9b6153cfd29cab4551cd95a2ee8500de2a1bcc51c67d4c127cf4eab77d6cae1ae4dcbe321b9934ad1da11b36d944beb84147102f9203e9ea6a0f4631f4d90c86cb3bbcb3df8a20da4ebe04ef789e59e8812e480c82869a47075e15b6ce82a5e8f5a6a2df93000e5dbffdb23b6f4f8b0d9c9d93f5846924e3358be5188e7b81666c487069265575b94f8d34511a29d31e4829349ab4380aa851e920f6608ce478d7613b8d28bdb07227c937371693acd33e221c4edacb8761662675694f76234c69b3697be3956ac94581b57d0ca25f09568d4ab3eb1a2351563aa74abfa21aed60da8301ee5f49ddf1f2752b6a012461492a5cc78f6c297d1109d1489e9674e1327e2766d7603a504803e9d9dbae902cca7987d7f1314d529811cab5594ec9a17e771b5785f02f7abd16eb12b076a27ee69ecdef4a89bd564b23898e3d56a5c0dd20b99b5e33373661b8852d08ceb5e5fa79077c12bedd46c92180b8ebf3610daf11bd86923d298a5d96e83538468e8a35605077e0455e4381250d622a44b1dc90cef0258072b5db1939de8469d7277ded4161694cb0ff24fe004966f2ef9bd649a7df65241fa4fad3729b15c8e14e2854c5f712b8f3d2adfb575815bf83d12e2c03087dabb91677b2e2bee8661776981021c06e4f147a2f56219c27177488bc4a03b1ff5bb94d6c4c00fdbd618e5375aa6d91fc11cd00096d109f11b40299fba72e66ad787284aae1febbb950688318cf06dc8995ab097825d5645d31ae2cbe94f86f79b9418fcd8be81daba0de2746a8265f1243768bd0ffce1b3b327e343b77352dff773ced2d92a2b06033b08ef618524e20498ed5fc794374d3b6e43fb239c53b4a649d82f1b388b88d04c3e08928fa66de539b67985d32c2eccc80fce1420aac53e8e4b010dbdef405a2be3b7bcc6ca82e4ade0259d5309591b87f5ec9504776518989f250e824e227d7579de84272d8d8d185941117e2dd6a47fc61ac44d2b9a8736160bceb35bd01395cf138211ca3506ec469982d22cd552f64fb9563b0c8fda735be250ec0d7268812d721d3809c21a6975c6d4c2d4805c6c8d43f47297f60e9e7af92115d9bff4c9d29391776c7ad8eaa4eff89536d4b9779919c21297ef48cab47b877a050adcaf839f8d869842142aae6312c8c0bcf4fa35996d7c7cfa70e496ab523931589b77c24789c9692dffefbf2201124e422bac5897b914fa2a97582a4d1a619e0f7842567460e4fc4b9ae06105164a1805e829f34e487809511a012b09244f3d00a88cd3fe1de363d60704f52283305e3ae41fd836e3b9ae8534aec5e8b396723106a1fac0f84fc50afd3f39319fe50e6743d1ac2389d31e736a72241c514036fe5b5af7f9371bfb8e6dd35836cfc8d702817e409846f5c6c71976c2aa480787dd8d4fa910edd1f91a17e177b551369bc1853eac25cbba4094fc60a16d492b2a0144f5ba9159cfd32085cf0bdc72c4b003b39f106b91bdf8aafe32b4fdb16c01d45fab5c0db509d784d6bf8d6df3dacea6ea9dbaac839f2292a57dccbf117c394f3e4df9be7307a85ab7c10b4171675a55efc7697241739bcb9f90bd655e4b8d297ee0a1319696fc4b852597c9d0b2634866465f39e2cf517cacc369a716f77c33106876cb5397738324d0b257bef385b1100eae175ffde8b8ab8957aa787e2fbdbe35a2bfef387c5bb67f9005d0eb00d2a91521759b5acea0f88e0294049b4e0c722fc940e6336c0cf0a1a0eb927459d7607193e751714e0c1a0ba34fb2e2fd8c4f86f1d331f637009c10795f0546ed5d3b9eb1e933613ddbbb9e8ddcdce0b443481c7651d2eefcc34cc25ee5225e54d6b2e3b9ddeec8ebd27cab262de228902c575a134a3146d631421bc7913000ed706c53a5dbf291ef6bdc2c169d71378c231d285c54fdf5cafcee4a2cdc6266fd555608afcb5b87a1c6e203b5f06a990cbcef0c6027159fa8e6253db1f96052ba4d6d7c9646eb6f89e9a506029a7e1cc25de66b97ea94ef0e55b3355efef8f8dd8fbc65ecf8d26326928dfe91ad1040d916ce621bd27e9d3269aba069f615585ead034c78dc392672e4ed405fd00c89e00c507df60a1ab3fe8d53f85c8ffcda8c9dba8b1cd3492ae4e81869686a45e824dbfb29d57deab817e4ee7462c55478b2c2e821c11ddb88aa37db55fb9ba5ed4779bb695f654e1a77e91ddb02a3dcba067c200fbb3580b393d0b09ed693a1b4c7ee479f7c010103f0b41cc4c988b9484b8f06f0494ff62f2dada6c728d4593c0fe678fdf5d1e1a1e37f83fb61edd8a7d02900ddddcd1be1886a680a3c2042040ed2644a5cca6d7cc81a9049f38549b350abc95853aeda819de320602e4da81c0bfee1e55b042088a21e2fbcdd514881209bdc5c69915e29c745f7767f8f9646088da25e855116c98f3e0c4811652d82b429ce221968a452ec564fe15543e28da9834503e79f513a8972ea49aeef4db447e986d896558cfb9325d740115123fe50c60770634060d2a6e59cfcf337bc59452cbd5e41400b9014e4c1f73b9d526758bf41aa5ca26d0e3642895b03b96d3600421634ad2a8ce482bfc3fcfabc74f62867ff7695f959523275d72261001732c2315f6777b2d4e7e11505a532441be1e7bf441b3c3a858d3d8dead5b1af827bb9a2af9abf4909c32fda0ec726d2845f49fac5468d228b949348fcfda6bfec5c3459a49e57308841e44e59c326f25e839049b1c501dd49c381fa71b5f5903eb37bb3674c075495e940110ca86eb96a4e6e6c6f655c352a6490f3f3bcc37f43ad03b173c6f4f85a9af634499aa053f6f70e744c1061baf222d49bda00ae3a19ed8a9d6ba81aa748e574a51b0660fbbdf354ec4a7c2b99ee5c3f76ed2291a07cc4720b584d0a1bbdea5ba9130403b2e834f12362f440d7ad3da197a1316847ae507afb5354dae487e1ab7bef4c87cb77d134847b02df76017b2421aba93494e50f5053f8910f1e498ec3765db248b70eb74826f93def98f7460ec7373c27c4e69034de20003a4f0289b212f0376e0f1d287a53681a16c213327ff7164a3317c107215fe809cc53e24dbbb3651d1c9ead8d38b96f7a774326f537179480019aaae6bd9c30722916186f1f93c18951c32ead949843926935c132e9fd0f9235b524487b8f5f378b5e737cd26d33eee8a2496d52842afdfc0486c7b5b367d3023d3becb8bce509ed385208ca1d3e1949f703d263936cf47be3b619d3cbbd7359fea61045879d25caa1f46eef4d49ae521fff222140f7147a7efe41e15bd679a8b537850b8ec0b62aa23d54fa33a00e0c65eacaa611177a129ef2a24e388bfb887f01d1bf34c10581e47505c0877d5c7b90fb71ced527a6a9d4da5a93e3a2dfcb60ad3d1b62bd7accb6bd0f7de9a91b9230857263ebce91349ee65a1f00a42cb545ef0fc14754824432f69ddfd5b460393681fa744486ccdc4cddf1dbb1e0912bf3489e60fc00b7ceda0dfe97aaf4d3628fc7e5c8f384b5d70242a8e68b858de048e0f41831546103af4b6656aa6bed42c8eb6b609fefd8ef14a63327eaa538a1488a181d85d70e180ade3ec273232f52a3227f16bfc50354997e3e584bb3f3db68f3780f6a247c0415eaae9858612068a5a4aad4344a54177cfbf1b1fd0d751f02100f03dcd302916354880d78ce0502c890319dff7316c8a7edc4bd5c5d793e7e68562efda185a2e81b00f95005a7a70b84d69dc14ab00d81eb5187ad251c48f0e2ab325508be24788439cf171987d08e3d1547018f61a4161d302971248147556f01c46894adb54e9e3001ced1f591e583df439bdfaa0f00e29009ecd0d5203ffc346ef008092f2a3868b156ac59799661dc496eaacb4232fca061728af191e5740414fdc357db257acdb1844d173317877120cfe9d45f5b5f21dd075d5b826c6fe0d92030507751af8ed83db5293d42b6642ac9491791e20e0795388df6369f775003bd3f8946f5d473e95d33da5cf0c43884640ccde96aa89b46398bd6e04682cea2e1f03f329b9f981e269867bc06f428872f5ab25f4c3f45bd3d2e34b7d0063da741f73007d720f4fa7380aab5fd60b6f5e0be8ab94d21c122f286a993b3e579e9c5ab6d33080b26645e76c7a06006e5b7a4b2d1e85e8c011e804c473138279ced96782cad780e3c94149b8c2ca835f132bd8aebdb0216f848f774fa47343528c9308f33cea5a6a8ace9256a65f3963d149c7d32fce08c895605beff394bbeb94f4481e43a648ce8f9ac55e616ceee508719066eae3f5f2dececfd99ecb38510672019623ce9e51d7301c9fd64e0f44fe179380ffadc65c919e910174548f50fb213cbf2c52aba9be6d93f9f25b86282c8da2ff53fd80590cd69e75a7d129094fe1f5c67420383a6a138aa30448d65117ef187586ebff7ca82c961cb41519839e9d5d60fdc30ce5e9e02cf67a0a5532ee7381d8d4eb16ae4a472ed96c1258a025303a23e5e63bdc700f57a5adbb81cea0ff785f346b0de80cd7fd6e207c10f727491d6e83fe6e9c3cdabd4f0c1adaf509abcda616b1358d48633412365b89da2199efc8b68e16194052e6bc5f338828109a8338a3f8f12e3bc8133bc8eff1d19c299c8667a0992a73e0983acd57b37ccc188985a1620961360f30168471ada82761aa4b0808bc5526373dc61eb6979fcab1fe34cdbe59817ff0df2f7b1bfc9a88ce2d1858345cc054fa8ac844524909220b55bad65e2fcec449a88ca349297186780a7fe6bc34dff6d34e1b4af36cd61dd047b8ad46228ff9a1db0860d6c8daf9c4571fec96edf5728a735a56a3ef5f849ef3de4ad6173c49ff86405573773595f0809d35bb0a9de169bb4701143690e7c682254d56775c367219a5ac7fc1443fc51800dc342032eb7040125cfa5b50dbfeb3896802584206601e785d099e967da1f0f77b5b1482ba69d2570b5421c0d3f7b581149b4adfb6c95d8d36377d9056744528ae44991bc7524fd15653d53ac7c70f6f3e04c48c309a378f382fbc36368a2c9305c483109472003c25393c7b7d66f559f47dbd0f9020786e39dc6c74cb036ec454d7daf9136b55b3f1edd196b61fb46de5eeac00df69fd43ac3661306887be95c9cc27a702809206974a49b7b51c940bc4ecbc7a611278f9150611ed6002be45d79468fa591aae2de7db095429ed9e84f3f5751ab9d13a822a87ceeb2867bc94b33e5138b0b1d6fc7686f6a91d2a8a351b30526fbf2737cae31be901cf41e03dc215e07a08e9047f8eb9e2ebe1ffdd35f5cc58d6f920cf03ed0e0ba18f0bd708297fc056920be9170c6afd790dba34461a2746420d66a16e3576e0c5a584c938f31a04ec4e933a77727df92a615b088a299fe2441e49610b04c796543b05e766027e97b670e172d33958546a9a6c305b01e8ed0874267dbffbfc9923b3f13166b957c95df7be293d1fb35a935380484b4ae9a35c45a6821f81cb07b75324700b6a95db1b1003a3da9b7c8a3b774b0ff417d892cc7a1774539a65c70eae5e85fbf39c50bcf4a2603ea741f108bc153bc9c5a4612b0570a4d57c6e91c188e963f8d0f899378ef2df749124b1b25184ced4b8cbefd44835f953117dffa4f73f1c8ffeb029f0456b3345978475cc5a9eed6165ed09acf6d1c819e45e1b22cb9ab68844e33b3ccf35394afdde85d186ad2244640e85dcdd7b2356e7299dab3ac2eff526f0ad0dab29cb33a03d06ae22dd6b898032ab0d8cc2628151a309f1caf1b1b2f51ac1693692c39d315fdd56a0ff51a5c25e834f9db1191a46b666be2e53c8cea76cd6a16982a003d693898cfbb4768211d320f14d59b57d5388b365736ee6d890d6e2e52ed1c8fba7e347c5d52e0c5b20ecbc2d8ae9e54bfd9fd3f8b3553a44ac86a9b212e17089283c355b720314337f170440fbe8a5350c9fed51699329b0a862dfe217c7b3ad886d95835041f25510e5c9e77b34a8344bcb173d98120dfc627cf55c22d3da86fda8eb51164ab991de90bdb577d886ed0f97a02dcf6b6d2617a8db0baab372e78768ecc64771471e2eea9d01b7a1a2f1d26dfaf6082cbc911e1ad24a48ed66c123b88b360025b1d6fb50358ea6b7fa9ab1031697520ed1d061a18b5aff1aa9c42cbb65d323e75a113098e18501aa808ca3dd999330c8eca2a27390cfb5db11deba262879a199df1d5b24fece95433a3d129c835b676a20b60dd98b97c76a266f2f678ed329d93946d951cd2ce59460f1c794639588c6d4e2b66800acaf30a01e760a1e18f72a52cb1140b9cdc48a42d583d53428b97d48b1c1ffd86e8386ad5d7969645c2d361492232b23445f124d31091ac9a7a3f1ec13df4913ea3e4f448ddfe3942d011e9ce5629040b88064978d1f7239bb41572d8459d419a9153037c249cb720277abc87d5a31efede2a26aa36d2ff24502ad7ee6285560c190436a89efe9d1a765bceafdbeedcccee7434b0ceac98849a8ed99f2b10d24e3e4490218d4ecc7e6b7d4ea14e75f08b6ad0931900856ec1149a011f00b5cdee689810fed2c8e72446da89bc3aeeef6e920635d1dc97c4fadcb677a3caed50aec8550c8b98e3261ad2cf824b9204f160ea63f9e3d6b9f35a1155943144fdfae07dc7adfd90060e7a0ac59447e02cb207aa0407758e2e5a7668def224b1d9921fb74488c881f52f5f69358025784b5e54d7df13a0c78d686c800ab82a00e2ab541110f66456be22878afe6ac94289143e1c6a9a7816ab03ea1ece79a0d8cf1a2db539bd7ad99f5f13782205b8b03cb1508bfb8b20d1c71bc84e86f190b6f4a02e280cd8795fa65b06761c4faaa4bea00e6e26f25f5eab0cb4e533d0c8c9e5cb46c65e8f66a5ce6644e6382db1839041a98e16b1f3f2055c4ad68f1abc3593c111a9f9f1fb6b2fb0ae812f829ebc4ddf7190e7b2545a46bf634d09a11b1021ab359c7bc2fec07c090d4d4096856bf50c739525faadd5fad84f7f64297f440070cc4d67d23680ddd87fb052874132546d982a65a69e403be2a6dc5346f469a6c4f9516db29e82c6e51907b18784f62e23ed147ceef53df1be3cd488ef563e5a9f875317122a334fe91d7ee033901fb33e7392a68c284e42b745ff64115b029735c114324e8af4fbe27731a3beb6a5a008fa9467bb64788f29432cb0da8e844945896015ed2417c671f80513485b020a4947a99847ca7bdd8a1bda800d10a78f368c0d31ea780f0a40c997f6903517a27e55ea99872c20de4571b8b155037f3833c477c1b307b1a1ce36ecbf5f30e99a6a7e5498bd18ac06a553eb503313040c387a6e7aa7ddb298c66bf9032443481160c29ae31a59a42b0c61ed06f18a53153d21dc43f9e1d70684ab21e0e9e72a3ff2f38bd95a05edc5848f2a50c091b60c7359af215004cf5c97ca2de5fa72751c035979d92bba7effa61023537666a23b9ebbaca5b8da8c5ca32c21f821dc27f718478c864e646ee3c2708844831e2fc23446f138ce2c61f63e1f2a27f11e0fbae26305320ca4700981a32b9f551290205633a77f1d53caf36fe7cffc208ce8c968983832e1ca5c00f360f677ce736be868ff1aae6c437eef8c7e7b8fbb4acc515ab980ad27b5cde517c9c046c5389b690164db0dcb261fcaf280cd67a5857455a00ab15103ea34009ebfb94e724304c3119e4bf88c3254e11908edaa83849dda96e83f92ff6a6cd697f48392127913d5ff5565281fc55f0587f90b9c2b7b151b7ff61546c07e1087c4a18d841dbddbed9b3807480d67a3fe2e020cbcadfb612cd9495eadc358fe403f8c35442dc684d9d3018bc185bf9df0ff9091926c304c10ef6a84f1ce112f73f1e4fffddd3c3a9371ed800a93b53918a1fe858e6af736b160819a6e35ade2070f7e7fbafeec2c3798dca2eff680b78e53651b04a029f956950b151457ddb2c1668b5fe3ab01db4164fa660cfe8558d33d98235fd11162fb914dc5d68ca3c6696bce35e3802060941071f615d3f135bd3c70ae0de0be97b4dbd6c5d7bace67c80d716a8ee48d880f62dd654af933e58b1f59c14cfae09809f35ab7bd5b120b3434017088e02fb5f36b7bf956fc743ddaeca03b65b40af165f7394d5ce77f4495beb92c38c48b09d78178360cc06a92c14e0a772503c1cfb8dc2650d999d0c247b8e3a6226b269969581df80884ae0549e377b3af59fc8bf741106c504810e7a095059b8483915be636cc0f0d6fe1a156b75a5e09b10d3d32439446c3a52367235710b2af7ff9b62bf37fa5db98cf4656e9efd970779b6a6a1b96323e3e2157c8a400fb549bc205fca084cfedb5ff0749b954566c3baa0c3231db4d6d2457e2dd96c64f1e67dc6644e2d838d010d0c827d325bbb35ff80669a4a0b270f2119289f4eed2932ea54cd3458eb1cd8935f208c03acab39d8672ac73b09d9e58283ee505a8408fec2ea52fcb1f284bbffb32602a56fad6b26897bc0c97c3f6b6ade4ace77ce74336c24720925c6f334b2a51f8382d14170b623c4c06652a5f7ca88f3b58eed5cec412568d1e4c4908056e598ffd9cfb4fa880b5b6b9702dc0c284ce834b7379c8373933701d020780fddf06dce54101bcf8bb1a30f5dcf1dc649c05266da46cfb96070b98cebb2780cb0db2199798500a01be6956c74dd3ecf6ff94d355543d4bec34a473cb4a936df9def84bf221fd8215cc507144d2027f08ac45a5fd71d471b134d30df7d01e9687285ba60cd13b438830471d49debccaed31dcf6e595332926d2650ac15d85bd43039a01d0262f721cc47274353fc720c59601ae8248ade29cbef8f4f574df399c909efa0401564334b617e8fab10973c6e57f580f54173de013404c2809e7139fc222ddcfe0b4fd40238b8f07aa68f0e171bd15da4e133dd9c5a457d52beb019958eb4c631b8312e6e05491f443a49127a0540d505080a5f206b8b5b660eeeb9c2c073e2801141b69d61a0f0af4c364c59d7e32b22a135756a005ba786431bf225ecb1637216f041cffae573a41ae44c933073276e76ef034d4041aef7cdd33be279a52fa2032c7ecc94274c76f9f3a357c45a6c343400a24875ee9e4a14f2341521f4d686c50b4c8826c4f42e4d259eda07288076eff2a9dec810fdab5a74e1aace3a7b15162ed021b041a2fdc4e59ead290be11f4060cf8cac3aff0ec4842dc333fa5553c5ab9a90636e17f17628af95241adda31202fcf7ac977123f43aafbcda3506e43cb5b232b38ffe28db158cb32170ff20aab2525f32bb847c953b17d39429a844029ce864118984cfb39a0ba7a283e41223faa78d53e0dde26938be526d9a4c4b6c1676be5b0b08aa02d723fe36ef3bc3c37b685338795829a99ebd3365b4673644481f0ddb227b74db913ef281df81b6151337b94da3b3460a2fbdca8f2c7580d61b210f25f9bf5bb2741ebff571328526279e8ede50012f028c12500dff43f25c7855311336c41870caf0e255074a6166a36491607dd6a5b49f9c4c8c0bb05a81a3dccd521ca56a3adaeb7bd017157b7fc4df5e397594de36a38a5f8de63206562d15b2b33bf84a183816dfb165f95af926b52e37b20662fc29995ca6f3a68365cb00b6d51a1f5664cf35cbf37de43039266fbf4cbaa54710160433ccb193e75040773a389b3166ab7863f440be457106b8c6afb678c0bb19bf9bdc576fee31175207a19667beaadeaab6c5bedaae0139bac2a43284eeb4291b151ae7697dfca9c5236833c6d5f67a3a20fde004ed066dfbabf8a4ebfbde6a167d265a16cfbf3be820518dd41c691cb3736fa7d1a038c940ad4aba2ad12d75e6ce053d57f386c6f220dccf9445b420a0305af81b63655c847444462da2775add1fdfe31ee1e46eb233523fb84441821c88f47633c21f4c5068260361701cc29b6f1c461f55b5a2adfae8b7f2d0c94e28cb4a18950546a36ce79b137257123f863a256be8973716a77e6f6ccd6e8cd7b822baf39ad2006fba6092122d0d0286195b7202caa38593e69c0851989cbf27ed7f99c749f869395064e753ad959acf0ca7f33c5bc921c0f6e2499f41184a2752530275acfe64ea72f26a56834679f041af2463dd53a84a61e57d8357e2fbd642dcb1b72ab558edf9638e0ff7fa8285a3a82a7595ce0628617f8fb4465fb3f006ac25a4ecc8e5dae7c2f09c0efe0a3c6d208c5fa48f0d348900aeefd786beb0c3cb8ba1647d1e3411e9ded7442ba5f9bc792b67a4a543996c9aff447470246ebc5b635e7a6859bb5aaea06ed856912b2b478857863eb57b1425ccc026875a1a3c32155987cb08ebd46b40490064d7be63b56c91f6081a60d612069e8b40021b7d66827d24581e65ccd31d33a2f6d506e36ad4f6da2b12c762a4350dafb405e77eeb35dbb23caa98225a2bb7a61355e5071d6c57eaeb2c322eb7d9d8dd678ea461971f79a07ad771d2cd15f4734560d01ac7643bf96a4f6702f74f1c1cb02dc66771b67f6188c19866dc718256531d567d28d59fa016a66e5407d25ea54351922c0c8a2def66ec9efcdb20aa709354192d49274e60bffc08f80c587b70d9345ef138de2ee8fd4d512d94bdabc473fdf6d083654412b8d33eb23bf0c20b1a4e6881842913e1b965eef19201f2424f824aa4c9b019df3ebaf47070f21b194f0b5b50b9afd8b48234fcbc6c5934d7fc3dc0ea5806d35ea05751b59252ec07a248c75ee6af6f9e21e28cb6aa225d639071d2bca96a8786c741546f8d3f41d76f497c655ee4680606970636458ba558391f92b846e7affbd8f518d23e6e820e1fd3d62f277f92e0b22f53c745ac4857fb35fdf597b9d36039129190f13f96b18ef1e0825c6070a003dea6b08fd4adb090e7c556c1f58b7029fa8f5d6dd2aeec5219dd146e405b64ec77ff7a8757ebda4e06eed44e7b052076f51f1898a6253ab2b6fdb58d71661254ece514e0889efbe2220829e2f8f866cbd1aa745aca113ebb8315a1fbf1d6c28ecfa41723c971f0dce61348f832002a8d0738f511519a720fa6a18a65d7147e7cc7c72faab46321d17d85443c8f8e261ca95045daac6c853f2719d17da026da13fbd6a8112f201e1ad947523bcb84d1fbe5b3c24c70bd62e5e359f86ab4922471c7d05c35cea2d87a199bf7eda12876c4a1235830658358f78acccfede92a5cbf4b1adbc37bc398fce80db2f173ea9333badaef67d5316b59085e656ca665552f83c4bd3946965cce75a9e8482617a6572ef21501b1531879cc8ddba73185969ab036b61760b602b42549188ca1ebff58fb9e47d68a35928927aa329fb4a95d82962b9c220db97b1e9b405d34ba36d51d1b6689cd71fc3fcdfb091344de8e27ec24f8fd41d406206fb66413c87b649b3429e5ef1979a5b3b640fe6b34b0b615ec174cd8229e738222d26210418e8d06c473f75e9baa1080c1475b31ecdc9495ebfa261d1619be8872dd96980176ec85111f7a7aa91af218a26d5e70fbc0d85b1dd5e5f9596935f541229c9f9ebff0a933e0ae824f99622ea8c340123d4e058af189aa1fb449262ca39ec2fa638e988dadfa7cec137a490d8457cb4c7474836835c0de18c4ef5b6ff3da7e26f594ebba87066b42d2fe77fff4036143c0616ce5476fe91f451fa94da8a3ecb210a83d1c7fc9b79fa7e0cd5cf38d630d7c17e2548052a155f901db0a32cbf761af50b4403d76591d6e6bac9c513bf893b730a85185a4d5e2733ee33c846bc1c4e2880dd636ab59da13f07974fcfab8fdaeebace6836d25c680e6d154394a79db3fcb2e038c80e0d1162d8276d2ba147218045129dfcea9b0d55f9c9f35d399ce6eb61e0038678ea39d559c2ffb3a60ceb04dc61a8123134da37d49ad7768c0c6f8b5e55736e85eeda9fc7f3a6e6823a6fd20c50d02505be87fbed6ccd574b933e412fce7ee3cd861376088791c1083eda4e2c591ff46929bf88335f6a0024c01b6697d0155fc2e67fd1d8941b019c88c7965ae187493ebedd0a31d65ccd4b604bfe9bb9eaa59c6ea635a425bc2dd006418d0418b825b9f3c28bbd7bc8897a48d196874463d83885992b3a4a9bd8a1fea53e61956e4ecc3b6d9070cc130c4e78cc75d5b47d3ee04956afaa00b342f8274b8235a37db7d8da22683e0d0bffcaaee4e751b7bc22298bb5d7dba0d0123891ffe110430b7a29ebf1b4712ee283b62b19d48d797375604fc42e04df31b9cf5054cd44fc72d5b0fa7528236cb00d1c696387ca6455279677b340484341b25148c4a99826cc38de8df666a86614d3c2a2b670ba8d918f4ba24bdfe961e52a8fa47e88ae0d8ce605d2d701eb93eab2204e6ca775c09db93979e78d80c14d8bf9174184e580713e2b04043b20c6210ba1a16d1ce167e3321e444f95348de086040f4a8ab73db8b2519f5262714f1e5908c3729ffea115578193a6536a2bd197dcfc117e724902b404686e3919d04bb1a0ee3170991b852b65a09ddce059698ac6f520d3776b41828df8bc65124f96b6cc59adb5928761904c945163d218904621a6ed09e2a6469583e6b0a5079f584ae2b88a14ad6042777f46a0362cf3746f9ff0a80e736b321af54c073f1cc53960a6334422ec21e9c9f70c7aacb6ef6a6d19c9102336397e98d4bca5451f1c7b414d61ef122b3b589788ca3e5b7b4f54a1427fc58afb4328aaa9e7fa36d95f539aaaacdec8095bc36f773eeb36f87fd113b455f8f6589389b4ed161f462dcfed4a44992ac968307e91be21e4297940db16c287d8a84156d7242c6393c8eeca7df85d56d304764fd533f62bfe0382ad13385b856a32e028b474a84c29679f703bd6fd81147c4034cccdcc5b453da22c094040db7887a7ac7eb3f804fbce91013ff640c02d5fe24b2eee20a847e2505e62d8fa6f0824aec1ef4a1ecfd1fe08d5d646d1d311ed64f8fdb310a450e651951131d0c73079fcb459d5abb6909c8aa82282ee1b9d85ee38c350c20e9a8ed9979e2bc57d4c34779e4ac813c2f2a4482308910741169d90ded6cb82a40fae99f6ee958512f55e4d8379d0001211d045c60e20cdb87e3113b0909b87ac2c6ce593fef8e8f8116554f30889882c930e7c80b2455f9e8c7c923c927a74a78e810d2114239181e36baeb0909f4b8d8a4dcedf341cd124ea83d84fc4f14708e5b8eddf14adf8536943b9033e91fe07b72a08ad253e175724c7715406e86910a8018a0943ad83d12d6cf2e6c5f6e618ddc9e09efcc542fc09facf97ec1f412e4ac4668d3c49776b090d36f02d6e8d1177e33c69b1300e76528a3c6345e2fa5e1191f6851baa1910605183e108aa5cde7888f804b80f62d9dca1bd01c064ff38f30b357f9d51d8b7e3bbd2f0e691cec98da58bfd94636b17c927399dbc21d86787c750fbdd4ec130f359f1d301440d638c155b287e74d7641ba6c898762fc257f7408458a3ab4be139b655e700f3fed9ebc6cfa158ed8fb93dc4be874bdf79ea752768f1a85863943af956c0bf319089b3ad58db6ebdbd568c9b5daf29966c3a70ac839ced3d055ee4aa18684b8e7990513665357051b7413dadcf5a319e79556ef44968c0db41021573a1a2de4005bfc7ea308f808173e53a5bb24392cd7a6e57b19a7b4a4e528edf82fda92a20dfdd3dd5178f383986c9d23245613216d647802e65cd7e379be1525e9475ea5fa91bb9c2ca00c533e979ca080d6c0593b55ad2721d86fba3605c9e894357f7064f9029df684911149fbf1dbb82179e9459a550b7e79c2297779ff7126676adee16d1fb0bfd7ef7f9901580c43b85423efb1eda8f27e9ebde99a494301934fa6754b6e27529c46395e9939568510d2be463c93323bc9a8e308ecedf443426007f836a50289166ca0b881908a165310d0e67018d5313c277d31bf8a44f59c7806880e45f5a218a106baf7f25edc953302965b8544ffbd08107743ea03140c2be545142cf1f8c61ebd836423fecdc35003b0984fff0691b02b15a8d7f6336739194dc9f4681142d97adb2b268b34ac950a888cd006665d31f2f35a264f5d7b92f949d20781331621b99a507ba7e0133b2b867df4f334b026ee981d508d030c7fefa498c4794015c3453e78e3017857c074f3671f5254951344961d80ff4f44ff6e7608eacabc8a9108b4f976bcc2f88f0ff85f0d0f0de86db3040cb633a2e70b246484bbecd8f61c8355f1f53db7fab72eaf7d3734b29ec55282b15d5bcd2631d86be95e2e7257f4ef0973e9cb2cdb41af1a9b6070a0792a43cbbd877eac8d6fbffbab7d4b919cccc2605347122d58a0798e2055af0836896d3f1702375465217b99a9b8dfdef4fd03c5832eb0490a4e8362f97284e74851a6b32a3982314463b44ee6e7b07d6184cb24d2a350e698f3c58e1114fea56580e0e541d4b41d8371390d23f6337563280516c497b205d6169214f5dcc87ddb465b526f36da3aa0c3fea23a742b5682217fab008b0de8717f7a851823bbe30fb5968e8d3e82e2487dac505952948c533512702a296817f751015e83001958382b2d4ca0c63efb808d10bf059552367a8649e67e9d2ac8b8f74a34414a73149611c049063ea2d7ddedd923c3daa1e4503e6c4d0d1db6226d32de152657386fc69fb67802e3deae9afdfc460f10f05895f58d2bf6581a580ad7ee31d3217521900c24d29255db1a21759884e847396ddc0f76e0334d50050f7492d78b695c8a6fa3eeccaf50ff41b94763467a97c5f53cbf91ccda3613ed767a60206a733a9f7c13cc93b703076513dc8f53cc7ff8de5f7a27a19e9195db178d551b58268f860fef0138cec1fc7472182814d02773d8ab03df13948251381288dcfb4a1c28f958129023d9218673d7c81d93fa61edea50f9d3ef81ab134e5e2c48a1a9944e2a049b6d09c53ca0c18d41a319f9671b4d2bd08b24c2c6385a9e96ea48e9c0070b71b04f779c6fcf9f514b48e2fe78fde432d8715b60d2cab602358c675352e4031c499498e9176a6b8ed91a601c780f441012214b65f3ef9e1e0128ecfddf47e696ae0ebf8279e430612c40d609520d90f5fbd3f22a5853f76b8ab06cf6c48eea46e5ea60698a0a05506ee8b127d0f7745803a547cd67fc70d12e3b3d5282b3b9719dc9d442fe9293cbc56088abf519acbfdacda20d75f86f2f87c6d7ebe5e492483cc3c8c417c3463b888fc9397105a52402f1bfb86bd6506fc788a8a53bb76e473caa98a71a6359bdbd4ac5dc9e534a9a575a79a58b63c18c2241d30a2cbac157ce9c460aa7a66e3e154022dd6261b79d0636278c4716282ad4e2b801902de31b22b3a17dcfa44f320394985736c8d57d7d90739d7852d5754dedc105cd5e980034b0a1b2ee323d34107d52104202aaba8fc1d094d8e52c097c3661862f4e8e19e13f36a5c47bdf9b30691f697e6a5639a15348676024bc752cac3f354053bdb8fb27bf4d36e307485052bdf40c01e8104e","title":"239. 滑动窗口最大值","link":"https://leetcode-cn.com/problems/sliding-window-maximum/","question_id":239,"issue_number":31},"29":{"day":29,"pres":["图"],"tags":["图"],"whys":null,"difficulty":"- 简单","description":"```\n在一个小镇里,按从 1 到 n 为 n 个人进行编号。传言称,这些人中有一个是小镇上的秘密法官。\n\n如果小镇的法官真的存在,那么:\n\n小镇的法官不相信任何人。\n每个人(除了小镇法官外)都信任小镇的法官。\n只有一个人同时满足条件 1 和条件 2 。\n\n给定数组 trust,该数组由信任对 trust[i] = [a, b] 组成,表示编号为 a 的人信任编号为 b 的人。\n\n如果小镇存在秘密法官并且可以确定他的身份,请返回该法官的编号。否则,返回 -1。\n\n \n\n示例 1:\n\n输入:n = 2, trust = [[1,2]]\n输出:2\n\n\n示例 2:\n\n输入:n = 3, trust = [[1,3],[2,3]]\n输出:3\n\n\n示例 3:\n\n输入:n = 3, trust = [[1,3],[2,3],[3,1]]\n输出:-1\n\n\n示例 4:\n\n输入:n = 3, trust = [[1,2],[2,3]]\n输出:-1\n\n\n示例 5:\n\n输入:n = 4, trust = [[1,3],[1,4],[2,3],[2,4],[4,3]]\n输出:3\n\n \n\n提示:\n\n1 <= n <= 1000\n0 <= trust.length <= 104\ntrust[i].length == 2\ntrust[i] 互不相同\ntrust[i][0] != trust[i][1]\n1 <= trust[i][0], trust[i][1] <= n\n```","content":"096221cf5b628be1e73e8bcfe626c7347c8e248a04fb2cab0a66692577330f1937ff9e4625dd8f5c367421d103e7bd46ab345588da2612d4a92ff52ab5a7fe2fbe3d6568d4c4d3fc0b2fc7a89ad25b7639e030929ca4418a3bae2b83edb6a88a5c6da56322f6dba7ebc9808464572752f6099443514af3c014624e43f731fa24ae99477d52003c5112c541fc14f06bde47175483d6f18333a0f284f368e6ad01dafdb34b36ec8f727f0c7486c05e740115d88bf9285e1f05f303ac3c79934c340dd84e970059b40ef0e22f37dd202838ff07a3374b4bcfbb45289680680718c3aeccb501faa04d83fd2c3af5aec087c63d0a7fd38ac14988a8248e0d303338a8e06488a98a9844a84574640ec7435a47e1d8960cfd258247a1d3cf1e81846fbd5038c38550bf0b4d4596551836f72b5c89ca252a9dfd7dcc9d7febe3428879bb1151be97131d507c85a86bfe278648e7abfd9eb896b2df4abd27f3973400749dd7c59a069fde2ef43113436a145befcc13caca29a3420e330567b96b87a9ae02799b31465e40daed6957c44ac6b0632fd84b3b95c68711e5a32d58d9322d44068fba4241513fb632d5f63e1899e316d06fa5fad1ab48f2007e31ef60ca08c6850bfffefc914f8c111e8b6a0a720715319b06b03f438b9beaf87ecc95543e2c8778bc23265ac2c840d5958d2a2e87bb5a5f2974cd3201a0535bf56ff55f43abbc81221b0722a71aa604ee16d7fd8ad644629ab190f6690eed288b020ee2c2d89e7aef97e2d3ee849e3c5078cc96ede72144ebbd9754f10ccad23d791a2044e35d647950cd839e9ed1371c1a1d66e52c587af65ee04c0e9622c0c54f6284c343009ee90f01a3fda28ff7e8a92aa1f0435df6a7bed7a6b2e2976c2f8b7b1150785f15401991cc0fafdbbc651670fd53c9d2d6741d2dec77a759a449a5c317a8f8cd61f0582cd41e521ab7ace126abcc2a04f0b89de1767b45a3942cb308a604e68cd1197fb64b698c5792e25f60d1a8222512c081f0ca0294e60d58c8f83032ae0714922ee51a021880f6575a3e54972af400dc8e77a2266395ab9bea275a4b6b895a1416bad90883ee10b11625d544eaea1414442f8f0392917b035841f5af13a0a357c19904149312f859cb7ed18d73d7abe9df96460e31470391890ce4a86d765549074b5ce7a713bfeda3286342cc22c9dbc7f58a695f8e2487e1658200936a7f356f38354864c421a787c2b8ec748994b58e82d8123382967bba32e927e46c18fd81a7175f2ed0e26ca1f88a24f3d3582f1c42da8ad534260f75624f0d4f5d65a11477988773f038ed9fb581119aa3dd42d604f50b726e7cfd30d07b2acced62151fbbc4758143541dd0bfa59d8d2f493a4dd383616e2f444f853390960f8c23722366db1b2b5c5c7ef2882b22a97b00ad251c61d68eb53637f3d924781c3f83e7f19e4420d027d0684192864164c046275c5f8804170275d0098e3d56a5958c6ec2c333c1a7006cb88820768ecda1a93114301c121a0e9c21d2f0a6b17f55c00ba8878943788360d88e5a7502da079cd08aea7ca8b5941cf9ff334934b1d1b2c3f1159a9f03431a12c36b970db5a40eff87971d8a8127ffd8ecbe651550a818e3a2d78dfd474c7f448b15541685b38e319462c324163f3e998c6ae1d76feae6b0b3a2818f0874fc0e443ce397e7b1392206c4e215471c590996c5b21b202e80b8fa815b3ba2ead2c78b9b0ece5d241ceb5b7274b3339681ae19d9f22cc2aeac6ef408b0fdd8e2e8a5d0a5da843cb20849cec9f388653b12b63346653f9c761a841741e4cf6408e1e77ed79faa5972e9636d623d57c789f5a27c235308205c06396c875265b22df50c0e83ae3d44746532677323984113e4d274d19be513a6d545bc8dfcfbe6d4f1d9ac16ebafc0ff66d62fb47fdb3faf1e78fd8c85919b866068c77da3b8bb71b5cca94b8ef75061a119bf7f09e3633dd674fc99e61574993776c7bde49a8d07fa55bc0886289e9c3e57b680f6dccc25448fc214f47ee4579a5c720ff28e8a381de53ae8b3c81ae2b1d87bd99843e25dcfb874f2a0f57609f3140c2472b84dd3c60d2bb308981eed20523499634182f7d1a9c1ec240c05a55023a9ea4b6b1410c8c5586fa44be2efd4f71c510002f53a65d2a8981abd0435be9be4f4c2ab45b766edd46c3572d200548a57aa9f5b60e3c005f4794dbc7896e7fec8983a4b4aa0e512bd45c55647249a0f1f2a1182d823003fe732abc4a5769176926ca604a9e68edf9fecc34761369480011d1888795e08ffb61ed8947eaeb2edce38ec6788fe0df3b0559dae5ac79f7c2939dced9480828c284085277ff3ca61f1539373920efa956d21269e69ce0d3fbd23262918d67bd80f90aa8e62b72cb06aad02eb8b5ac88bf6e5f4afe87eb278692549df122febdfdad3eb2bae07aaec809309f5b77d78e48d1510317c9b4bb10a3ca89193cefd349e5511d3af3398e6767b9174215150d7a6593370ea57a6a3aff399730311821ed9e0bc31db32cf0906712ca190365f9e53006a4fa7bc50c023400cbbf1b75c9d853a9bb1d6f44d9d1c5814c6a7a22bbc5258efdcb6e503504172f01faf001751b85df952972404ff4910f83be69310391d0c0bc355350a08fd24d6f027f03c7573ac0302ee19aa4f74b3c8520cf2ea8732b3cb34e57cdbfdcef8c6dc8df023e4f4e8e5600080720b4035777af8414e2d0f2a68b1a8f4aa162373f66f86dcd86e0464ca751748367512ca6024b4dad27075346caad74aedd83d138283cd5fca3db7b6d4e5a3d2f2d255703775f96de2991d0b70b780e99693e3ce04805a61f4f2787e7c65a41aeee21b10204000364999a5b0745cede1fd790ce375b163dac13881ea82ff0519c6c0bd788ff73743f0258a23b77f8478fab5b9541b967801150dee13c0277a52bf72bc92af9752b449777cdf4406c767c35a88c70b24780c90f0d4546589e48e921ed83219581b3febe0dc829ad25d2a7834fd276dfd0f9b0d37f2b9fd66a5c2d5f88f8be0b8d6ca99c92051b0469157a9674d9dba8c14644253541004ec1c45a7cf92ed6573991ecc8a5aa46fce32e03b2aad4602c352ca55978eaf70c185df84765555ec56359c4022f944e45ef62046f4e8947307265b410d511e222c09e508b21acfb7878eb0028b5ba28e80621d0623f0f071cbbfd34ec577c01a86d5476e0942ed3996477eda6bff4a7f3a00a86855a41c0b7a9ace212da903cf177fd3eda5fee2a7c72d3ad6e2b029fa7606ad95f9d99d59ef461745747708b491065d8f487e871220d84482946e9052189cc08c9e87609f02f73b7df4f55580083c175be81a54421500f7a0900aa4887245583c5d3f7e944ec49c03fc54f786d1f2726c9301a0061bce1200043d3e84dd4a84cc0fac292e2a57c5669de0651a7737dc2545e1fde62bfcada181180ea42dc6f2a7ccaae04a3bae9421ccc33753a0031846245dee5cd0efbea31644f1cb9cd20afbe0d863215d677e15922da1eb68c591207baecdc72b5412a575a8a582d9a5c9d96465149f58b4fddabed531310b9bf525cf80035a71a33cac97e1b94a3a22ce5a1de0a2785cad6b75130223495adea0d21744fcfa7d07834571d24df2746b8b99226ed59ccf9ce7a7a5ef9c6da4a46b0b30204152476c04972c61dd3a3e15662591d898b74a9c2adf7703b123332cd98033d296e66357602aa7ccd71d15d2ec219a729f841dcc470271c655870cefc26295ff2024b5fce047b6c73bbe95c9330986be61f2a3b5bf42ff248fb240e2c8ab62c6e053073a22331c1681be4c4bf2096334303880b71fa157dad4a8c4dfb5a9a26381090ccc88e1b965fc07fec334bdeddd757f811c371c055d17435a2ea54dcdd7d074b595764e86912d390e032b5d6f7b8148afdfb56082872f130f73c4a6e8b9c3b18892a943ae1236284e0071f3d42c7810388d79e100a6973f37fd361c9162293b1ad01095f98e916fae29c8b474ddbc6f5126685d9f82de5ed9253f192db08916df1aa22220916b9f99f3ca644a8d3a37a82117fac298659dbd2238c40ecf8db5a32abe86ca85708a82680b1924fc35e46597359da0e95170704bc3934d56cd3df70f3c4a147b52666c8af2c8fbb6c3ecc89e2968f82549e0cb129e5b7d3e84c22ee9ea11788515938f29f313509eb4f0ecc7fe811e2e3124992503f04dc404b22932fe2d20ff850b1375d0c4d6defec09acc682a0e0f7495337905d751690448526ae6b3d29dad01be28d4fb71b13f119d2e2efa889de6779562caf1350a5b490ca018089ab8b2afe714efce1d16be675c2beeb0c737c66ef16ffe57b445ade53972837d6dc395b218882992ab26161a7e16149bf14cc0b8a695e1a7d8c8a9556010c61dfa2ae3debe28cd4910b1feb55779967f1602a312652b645d25191b7156b8f5ad98df762fb6db2a93013a8dfe0e8d887c7bfae7a6ffc1dcb74939b6feea4c422872dbe1bf40680870927f858cd730ad4f7dbe05a1f4786f3c79876288e4983bf5f74ba0eb99e8fcaa5eba2f8671cd07bf6b8855c180b43814112abafb9123f4f3bf8c30a5ab94367d43158017d730f1eaaa953e42b2d5b78a9a105950ef496c39bb14f60e6b7edcbbd1e1c42773e88e40ededee1bc63e1da4ac261213008e595b8f415b844075e9be3139d3c55bfa272af33dd8311b0cf39d311f3768501c9a0114c5f121608679c549cdd8d489f82814248ae87b3100c0ea20d84c582f18a02f1cc57ceb1ab37ab14d22e6378fb84260877017b6803bb92bc5d51ae7746691c13c3208926279228f3c18d2bfbcff9920b0f529a351e8c30cd5d67dcdb895cb9b50cc5d7a1f4de0f4f31b3bf1bdce2a4d8910c65b6c7a6d5e06c69e1a0111a285775f2c5135acce4bd7e88a7bf1919dced59136bbff20f127588fb6260a4f726e3b0c3a06c632355337b9fe1b75b54642cb5d9cbeabded56c39e99104c3d1713f16e4dbdf7574538c1c6bc9c02e69de3a0d301c307c10245364ff997cf38e2613dd040c859d968894b36c95aa6e2a3c3d9e605a6cb46cebe781af28de128e180b8579efb2229d81c0158cb49e5a19552ed674563d547d670947e2780ab93bd6592e104cada385975a7c276d3fc53239609ed20ffa9f30dcee660bb2213d0c4563537b4d7978d195d00ca958aa2057d82dd4ef7a82dad7dcbfc90f1cf5cc86c611547fc2ebf5e52068de83544fff5943528c9308a179be0f38c4cecd02d84a2b6dfb2de1f45faf39d5907c2d8c8a80e7b5dfad031e00ea099ddc9ab6117013baac473f903dc0b3c1e2c0c6d5affd986c4d6f751b8764cd850193080c88c447530dad43dd8ba4adf14b808b873f21519e0fb16667b84f1cffb7a06b93ada07e87356adfb0810a8cd51c5993821ca0c36c465ee1be95712e6077740284ab7d1a991845e84c31eabeab20ed768001bb025b83ecc93a30bc914db1a6b222f171134224f864abceefe305f65f077ba7601211ee712e3a60ecfc2788636c19f1adf281d3a0ef25102f6b19a917d6ff666c6b1bfc32554f2184f57f9568d3c21c5813f0f509abcda616b1359f24633c433808c0806491e6c8abd0591f475cd8e71a24e37c59d5cd43b3858c2e30d51336d9f4db80927bd9cb28f6dc223db5d502cb02f028e403968c9d3f5b047874216bf971a6b52770b1615522bc5526373dc6439c979fcab1af3a8cfa54c765a5dc1b4d2df59ca2c33c0372345cc054fa8ac8445d405b2a4a14f19f117a87d55af881b958633e881c5e76ccbc34dff6d34e1b4aa846d61dd015fdfe136edbf7e09f052e87cec1ead11244a0dcb991368a6e4756aba1529597fade59b3687749e2860b03232459dca2d3c92e910a9da827ef3c7c142ae8b5c69f250313205c2d79198bac74921c628a3c53956e6567c850401276ba1b10f1d4d9fa2e2e45064b337a061d00dec12e9be4fd38710888e84cd14315416293c1e3a5c45fc518cbbd8c7e8d671d1dc017260465ae1fd74e8a104bd17f55e73a9ada5b6f2e04c5ea649e70aa3e62a16a7fee2cc84b91ce52d120003c253333512b27a759e071a71ea83b3c7b398f2438d94d0a87009e95ea39235bffdb93f39ab103f223bea7e344d93c993ab876622f64e3a9d9959f3ae226cfbf0191425ff1e1369f0bd5e5f6796e5e79b05d7c468e244bb64df2dd2efd5903f52aa2d20b1f6ca3848fa0bb2723a3d667f938e39a962467b4c1fd244b6ce1b1c6e233aef8bf3241be60654d4845bf647884b04fe95887419b05ac52a50119941f558ef8acb8bfcbf551a1b701abf22bd429ab4159a18544cb087d56d965d843fa7605708a530dba720948274e0e4832a16f702ab085b0ccc579bf5751f11d9b79703379b724060873c354daed4d1f202e5e4a93ed1d4605bb354c7098e62da42d9e310e36118a114b4b7cb3825c217433bfb2e7b365fca33172931e87008fff67281fef44cd51c50b521f96b31466efd875abe16df60565706825d19e01726ca2ca8a38832877311ced05c3c984055035489b61db3be778a3b2fa957aeca1e02c77e441b846e8157dd7c3a9473b417f9acd485bd4bcdaac6efa95bdf860f58fdf20c371e2e6588495feb8cbefd40070b803093de39acb6f0f8ffbf635f9726b7d00c0843c820ee5a3616eac5682e3ba9849a1105f2ac397b8bc069e4865fc684b1dfd9bc196c3ad3844621984dadb3c234c837ab7817a82afdf0c9ade0dc82fc122ba4f2cf362d8659def46b17abde8688131f348a38bbcb1e9bb4fc56527c0e1e0715fd647aae900b4b545c91fdce3585746ed28eb63118d97f12fd2de27dcdb3af9cdf7d9a9fa76d95f866db3080bce0d03e1fc3a3210cbc1bfcd85a476a284b2e3aa09df8867421f6fbbbc308ae9ff57bec3d3f9a9557b0ae4cbeba512e37995735835503e575b3377525c49e6b3f44817b5ed512adc67e3fc628fda51dabba0826fdbba6a50ff0744b79be02f60d970079e091fc3125dae2b33a715768ac086f5e1af094d0ff0da8c90e8b13f89cfa957eaa070c670472617e4c375aaff72fa8778f7ec1a5b01517cea954df2f5f0e68625a8a81321ff8a281a9c1f05e342d04cb68c226214bb8e35df9148403f3f0037c6ee409af52f8b3ecef4db6ccca091067ffd49e51b8cd6a36e282e836f510a6d7d2ab01a9ec66415e5597821119a733fd4c4ef7453558fad6fd6ce8b3b304350fd1680bcfa9f2bc1460c517ac8e3f5a9ff5a2061f331008024e940a9dbe8284b54ef680c041a604cad00cb6ad612d884a3dbb060e3d073d7ef04065f527089cbc82e78bd2e09fac2edb73ac0c9e918743934021b71049f273c68585515086f664e8ae8e7b4e10dbd0c52be3150108dd3adc932181880a4638b00bfbe79b6cf187433fc15978300d932d423e4c1a517f013f8a05d810dd7e1bb4d653e32ce66fd806bf3bb69bf58c7faef574e92441e047a567abe616811d8cfc4daf339321cef0340a12b0478786fceec080c81ffe793e9b8c3350a6358fc1c8568729d8b090051e410638612ea1ab3647a4ddb02bc69b5221949c3eae8c59cf8a98ef59cda51f4ab534b96d7fd2e50cc8bad0fb48844ddcfc471c042e4100c9c9f64e819b0de17d93db19df97527cfee5edc3ba2c0600dde134204462b6ac9493b8e283073a5ad8404c4f3603033f074c93032b4fb4544a7aea733486dc3ecfc1c2fff68614dbcf5cc6ae6b8e992821ce1eec0deec6aef1a799ff1a3a400967ff9c49f82816abb3ea3ecefba0a8fe2add845a3dcad98fbf31283397e8b39f4d39f657579b3d0e6f4fbe3285a132c1139bee9d8237951d774dd03642b2799314983638fb3f9e6b6cc557c3f3f8e9f5d8b656bd37ba1ad7fb6cfa9002494cfc4885058edfff1eab23b26c14c7a73e1efb5a64c35f034632f8a07f4bdecaec6b94962734370249615a40392c60415d3af7b9e0068a831b3c08cffde1448548173c7334354afce53a088f7f46f97f87e0822ced76f366a12da85ca09297835eae38ad9ab350ae37ec42a2ba8172837b82817a278be2da1745f14fa417f27520e9e24a02fd89d1cdb6b9ff4f543b74f8eebef09734a51c4124e7dbafa54641eb76bdd725a7cb1d9eb78297f3642118624497f1d4916e2b15dbd0d51a29918f9bad81a2becb2489e1b0155b77cd3201fef1d8d57dacf6590fbcac23bf8f34e76ac726ff37d7cbb727e587f1e20d8149aa515a12832926d4c704de40fcbba8498b6bc36bc2a3c8a50e60ddabc6d97e58cf2b30947631e3353391dfe6acae0c4c30cccd3eb34c3c8e4ad7201579591d8547f4f6a130d13ef3dba52812925be8deb2099d0e1288f4216bd2c40d10dbaf46bf8a3269c7a83","title":"997. 找到小镇的法官","link":"https://leetcode-cn.com/problems/find-the-town-judge/","question_id":1039,"issue_number":32},"30":{"day":30,"pres":["图的遍历","DFS"],"tags":["图"],"whys":null,"difficulty":"- 中等","description":"```\n给定一组 N 人(编号为 1, 2, ..., N), 我们想把每个人分进任意大小的两组。\n\n每个人都可能不喜欢其他人,那么他们不应该属于同一组。\n\n形式上,如果 dislikes[i] = [a, b],表示不允许将编号为 a 和 b 的人归入同一组。\n\n当可以用这种方法将每个人分进两组时,返回 true;否则返回 false。\n\n \n\n示例 1:\n\n输入:N = 4, dislikes = [[1,2],[1,3],[2,4]]\n输出:true\n解释:group1 [1,4], group2 [2,3]\n示例 2:\n\n输入:N = 3, dislikes = [[1,2],[1,3],[2,3]]\n输出:false\n示例 3:\n\n输入:N = 5, dislikes = [[1,2],[2,3],[3,4],[4,5],[1,5]]\n输出:false\n \n\n提示:\n\n1 <= N <= 2000\n0 <= dislikes.length <= 10000\ndislikes[i].length == 2\n1 <= dislikes[i][j] <= N\ndislikes[i][0] < dislikes[i][1]\n对于dislikes[i] == dislikes[j] 不存在 i != j\n\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f2b9c123385f0604131437a5b7c0854a288274be8fc0a0d03b4520385a146af371c9dda651bd4b838f921b4efb022fe70696a969bd1e10621cea0848e126f38f76e8f96ad09d336b035cff5b7a599502dc1460bdfd86d69b8c5872d2a063b9139ccf6eb2099c07ee7d80ca8109f6e8cd71a4d3a522d145b0c0fb34cc637bd727b08b160252c61ccfa1e5fe833399bc8bfb381a06847e88b0b7794c743742409a8e6e77b063361940cea5e5bf5041c598f58ff525cc862cc917416837f2b739d14cf77542e9b8c08548acb35137091bfa8d13b7a4d31a8956f1abae5fcdb9c2b5234c4c6a9483f4679a56a403142e1f20ee48ae9c448c8197d1e57e5323f789a86846ca31efe19919f982fe8d779f61b24aedb72c1bbc945b656151bf02b7d89cf163d725900958717b0f71ed44cf54966e0d52c6e2a5a1f2f820f41098c0d3c1e5d010c3510ad54e24a518d554ef48febdb74bc8279d959585e0e5863b8952aa5ae28d11820605a64e6fb6960de171221d7800a4fbba74b0ea1755eb06920db473e95c68712e68d2a62e1ddb72d5d8be92b55146ca566a7c37743bbb2916ca9d6d1bbfe40b654436160dd0e53ece3bb4ffccf8e429d101ca67e0a72073106599b79c0dfdbb3838b4f4907b3fbaed340c052071898e13d8691fc600c39ef4e4b3673f3b8dc0264716caed375c652c4c57b2ba3f5c036d3b26816c8c688f75b6a9abd3b59e3ca61be8b074776343511a526536052516414f7deb305426b2faaa3e784859f5fd573626f240947c953577e61c2216a1e24b6792a747f4192755eb563960dd990309f427c9e9130069dc41524ebd60c09741861520263e0e43d07c6116ba29ec05236602aa57128797f4c38e6863809a71d1377a983af01dd023911d3b9910bd06ee44e867e70de0b0304b25b9ba305abe766eca49a813c12751e14d3fb50b37ba8e08a72e93d0d1738dff7897f541d44fa37b2a80c4605e63f3807de8db4d7038dfc121d86f85649c47017e341b2dee7b94942b099d9fd8914a326601ee173c5c4eea85863e00d4b6b895a1414a5d90883e651e04573f3a63e926b81bf9f55877325f6b56116e8d41db1b044bcafd18a32c74fd32ef26b8244fdc5670840cbdbdf141e1250f889d6ede8fa91a2df836b0d4d95b4ea68230bd335cff3da88992561bb72dfba18936681744659635f3b4431f00fc106174e7aa85a26527ef2c92404a83fd564bf24c0ad33923240c440eca01e27d524735fcdf19a0e6a5c3593a3fc700871b0f0d6b2aee22dfa3a37aade3ab03ed9c87d02bf5f400ede06f7b35f0b3f1c47b48e2719a260cf1f3f89ee1649dcfad83f1040417721630d4ec48fa493d0d6815ff43213bc7894541a16d7a581ce8fb95a3a98837fa8aafc3a1011cdf1e40838e3a49fd27366bdbc7c2e86bcaf8f64688911af6b6bd5682542436db2a0289b598455adffc1bf9370c21786547e8ad57f249bb16e0eded0681ab8c3f098f272e47573693cc38576e5324d63d39b6ad47771d6b9fd4bdf0d081355aa1847ec63a9a848c5ec3dd087e91fa73a587e617d64d8c1e975e3f45a426e57ae0d730dd40d7353f1f88c38fb0a1b341645d6c3b8e232dcb7ca196262897dbd70b3e8f6985e16a00b44930e527c2c16032bd1ec12ecacf06505427abc830acce21774345b0d8dcb9410c285217f859e0a8d24214e7e898216cf6835f37ac8b50bac68391c658d56f836fe6bff4a5de62455d6cde5a5d3b637149b798731a4d096ec517c6a96553448bc72e3ba86336be6f16c04ecf07ed79fa9577ce64c5b621d6aceabfda87c23967e072f7a2f09ff4f38e60a914f200d4185d9b12d2f2e1404c6dda02c4e1dad81ac6d8464a9110b3b82cfa081dbe68e6da0cad564e326b951dc3894399747e2e0adf2e7640b9869e6e0b81cd6faf7178fbf0e5ecc63a52f53e5014fd031a69db24c79ce6b669bfbefcee239b40d8d5ddf3fc7e01035d09bab8ecf4e39a58872f6108f69c327634b8da1ed5f1dbb46defd9510b2ccc72e85920b9c55a4e96c90d2d13d42cb7f54122ce340b4832a57c900cb4ffa6a033ce4106dd5b3cee0abc656503dfbc2a3a0e7456b0008c8c5756e9944e3edfffd36450026c13b5ae8a99a16b52238bca0db312a3e872bdb28aa75653bce7c0e940bd78a1b18ffad73ed0a33873ef3dfb0a7a8553852ff55b372f49c254178fe38594d0c213b5c1c6cae07ddbbb83dcc79d111b346fdc3f08cadab92793c7a94cf732661d1730869f2dc47f6d3078aed8de165b376ea8d1a8ec057f3d75ea0e26d5e5cf86578e093e56f78f9796db291400995ff5dd751edc9d7c7e2cc4481512fe059147e64db338725fdf6bb04c91ef600a66a8aba0bb58da6472e698353e50e617a36e84eb22b1a81c68071be6bd4dcf7d613aad05010b6a35f68081cdb67fd6b01fbc0aab88d10d43527b1c9382c0b0a77e60835d79da68bdce7eaa412b6fe2b275de4b1c7394384eed56cd94bae1f412436cd4ce50cc21041e8f5463ab111e0affa361b485798873a9bb1104cfc90136a17db94ab2587d5e48287ad935f70d9f4687aeb3e6c13ae1a816cf196a379b5f96cfa6c55adb8d997a50ad4e49feb346c94ede223d7ac8f3acea01919ad00e1092594f9152f65c23512e8228e7e49467b02452536ae6032193cf4a870ba908efdb8953eac99b9f9c7e54c74e48ad384e933f5001840f4042aca3f4518a9a1c54ec5ac715129cfafae61bacc3d2a7f99c50a1a0eff68179d7e4b5c6a755e53af80a3a60eeb7a39d89c85085c765c277a7488119ee87e75bf9393c11fa53e069ce1fc8bccd7c178013d8d9b7b1b79b3b82dbf60be5627b312395434dbc4d3dda56181ac67cb65a365419d16d849a8e88cdbcf0d3a7c05424cc242d49035d4e532e3c1b22fdb700be3658e9da60af327cace4688a0c5e1f79b0a79d7bbae365ad2300b5a183ccbe2e7ad99c158e7e95f61c22346d3648dd01b395830d3f47b7f4566587b3e4a453ba30d992ecc5fc70a69d3dd865a1c7501382747ba330cfed1fb93422fd1008ce674e132e3789e3a43db64729e4e6816918c9f66d70d116df68b8a54d843d8477cb8449918da4322d16414f17859500fa89389f7ff9d2e9274e8150d73633ef06ccb5157e335dfddc87814a04a290e00cc0a0cca48458da7d5f872a604a2ea0a97348ca7acb772e4f87cca85f91724c2ed02bfce1d57d1c3b9faf68d22bc803a6638ed72dd089198f8dd9e95480e624d091815fdcd39ee42d8d787577245965e532fafcbd5caf3efc28601248d3e91f53e41c955925a507b9e5a55c4da4be5c2ce38c533fe88e8b2b197e7954bc09e32c69a6642168265ed4755a7aa4801462d81eb7582b439baa453b942543b1c5dd694c148cf2305b9b6d3e0e7f0ee062da0b112018d0ac5cbb208745a483d829605c8ce247fad3527858b338841a590a6c55c5b908a84b072f0765cc35c077607468698268c52acf7043deee2abb3b5d5f96bc3fc898bffea9bfce4d23901edf12178ae22506ba8b478d8c29bf1a7385bc4a84771e5445af60568e1ed1c75de014bb38cf692db0b7645fd8e38a44a6c389ee228b772a8941d47e26302facdf58797cf740d6aae9b7a8de2f31717c8a1f815d08565aa6b4a74881a461b7ec1c871d0345ebf476c3a4007c62a2c35b4d392cddeb569f1ff16b50ac7fc384249c32c596975b016a0eefc7b95ea382797c0e17099c0039694d50b00a4ae62f09fbb8c5ef0208fb05bc3cb8a4ac9dd7107243a330f0e4628f94bf20981818af227de7f9d11aac1eaa3ee394434c74488659993abe958816edb9a67a9a9b14b22df03a9c1566d723d777ae167848ce019e8aa2318b7cf55076b7110210359e81481abc357cbe52547505d48454e1704eeb7117fcd25121d5e0785bf3959aa8898cb7fb705f53d5bd65dab6d04d0656abdc57225acd981b674a12f979909978f671c494e50f50a29b21ce8d695f72367fe0c8a70f7a60ce339781b48c4c463e0ed27ede26b1a6ae33822a6ef3c99073b0277ea2e7a250f91166decbdddbc5cb63a8758ef782b2b99e38ab04203b3d62ef43f94d783bc89c996921b545414327528503eeef35ca39b334aff60c1a7cf41649092bc2d34dc5058418b3fa8d55236602a7b5e44ae80f8c851b7ee35ce3fff31c5ac2685cb294f8bdfe66d6f7e7337743e21d28ec994d0539bc887038facd5d59ab7523f2723f907b92ec522fb13153b548cad333f132ff52dec3e2ab4ea8fd2fd6ba6f66f7c231c2283670a80a37bcfd8ed583d05977ae53c9644bc7ec66425b9a164c9c8654d1d8f67ad246fbeb6dde5b290741e89383a20475edfb387955925408d589a7aa699d2299f3744e1adaf5876c6715f52ea51223b2d44642b4c2406b9a1e6a9c64c2681ecef73bffe344aca546cf7e719745a3141027cdeeb6142389e8581e7dbb2ea26275a2392b70b1c12ad188be718c00952edb1cce84aad4e0c3df4695b8e2f725d7200298540b950d1048e1f85528f442c3c38021c2b89d19221eff1918d31b09497174f4a27a916e43efdffa7950b56b1f4a5899e2c9cb43ac0b9ed2f61ce67355290e3e48cba282eb48e2881c48a44d27c5f9ff04a0a767c942326a82237a4282bf5dd470db6a659b57a379265ca59460f6517a9a6e2f3216eb04e73f29e4678ea22e61589d6aeeef5674a09e9bf46515cdd857de224222373318110d477e622b079937321e5338e926463bc431582ae3c861ac7f538eb736193de35febfff3b4f6deb07538f8fde99a572e7de4bd87e8e718b6020a6416c5e1d33954abc92c0c84c7137edaf30374afda818e37beb839412208b1253c7abb06a04ff98ec8eb63c19c421232fb20ffcf286c6942aa4d9239feefd4d20ebd4517bbc9084fd825cf7a8e0f2531c88836e81d347e32b436f4c5fa0cd7355987eb693be9e235f45b3d4c80ec9a30f3cb2aa3498443a5a37e9ffd3c2d46a51df6e4bb6821bbc83431d0f0d7668618e9d68056ff531cc0c14f53ca3222909e17bbf4983af09aa16a824b38e75940f6e1ad1f6faa112efd3f8fcdbeedab9a47046a3301e8ae7998f726f0c369fbda8a2a451f4bfe65b77983e02831875e5cc3280bccde4e487adc4ada25d444ad214faee691cd87f818935d089ac96c2c91201f5dc86875f107fdee1f5b02163928c700bb90a4b15ded258bb30ea1925c6819240fe0a2121d10a938425af19d5987665aaa0aeaedfdcbd131e69a54bce4a3f569788c82947915bba6bea270e0c492730706c0646406ffaea60ac225e8944d773c183c7e0da24ad790033376085681a7ac1f4a676894b8f1fa90611e4e5f13fc0f9349e44a6f87bc181098fd5d8c210459c48af468a91302c4684e691b5e2fa7c6ce8a0ef4711ee03623822164a9d540ac9423a664c617e7a71ead0679bd6eb76ec70121003f272ab90ba8404e6031e6cd92f5e19f37630496ceffc3d95370803dbadf281d3e4aa255f392d42e011c7fc26603919e232514e62cab62ad973d3c4430c53d6f54ae481e944bd35aa077916433808c0806491e68be4df59185a73eac85f75a26b5fd6cc6a89f8f12e3bc8133bc8a9bed29231d98266f68e6373f29049ea5ea4569f51d3c0dc6b124b360f30168771e9e1742de3001022f914657f729256f3c5b5cab1af3a8cfa1d8931a592547b20f5c6f08f7d50237d21bb1e878ad5591b1e13004255a4cb5e7c879e0ca881a3582071dd1b4c7fa5f37890a480355137f371cb1d935ab1b14174f1f7e09f4c6887c68abc811c17e59ff6df728a735a04e6bb0ad6d0f3b856b0447963ff864055732a1f95f0809d35bb0a9da86ea93c3f5b3b8de795e46f7e133d417f2c4d9fb07e925f3cc51600d0222334a64b08301ba81a0093f2b3ca610145105d2550665140939a7dbbebb47d1747d0e42cef0b5d2a2f939aadf0891d804a96bdc2548d6d1d7d905674176dfa11cb55c7344fcf576db647c7da0f3d7b57919221c025982227816d78e506b905c48310d0371b1675766f283424b91cc471b91b903a316835c07730cc5d088258d7b4be39625ba7d7c7e586b11bb268a0def944f63a843d971a683365d6b497dce209ae71c2c053814c49b5b51c940bc4ecf83f271272ea0c2515a4394b8b79b0a026b41623a638edc54f1129ea85c9f2ae3b31b58a00f01ee39a962467f78eb3775c23f5fe89b176f7bf81592cc3714f236245bf2737cae31be947c80e9b01e415a27a41a7043bc7abe0f1b7c1f305dfcc58d6f920cf03ab4159a1c64ccc077965fa59d543e14d780b957900ba253b1a3a46532766a1267037b094abcc8c79a30d03fe56d309397a7db76e517332c35993ba30177e611a2ec796543b05a628513699b420ed3cde7f554e50c4560e4312e8dd2274267dbffbfc9965fca3312ff058871eeab3282809c058e21fd81b4314bcaf4108afd67ad5cb54f21f627e4f2cc6d35c0a07b2c2c67281317a540df24890d388760e751da1218e5fe72389b2fa957abcf4a2603ea741f108ee506fcbdfa32d0844748c802b1580bc94a06eb3dbbbc649dba09174e576e4f77bae8e94f8e1c5b77000b8600f37f2fb9c450c80eefb31a945287f04c4d775bf15d2b8352ce309ffa3ba9849a110096f80c3b1a148c8056fe673627cb490d1cf98ad455f1c4bd1898f636654fd35e59d33ccfbc10ce59d428429dd25a13d7cbb20d16899b017a107a6c22ace7ebf48f3c4efe2a0f903c9493a90f9b23816c74aa2e273ec860ae351d0e30e1205b967b97f47c8dfae23cf9720c6f47d9ad0dd9de0a93a9014c33eba220bce000ef9996f7c44b099c2d6afc376bf84e4a6e95dcdf07b145a2ceff36296e6fe51a0d592f9f44e180af9cbfabe12aa79cf3c4435537d090e606a591615b2a7d84853b5f7516e9534afb529cac01ef0b3e3cd3a95ee1119d92d59aa9bae2f6dd9610e9e5235a46919d53b4ea718769bbd88a5b4fc416008e5cc95d6ac8335decfa457fba96bec70472617e49e5faaff72fa871f8ca83c607c5171ea8430fca5f7f09a0fb8a75067e6d5790ae11f08be79847ddccc62483eb184f05b61a4fd9dfa9ab10346e62308d0cd7bb68d1fea48f69a45ef2a813fe7524526c2af971cbac297aed2879a2089c66430f2594d091cb74cf5697730ee1325a0d1c309015fb0fcc0cff1d10437292879bb71673f77a295d2e79954b0659c394e8920c36af1947ca5c7d42384c4ca99baf82c1bb0e67cb51e633b1e51fc215be11140b6c2c4c40d81839c7a28a77206fdf1ebbd22ccd4fe2630146411413840d7747866105e5c17226a16c9b6aaf8c64ef54913ea3e4f44cc91b09a7d544dd4bf699158b9b534a0c2157333ee3f5f248a1c985ce4502c26eb1582160223f99d384157e4e6f98837896d2faf6f40e26c80021126c0dd5e718fa1aac5bb3aa789eef1c7cfc1eb26330fca0c0ce46e0b11372b8be14b428fbcd79da9a183211c1557fc0db12e2acfc74f83821ac3d63fd46a8d76f4eb8901f729e531afcfbd05133b547f6c753a04223194607eeba62c733884d80a2b0c912b0e1af7e500ea45867cbac90c47e4509e0921d453c44409389fa73232ea7fae7a6686871cc5d497cae8ca6b8cbf09edbee560221dc24977a6dedf60bc2eb98e597c9aa22d2921f5c4ef0b7352dbb446aec9fc320675aa115b694261881a2448271df8258cad35657a079b54e3424441714dbc5ea04865280be205155c4dc11e350d3a3d488646bdc44cb743150cd0b0fc565d252e6c02a7d8c9e58af23a0a6fadbff966b367a7396d62dc652acc27cab362215a5180b1fbf06f0f822380f76933f5a405b8ce8c4f239db1a6b76156cdfff8a0e94b4092152d20aad0eefc1469e87176349a1bf9baa028045219e49a99fcd9729f7d91485da37bcbbf54d70070a028f656307900aaeaca2ff402f190c43636c44e577b6ff75226e3c0bf274395c6f4a010406485fcedff21015c4a0397c649d81c83c93fefe9ab1aa1dd0ed374ba2775681cf9547d26621e9c318d2dd18413df469cfcd243ad676d6167ccf79ddd28ff36047f42c7c3df6def21f6f0e00d1c55e6e293c4c8f40decf2f6c3c9bc2d2dfe77a799327aef7a0e0494f64921bf4a95e88433910ba3a50c87438a5a6dc558223d55954f7886bb36a4d771dd8e35e5b5deb0feac0ac70d34a13cbe9b57e9cbfeb80a9a385f0864250ed71ebcc072de44e36704bb584b1f362e898fabeab7abfaa33fa6130a3602c03549288441065c15d38db4172946def76540513920b421ee4297293fac82b36d85d2a46bc25b13a27101844bbabb2debf7768059a95bbdc9e4995295c160cd7a04bacf0a4d0f9e55a8a76529a0cd85e700c97165b0abc82e07e94e51d843d39909d25f584b3c4421489bd3a0f0cba5e43f231a669d0d004923b802ff509431a5e6679657bb148e709af289259f82493ebebbe3ff617835c8e83f0419c1b0397b2ea1e280a82cc6c673d1af4c1dd893e0829af9f57171f62e887a9d214bd82b0a5232453ba1d90a4f82eb8aaa8320bf5e52181244791bc52856773e254a613665dc37358a098e922886ee2792e6ab513c46bbf50d6f7ef27a39f6f5448c8091bb944cfc3f035faa44c6770a7b5588f4d4c9950d681d3781dcf9510e6b39ffc73774d71c3f98262028fdb280d1b39a7af8d87382d12173d57b9bb12993e37943d8713ba39bf8e868ec82dcd02fc0067e6b7d1f44e40e11c8b12b52fa45185f39a34841125d1bc95a7fca064acf905b8e9a1cb3b65280d16d36fc65e9ffe33ff051e36644bea00ee206bab0f15c3f0d471bf8940cdb7ab2f11467cc67b63f21c58492d6f33363be54cd9f64141027590f20ce190faa33fce49b79c09e25a691f6df521de71d13ac3cfddeb05e7afa69c026998a09cc65228a58e22813d80d97e481935757b2ad4bf4b04e1c1dd9e3c29182faeba7ee9a8bcbca092b873b548c0998c673a2dac3436c876458e9616fb52c153ac7c2db555fb58e127a6fc5087aa1464dca3aaa200dd704c2a6c78168c676afa2714c0fab5fd91b126ac6329bd74edad0c92d1335a2e38a9a1beaa810816e0ab1df28ca67bd21b3db7c1d587a311c3e6e08feb52e11eac751ca3ab8a138bb2f5844470c4e915391309ff5a75f505413b1959703b129cbdfaad09f79decdc73386e81a77359167040427333962bb1d2db689c2b287eaf1e99ab99d8f325847ea678037bb741023bbab602d14d8c5797e442ca0de6d21e4b322aaec14e4798ef90fa0dc3957d3f027c9108da47d5a4743f2e66b3703003f749d77ee290df11ff6f7bd30a7480d11826d329c01913a25c51a8ccab2d7cb98f475ce0c8c8718df49d78624f70c11a6d359d109779857ae9278fea16e21472400cafc47a85c074fc57b630d0e796e689ec3a0ff3981a24686680cabf3f8dff403ce7ace3f3367242581cd623ed85f368b4d043699b531971d54e3d4683849104a61370707c6603c289e6511366ecc4b5d626a0a1d574daef8ac4ac415a7b4c935f93ed93b059454a4f411aab0f35d09f94481f2915a277200989816e850d11fdb9a100a0b32c7bc23222e2cd8c91976e838d440ae06d47a3dfb9e25ac16ae30b3cbdcb8266351c583a4146dae55541d732ed0e25f99b752fae699968e352568c0fe72d4ffa4d6b5d252ade46fee920c4b904dc255fc5dece7416760310358f728ecc1d3be4ca8e3b43fdc3bce11988ee03728a56cc742d888c4841af4e3d5e4ef02b56331a12634058af3c7247045ba784dff90ad92f8a4d1236c9b18f584ad647d10cad60b8bf6f5563656f0f554a8fa1272a2fd0cb8973c51f46217aed3835b941c1db93964c7d781c2513891574e38728e32be838395eddae1998e86fac19e3a9286b8d0d6b04da98382703e4228967168c8c84d51e1666743f1b384d85f24afb864a5e4acf1926812f8759e779f822e734ea4529c9eea6dfd1d871cda737d712726e05955170efda1c39939e024da57ef00693f445ce190dc58d989935fd9abb4c7834292e10c3fd1da1d1b7dc4687af69c022eed28977b98cb2ff76ff38946a10c61727227d2286d878bafe52b8c0490baab14d7fa64886e371b9e8568963af5cc8c0d0673d773fb1e0fe24ee940b7c129710b6b80e88960ffc746009d8a51119c9a765586fe336d61d9392728f2c37d9108728b5c1578a408e11853b0f020dfffb448567df4d749991117aacc78ed0191704ddbf03a577a085fa12da2020becec2d0b48f35ddd65befe37b5ae24a0b3a56a552e9eb7c6e5149178b2b723b64241edaefc90b1b8bb710642f7f019b09fc0c8a0a6149d93967203f16e695f6b6396cbf6719259249688a64a1e1aeb9c385bbac38dae6111d575c4b7746d176fb862428ae5917e52441912d4dfe4748978939689a2a9db0c9be945695093aaf1a4ab19bd158aef2b507e4b79c447de37dd2d2f6c469d917a868d4c22cc0097c083fc2c3895f3a6030ea4eddb7dd6eb701e563215bfb3fc718294dc8c4a609b77ef1fa67efdbd7bf96cc131951ce0b4bd6dfe48c736309bd39ce62ef8013a9364d4f6e88f6fc65657c7a88ecbe4607f2876ebc4e8d7b101a5fb3fbdb51cd256b5fa9c6c4764375299cf3be3a6821f3872addfdff658d3518bda85442d463a154196f0775053ee0f261aa0dfc38d72f5ef7432038dedaf0f1462ced2ae3507c24ebaec324a6e04413d53b3fbdebc93f10e29f74db0ad631886b4f22be96fa3fde7009171a4002cc7200742f89a3d2d50b585c1a1b05c6653c515e4368092a11f18104de03c4f11459ff9c846ba161ea1e3da5eb012583fb76f41962f87e96633ff36a9ccc4ee9c8ffccd0417d89ac1c8a0216c5a683e5d39180bc5e109c4a51dc0d972aa532b8693b93115de1325ac530ff2b37ae295b10abc7bad9a26a1a28dca1561e78f3a96ebbbc117cea4b9fa39357605cdd50c0cd7e6ec3dbf5af48e1dbf337b979f17db2640052485775c9a69dc3986a8a4438e0c1a48241f16561de0b126e573f66d0288413bf313fd667bd057a84b3ab43bd9059bf691109da8b927ff5fe8f562a156debf91d5faa1561e1f7c92b6cfc54636fe97347ccc0362ffce848af8bfb1e3589b933545102a1c60a9831f03ce4d2c5fb8cc88e280d0e5ff5315423a7cb0fe19d5e5416229f3e298629e03872798bccea9eea1ac5d8dd4d2a4ccf366c1066aac23d46bf8a09b6d93dd147873c29787a215e32732694f2a3f3f60d82863fc8eae9df8becd41d90a9361e77755814938d3e3764b706efb47d2b39db4de442fd3a5062558e525f1405304ab9802c81faf932772c0689252a55148f06528bfc6bb136e9cd87fcae9f19a1c2ed6c5af63545d168c1c7fcc2293dc6fe6269e1671912c87a9f6098617abbd10d690f6b67f88df8375d54881945a96870f3b60a01a870a9e879c9695f75714659311e286ce1d8f48d2a966a3fd6ba600866c520057d70009","title":"886. 可能的二分法","link":"https://leetcode-cn.com/problems/possible-bipartition/","question_id":922,"issue_number":33},"31":{"day":31,"pres":["图论","拓扑排序","BFS & DFS"],"tags":["图"],"whys":null,"difficulty":"- 困难","description":"```\n\n公司共有 n 个项目和  m 个小组,每个项目要不无人接手,要不就由 m 个小组之一负责。\n\ngroup[i] 表示第 i 个项目所属的小组,如果这个项目目前无人接手,那么 group[i] 就等于 -1。(项目和小组都是从零开始编号的)小组可能存在没有接手任何项目的情况。\n\n请你帮忙按要求安排这些项目的进度,并返回排序后的项目列表:\n\n同一小组的项目,排序后在列表中彼此相邻。\n项目之间存在一定的依赖关系,我们用一个列表 beforeItems 来表示,其中 beforeItems[i] 表示在进行第 i 个项目前(位于第 i 个项目左侧)应该完成的所有项目。\n如果存在多个解决方案,只需要返回其中任意一个即可。如果没有合适的解决方案,就请返回一个 空列表 。\n\n \n\n示例 1:\n```\n\n![](https://p.ipic.vip/nrmqt5.jpg)\n\n```\n输入:n = 8, m = 2, group = [-1,-1,1,0,0,1,0,-1], beforeItems = [[],[6],[5],[6],[3,6],[],[],[]]\n输出:[6,3,4,1,5,2,0,7]\n示例 2:\n\n输入:n = 8, m = 2, group = [-1,-1,1,0,0,1,0,-1], beforeItems = [[],[6],[5],[6],[3],[],[4],[]]\n输出:[]\n解释:与示例 1 大致相同,但是在排序后的列表中,4 必须放在 6 的前面。\n \n\n提示:\n\n1 <= m <= n <= 3 * 104\ngroup.length == beforeItems.length == n\n-1 <= group[i] <= m - 1\n0 <= beforeItems[i].length <= n - 1\n0 <= beforeItems[i][j] <= n - 1\ni != beforeItems[i][j]\nbeforeItems[i] 不含重复元素\n\n```","content":"096221cf5b628be1e73e8bcfe626c734748523970a3d4cb45609426e2012476b209e2dc8c9066ecde89f32f426e3ac57af2400c3906714dff32ff523fffaef2ef2326f68889bd2fc1b378fac9d98506c7ae664cb93b3038b24aa68dce2b0bc885a36c60766f89f2b3934097bafdfcbb47bc50b435109b080f7254a0c88279c4f99db1d7dd7e3c9b69b48c7f62dd068dd76166abc105c2a14882c663dacbabf525b2a743420a3f944e5266b70ea5f1c5e03abdef978061b68ab33ea7b5ef7133954964bfc7348c54ccb9d730081533071a321cc5d562da288007282c72b367392b6aee10897d3662777ab46a8aba3d1fa4f5455afd0ca2f3a22299c103e1907aed0696b366a0db159d39c98b649331c73999bb66fb424d80254b98046b5c704bf0d66d0c40aac81a211b83d6b27957c49ea971250c4df008ea71492e412d35ffe4d40ecd2176f2f68d8d04599a4ed01ffefa18ee6ca869510bc45858f5c5370db83f3fb51b85fef0ea1cd80e6edede5c02bc4e41da34721151ef16d3888c2d43916e814190a4e91a66338a17843b25701d7540f97e6a811e6872079d532014805bf87434666328f36d4f11b139edcd351c0a7d3d9a85afc0c463a2aff720edaafe747b8a19423c4055df853662d386c7552e12ced8e83bcc8f74bed95420b2eba49b83715b477810bd9cad525721f61cd95c3e61ad2b426ef9d1f8c3cd1a810f0b32d1f1a209511a019db19edfb8ae87a6d99bc90c37805e91e4eda98ede7c89f5bcb95d3e0ef85aa3e7c60ce83deea38472c441956e31fc6c92f75263844e35d527752eb9f9e9ed13932191f51f920656bf662d6461d9c22fdc24f7693c36a389fcd3301a4c5ae95faebb029a1e3655fe095bed69ab3da876b14b49e447d2917390642bca27da687f66d6826f41e83f2b10b3750b77bc632ad37cdf464dddb9b0eda0c7fe47a0b06c3d3c4aa61696160ca32739b7c94c7d3d837ff964f41b10c1fe63cc8c6ba6c70b7a12d79a367aaff9648426c329564239dc0581acb0bfa4d49bd16a686d9e6162a84e8406e4d8156ed9f9028da30000a029cf731b7ed2ff5699851bfd20cb3699135d18d578117158edbb8eb0fae2d70c4c8c7b0f99de32c74b2367a4d13e76cd1069364af00de321d879e96365815c2d5d0b97066326252424a0b6e55c7b4943e696480e18138d2b64d155751d79830b83337a406be05dca8d0e98ba1c7b01fcf4bf9c5cda87bdcc785f12043f1a5089979813ee83821c369a49e1bf90f3da7bc52e293b95a257381b7858b774d42cefa98d5dd8af0968ad70fafe96253c34a80201db4bf0098bee345cd3d3dbccb82e0a372cb177bfb41b24a12c961c88142531dce84ae9997a5d1ad4d0006fbffd5a6d450bb8d55d4551854d29bfd4afdd4d2c76058393f759ab6fc77503581a8cf5946e8ec0d0684f22a2d595485f53a7db94cf55bfc64ec3dbbb18cd049d2fd6f56eb23d26016c15d0ec00777a61e2b9032b8893d6ed69fb9fa781a6e555c1a089b749eedbba0144cfb53f7c3d6060fda11c6ce0e375582428db09bea2cc7a7891befc21c4504e21535714ef64a54c3cda2ae1454be539be12788b5f96a8c812b85b8e0914a4c78811e8017322f45cac7b0c42c6e1648c3ecce46cc13ad38793f2ec1c942984490395f55093d0181dae8080e2eb43d0e0817bfed5fd701d2c79286ba13403da00a1681b878688a44d8e9ccc73616b805ddab3ad05a62bd18a1ada7bd16d42aeb506b74ad986defb876380d2d2e10edae44ca7580105a4724b7e9df1c8fe48919cd68674ed09c2f3ad0b04029c41011a77c5fe5464f6a1a63736873a35b025f1f22542e0b6ea27967aa17f41631a9953e82f0275f4c224bbbf3fc597e7df795e7398039d7304b40b580c78b8bb99304d9c68918e966d9679c7abc5f25e0e5dcad204f1050a62cafe4c761ef938f07156d943fb074cd4263907a7b8a559a289f50fb20364aecbcca9d8a0ac1bb0e83438f1d5bc9f362036f5d5095902d52d067d630fc10b2add07a617ef1f339bc086d47be696948a85a66837588092584183763b78b07f79cf6e866f07140b89f648813ca5ae9c9f974f6aa5a424c391940dfc8903f4b037f7bf5b3afcc491b9af844a773301f6bfbb0bba40fba8c0f394a9c6e859c340373f49d8158b76bf011b7e6f005e6d444992a488ed43615b816b28805e05333780a0482a59b3ae41fb70d47aaacb17dff88cffefb89adf4d26ac43e4058bf1b8152c068c72c2a4d505a63c2785636be8d0d1503885b6009c0bb1dd194910b6b65108b01de2f3b46e0d90ba9e33ddadc3b125a70655f28f6f23832cf24d631561d1be09145a20ccfbca8f9897ce546a8dd54e69bb7b8288534993a6d1604f136f623a8860807ccca92f1cf9fac2ed6eb0b767614fba105a4dfd8d2df24a8304576325897a9dd641d8d8651640e13e9571fe6863e9e81e1fc35945809daa011bee6767b92773092d8aac4677825f03ff9862a7516d8cb86241cfbc0be02dc31c122054518a092039012f5cf3463c7e3469f6f546be6c6d21fa0e94fa3dbbbef3af123247eedcbf718ce95f9e2f9a9e238696b1af3d42e4d7559e737dae679b189ff4f1bfa14c67f87bbda9763aa696b5a254e0e5d76549d09143aa57d69d6aa22cd0bcdf43977d58ff22ece960d88e0beb6d4bcb9cbec8c1ea885f0b73c0ef52e3908657b139e4b17482c4132a5e251021b244af76fa6dde562c0b17cb195e1316e3dcb5c0ab4f0fa7b7102a9156c8784f25d4f96de9573aeb720b6dcd3acd9c4d0656c3a5acc6ec090171154b780d099a9f9c1179c5943f0f066457d73b318efee1b23034a0035429fa7b36140eeeeda782fd675b348d7fb0483ffa3f21f3b0e093eb62f441da66f8a4c84e51abd399cb4e7ccab96b2bb744cee4e9e321ff91b70bc9fafaf54bd7c7c905bfbc39860b103b046e44d415ce1f5bf0848febabd2396764766667068f38882a0eda35661263f72aab8078f43d5a20374fdc1711dd57268739f98f5fecb48fd1aeb6df939b93b208addcb21260e4e127027ba4563c05714ec5f769b30c24ea743da6f78871e42f06773a351adcf580448ae84d28d06898ad90df6389a632ae176eb4de12158c42c46e804014a403669132d1c02e13b7dcf2d0d536d32f558c1536e0c8e7b691d9d9179b2efcbf844ebad4bbca11b794a32d776cf4e3f8a6c851f464b77bb012ba34e5667fbb12061ed0f8e7a7abd9cab808a905be68f808b8e63ad4169d5b7909caa0442d9115b607535989023588d557542eee28d07d65031930e43a393c691db1d8a5aa61a1a86c400da2f5a44459d4469014c2288f4af66c4a529276751233622d576ace83da5fe5f0f4e8f2a6afa5f9abc9f5d6f45145773a2b8399ca953bc7055371b5d90120ead8aa9dd156266b698e48f7231c8ec3347e1239b9790432f5a2944afd758ff80437ac5582ec3e63dd33a8dce3e75545c9889a7ab71d7715dfb48067a004baca82a9c4ba6c42e30cddea88f83d6fa62c8fc9f85dcfa99e9f5d1101defff177db229bfe4faeb639286a29efc19d526758bf41aa5b46e9fad4e2f9cb76891836c1822644a93b4c51e47f03f86ffc647778a32ff7f689c9b352b563951170a7e243c5fea60646258545f0517003e41d25779a027faceb369939dd6e3121cf820bcde62b6feddd1b41b8fc3a22610326ff49fac15268128a40009f2aeda76e3c5d35f9a1be6680fd61910dbac18266be87050de510355bbcf3802a760227303eb37bb363d8675415e92010b848be0d1a4e2edfafa09cd1fd65334333b8072ba329e6e5a6f66469f83af631597eb556f2a3ea34c88001bb1254619ede544a7a9d399a696bd98a227a41f605cb02d0fb0df245496a7c9b9cccd98fe59d278145783176cf090c1fde7a6ebbac37513116ec30f381c250f86ad705df48893c246b70ef43b02af6da46254de2c3af4867c73e589c8bd72ea22819740959d6f47632d13f58dcd569e0e32123ac9d825d31c977744826bfcd6b78f7e60a77a77e8714eae8a9e65f3d22626c018e7c383a521a390cc984390a5750b080efc71a1239773d4eead3b25340c869b1e5ac77bb54006465d614476788cbe97aaf886a58fd66b27aa111db58f57d909387b84df2e92fa6c788f159be129f8131099dfa0bc82b0c5166074228b393efb5a8a7cdd6c32e32d5beff80b4b308cff849bfe90ddb5426a4e4f5ebff7e4dc5fb7e14520345be63f33123dc86ebf1b4f9e0aa1d6278aea61135b42d851b32449d3d6d9bcd320ccfb28241577589f0154b3d029f699b168745b8f03840cf220be34ac5966ffa90495c60e303dcc12af54178fd1b4f1d5f27666ca2b7e51672749304972bcada973d50b9e2d651121ac1edf2d5270d1db50c1aac43193ead1cddbf7ca9a9ca82d0b7c25388eea3b602aad4063c5efc65372fdc00b775f1340367fd8dc51413eae8581e71d7c21acde91b601ca4c3077f82bee7de84cf2bd7e6f2c2c1399186a299f3657e98ac15d732d288a4eb254cbea3cd5018845d880ddb2fdf3bd21041af61e62594cba2404538de985ff40964cdb691b781fc9937f1c74036eb09cbe21c9bbec66ae1b85a8fc13772f612cbdb71c5dd5112746c919a2e04c24dbf1a9b32a92fd00e8b752d1942635d7e80c48c13fbdac36aa56f5d1d3a0d32c125d15bda63ec6b65c3281c218af2fc6190a55266aecf4b13278d7f5d1106bf501a0edbfdf3b8bd57cd16ec357ff6a92a82a975620b3dd4fe0966276f45a874803b77daa8f130099bde175eab0ad34aebd16271c3919b7774fc925b74aad60f687608cedf1d89b3383193f0567cab4b35b22ee97db2f5f9317836c587f450a5294d011313ba285775f681473ac880299ace02eb5d68a83d28128b3f346de670b9ece73591b7b74110c3a06c632351a71fae70768a8121a8f5dc5beabc9c86445f3b004d2d85b3f16e4dbdf757453ca5339c9db673dc1680a7e68367b005d077ed5997cf38e2613dd040cd3d4c5828fa366ba985a572130924a4b46b46cebe781af28de128e5e449436f0fc3fa8cbfc51cde8dd0e7d01559f094c17547d214615e2310af075d60b6f5e0be8e2d29b145d73667b92682b0097c825fa9f30dcee660bb221744a45201c2e032d0398e88254e00d966e5abe7d82963fa8f0d7dcbfc90f1cf5cc86c6115429d9fde8e43762a583034fe25951788c9308f33cea5a6a8acec013a04f38239057d2c161eb52d3dd1337a6a0c0a7f59cfd533443a61a8bdbcf97103c32bcb04d5b9066eae394a08c8fd0fa85982f183d30558336cecc069962099ec651416ee317ddc5a8ada70ec3dfc86d7c43910da66c7bf07d11fefbc363d2a9a26e9a256b8fb9ee03a6d51c5993821ce9852a0158b3a2c66c6e256865189ae67c53cb5b08f54536ddbeba29ed24c555ee501583fd9b5630f2de19b1e2f471ac76550a4abd36ee8a90ae44a6434e35f36c1258a077756e76f1e769a7056c19f1adf281d3a0ef311a293e43a642d0f53346791ef0592bc1d55230c006f5032f88b7941569b381e7ab16ca27d51e6d3c8bb7960708cf596740abfa7f370140f7e10f3bb8271fd6c67df7bbbe6a7ec55075c6acbecd9d2b8b846aba996f6eba960ed105ed3992029088992f47077302795f8b7887a5271ab85b422cbc9da9a9fa4eb57e1617b7b9e76ed8aa4e933eaade117732b6cee68b205b163a1f8f19f5da9a0b59434c67115ae7840b2ed4db01fbc2eb1d642491170576cc9637dcf5d386bbe934ce4fd94ab9fdf313ab5d552402f9af06484f323bdb8c41584c7bb614ce92c3152afa17596045d860a816633604f892c8a4db0d7d481b947d9b3f67bb55f5fd8db0793b0f1ebfc6898f9ae4bd85486d3098d4c33dd2cb35abf5952596ffffe65e92d142390807e1d1a684a09b95b6f2852e25b80d63329aecc00360e8198f829db355172937328549e80d725ef848f48bb908e2b2dea966d20a1b851748cc566df51382975c3771943162ac0bc90fe2993c868864b439c15c23d40cf8998c89fea7efbbcd469f0f892ff470abe293b538b7f11da08764f6125c06ff95a93740626554479f5b802d34528d1bea10d262b2b9cdf90d5e11312eb137de0845f70c9faa300db550926c2a40b0e38a957fd6e19a1e808d5bb166749778b8ff63e40d58d3f4ed3e6d0f1860bcf76945d577aa753a5ea2c6321e1cb084c87c3f7724de5a7066e5945aed8bd5fc831796f3516fd255a14fda3a85678c25eaa72e9fdb4a611370633f689e590af6643cba60c00be3738b00842a83af8f4e846f2f2ec0a91218e5a1d93482828e82da87af20bfb78c3e5b3760ee7966f8fdbf659bbbd8e7b429c2e49dc507ce3dab2cd4c3c3212ec6ed29334df27c0123cce92ff432de611c5f1fdc581b443fb08210643e73f5abbb904fd66bae947d86279b287aaef8e27caa11d85ebf86a326ee6d4c6619ac46708972c29ab491c495991b9dd64d4d51d60de29a785f68c5095d3ff8dae8a30bb23a75a4234c225552e1183b3ecc5fa78870917baeb5581f6cebd2acfc455fc7bb057b1a21ad137920219e4a6b77b23a97771be041547b7d6460109bf57ebbcf73d5e1bb714ca3aeb57ff90e6bf5ed214cd5695afded6c7bac25fff58e982862b0fd00e95363559226cfe9349ef6de411707694116ac83adf2142e1535411760fb2e46c10c6a4eb25e44a3c8248fb32ab8eb75c652bd76c93d68863f05d30ff441e4a3eabc7868228837a5b6510624f6f19340ed69eb0a0fc547dc7c4191f5c529b143a5ba3e5a53dd5811c682aaa62b5c157a34f07c1fe7096dd10806d0006da2be717c257f056e1e301db00b2974782bc114316d48dadf1778a82a6a20aa79503e7047f1fb8b600c4130dd36d54fdda4f0c19183f09dfbe5df854e5f16c99f7175dcef41fb2571e648288f131178c730564eb333a8cfc6135d16a0a862e1ca06c8358112983e84f43cb1b0324f426b5c679ca98e3e21de9de83db40c0832f32d1ad405d0e5ee885d58e72536f04240c3792bdcc8c6ebd8232ffd374529674df13c479ce3723dc68231daa611a10cff3177ec819c324270ccfb35695b541fb14103a01319dae860a1934cf78d304ec120dc17be2ed88b9e057d37d5166b44287c4c07b05b612867e401091962d87041aac688c4ff5f95b5af216d0089aaa6c147fb232b33ed03a2071d3f0febaea8abaa0120c15a81c140a15aad0c5504a8cf54f6610c2a0b6062a3c60d2eb42896eaa484d176b395709f870c66005ab049162abf8d7df3956ea4a5f2a9190465f4ebaefe939a85d11ff3f6a19580d3c5b3e4a14762115d2bd5518d8a41f7f8d00b2b145ee3e985415be9609e2c68afcc8e59e7ed6addf6b64d86079a59d1b8db308951c1c5cc250ce4f1b453723e32ce67f39267fab468865fc5c6fbb9ffd1ac53674d3f2ead3808093700161161d4e0c278a1ca5ce199b98fec306f8cd936790f44215768bcd3c2dc09f30a96b80638a0074be91e548e10f101be53614cd029bc5186202959c6fddc26016d14476b1126956250f883232336cd884368029c485e15bfbf10ba0dcf72f0994b07887a51c2dd5db73bd1c1dc194bf8af34f776cfc00156ed421328254d59ac1f24ce571a23e0bad85deabe061752aa58ba4f0115371377caf4b5490077abb7ca517dc7370e47f585c70ea6879fcab65080de9fa5fe229f3614ecfbd7cf08e42cdfa8c2a4e734a544d9e490c31dc2968fb601abbfc5bc9c8c1eeb7874e070f9b1cb4b143ab99db4f5928a0f2e82a3162b8de9cd2e7b60ce7bf81ea0dfe618fda00bbc6e76a0f5c8af5739470df9c47af03f41ac96663ebc7e1606ada746184b5db399320a96cfb3212a820c4740bfb5ffb30a68f9716f35c918e2bdbf16364906ef8d8ee1f021fa3391555da8150239b258ed802fdb3cc1a1d4d8044656bf50c5267155b8dd50a7b7f4d54e9dc1410713c5d55e2f6537c784f701297c08e8d7b9df9b0e0aec52c43f01a923153a871e11a740bc26bc9ac2943ff495a5cae20be542b930788601af5a485f847191083437b7a78cdd2ef527030245eda28d3fae78fe9ee0051c817f431216207da072246c43262db307f178a7db6733a33e490293e6190bb84098ff8622800b9ce2199a578a691797172e3744c13a46c9fe78f0c635dec1b55e6551552220e4079ba727a020139373657f41f80cd9958ab187b630bfc69521964ca71c15c616027a637ef6c1a9f1b1b3f097298e79301943c5306130de400031669bc6ce52675ffc9a370f472615b727a14c94396bcc8bbb2dd04826fb4489ea28b3ae5ed00e7597522de866bb3ced786c34118d41b933b63951adfe591515f71ae4e837328acd85e40046bfae771805a4ec29ddc20dde3c076c945f1f197d146933db86fc83cc8fff5563304ccd5f4553657eb233d65ac6300e921c9762ae34d587adcc6ec1d00a51eabde1e0e1b6ca760bf499e5586a9fe8e958090879c3075397515e8a880508656374809a6972fa21409971a8af0da6d1af18483b676e8a8b513742367fa76792c7f1cdc3a0d67f93c5afa58783ed83a65e93f37ee91206d9f490ee140722a3cfd20c0bcae5d33efecf7411b711523d354ab969deb7b01bd701caf794f01e326c1415e2a38be10c4d0e818eea953b5ff0a646a0f822c4a8d8647550382e209c3c5bec5463bffe4dc75f47b85473d6cf79d7bb40363506b465620140f42b5154b2f8a2836eb2d7782eedc00bc5f3d8b53fee9984eddf01a4ed28d4c0554cdf466d9e183abf3a75f7ec13f83a1d24f714c109eaa17f17e10dcc321c7af1e5e2c3b33d1ee015a7036291a92fe96ce5a477671a0f2aa4fb60d22667f5d9f2aee3f00a875d0f6fff3d7375af634bda341e1757a2f768c7f876df0adebe483b6eb97bc91730cd54a5ab79d94ddec858dd4071163cfb945e2db03925eab85edfeb4e633b1775362a00255e31f4a172d19374e2d7cd64acc193136a9037d9078eef6cf183c31a96e9111afa8d17225c91cdaf2d808900a879ecb2318843401b09ba08f76705715a256ec379de95c103ab4a4caf3a5c51badbdc6d71084549a9e98f50a29c6b1a816fe60fa63513f39b90fd90d8a5ab802c14e5f806b97b8241d8a961f47b4117411e41af46d86bddffa02319041cfcd2c055e071c595fad0c412a44304d43c519ab3e172f49fe0b1f9d2f377f7b940180435010659585e22114a9dd2c8199548b953ffe1f00324bcaec83917e681c5fe4053bec47136a3376da722d03f3fa11219a3f81c6ccc5cf54b29b6b1c68b2e54fad3b9b5f0f846c463ece672cf544c1d9a4be6bfd418c2f731925495aa06fd7ca1c89cb3dd74a908b01d5b4ffbcc0841eb32e99057278f00a1a32eeddecb2cb6ee203230245a93a80fe71214805982066b016b2e25c7a7a6e478bab015bd4a01aeafb88b9019e47ace3f336424a5652ca49f20d7cc39c6d1ddf6b52c970c0ba6dc27285c6f0533653d14952e7b20dd211d6b0181185162234459120afcbde90f825beafccd32f73ed9664fc130f0b558e4e3981850a00ad3b6971c6b3843dbcd1be14d8a5fd09b04534e2ab5c800082e2cd8c91976e838950efd06c97a46d4f171f944e030f58a90ad2c2a7b8cd7e1596de71b5406623fc8e30bb3e300afa382bc8e3525689dd41192ffea99b18759afe969a9820641a741d75eb164b09e492e2e650316b86ca9cdd3f702fce3f767d221b441ddc0a43f61f129c30df28087cb56bbb1dba7f704a86e3def24456ad3fb896b3400b37167ff90add1adf6d13e6cca16a599b87c6d04d0de41eebaba043811b5a15ce6b55637eab342abd62f1a9b2c53a690d6099d3674f6752b95d9d1970530df180a3b31dc71f9dde0f8a598aecb8ecfb4c1963089c1f8dbd7b61e9c859e38431f50d72120b3860215a41b6e69f1b384d85f6de1fc21e2b6e9fdaf265fb0769066d89e163a4fb9118dcaea7cf414ad1cda737d712726e059551747bba18dd63fa539c141e4477d3b4d74eacebf1f91cbdc0da4b19e95c616c7b3423f8588485e66ee687af69c5f04c739d97ae2b160b3ee7f6ac555e9ecaabbb073a481393ba5ef01a6c13f6e2bc434a85c88eacbe4b4ca685392534d61c0c2b802e414e99f3f8e7df24043c7aec2d9623a17b07629eec6650096e35c0ddaf7eb867138f774af82d635528275809b54958fae39d108c5e74d7de925849b4e4966ddcd7c84116abed175e3013b90b34b17c9d1b1ce802ea8a2464dbf23b1a7cd12a9a261a3fd2db78216adceb8ae84be5b0b4ee550d72bb235f4698a93342709663a4529fcd0f66129fa31684c4f1d1cf822205edb913ef2c59ad0e3500f34b75aa4af5b521ab8d5931d79be8b7d0b1238a49860a85e11b0f5b7a934e38d164954e7c48081a6550204e5418904665f2f563c9078709cf0a2144e2e267dec2dc15161dfdcbad3d902cb5ff84181ead7c65b1cfe40779bb304d3000b7b6aeed314692bda962fc7f512de9d7b7b5f363fe2e174b25d1e3f67c6aa72f415ef26a17b6fe70023fd248417fbb3f2e736c544f3d71e1b4f75de3986f43de43839270bea01e9de0e101b043f9ef5c6a6520022547ddc3e09ee782cb157a45b7343a9d7b5e21cceae77d09ed14370e9753a5402fc9a7cafa3af80b6c5fd95e0526db8c5a82c8effe818001d00a9216499fb96237567cdd3e938332afafd4bbe552deaa3edfe94b78a73751472520ad3bf27e95c10c1dd1c3236b37328f5ddba26e55ae84da82fc0623ab59a507447b286c3e43793acdb0be72eeb7a1c7dd192f9976cf1a5dea746aaca4f9b165ba12460fa779b85a44faed46dd2131b8eb326e43550752640797419cb9d3b5d47044be89da6e9e4b1b0c8c8492ccb0a54d15603d746d19b45331b1b3fdd106324ba976744a661677c973e8ac9b079e097dd970821ee50b8122d0d4cd354087c529ff0cddce2921108fce6ed68fa10f0931a8c216bd68908ed79531022d32d1ffe0cc760c3eeee418f411e592411161a0ba5d44eea3eb73e56cd1334a341b22471da48fb147fe92e9e02c8ab84078f83a178f25cfdf7648805a0fa9f98bea87c34d9c706734b7f8fb44616f5ff4efea26e057a1224650554d7403bc3d0e5db4c77bc94042ac44a3d226b64302a07532164e0d0d889b32c445181b1113133fceedfee5ae415fe323a247726736dd42553efbdd4e67ed41065e066913fbbefdf28931eb4da73427e4632ec31abebbfcdf6c27a31b60431e08fbfb4a829378d5fe96536b0b2fb0f8fba7126d3c7b4f24c827d24581e6582865060aca59d4fe26c93aa917e5c822be32065e0e60bb613b97ac3a31ff2c3677c7cb9e74305f20c0d3142f6a42d2a1cb485dbde71998b0ce32e53a07a8a5b8fe755b4336f4aa043932c31fb2a105702b70f5c4ce9798e283f9c3c2dc992cb66af3ece030454d0b2ab38242ed303b9d6d249d65f8508de6548c363a811a5d0b89477a223d6185f2149694b7fa3ac4dd711746645d43f4dde719b1ea2af4b553cdee9dbda788cbf92fd1e0d5cecae24983bf0c20b1a4e6881d5290ee1fa7af0f29d07e55f7f825ce3cabd0ac529e1862021b7a0ab82939f9d327b412268f473549ac5ad5e1f857f2ff0b1f95ea0161fe6924fec3d9131c743e6d412b421e28fb66f87f5a659a7472744a251730f92b9e761c98f329bc1da99ce3394250f8d2c36458ba5587e4ddded1698fef9d5e91197233fd10a1dd1d835224d92d4b10056ad71d10e04b435faa093a4a87b0546d684f72298b9f9bfb2ce09f7947d817b7a792226376f66711a98a5b1ce377bbfca516d95fca3071eea13674c1c7dae79e36d8e34c1d74e5795c4337b1b7430be495d87a03227adafe88c882c2a4712e5229266416a3e7fd9debd18056dbc215224de70ca113ebb8315a1fbf1d6c2dcdbfe0321d734c5e5c47041d232002a8d0738b35e039a355da0b2da539e4e6335c2c765f8ea2c71ef62830f289ac44952ed580b8fe13ffe6e5c09ac03a9c9558a3e4607d6b48488c700d5bad10244066f747d4a93e15f803955f228e35966ea9d2c15a6c3a5ec9f364b92edc78b683684e2235a556c8a5af0a69de9e7f03a08eb04079ed4179d99eedb17beb90de2d461f5d9fa5bd12c760f04536521dd704233cdbec27002eb068b66afe8507f1dbc7c79bc1c05ae72117584c4c5b209869d9dab1ef0046cb21eb9380702cbdfdff958b5cb0a858635dbc773aa30d0b4be32cc9e7bce6d47fc380ea1405d34f33a9249047bd89a34bd388a6ce9ead32a51bc1bd17816a248e1cbf874898615bae75c99f57760dce416761fed39e1837519962aabec4fe34de370f015a3c9ac1a0fc358c638c2376d8b1407ac91a45f7a4d0807b26993cce72c5b824d7e788ccc654cb1adbfdd06d56ee62e81b4e731545fadc1391919dcc7983aeb7b32185802526ca9666b2aaf108e9eaa80246cf99c8197bc9974ad5149742c2863296cc556154f7237ce69d489e6ce13ce56d3e4b131c4fc4148df66769dda6c16de4041032036c074411ba0fa14bdec551b7aa13e4f891c416db5e7d26ce32d284d26f31d821e5ee4bab0be0f49f13530c1c8e6912dc83a56c152b4c74382ba665c518552b1493c677211594dafb96238e199b4399d5f8e9bd4cb6239e82d8561d8c5debb0ff1072635f0518066195e5a7761022d045745d18c0037395ee3a5828b48be1ac4934d282d49b0ed3dba150bbffca3b196b56b1309431da25a15ff3d5649d07082bffd2799d9cd67f946c16e3cc7f4889d4bbc694d4bdb024cccdfb3401f0c132e87b55d07a8ab90b1f7eeb6c8a5e827c20f1bdbaf1ee8677b0675b039d23382246fb33853d9e0f558c6c19c343c0945152f47ce4f536968fa744bab491db4ac13171284050d822edd33bbb6c297460eae4b20d2b9ed15169ba66c767380387d3b58219006699e9ac8944f11beddde43c94d2aea58868c7e72301b435a04f3ffbfe7c64867af044e7e641e0adc46d36becb0720f0c0f4499d474dd5532747b82e2c301188702da421496f3ae0ebd32ab9fb34fbe2d0026829bade6baaef54e5943358e399efb1634f90c5d6a1d88018de5af304f0033e1aade53","title":"1203. 项目管理","link":"https://leetcode-cn.com/problems/sort-items-by-groups-respecting-dependencies/","question_id":1309,"issue_number":34},"32":{"day":32,"pres":["模拟"],"tags":["模拟"],"whys":null,"difficulty":"- 简单","description":"```\n在二维平面上,有一个机器人从原点 (0, 0) 开始。给出它的移动顺序,判断这个机器人在完成移动后是否在 (0, 0) 处结束。\n\n移动顺序由字符串表示。字符 move[i] 表示其第 i 次移动。机器人的有效动作有 R(右),L(左),U(上)和 D(下)。如果机器人在完成所有动作后返回原点,则返回 true。否则,返回 false。\n\n注意:机器人“面朝”的方向无关紧要。 “R” 将始终使机器人向右移动一次,“L” 将始终向左移动等。此外,假设每次移动机器人的移动幅度相同。\n\n \n\n示例 1:\n\n输入: \"UD\"\n输出: true\n解释:机器人向上移动一次,然后向下移动一次。所有动作都具有相同的幅度,因此它最终回到它开始的原点。因此,我们返回 true。\n\n示例 2:\n\n输入: \"LL\"\n输出: false\n解释:机器人向左移动两次。它最终位于原点的左侧,距原点有两次 “移动” 的距离。我们返回 false,因为它在移动结束时没有返回原点。\n```","content":"096221cf5b628be1e73e8bcfe626c7347382248a04fb39af0a7771247d060e0f0dfd94642bd18e5c0372ed5596684b8bf24d65cf813e07c2e763b522b5efe922ff3a6f2898da8ff0062e8db59b925f7332e96ec986ae0e9120f437cbf3b6be831436c0446ea79229203f4815c0928bfdf714bcaec084752f916f6d5b19831aa076394751750d135a1cf979f611cf64cf6c175787197c2f30b4cb4025c8e6ad111c0f294a17ee8f727f007093cd7167012bf74e5eaf91bfb73e9fe96851f60c185eb770fc537fc86df09c650e805e1472be20cf595b228ab90a7481c0313b72a29fadc71498f84ee3a221448cbba3f8dd4c556baef5e92e2c2e27a01f310a1fa8da4384ac839946834657570ef5737f7b560f20a828a13a4799ffc7199e8b70815701c960e6c2a6fc45ac721802ca297c82cb020e9dfe72cf8954e8c0488467b2124ebf902e0a516ba8ac47da0d0d881e2a1e5d010ce0915ed26ad0d6550c15d4cb6a1ab3fe943c8673063e05182e80f27cbff371de554b6d043bc65feedcb2630b89502a453182df1728cd0a6c070339b6323dc291bb7cb2b545ae8c6b352d57bee318731f6b8cd4dcd717189adfd95dc6a5fad16d91bc584d6377d90557cfe48177fce18a4cbc171e826008502b332b559159e4d2caab8098418ffa416857b519d11f7303e18c34e0c6d711723c51cda4c5e714e2b33ce29e269731c0b513e5bfe5d4f1b14a69c93a876ed0b0e5eb1139aacfcaed3b71cbb2cd0242763dbffa425f79bbc1a2d9a1540352b3ffc6b97c67633b0d098908b2811a387c3ed30b385f1c2cd7f9ed97bb4e187b6f6b984c7735a55e900f20f344f170484c80741836e7717e54aab7e1bfb5b48060f9e13f25f7d4c0e5c6e0e2d91805d31b1e3b374b47220ee19114d79fb22f4c4f8a36fb06d36e04eab551c433b421c2fa7addceb90cde1177ff4d0804fad0d28f657d4b62df167287409ef3c8d517d05e839a31cce265d91d4470a4579def5640f1239bb0d648173724f40632c29d7f708ed01ace9c6994744a591be9926d3788c46780f400dc8e77a2266395a84e5cb7b8ff10d24c54a93f14e15da23a6488851ce324a24113427ad729216de9c6ec963648bb6a0cb0790a444eba4d9a73b526f3349e7a1aebf18446083a819cdfda2a6245017e233c0c0b23cad9c5143724a0aae810b40428557916aa8457f32252de32d244cce48cfeffefe7e87cf91a89e0a2ee688b9e999848739cdc31f43aba70b81048bd6ce1fd00b9523ec0e17584f08d367868fbeaa7de1f5024a4e9fbb0f8e4b18ee8ac1dd6bc410cbc43e7550efdd92fdbcbdb218c1649dec3c89ea5008f040a67b9258fc6c24efd63f7205ceffef4aa3773530d670f11d2ffd89406d131e1fa76ddfae083de70fa20500e42b2a07c0472818f1f90baba3738089ea1251dd1964e3bf592e7c11c3aadb36187099a68f326a97a611b65e55d238b997da955bbfe2f083db7587ce67f08edde215387d21f08723efb9db3c5f095cd69e460526102f68756f63e4a5ed18f4b1d1462a3fcc2158a3645554ad382267ced623cf5c7cf2ad688d3f325869c2357173ddb8478e1e0b11bc89dafa90650e245452872ad858d5fa616576b1b1ba8f7f79f0da6c6f96f266ddc1b8d39f2d79af6526afa093dd10d240c00464233b75ef264445689beceb2ff8b6eaad25c1d2d1b7e9cab179707044b30befc6eaea2c3d2c44ddd29ae1737a8eb7c7fb1ce253d6d06a5f311955f6bff5240e7277b35464560ba9e506b920422a6684f3aed69796bb05d3544b371cf8b6881ec2387786d8bdc19a896da255684246e3b4f5bb0d2e2e5131d3a712839770102fd6328e830b54d060941bad35e8a94e8b649a5e7fc464a98413423629c5da9080ed617456a3988838109fee764888421c917ef75f21409a5b4e3c68fdb1361862ab2d3c77dc092a803ddfd353dab6acf516a9d5c5c8d6e9dc4c55f149a562cdec389bccb50d43eec0dd3549fc04c7ccfdaf78994120eeac171a87bb229ab17292297f1836c79fc6b89948177f6cc8f5191e7579e0adad5cb5fa3ea600be338013f72be77de04985de924c95fdb683009e6214ad695c4e6a4e254401cf9f196a8c14d663029cbd57e6e9943e0eec6fe2a7d0337f03a6be5a99f31b50512bdb9da31311b8e37d0228d59662fdc7139a90bd9881b13dfaf58f40b15b43acef3bfbda0563262fc65a571f78d295365fc0e468abbb8fef480a9e51487c7b2769773b58316816279f282a4a48641d1d903060c3d2385576d0ad1971ce9b574bd915509f5639262284cd5d8a6753bbbaac55ff78f95d3fe4b43398cd031e782741995a35334a3578f7b2447236616b81f9ef368a8b7f4900fa54db34a215a9725d87ee02c86220acc0f6d2aa3b5e5789265f48bfadc3ec76aa18c582509e112e3200a74088d6c2bb586242f9bcaa896128979d6a13e573b7f39af129dcf72749a5f21d1df47e6ae5b5a1203dcf6ea2adc6c39e2f2cf3b0349ccdb0d392eec3ced4293c3ebaa6508ac5f8e590aadbc457bbf16b6a5ae63431a9f7629ef07451057e15883c8d05f0e6db70613582b433721d18d417dbf816b88cdc8229f2ecb49bcd139f8a43cb26c55adb8d997a50ad4a3cdaa646dd2f0af17faf9f227d9a0706cec55b3506c9fad5b3e1d837b55ad2ae077346c7b02456c70ae2d7d0936a6b52cb697a8faebdb67e8ddf7b59f842327fea0d384e933f5525d14a15664ca201744e4e9ae0f84ef35400db4f0b36caaf7006a22b3fe4a5b58be6874d23a0e46405f1e54bd8bb2b83483397899deab736e391d723f40c7429ea27e35ffd3b9bb4b9c3b029ea6fbcad3d5c3444775939a6f0f26dffe2ff265ab1717e916394a7c9dce89d8f82686e66ca66c894f842dba1efe776377545396a2bba1c64cd3039ad8688e9f32256904e77bd5cd10ba1b0e41873fcd0f2181de8bdf25225e98a61e7240dd3390b4f19d8df52e7d4c01556796c7e390fd6e23824bde4a65b7fcb4e51f239ae19fdf82e1938ab98b6c9e77c054ff0fa2e516720d9ca3c6c991b58129dec869661428c2e95c844a4ec525a96fbd72a7c3279af3069d2e5d938f867184df90c134421b9856a637c8e57dde2ddf60e7e46de8dd73c09cffdca5d9c092aacd7d92b25381c8c3cbf7509308b4b99a5adeefc73d18a859625e53967703f71b18ddafe5f77df60aebba43d43adaeefcb827adee63d398ec777485e4289508b5e61558353d1f05a86c69554c7cab6a908f46553f44199f45acd9cecceb993a569de448f2da8746728d17d694ab3598d2024063051da5249c349bdf3341c444cfb8d1f359decfced08e104e09a36133ec82e298c9ccb304802558c36643e0c7c136ebeb57c33b1b44ceca9aa6faba1e18ac3055bd61afd2a9b937b55b3eab9aa9833f8e93661f357897fb257b888d70ff46155d85baa3c1c40a4f9d2353c9a13cd4ce022e9603b143116d6c9b9b1e4d3e58f113e0c963f8c29daa82093d9e3fde6958c4b738546767504662860c7d25537b5316647214c3d87e14cbb05ecedb896a38fb554f085a69a3a42635cbb44ab5d86e97e0013d9ca2138cae1356702b1e9992825b01ac44dfd68301398623ad1b2cd9dc6727553559140061262766ec4f37765f635f0773023741822c38dd3af790fc34c4f295b75b53ff35b2926aa8fddd8ab42ffbe9bf3b0d326d989da55438a939c4007f9284cb6dc9c5d35f9a52e627559b1f12dbb2632658e82419861c523d93c63852dc715f7308f637aa2d5ec075523bc601108f9bf0c4b8a7f8faa320884fb6541e233b8674ba62e57f276f7b5b8283bf786ec4b12f7f2f30cd6ea2242efc4f235da8ff6e8de993d9b28ea4fea46bb456195cc36243e58b6d1bd8a79293dfcd88b20d91333007cc4720f799dab9eec6befe843070583c80437d14761a9ab7305ba49599da47ec44a132218547a46254de2c3abdc82873bd8993f230e66c9dde1acdc40a1563645df5c3881f9f09225d60d9ec28d51aea2e26c339fc9bf8d93b60bd7a3aa7270bfd83d7709d976174855d9c8dc6ec66ebd2ca8c3e98e5275d5c24e16ca124e574ddeef61125340c869b1e13817bfb0f5246142f006b34d5e0f8d1b6c3ecc89e2968f86c079fd27dd909387b84df2e92fa6c788f5cdde121b55c17d29eedf1c7f9ed19273130e6717cb4088356f76c32e32d5beff80b192dd5a7cdfffed193e6682a0e0f749533791eb2036945445228e6fa9c9df953a23d80e916fe69549d3333fa8fe8e17e9570ae8e714f1c1b49e5634ae7b8b9b2e705c597161da54d5c2beeb0c737c621a43b8113ac28ffa07c09c2006dc888b209a260d4ab2e5b55285352c9be4c8edce8d2e1aeb386ee106801ca1d942ae8deaf21d76310e8f3b84c53967f1602a3122c6d64146b66021e11eab0e8e3960b2ff6ec2afd01378def0ecc947d2fe0e0bc80dd84ed0b7cf583a3685f287fc0dba56a68082db8229ea69770ed6557b40f647087ecd58e10b60e681a9d3349fbaae1b3c26a748eef33c8b5588c50cc7fd20d2c5a662ea0a36e2110e94bf1aaa73d8bb196176f461ba7fa668239a29cc65270e38ab5e2ee013e32ef0a3923c6aa3dc3b2f9170d7024b82e2db9a31280d88746f7545e9fec40106ebe4597f20980d42b9befa9f6075c94da09b83e6b823b568e463c48159891e3c0006fbc7e70f3804559d89b74c7191b41756de380ed0a3d89b6d7006bb502dae3f8966fc3803edf66c812f26c92b23dd80f65c5e57aa591792beb71c64350e460a794000cdebab864e2aef405c5c3532e1cf1be3db2e505a745f52f8e154c8927ddf11d318845b0bcc2dd6e7123f4af342e49fa981fec49ecb8b343cfea1a1693a3d70a340a57204027fcdb1896a3ac6bf0829b89c29177bebd2edc6415d4b17c1f5e7638444f734083603a5af8661d86a45880df5ce31c526f486fa3db655e9c721eeca9df534f19c1e29662c3ff6138e5d330ffeef6dac48f80c28120ffb3b8680be28b77c19c145b2e441d5aae07678090869446c5c38f17e42e41246aa647d614bec866947f78f123452bd0083058c6b793927fb0cb8893c18a808657fe965cb35a89a7c1a52f302d5df2a3e0d3861cb38385027ec9522ef66047a0bc24e8c3de8c8381ea9f97c700481489149e7ba59d64970b7ec44557631f1f6bc9a76109027cd6dac8563d1475f791165df18a50d687c9095b866cf55dd4ac227f07a9560a07689453e1cb6bea5a535681ff2123043c465967e0fbdf1c009adbca96443349a9ac5c39c524e4a0dbed83ceccf9c4817b5477294dc67284800a92361a83c7475b8743b5dd02132362a76e1a5ffffa9c744cf1395ea45506eafbbea8267f318b76a4e7582e259c484ca39c3c0dd87200a9eb9975784ee38894fd9ef21806f8de03a98009dbef57147f8356e26cd62bfa95465752d3901754d537622fa2618affd4f816f1603d563df16edcf7f04edbd5d92cecbab2e6273daa7cda6c333408614740282ac6d3b9f7a62ded1575cad7fff733b6ab86ab6075aa0990443dc5c9b06132bd230b3eb3778c54c9d8a8848195073ac0596945631bb68296b0661be0a025abd9183bfe034539b9b4078f970d7667440acf1f77813358a5f4127a843fc976fb1c9e4f6c1ac2b98d9ca5f6bf2fb71811e3fc2a83da8479fdadf2b871d6211850561d66b1343ca821f40d059db0de362100e407192349548800aeda9b5e140059240b05ed88502acece03bdcbe5123328d3185a38ef96","title":"657. 机器人能否返回原点","link":"https://leetcode-cn.com/problems/robot-return-to-origin/","question_id":657,"issue_number":35},"33":{"day":33,"pres":["模拟","堆"],"tags":["模拟","堆"],"whys":null,"difficulty":"- 中等","description":"```\n给你一个二维数组 tasks ,用于表示 n​​​​​​ 项从 0 到 n - 1 编号的任务。其中 tasks[i] = [enqueueTimei, processingTimei] 意味着第 i​​​​​​​​​​ 项任务将会于 enqueueTimei 时进入任务队列,需要 processingTimei 的时长完成执行。\n\n现有一个单线程 CPU ,同一时间只能执行 最多一项 任务,该 CPU 将会按照下述方式运行:\n\n如果 CPU 空闲,且任务队列中没有需要执行的任务,则 CPU 保持空闲状态。\n如果 CPU 空闲,但任务队列中有需要执行的任务,则 CPU 将会选择 执行时间最短 的任务开始执行。如果多个任务具有同样的最短执行时间,则选择下标最小的任务开始执行。\n一旦某项任务开始执行,CPU 在 执行完整个任务 前都不会停止。\nCPU 可以在完成一项任务后,立即开始执行一项新任务。\n\n返回 CPU 处理任务的顺序。\n\n \n\n示例 1:\n\n输入:tasks = [[1,2],[2,4],[3,2],[4,1]]\n输出:[0,2,3,1]\n解释:事件按下述流程运行:\n- time = 1 ,任务 0 进入任务队列,可执行任务项 = {0}\n- 同样在 time = 1 ,空闲状态的 CPU 开始执行任务 0 ,可执行任务项 = {}\n- time = 2 ,任务 1 进入任务队列,可执行任务项 = {1}\n- time = 3 ,任务 2 进入任务队列,可执行任务项 = {1, 2}\n- 同样在 time = 3 ,CPU 完成任务 0 并开始执行队列中用时最短的任务 2 ,可执行任务项 = {1}\n- time = 4 ,任务 3 进入任务队列,可执行任务项 = {1, 3}\n- time = 5 ,CPU 完成任务 2 并开始执行队列中用时最短的任务 3 ,可执行任务项 = {1}\n- time = 6 ,CPU 完成任务 3 并开始执行任务 1 ,可执行任务项 = {}\n- time = 10 ,CPU 完成任务 1 并进入空闲状态\n\n\n示例 2:\n\n输入:tasks = [[7,10],[7,12],[7,5],[7,4],[7,2]]\n输出:[4,3,2,0,1]\n解释:事件按下述流程运行:\n- time = 7 ,所有任务同时进入任务队列,可执行任务项 = {0,1,2,3,4}\n- 同样在 time = 7 ,空闲状态的 CPU 开始执行任务 4 ,可执行任务项 = {0,1,2,3}\n- time = 9 ,CPU 完成任务 4 并开始执行任务 3 ,可执行任务项 = {0,1,2}\n- time = 13 ,CPU 完成任务 3 并开始执行任务 2 ,可执行任务项 = {0,1}\n- time = 18 ,CPU 完成任务 2 并开始执行任务 0 ,可执行任务项 = {1}\n- time = 28 ,CPU 完成任务 0 并开始执行任务 1 ,可执行任务项 = {}\n- time = 40 ,CPU 完成任务 1 并进入空闲状态\n\n \n\n提示:\n\ntasks.length == n\n1 <= n <= 105\n1 <= enqueueTimei, processingTimei <= 109\n```","content":"096221cf5b628be1e73e8bcfe626c734748f20900a3d40987a09637f20146dacf34851ebc96472cdec9c7be126a0a557be330cc8912f5ad2b362f921bda5ed33ff3c666096c78ee0002dc5a98cd0497725e17c8291a5419d24ac6aa48de0efcdd0e0378e9a7b1dc1c6b9d8afc0bbc8bd7ebcc3f2c2ce2e00fa3f520fab239e7a9ad419793b7c193140c6ed67c90fe621ee1c538111540b3292cc4c3ce0e5b101dafd712f05a4eb43276440ffa8741a6622aceefdbf543e3ef30482f4e1334e1b0d179c3bc5c61ccaadc55d68e873770f9d7f916816418ae06f4cebaa3b532f871b3f30ca1b348c6e47ab9f305a230f04dd8aa42e3d28a6e7cbed08ffa4c2c728239808526a2bb741c6aeaccb8f5f323eef8ceb15986fb60e1d12c222868f6d955601c0886caee3c72bc45a7a41f047248da7743ff3b165a3051badc11ed77dff7f4be0c3286c085cdbf1655c480e961d2a3051084565559f1528fd853805699de2ef9728a3dd17c03d25446a385aefcc16cad514af5b2ef7ceae33b86d3348ecf066e1c980b05663162ec02e5be3051081321cfd988f65bb806e0ac25b5e48621206437440319c08d7d31f189affd36cdaa7d2e2aa7dd8c486d79a720557cae29179fdff884cb53d11896e0846293f1252924cebdfc5ab46f64de99665142f847cb2162e9e99d21f8ba4c96a2b2b27878f7a43c60e7c65defd4ab24399ad7f99a462443b4fc735f95ef44793e9e29a4115ce86f99662705f984ec5ace3c6c05a8305267d95a385cc4c5e019595bebb0d1a70645239ca61b6f762120d46f6445e705a50cf9692b2de362f1c1e42da21655ef663fc4d1aab21f9f1457090c3722f5a12cbb10cb6f9a9b4838963ede4302effd6d3fbc4dad9df08163c710b5e766e3e88e5557cb4d69aa9296771870aebae8c687d71eb04c877fa32baa47aafba90448f2b19b16a6d66f4b6998f21156808952813c76dcaaace9179eb3ac8ac4e432ed3209c46679956abdd595cc22089b11214247756d16d73eece1c4fdf8f03abc150decf15260f81ca5650086f409c7eef9ca12bcf3f00141597d63fb5e701d1576d76bbac50a12ad4378df373c57b1dd681ac8657b3452cea988c865d12bd0c77953175650de856f305b374a229cd321d829ea43b593aeed6f59c7256296368414a1e6e56ebb29a055467a0f48732f15914333010c2e25cb24373b44ddb234ca8d0c38591c2b306ec44cec5cfb248d6f1a8f11369fd9e039756a73ef6202be47b024bf83d520ceb270f8db0de1f1116cb83c9fb4e1a1febb1c0eebae5f73489c01ea0d87e51e74e810c0fb8be1e9989c54eea1cd279283156ff1bc57b2fe228cb52468f4299e16d2340d5f3eb98f3fad2e2e7464ad194b28db016b82653d964f7e290de50cbfcf9cfcb7f5ffdb61acf8d4ff1a6e56f1955e7916167f9f0fe8bf8bde2c130026a578a37a3d728cf65df5024435e82322cefe565c013ba93713a53d360f809333700567f10a7b24434f4ebaa86c6737695c467e46b68693cd515ab0cb181da0a03b166c7ce0d4649f55d90d9eae61591edd434a6d05c0c58cc6802b9ab3ef2ff221443181451cf4dece45695b3c0ae1d7fee596f23768d849957a731496a3029a9c5d4900985c6d1712752e1158008fcea9ff1516415bf8340ead68ea2c2818215bb2e88c0e7387867333a32c3a5d0691f371b728896f8178bcd3507fa9272de14451468c2dd008e183b9a05cde974a22c752a341ac43bcd4c361ce5dee70d51d9ecdfa5c198f0fa76fc4d8c764c2b2803600ed77d683da224bcb0d46d4182867e694c31c9183baa7e4ce5667e632f5ec094f5af471a5312099ba2b165a67b658102f6211d61059283ef3b5241374581f239f4d2e936132ea472b622fa8ee13d5469f6d28ff85af2ade4234db27118cb40f13e38a9b1dbc49ece1c77bc2086c8ce49dd939c00d3d213308b7ccc70559c6d788074a10260d08a1badcf517b1a4e08d37b8c2481435c9cf74068e5dbc592509b8de5de6ba873a4289f032f28b4fd96407ad44580a5a37bdbfb8e4398e84d8b09fbea04ffe5a47a5749adc8e5f977ed6353b89f754dbf7b9c2e0c739d2ed147760160045d92db9df0c6850c0b9cae6a00a09b7d1ac555bcb0f8b980e9c66fda6907d4cdc71bd95e35fdcbff584513f772df5ad56d2e71fe3c579a5ba9b97d68c0e504e66b4c826696d7f9071693404e9620ad3889ab6b2b62945247117602732d083020a414590ca47ede17fd75cf24792b193363c97c5737959d01182f4dcccd04faa31fe0917fbab0e0fa20e26593fe2bfebb5098a855ea9f5a1a34dbe396b3a88c0c7b883f4f3c4bdbeb425bec00974b036d376f1bad46d7bb32e6522b702d866bb3fce0ba04d921f535ad69888bcc1d29aa7c236ab176e736437527fa43ae0516a5d68a45a56af7d1f6ef1faacf7712918f516b2513e762f15710fbfdba7f2aafdd013bb7c615c0884b17d6606ac0c1d7a95d3f6bf5932339f4acc4540e00d6920d3378b46fe1685c5f47c9157dac9a00f5cc0545c7e0699c4a61ae6d5edf0192eb69a7d897f73af1152a51f3caf62cc3b9d92b5237ee0467849f7f11870f18548e5cd957961608f074203cbe460ef092d497f14399e6cdb7643584f02dc400df824fc465f9b52de703cdf70f75f1ae37927b9034bc28e88fa9de8782acac67d7a098d9306e9117bae6d7365fa42c4e41b59c61959dd48a1b1a5af65085d7dc4e506b99334459e4e9c574d2ad605029b896b960abcf3d26198ed8356702847f1b890347277d794c6980eb3b70c66cddae17114208097a422b790598008f847efd7850704cb411ebf1193c1241070f40a9a0b14164e3d7f37a22dc76a145d7fb0d8cf1a8f40139ec83bd21c6ab728c71895884e226b238978de5e8a25224207460cd4fb32b1ecf037dad9eaca162bf4e56935fc8cfba70bb37b8a352240b6aaaa9b8492bccd0d009cb1d5f22355e3e6f2459080777c1fcef82f17d2f9616f44765724c516597f9100b52dfcbb5dec8cb9165892c25c853c82b7fdfc59f5b09500f3114469322c3010d4b280775fc41cde5038c2ea73c83631df00c1c87d47c55115c7cf12b4d4b68b4e69d3d9266860d4ffc17ac4660fae436f8d162cc8ef397f5fed6b8fe8430d7b24e81d1c3046bfcad7884f50c9172602985917c94e2f4cf8b630447858718686f32fa5dcc423d8b55961e75677d8d2cee29d85c6bf1b12a6bee3c8f7d67b99caea687af6ce9bb894c28ed39cdcc011c2d042e92429c978a89b0ae3a478ee4876e76e436078dd258386d9d711b94c08caf9ca5379cf10249f6dd64811539175ade164e621415d6a1a3226121ec4d7e345e2668977bec901aca9a665c149c6c24d6033b1b5995ca8d9da7901318a55345d221f292928b5d09c7f187ae9999d02a7fe0f7cfef2636a18309c737bbc4c9a80974404806a19434e2ce064eac061a89841f4eee159ba2c95e6fbb8b97937cc64c5df87e074c3b4788b4e339f43249dfd267543b62585762d20c723d43afcff3071e618e52a6fd5e16a24f0e55fbda6155160394f9353a90950e33e13a37e9572ce2af426aad6f52135a6df98237222fddc755b8072a2fcebf1df71cb0e558456773136e0c734237373d50e0322a6b566e5fca8bac5d31a757ed2e963c254ce14443501dda53a7737703b12f34231c6ae3416038efa7a0a85e096af4c9f8025b8058a54275c62441499006a18a0d0997030fcdef542a6baf6d4c9b014d4fdfe52902bb7d223d03f72abb2764d55f1e11da1c428f81f4c3b3f2edf5fa10cd1ba7494e6174c337e961d7201d1b2f0bdacaaf7f5999bb15264530a704eb7e5dff2ca9b04022d9296e6c1c395152fecd2af5c3c2dd7686b09ad224911601e3938c9bca38c475ee9799e66d2db5101d7428275490ce75d691c8e9253b1f25877260bb8622f2fc81027bd52cae862c6d8e6157dee99f714fdcda22392835947b46eed3071465bed0f9e29455614c875489ecf1ad2a0fa031d822ccda47c174122d29bbd009b3ca6ab6f40a4e4f987e15d9b725f7590d602fc640f8a9c93d906dcd87dc8b645b8b2e97b56e4c6b8ca51e2685981ed521c63398dd6c3eea8faafb44551a4e0f0a4d7b57abd037f0ab5834c31fa7bdbd0c5ee83945a9d51cd0346eea58b1871f1f3647783b118fe889e40bcae872a606905bc5f546aa926d40cca2fb1e05791d61415640d1ee958cb31592bcd309cbe8e987f28accd05b13599646ce4669da7794ae54ac963d330920d910ed0c0fb7e4a3ded974abcb4b77251ee7c15d43da9b17a1d4aa281b78fe4499619338da51b83a38e4c07ea0a54e29759211ec2203e3b38cba8de4131cc94137491c436c5a264cd5e7980e873ae27767668064aa92093808d2b119ebd99e0f12e9fdf5ddd7c697b2b02f346f26189de83075ef4da93787e5cb4c603271b5744f0540175cddd443460393681fa6594962d1e6c0ff06b92d3d13ab2186c11ecd2755ec86c1eb70ab4c3629fe5f768c1a4f5c4d062aba41b449eb058c3a844cb1461a383a273b2b8bf69a26e7f3899530a69a9c1153af9108d089099ba295ec5e5ac48a98e2ee2e1d31c9253032ff6bee433974b7e0cd82bb3c2cb5be0783ebbc4fd65a5cbefe4922517fae3b24b0223da127c5627b4613b4a47f837831856fff58451b70168d9ae3ec33618e6072c7a94468cf29e0234d8ab99fb27c2964eaee1b4106818b3d9611767a75ba426dc3148730de1e8b1262da50fb860d289e26789de06d8e42b1e373b44505cfde545e34f91f5c61e13351bdb8d8a28272ddce42fc5d82498a6324b6416c401d31b244a39bc1f977721ed5ae38064bde83d04902b3b8f3928b4583d0c791b56432e196df80ba1917c526212fb219137d514249c93b4ea557a4cc1e74e29fa3f4b08db4ffa36ef49eccf3612a8b916080e85def395c6c6b58a3ed4d59a470f271f9967d1d72fbb0cb609a844b4e98cd5295ebb683f4e1d9dbc1d6645de77f4b899c199f894032270c7576e75b65efd8b9f526c88ec92d6cbfa6d2e42818be27dfae41f3265cb361607ba2116029dffbca951ef5fafbfacfe4dcba2191a837c147cff5f0cd46195101f5d6bbdcf854afe6f73117a145598c7529dcaf7ba0ee8fdf8fd3b2afe5a3342152a973e34ae7e07cf45171bf39641164300fa1ae30562903b8f9b82a0a6624f0e3427fb1d3539cf8d24a1e8c3592589ff0250b70bd3691c6ea75914b388f67dc3b13a2a3600a44615b2e38c99b860fe509353e02cabe837250cbd1324cc0263b26490b20714c03a9e7eef5ed6ca1237b8b4fef9f432cc4d7c52ab44000071b61b955167ff9fbbb7b8b5aa4fa38aa9a341078c2233e76b112c9d21b7027ce114adbed1b479c4f43d1cbcf3e5302bebbe090a59f651cb1b228d1d90a89b561790ea129bf5e9044d1d3346b1ba5af7930f7753e2822ef7a05dffc11fe71335616cb63f8cef16bf6d7d806e299a3e60b22a07cda83a9596876251410496955b8c1992ee22376decdfcfe2c790bcfd9443ce72dff21358a8ab81c4bb56f550bd335bf03a8dcfae191cd4026a008590e3912d3ef9acf302e90f40eeeb82b47a32f3d4180f27591ff5455390e00b35e48e76a70e7bb1713ff389010ec5aed5b057dd1d6d39bca978c42cc2867bbcd6fcfd2e732c3e2ae8203b13953044f7407aa4a4d8b4c911c57ef8cae6a26674ab9dee5b19966f93f2b728c84b6c08bf19c26739ddc25b4266123209cb9d918d4a8bb7b09f36b7e17d5988d73cd109551d35641d7f6713f7f0f84f72001021744ad952a0349f5584cdbeb923863983016f38a5eb1523c817e0e87d1e9ef8226352930f201ae5b1fb1268be8dbeb6ee18fd26003d7bbf27f2c4d1b629a5796d85e8aff52daed3ab24208389474cb95464b75219f8991cecbadf4ebede65b23ed765153320f49d1a37f42a2e5cfb33b5d19614d872e8c3e0c06cf01a582c658d7d881b2088237a902c8a14c988459fc471c82b97b07de936450eb646c37f5fab100e914ae0107b453c2fbd9b995f9e6cea371fd61884f9f4cc2be95dc49859158a2e0c4009689ef6ae4895f1d4f200949e83cb8564b5efb55ef7e43c6b384f7f5304e1f351abc28e50042e9e92917f7aff312a9025244fbbc89f012ccbce51be1e347c4325ce002bf893de5673dce97b50f026b232becde3739fa3fcd4c5f068267a3c7fe321fa9263a137dcd2f176a8dc968bfd7ed8cdd35e3ac5126b168c63df85edc48d067d1ce5e92b6396cac77602868804c0ad8413c8f40c730c49c0669ce0ef7ef9a17d162da24d8a8b66adbc820b285ba856c50036664b6d637e4dde6898cbd3ae19416ab5eeedbbff71cb896acb758cf5601ccd2c6e9c2a74f53febbc003ad94d84622bb3ff93db09ca4ae4fb9fc8fe46c0894d8eefc373c7803ad631af5b502da1cc66055e6b3f926d43090019dc6cc3e65cac80b5f85270f9d119084d221799bdbdfc3e8261151b768ffffa3e064ec275e1cfbdad6ab0a8f0eb17f834d2a7053cd2a3d15f4f81be136b731d2813a457296a684941a41a5d2301a5700cc7c47414b82373467fb58a60975ea0a0652190d7e76c7ca1cccdcda9df5b86f8567037de5546f7a33489797750be10a28c9f5ac09ff3c08128d3a8b9a80425e5d6e9c1ccbe93698f7d05b1b0b7d4022978796e9fba38c3623d20ce97e35f4450d4626b0d30d0de6295c90142feea606a21d2a9c8b2dabc2a00ebc3bc0034d083e2f17ee43b7c9b0e1b42410dd102230d7cfbb917fb3b6a20e16897184881361a7b68a35c9c326c6b363e799999cb3d05c991fc63dea5c43814e2488f0233d17e399b199e3f122ebcbfcf9800982a267065a29bbfb75dec0e241fb9992e4b8197406f99fbbed59f963891f5f660f452a09606a221e0eb295a34117b8f351469534b7872bc1c76ac099e3cd3a95ee1119825318f9d0fd2f70d91a06ca136688694dd32733ee1976de81d5be9abe74164ae2c08cdea1f424f78efa1ceae93ec63509735aa1cc1efeba7aaec62bbcbf4e0c2b517cea954df2f5a2f79323b1b51d7fa1c35612953505be688d66f6cc620a7ff2cfbc147b8ee09d81e79b0346e65c4b9f8134b09752b248bddf169165d323ae1c1138caa0d54faad68cd5a0a29a3093c6a2a273909ffa871ec3f9794c2aeed59a13176bb9808a6034165db49f0972727bf457d88b97c76a266f2f30c69a659c3907cf208d25e3db6ce48cd6219f8399b3a7f83c00b0af7ca91e2d201e18f72a529f580df3c2d9c440c0db942e61a3710af5dae9a125d0fdfd122a141f1c21317ad7727e66111a1a442a231ac9f0ebb8a00bf5195cb93e534480d4fe9229151e9fbe25c54ca5bf34b2c20a6b258e451077f7678821e44c6363eb099d1d185dabc87d5a7de4e6f9886aa36d2faf6f02e5668d52046edb90566f8bf4bad8e174e683ebe988cb82a7613547b3475f9f3e1f684a50999c4742dbfdfb95b5969c3c1c136fb822c5271dcf8400cfcd48d8fc3fd46a8d76f4eb8917f728e532fb81f82f5d7e0c2b6c6f3a635972c13247ee8c66732584904f6a5c9b0f465fb6b550a5158e3efb8a4742ed179f5c629b1f8b165a43d1e26a66972bfa2a23c5c34d8ac2b4e0e8ca6b8cbf09edbee560225c8c1a79e7dcca71a738ffc41617d6f168320bf5c4ef5936068ee608ae88b2286a5fe22e580c2444a9493c492600b672a6f068252054b75de9492a072845924bb94e286506fa040c5e5d8d4564704140158612fc9707e4691506d0d0ae414c2429704cfcd0dde49bf2735b12f095f96cbc4de42b093188656d8973a5e174215c04cfffbdf173199371e5b9693ba1b87cae86af0f38f79b8c9e5d18fde4bcb4a6243f9755706ab7bffab33773f2017432861af9acb51c335e1ce0c0c4aea73bd067d00616f815dabf44df0077ba6dfe44697115e0abc24ef802f49bd473299f0f1a2d6fe20977edceb1465889c3e8f0726a6f85ede4d17b0d4f4e119f9b089649f8b810b182f212a8d4569a36f03db096d56cbfa7f2b7a973aa17b44221cf6ed25a1d03d77d904932289ea3d69a25bc6415765fdabc8d7da02baadfb2521c49efaddbded0f957b5eae4f2e3966e62bf2bf3db267df0694b02dcae490f8c15f6bac13c801ae7f1029847da0f47d5434e7207c20f7285b065f883748e8a20ebbdd2adf5b10982403db167c8c757e89aecaf1e8f7e6d1f7a7823fe49e49c2896178d1c15c6515f3a36e731302910413f2a42bc5498b8d7a054f8aea61e84bbf0c11e0d05d2839a3c7ef885b8f6ab42f027be6ebf97064d2782173b3cad2f91977ab0c906ec6c05bb3f5ee2f173a95bbd80e1d6168bc676e37c5fa1e16f1d5f8943ece137348ccdd1a653c46d4ce4e2d82a1ab45614d85cd3d146995f0e6473473d728ad2f293c2f1f658661366c627000065b80abc4b9133b2b501d85bae3ac522fcbbc87bc5d14174fbb6ebe7662a6bb3b71a5e3795ec763235c8adcce77e92ec0b94fb194f999ca606661b79d2ce3c893ffd4ae2c83ee28ca39d80942e1fa3c8032c26665bf436bb8161690a214fef60022666254f24773091643a820a93dd3296ba3592b5ed1d283ebb8b0d7e77fb332db3a9459f9ddaaeae54ee295326a408833910051d88f9d48aad576e1b38d3dcab18567047b68a2f66fd6d1598606f7afdbacc94a4d57dab9173c68b7271d57a9b8b73c0a32104813e22ed92eb8127a0cd8e8354897b2f23255701e75a5f9fe26e06fb0b1f1623e444514f1548d0117fd61941cfdc1ad3d949b88c6880da3f27e963f0bfaa25e641fe7475c9bb24a246fa9a86363b17555e9b80629e6098db54278c2db53b25ae8cc5bda06063cd1b81971a5d5f69590920e4190faa52a1b9dae60550be73215b0a9d9d0ad96bb24780deb44375f975db5799cf458945269410916613dc1999b6d0932319b7bd49e4a75e581bc7fac896dcd8c8bcc49a8b9b9f1f2e833d54c55bd7de77b0dfcd476a99720a812d2ad7650435c6c1d75318aa95497b29c54947e6484dca2a94057fb12e86efc9e70b8d33aeee254277e55f9855413d8360c7af5291b289705351cddecbad08b88a06a96243cf8e0681368a7bcf9a565e143b624f3e5b08e0e07211ebdd51d810a5a129a07f440617580dff01df6fefc1ae3215007ce3d1d251b960858bd1eab6458ed1fd29b0bb0e7720fe3004657561783bd71d30b68185a9b0c0a5a8c9f2ce817e1d4fe261c824d83a4458c6ab256953d4912d41707fadd97564aaba6cb49114ad37da8241ddc71357d3f0609b51ddec4f51577fcae6064a3b562a44982ce03e4aa964a9cfe32bc406596acc10498f7c8a1025c55dde8be29fb09bff60833ed3ae6598088ec23ca9481fe3b449e21b6cfb5ca59b78a58b6e211a0e2acafc47a85c074f8060783500782526e5c498d32994e308ce4c56d1fbf1c4de03ce7ace3f3367242696cb1677c25a31f04a3609cdc82c8a0c1ba2c96c2f77592b07271407ec6b3766d121543f44cc4b5d622f5249230cfdb3ff78cb68d4a7f77aa871df741590498bfc259ff2e5037af10aceb6d45327745bb29952ae03d95194de3454596397e60771617e8cc15c2ebc4c9513e555d87a35e8d733f049fe718e9bedeb6e7839be92d91d768455544f367a85b011e9b149e0f1cbe8d744702dc891449db1f0ad989910b1fc2cf3d00d418b08f349b556f8fd1d775f304643fd70e083878c7fe2ebff77d060a6189883fe3769de7ef304c59d87892da9ccdbb8a00d9a3205ef785f02a8ebf46b2e00f20a758290a092badfc35e658032f5d6e830284284d6018aeeba50715cf0a141e6a54d1dabfd11a5977f4ade2b59fad3c21294015ee66e0195d9d1970530df1843332a8e25fe98b4bffdc1cb998e86fac1d875c0d1f8d0d4a145a68fcb763e4b73d77a0ab3860215a41b6e69f1b384d8086ce6f421adb0e5b8c86854f937de24d2943f4e03f75acf9bbe35896fbc61da6f6071736fad1c5c1755d7a1c3996ba5708f05a1002f7e080fa48ba609d7c6d5199cf9bcd09e42b3f21174d6f31c176de51573edb67504c768d73bb2e125fdaa7724dd36aea4e8f4e27a8eab393ba5ef48e0c96f6d60d9329f5fd8ffdcbf97e96808b853092486c2eb4db64080cb7ac32efa1352c2a58bd9312052a16c09a3956349edfe5b24ade6d1cf146da76eafee9f6606f93ccecf29998ffe28db158bae6f61ff6ad5f7071a32a68432d06c17b7d125d70157d9e01f6c809fe5b39a04e1ec1236c223f3e2d307979472f1af78b7ac51b981e9e2c19d40214ee550d72bb273bb3b8ac366290d70025060be958b3375b434681755724f86593023c0bb3ef2c59ad0e3504672b71df6b4474f24e88cc1577eb88c546d4671df870ca95e11b0f5b7a934e38d4b6354e7c48081a6125019f545a7067a10245d2cdf2f7081f0ef083c0c4b6fe338bb044beb86bab096468e5fe26babaa9786184cae6a7996aa28c752376176c4ce19266ec7cd14bd8d5b88dc2f3e451c3fb2b33bad4b14255f8f945fd852a063b43a3bb55f25ff3ccd54e6b4e9b77ee100b6915f1b5068d437c5cc59ad6b6d626ea446e992415e5c1f52e6eac6b461002f0a129b6c4cab2e74f240a445234fa4d7e2ad15d8f45cc79cd54434eb74304319a6cf64bee9d1cfe4d9b4dbb44c73ee97b32798f7ef6e4e0363ee6926d6a9c523682ec0c8a53a7674aee045a34d70a0b5e2e584f3d72c1657265a469aec73e02055828953602afa3d3bb992a638de5dee41bc6fcc2473cc9a4d7404fdca8fa13d88b1d54dfd6eeb761979d7d0ef9662fbbfdee203f9d708f55f18e4776ebf39dfcaff0cfb941b996b54c4f665b0665068754c646c5dc7902b5d4b0f4be89ba6e8ecaaf495800026d14651db4004d029b5df4d3a171b44db6d2d22a6c3375fe52b6b71973e898eb0708bd99ad2006fe74a92122d0d4c81115c2900d1f099dae3961723cacbc437cd55afc71db63572caa712eb52112273bc6e4b8371c92193bef606d063640b6b5b53595facfe32af7de37104d15a7af75fb26579c601d1442dac2ed74cc8fbd94ddc3c6d9278b3107d884ada224db598bea87c34d9c706231936c0e60f0bea8058f9a86e101d321f497454801878d0cdf8926c6585d84760c65b2c1e250b6236773a487afed08992992c445181b1113133f3e2dfed7ddd1bd202392977cbe0f6119ecdc5bdd48a12d4442cad239122bbffc402931eb4da73052c0968b34e24106b4f2a34fbec678ac2021f41693fc1dc01b60df8f96598f0128fab5b26d3c7fdbc18822d700a1e7882964b4a86a59d4fa53edcffc1475d9562ac2169fbb411cd49eb258df32da28d224f1ab7ad181cbe42121305a4eb787a67e4d7949434dad07eeac1d502bc34e74975d4728fc68f0fcc57b7f171d0d285a91bc8e6e82de215ed951df3b1655570f269904bc698dfd1ac89d59fa016a62a1141d213e41b22972348cb32a654e880eccd7fab2ad643752149691b2dece60894450b2f0b907a0ad87d9320f2e0045238c5b5f2933ed4b383df726155b8ef77d3688b8b455e072bc486525eb5a857dfc6c73faf102acc19aa8df5488a7bb2fd7073aff7a5c3c3cfd87c3f49723abb391ed69161e49343d68f360d509b30f8952f3c9561ef288169855142db03b52424256d98f9a74da5451661ac7a5602b690e556c28c3e82cecc94ce018c250f8d2c36458ba558391f92b811afe6e0d5bc5cc76a6d825351d9d667743295dab01f0dad719f0c02a570e0db8abefa54397381bcff73c4e1d2b1adc455a7b01ec572077522616520332165d1ebf58b7078f4ca103d9eefaf1746c11c714e084ea578f577c45bb8ac1e03c7b94e000a407abe4c568de13630b181e8a78b0466097dec22937b41277f27a699ef57503dc3681d35a424980a14bb8315a1fbf1d6c28e9eaa562eb334be98ee5a41d232002a8d0737fa11983adbc9446e4fa873cdd3da4a70b46312ede72c9313dad21864c79676c3ce256015fe6e5c09ac00a90cda13fbd6e9447b6f4a598d6950278486dafb9cff824514d344cdee598625a1d9787cced83577a5ec9f364b92edc78b683684e227415763cf12b9d99ceeede63a5ba51f7edb985193cdbea444f1eb59ead27de982fa71d236460700537a7aef795439c0e7a61346960a8b36fda71a3a5ee80361fc080fb9285d2ba2c495e046ccd8deff3c946b25f556fb775551c2a7b0ad0de7850ac4c866c0ed73aa7996e9d82a99bc6bdc62279371501b95a5b71bdd5ed383a37070b74d80c7348c9547ce85ee1a9bf9cd6cdd2f1c6da0781fdf6c66bb162cfdc2f6ce1b76d95aaf2834e1dc12876d51bf638330ed22afdcdb8e54438c1f8831c61d608bd38e771640cbb4d4a5915d841c1322b7b8691c542587ef4b669bb3bf1b8b51a736d31d6636b8e08fe3e9d6f3e25a4431f549297f3726795f1bf77b38ff019e647af0d91449324b40d2a5dafe5bb8446a7ce38cc6fd258893d9a1bd7abb56761645c213d56b373cc62961cfc14c85ad463cb3992bb62266633b52869a825b2f857c48936e7fee6163ce474fd61c472faf488f4c6ee773ab447054b9c9a3ef5a62986f34a791e8d24ddb44c92b213c62db4467e79ed31eea3d86adbdb487ccdb6678a3bb09733fe06d95717e1c1b98bb7bd44cab1f000d408b23f8a5cf4e9ffa437d1e65013b2e7c697612a9b97c47231b90a9ebee62ec4fc9c3133c7f14b8bb44976370ae9ddda5d9fe7f716c545d47e4fabf1c1403ff1cd49aa964969e9c54b02ff80d60f898c3a70ac2440326cc6033e6461b9ffc9bd0c30674da0ba4859db9edeca0ffa6ce3dc90e145447e17ea7d4c6e65bb60af91ff9cf37eca710091ed3606143a584d3c1acffe033ccaa94ed02a6c71c1e74b5311030268534008321ef329f9c053ff8a015a6b31e5f2e7001dbde581132be7836020876bc7c2986dd9b800f7b948a835589051d9228b2ee13667b657bedad192d282423c988140b6545693309dd77e06dd6a8780b30838d4d4192649ea598f5581d50d0a30cd22e88e87b783c9b63a13b4f2fce6b82ee63c6b493a1b6bfa1ddaafb3a46d21e77efd07f9599e4d62853c3a2d6724d5a38e3ed12cc283c5c949e43e49a1e4a05f26ce072d318bdd4065cd74dcf0b541fa9509025ca3dd0c7a20f7fa77b9dd9041f397aea0d5c7815c81793c637e9e0a2f3280991241f184c6b7867d5f36987b957c2f7e77c65daaa57a0dfd098896f0c46507a3dbdad2735e9f8585c04c791849d75d01114e595924d344c482310fda04a41a90e7d23b80d0dd9e6327e1724e566c1515ce6085252faaab07efcb1290def28101cf0d3b58d1018f3cf065a601b375a0eae8117b85c58f955905697e9830264583aab7ea1c125c0df0d6c8132b2e1506ce6592a2da9e7b4f3eb34d0a7794e6edaa83adcac1b150ad884f492b10fe1b7f8891ecde0a2a27f3cc5e1e2ebc5c2858e9a607837e10376810ffb6ef653b94a79c0b0a637a5401d63cb26c925bb","title":"1834. 单线程 CPU","link":"https://leetcode-cn.com/problems/single-threaded-cpu/","question_id":1962,"issue_number":36},"34":{"day":34,"pres":["模拟"],"tags":["模拟"],"whys":null,"difficulty":"- 中等","description":"```\n一款新的在线电子游戏在近期发布,在该电子游戏中,以 刻钟 为周期规划若干时长为 15 分钟 的游戏对局。这意味着,在 HH:00、HH:15、HH:30 和 HH:45 ,将会开始一个新的对局,其中 HH 用一个从 00 到 23 的整数表示。游戏中使用 24 小时制的时钟 ,所以一天中最早的时间是 00:00 ,最晚的时间是 23:59 。\n\n给你两个字符串 startTime 和 finishTime ,均符合 \"HH:MM\" 格式,分别表示你 进入 和 退出 游戏的确切时间,请计算在整个游戏会话期间,你完成的 完整对局的对局数 。\n\n例如,如果 startTime = \"05:20\" 且 finishTime = \"05:59\" ,这意味着你仅仅完成从 05:30 到 05:45 这一个完整对局。而你没有完成从 05:15 到 05:30 的完整对局,因为你是在对局开始后进入的游戏;同时,你也没有完成从 05:45 到 06:00 的完整对局,因为你是在对局结束前退出的游戏。\n\n如果 finishTime 早于 startTime ,这表示你玩了个通宵(也就是从 startTime 到午夜,再从午夜到 finishTime)。\n\n假设你是从 startTime 进入游戏,并在 finishTime 退出游戏,请计算并返回你完成的 完整对局的对局数 。\n\n \n\n示例 1:\n\n输入:startTime = \"12:01\", finishTime = \"12:44\"\n输出:1\n解释:你完成了从 12:15 到 12:30 的一个完整对局。\n你没有完成从 12:00 到 12:15 的完整对局,因为你是在对局开始后的 12:01 进入的游戏。\n你没有完成从 12:30 到 12:45 的完整对局,因为你是在对局结束前的 12:44 退出的游戏。\n\n\n示例 2:\n\n输入:startTime = \"20:00\", finishTime = \"06:00\"\n输出:40\n解释:你完成了从 20:00 到 00:00 的 16 个完整的对局,以及从 00:00 到 06:00 的 24 个完整的对局。\n16 + 24 = 40\n\n\n示例 3:\n\n输入:startTime = \"00:00\", finishTime = \"23:59\"\n输出:95\n解释:除最后一个小时你只完成了 3 个完整对局外,其余每个小时均完成了 4 场完整对局。\n\n\n \n\n提示:\n\nstartTime 和 finishTime 的格式为 HH:MM\n00 <= HH <= 23\n00 <= MM <= 59\nstartTime 和 finishTime 不相等\n```","content":"096221cf5b628be1e73e8bcfe626c734748e23900a3d41a84f0b774c2134766b2a9ce16c4f888f0d7d43b13eb80f2fa76b6e65ad9d3e03c1ae76b561bceff835f3316e60d6d7cfbd0a2ccfea998f527d3be17095dbb5049b79b730c3e5a6bec05624820f74b997633b3e1271aec285a471c309213a5cf68d6eebb39276ed55ca1c1081ed344b313160ec2b9c279432e2c4f98f6d96ca476ea8a40823ae94a55c6017763326a1d17722707ef8856f1e5e11a8e6f97a21376fa82eea484ef62402588f71f4546ac876e291642880502570b40bcc6b4b2da38c0b76a3c0313b73919e6bb431cbae45983a6f1aaae4d7c993347039eceda443104a4a8d6a6f1f42dae602f483e9c7640c92f2d10ee15d5449e11feb129c6ea21adbf3af47a2d408af3462cbe8049a98a124a93f6010975146e2901a5ae4fbc5606dc83c4819ec4752bdd034464d08358e7771d84c0d8575e46f0d7c66183d101989428f83565e4ee282f6f376bfb379d954596325565bb09700a7ac3bfe181e575160d03e8df6df3d3321fde8cd32abeb150cc42c74ff083eb0f782415ee27ded29fbd14330274c068db8426f403fa129d4cf251fa2d7d059f7a6e0d2a96dfe00783828c642cb74332110a9c8ee3d946e70a83d774d65402706e65a6cd8d8ab8099518dc8646a73bc19ff1e7306d08f38eec8ff2c703d4bcebdece901efba18c15b9e3ee34f1134dece792c6558af6cd0228564f2b3fac4171292c1edd6fed866a89e5a0ee6d8de70cab2c8c496b79fc163480a91b3bfae0e196779530bd9a85d1ce6e8eef62784dde21e24df3f1d4730b7faf5aca210ace43dad759d3426f768d5b53a443c04b2fe401cd6c60cb4e688b7b3876bf8d23c31cbd4d1e6cafbf0db2c2ed2290dfc784f394d23a00971a3bf332970438d31dd6ad756212cd86ea54c974d84ef17b0d9ce7edf5e07ec195102ba98c8ee285c2e2ae5570b8b30e4fba0883cb10e95c25fec893fef540c4af92e88ae2768a47a8efc8f52487e329669059ee271f88ec713cdb37b96404b593ae596773167611cc54f8addbf7d667b6837937eb203dba425b5264d1ffa9036ff1eacac45629816eacc080a552f8f03ebfa7f15592cfbd4c534042afafa82c3739f2b8a49a76b8359ff913b41199b929a888cf2dd2977440147233d31092edbd9c03f34389eabd93db51224555d27adbf5b359be7029d6b81a3c4d86353335e61ac5c45d0e5cfb173d7c3a3f10165feac3c9470b933e62c27d875a99b21f90a30a5b548e28bbf5b337f8387bf8a417087716041646a4fb39cdc69a37c61f0857f24ff3470f3b364ea908202d37b69ba97d8faff0fca7b2cfd29ea5a45b9619af5552257ecfffba1f2fde9e2ca6c4ad194b58ea714960851ce53f4e6a8dd7fcff5ccf3c64e5fff992cc9907af38df56f1b71e4a96162e5fb112f9ce4feb44f27c434ea57b906b96b67c766e0c8d35d88bd28987bad57aefa2d2004b64d4be64017e5e0145186f61e076e3ef89abae1d398e65ce441746331cf8671ec3c6f65d2aa67d47662da9cdf49f5380b0f72a82a4e05e9088162c5cf13d396cd35cb7e16f18897d6260c865f2640d340544466c9a866ac9198a37a050333ff0617332548ecd5b8dc0cd19dc4174e538e47b97cace1fa9e771bb1274c880b5f521d1a1102d3cc3de09fd2a3ee99f36876b7240297da573626d6a095788eb8422493ff63bc4c727f02e0b36c8d6c7f9e515634f846e4efe3d953947e59c0c2f5487c089738becb80eee3d46d2ef9098748f0e2d8a89fa8e342a086bd58f37bd2dd102486c40255d49411c2f4f34e29b97710190e3b8853102595d2deccc1d6f7b1639a77658917f610026f2c9188e80c5f6421448eeafe676577f2afeb3b923ad4014a61bd83e795888b8c06d3cc4e67c30fb765c03ebb0278fc8a87bb908a5a56c6748eb9b4457195932d3f51767820facf6f549d595249e4f79ec7fafbc26e5699decbc8d92c28c565c017e74916c1f3631e6d0242939d3c43dc6d9068a24dcba2f67c796bffa27cf05e2b15aa607662228193098057afed7b444ea57c4d8017627174c129ec8e571cd94ea7679e343d72ba08d1022d5634114057600d3f4b3b7568f9ae6834a8994d0ac556adb0dc94464c526fcc6607d9cdc13cd0b258e783b8660d6df41eb263bd330b068e2f3f2ddc7d1fcdbf7fad6bcccf990be7426878c0be374a5c9623b7238a8d75267298594026761372201133e42494c4a576916f9f6cb31ba4e896dcbbc3c3675036bea803080a4dcedfd67509da8d8b00e48ea0971b8f1bb4a345e1db0f94cfd0a1c4735b6edb89ee81f6c70a3ce90e12a7f8dba1414dff03caa4a6fd633744f252dfbbe05c397252e230ab27fce18f07e031fe329a69998a0897b3ab7835699559e70d607601e44ebe091886da8950ad6bc6f1f6e1336c69f3ce393b961d08749861af0b319a91a3e7ff07bd5e37d043b02ce648459352055b48dd9f66dcc0a40d8dfc0a3856e2b953d69a12220ce022b2688ec3e9b87512bc4f8c550aebbc4d32a11194a9e33b5e0798063ee31d0d005ed6900c5115f894a22bbc0748018bb0a2516cebff6c6dea155010ac348464e378139f312292a35445b7a8c99760a244a3ddba7e3484f025e208bce32cc464ef932ec11fcfd90077e18bf20ce2903c8a2feb98a8e087808a9c6afb9c5f63b6b221a690095561db2efecafaa58e69b383feb2c7842dab7fc596ec32b1be0dc2b39c76707b9e6562d1e27ea5fbae67bacf542a7f99c0303024d5af9307bad5f76a66918847ebd926eb1abf915d4264c94e2210753f7dc141dbf94935fdc3a9f10ece7547dde0f0cbd5cace7140389ccf364861aea467a430ec35ac23f7b5a3a1521f7c97a85f4761b445cb2380189773a77af8918391bb387b23110ed400c61777be2223f6b8e9c148f11043fa33e1b6c655d89f1c6c0a104400abc3d77b7788f38d57c17830274a103bc3e1e19e98fa742b6c3f39f6a947db718cd221394004d2e07971726f5b66358ddf8ca022b62fda53c91771d3fd945932660a3117ab03ac21e25714ee6d599b00d081599f8345ee7be6d43fbdff4b9168906c6cd072cd8cc4927b5a55dc13fdda7241bb5eb11afc4820f572dd1ba88692e982c4cbb8b6d07dfada539dd5c3d9e47ade18f1e9d41fb3cb812948e71a3e741ddf3656d6685890b1cf32cf5a0aadf30d9d69929ab5f562ad2aa275544cc5b3084d02d548f5cc3f5b363d87ac40e7a79e8b8a68aa52663a3a3259c217c30e7578e69ab039565b64ef3557196c588017101c2af36a6025714a061d6c9e02f10159196bc944560a5c34d477e5e4d38d4da1ac26a8934545523e5c3d767bf866585deedf3b6c6eff6f55912692c3ec4b133b123d00bad76da5c12dbf2a02125ae7589ee16c1a771ad22472e0ffd1ef2405a18f31048519c9cf870549534403b2970df4c1336aac072788b63e8a669f9294c55e57b389a38b71d9575df86605661b4baf942bb163afe5073fe4f4aa86a0daec57c9e49f80c0f1754e6d178e528ddd5d118aa1bfc33eb65af7c0b4d14a89fc0f350d14f73409e1b58788c36835f34916bcc4a9ad9b5e7726979d5cfa480045bdb24f8522f49e751bfcddd588ee9ff8a1aac38960979fa3ddc59784bbc4a6e114dba968bd5e4550861a742372dff771c31455bb4b63076009e6112c0da9d4a9ea31380391f863ed1184b4390919d641eff99a3f8c64baee10edc1566e8ca0b944ffac2ad8cbc35460b7c63ce5e7fc9a2eab1bf3f36bb3b8870fb6d60d7501535e016e34239517e963c8b2f6bd22b622995beafea8d6e0501f15496e94aac0b9cdb659f804c8fe39abc7df5a738d103d1423551b5c72219265c0f6d4b0251fbcce315d96635012462f5e31d87ee0b88408de8870791a3175092c376ab18886aa59a1fda0ad4ed9eb7ed90c7e1310a27aca0aa69729821fe29253a8ff5b09b8e8604c1e54e576cc0159ac1b68b6dcd4f09a4e574eb15c81edd3ac023966975beaa5ce2eaf647b7313c4a53aebb25bdc89233e11aa1f54c1d6af509c4a5777a2774e4676ae5534c8ce9e8f3ac637ea20e71152253b2d25198a880e1a44d474cbc9c3d3b28ef7a744fbc1c175634ee2932966f6622db546eb79c1beda424ca6545ec3bf35b15d59a63d9cd853045eeccfea94122e277bc571bb298647ce6d6c22e3eae14b3094beb25001194952182f46a0acafcae433f6e9ec5eb4ff8ddbe9ec7b575f3d5b79c1bc1b529d0c80d72ab8e74d1c597fc853930b49e0d4d887d522d9ee282415767fa80068b0de2bdf94b47e7f5b9b03a523fe0f8536be5464e78a0580cc0d2521cc0da6510b843c30b8b8d7103be74f056a147d595f2e5fd4f38d029315ed666968ba64a5ad0e3802c1b021ebd3b00fd7b0cda193c0a0e8a2d85d242c7a3dc2983f019059c49f2b26bc7303aff5b5e1a2c1cb566cb7b47d0464bff5353c8bb0eb6aaea3f554c32c49538a68dfcc7b8b0d32829aaf96712c99b8b276bcb94b65460a2d0160c573d10ce87fd305d00ead0e62116a790f61e5ecd07dffbe1050a47f60534b5c1172bc544c9e2c64eefd0802d8c0f2ef8a96b6f4768c331aef67e6453b528a0d57297f6227d6d11ae599ad2b8c410dccdd1b496616ed0450c63941c73279a6cc179f1caa469b7500956ffe65899c355396d781ce5111a80f01c818abc14de6b814ce8891875dc682a187f7503d10e4e80cdd4c411e10a731a5258567c853ad03fd9627c3036f86b532839f6961ee0fad410df77fb2951c0adfde9f1ae4afe51ad7976568506c4dfe3801974af14ae926e1ca6f85b98e95d976d1767977289ffaf70863fbd2c12000da10926971624c4302ccca007845f0897719215a3affc076d0e1a534b5858c948fd477e3f369d17f42f1e473591b7b74110c694eca32661e37e7b1037ab14e16857280c3f8809436039dd34997d6086f5aad8fd7776e51c35a13c9892269943a447e592c2245324a7ec89931b2de2e5a93500085dbdf8592b56ab5986a123263d32c0212bc6ef1e588a602de128e180bc636bab876fbcbad3f87a99e4b33552ed63d103d0735214c15f4210afb7585466f400bade394915a04376634d47e6e509e960ff18230cdc4660bb221744a45205568033d0384e8835cb444d9204bcd26e4c57a82dad7dcbfc90f1cf5ccd58b11497f81bb8bb07226deca7e4fff1c0f1bca9319e63cf65a39c7cedc0ef2197b37fb0782842faf5a9ad43937a6a093eaf581fd402469a648ce8f9ac55e3c03a2ac4e718376eaff94f3c18f8aa8d78c7957453c55d3648bcc4fd76259cc83511644fe17c9d082ada70ec3dfc86d3d429705a32921b1064eabfaf36d8fe4f23dc47b49dfebab0a8cd51c5993821ce9d6214e17b3fbec2520253a2456dda3741a9f1e16ee4c27eabeab03ed24c555ee501583b4941020bc8d50b1e3ff22b83f4d057a9736ee8a90ae44a6434e35f36c5715a038302a09a3a969dc784619f1e8bec895a0fe765f617611ad0f82ac607f29449a7301066ecaf565953c81974f4957dae809bad88c16b135c40e633c437d4489c66482f6c8b78e160f4408bfb54b7db802109a8338a3f8f12e3bc8133b8da2f19d9268c9e128f6dc223db5d541c11bf73a9f45c6c0c076120e7b0f2c169261b7822761aa4b5522bc5526373dc65bfb9782caa5ba108cfa1d8931a592546132f59ca29d651852344ad054f18a9b09310f092a4255a4cb5e39d39e11a8c4eb582a71cb420a74e6f979f5f6d34e1b4af36cd6549615b9fe0e73dbe6fa9f093c87cd97bc930817ef9fe0cf588a735a56a3ef5f84ccb68a42ae593c04bede48457f2a17d0a4809035e85e94a127e0337c0562e89fecdf6543390a5675f9c973388730d4e917d3fb33a8db8ae807711251fa9de74d37041debc9a784b38b95b6db8f023179dee3e63b5f228fe8eb08988eb7bb561e003634bf45d010725eee8902156c99525e6f36ae82149f0ed0b64b83ab5bf356da74f8d1ec5769e751d85da5a54df98212e80893b98b58c0260d453f3633373823a11ae97cac57923e767b35db716ddd160d8b5b9b9fe16d685ab79ecae287a716af2cfad9a20687209825b922682f7fa0a99cc5cf38e6258ad7530ba48c3c05be53bf7b2a508fe4b2979267b0f71fe2e273c51a79e32eb9893ac7660bdb9d862c0f522594b0d36344fd71a5612beb2c2fa3dae3240563b6fd9ea722a9f0be0c5c8035410e0708b072388ca616a554c415dd05ba1ae9b59445cce0373e2c2f391431db69769f5a75e457a36df6cf68719f58f2bfe8298813e6509bbfd412d3857c94e7df92c01c274c65bdf5f3283e6e5c1dbf1bc597038a5dc4dcbdca13ba8980ba60dc560de8d2edf8cf9e6155f499c022af94fe4023af3dfa1ab593a0b84e8cfe8cc04a019bc1e9e1133d701bad630df6b400d82fec624adeb2d21bde03b303aef2c20047c9fb3951821502a42a97b8cacff2351f83f8805d0f0dce69bb8da5982cf0533a26b0a4edd84b9253fb50e51a073f10cd74632da59128856a8d749ba4573a63ebc6b4ff65610179c5f9c0c321f79ee94a9f363a58f755bf0277cb3701480283bb805023a20c4f34feb5fe3a0eceedf72cf62e317f568e936cd44f86f8776ae002baacd3d70de4109c8a61973948da5be98177aba2a7667185c596c62217620a83894a80a5d409d87205fd472149c80361c867e94bed3fd2897da40ea91c028c66bd0207cd0df56fff66242b7249118a2690b5693b25c6df56a96d6fdb0e0dc665db41639de2e529b040a49f3a5a69d95514d04d1dd4435751102372b35dcb45cd1122210ba59d6420e7b9e13c5d5e616a0be1672e0925038a4708e787b5ef74209c4f053ac014705d037593aaaf3f726a79a93ebe30eed18ffff6c9cdfbb6f99fdf5e2d70f7df326e98a864a14341aa181cd8461f2654ac5176a5df3eae9c2e1c6788c21cda9056d5b60c8ef168829861bfdc4c692d335416cd82ca6c00781b4073e1267861c0656fec6ab9cc9ed151369a0268bb783fbb574e6d5b002a01e2dd19a6a5f1b9dd7faae85a7ca7d20c4cd54f0aef23c229b9996c026ef68dda","title":"1904. 你完成的完整对局数","link":"https://leetcode-cn.com/problems/the-number-of-full-rounds-you-have-played/","question_id":2033,"issue_number":37},"35":{"day":35,"pres":["计数","枚举"],"tags":["枚举"],"whys":null,"difficulty":"- 中等","description":"```\n给你两个字符串 a 和 b ,二者均由小写字母组成。一步操作中,你可以将 a 或 b 中的 任一字符 改变为 任一小写字母 。\n\n操作的最终目标是满足下列三个条件 之一 :\n\na 中的 每个字母 在字母表中 严格小于 b 中的 每个字母 。\nb 中的 每个字母 在字母表中 严格小于 a 中的 每个字母 。\na 和 b 都 由 同一个 字母组成。\n返回达成目标所需的 最少 操作数。\n\n \n\n示例 1:\n\n输入:a = \"aba\", b = \"caa\"\n输出:2\n解释:满足每个条件的最佳方案分别是:\n1) 将 b 变为 \"ccc\",2 次操作,满足 a 中的每个字母都小于 b 中的每个字母;\n2) 将 a 变为 \"bbb\" 并将 b 变为 \"aaa\",3 次操作,满足 b 中的每个字母都小于 a 中的每个字母;\n3) 将 a 变为 \"aaa\" 并将 b 变为 \"aaa\",2 次操作,满足 a 和 b 由同一个字母组成。\n最佳的方案只需要 2 次操作(满足条件 1 或者条件 3)。\n示例 2:\n\n输入:a = \"dabadd\", b = \"cda\"\n输出:3\n解释:满足条件 1 的最佳方案是将 b 变为 \"eee\" 。\n \n\n提示:\n\n1 <= a.length, b.length <= 105\na 和 b 只由小写字母组成\n```","content":"096221cf5b628be1e73e8bcfe626c734748020930a3d43ae4e066f7323046f6a2db9e079758aa3327c548832950f2fa662a2e03f12d0f35741cc7ffe416f30d677f2ace36e048899632bd6b1998e073078e8788380a2039a31f426c0a9a0a3801632dd0663b99e233a7e0477abdfcfb833db4d273247e6cd33e4ba8a61e819b47341d1e0a98684a59a36a460ce05a03da096c26290edd7be5a27c1b02b6d7bdf93e7fac0e03544c2cfc7e83dc15d600132e088f9105520371db56cb4b1194c2824d34fbb0c5e890ef2d32e20f0233c33fd2398f392ebce9163ee6c0f620b1bce81c7b939f5a24a80fd1f13f5b1c984f3310a7cdc8fee46651945ce07464e24cfb453e1daa0da38bf2e234c778d631034c2b3e835b86d950dd9c08547bdebcd7f9467c3fccc4721a3188b3d6b2750287db6c82e3f9dfe72cf89542c9e6ed523956d0ebdc98e6c0f7ddbf36b999def02eed6a099cbcaa7bdd6d64ee839da5c61f583f7ef7482bc7bfd545a60075756ae963aa4af0ce81b1476566aef3fb0cbde0d09e50d29096d95a56c15a0737a75083cb5330af15ee849c703c38343330565078288841c5f58e439998e326bc4fabbc1aadcc0b8e042b54b486f6efa0e53eb27e54dbca1a816c73b77fa6063e9e1f77557d922d6b344c1c99f35d1d924235cda53d697743eff63c64ecad028703d4b08ccf58f72e3f665c3ec48a1545fc46ad6c46837656ba262e8108646db7589ca5b63869b90c9510eef1c8b020ee1e0f19d5ad153bbdd85db9d710943befff58eb91d4b5dbdd24b6dbce4a7f8ba4bcd5498256f0773faeba2ba66097940615d2c6945f756f54e1a9422fbc0494c9e2c1209eeb4007ac4ecf8d2da9fef1feab8793eabb8d9a4bedabfa60cb4d0082d392061824e3588cd29add586701343eabc6d8891e4932df45ba668988a14ae4ea2542201d72475dd530232c8565f3ba6dfa8e61390bb03b451726412f536d70f2e3fddfe66f2064c6b85801daf177fa24188f78e684b6b1f9857269fd77a3cd3c379b6872bc85915260f83ed6d513f7d43b647ec9aa228ce1e0d3d3292ce12bffd193df8d8b3fa863239e21069b98e1ddc24b84304536c90cc7546780f8db07812b20174b7007c5026e64cde0b92716bdf593919a39cb6265615e8d4c69f73433563674b45015356ebb299255ea3796f8600fd5b32373318c6e06dbf4e7faf48f42ca9f0f349512f44b029fa8d0e5cce866bd7c3b3348d8b7a5baa513ab960b21c42789561fe22855328f927cb6576579c724fe93c0f88565f41d2d89fe8c380ea988af232a1ed70953de3810838baa506998be849d2343d97ef82d9977de92271f742b3402d01af5f8d456a1fcf9eac8e98a5d1ad884a38a7b5d0de806a199e9f7432a2d8305ad7a595e88c9b64f33b6ffb470ed6f289e36e12682279e061f6ea1039aa225445cafd68fb66eeb1126ae723a9454d1c58fb573184995a885ab6c5ebd490b6707e2393b7edc829518dda1e07543efd90b9d4eb9bd579e655496008df824afdd01466b7c7578e1178bbfdf317891d655245e44b5d66812c0a4812497799a9b78620f3c50414430aa9da429776649c394f2efd0cfc36fe03445cffe0a63ade2b1b370a807e92e3f155b5a26e1764408e43b4b826a4af84e7f4f72c30d1061e043e65c0930874b060453ee2f989b03622816d52d2d8d1daf71127f523b9c12a22f0a67f02a221564484bc03c64c00f05ad7ba279b6b012a69814f3b875cac8c4c189e1d3982ff8ed6e4d67106f9098749fbea3a6acc390da8306a6e15b43e5f07a9e1e0e166e7aed29347fdc0522ba47b1a393cf322045977c181d7b6c4defcf6fe72dba06c837ccdd4eed0764768bd97faa6992a2a392c601e6b7b23618975a80b1f39ade9ac9ff7e6b176afe7e365d607b778e4d174dbfd47004302348a7c62c478a0b8be50b9d995a53f7694308451ce5e5e73caf98f4b82c6e54efb20f3e65cbdcea0821be5bb0e9f4355bee1406be034451053894497df15f7500bc609982e1ab8f3a3569556f14c39ca1bf1bde843d8906ae079f15beb5864a9636e8d28427b76d328d496572cde4fb5739c261a708a191891878b9e8a6ab8cb9e3f9f8ce3be463685a4015d1310a30890f5781283fac66ce3420adfe228b6b60035be9bf432312a8c2ce12989786c2ae6be9be864c2c1452bbbf0499a7209dd66c5b8dd91c11d3114826ac62fefc46c74248232d6807c345e213229e4218ec79b5b926dab6da102a5e58cddbdc5c3456d37968b002a0e89474703f9b413e7977fb883e1cd21ee72a6f23fe9bc4a95a86ac359929d39e8e3524a338d3c7e871354f8cb7677ced929835ba4a1e2a7bdd320c1497e807c58185a8b72a877a1ced25afb55ab08f50c8020e6caa6f6212f01e87f8f7570374ae501e9145ed9f2d92baf2ba7d3a5940bc0be4965e9b41a11075b995db00a358493a3e1ff06b25b2bdbac3589e96f42946c0c9fc197c561772ef705faa10fbdd91f03c41a5687ccdca9a978c7575b616fe8bf6ad02359cf117dc6f6459f6f4d66ffd6de00892e319f98d6dc609d024d14c5a06dd506d7c0a6848d85980dce9f344fa44d5d62e417ef8c537811a331279760e6f76b1068533e861c256c6fc59e534a469d3c2d34824b66c9a32fd72dcfc53476e786f22cf49d0eb727cd906c1a02829f9268dc929af7216dbc01564350f11e8c44d088b54914ade14200161446f678b7decf59cbb662bdb2cf3d71330fa4a1b6faf072510ea93e5a85a7d55f5b8dde9142a0983cbad3d9acf5c2d16d6e3774dba918341f375cb5a1d694a3eccc05bb5876f9fa637a7677b21beedd15283842122e40b6a4b14473edfdf3732bd177954edad41381dfb2fd2123031e12b02f7af221ff4ce00bee1abcd414e9b8d7cc161e7f29608316af4170c9512ebeecd5a42ffd7408f35d8e9dbd07f01e0f0dce4d7c69250d110959e9b99925975473665b4560c1b48284dda1787d270f7ca8820d8442e6a12f5138259fab7d111f7714341d1d0f14ff9e6fa501b15be7b769130d59116ac9d2fad467d28630025ceb624b9a2acf8a5d8e6fd238e03b2aad6107c24fe4904e51159b0b061644f5879b59d751db487db8418e18da4322d35219eb5e555f1f604a6a7c306bbe321079ab0e435332cf6dcc6a760e9f7fbcab1f15a74f77071ac3384aa81c11ddf4cff77df609eb7cfd6efe4270fcd9276a549e1e2f5798f00221a522ce3a4b3f58353d4205ed203a560367ed2bdd895e106d184ad807c0cfcbcca2a5334cb7e448f2da8746728d17d694ab61c1c20f4b63051da5249c349bdf3341c4449192b0f39d46420b540989fea764ec9a28184c98d28920eb76adf13ba0e254025c812a61d153989b90727a490a5b7281a3399ba453b94f540f129b75f6997962c69915a4d3265f7f2bbdad6429ce8877bb4b507782e8b2cccf4d17952c0a87f07e949b662e9e4efe15543e659bc0344d3e14b447b49968f8c2a5f5db4779a6768b0823c88540546f2b151262cf0c60254360505f066ed0161aedc1377a882595873eb75af1c0aaf1a61f56c9b87c73c67a57cd0264f2cb1177c90d4ca883ec9ada034746de803a8c626f1eb60e8632b6312cd9dc676e1335511f0065633e1dec7c3739033018401f49375bf85728a03afa8dfc25dfd895b75b53b673e69a2cfaabdb969a28d2acf05972492589b5ac5468d228b900728f84da76e0c515e120df38b99a6cf4823741ded38c2e9aa15ebac58b0942fdad11a69ed3c67b987c8cd0ea750f11c60142cacfa596f6a7e9cfe05d9552e600503b7ace21b632ca67702f2606b5a967c3e85c259cfbf5de20c84d90c655e8f4932b58c5633245566d72317c5ee17ab182c213ea81101a89e1593b657f27290e65c8178690ce70e7e833775065488c8aba06c7bf110cc3c98c85e1d6523bceb0604076489a35882cdecd0aea6bfef81bb5ac3c08fdb46b3e4b55ba2cdf691a9a61199585acf8f1306c3ed965e6b5cdc75f03fa43e379a8c10da85c747127cfa43cf6b247fe860d1713b43951d5ed43f52c4a7c48a366654545935430c8cebcb539de2be52bdad4fcbb3be2b3a1433491db22e63493fe83afafc6bebb1940461718462a7624edf066a9aa0c4af856ca98d9aef5e81262a9e72cd10062ee78b25bbdb4b0ac87aed834687e39cc387cfd468304b62275a62549f9f1113375d8aad6d5bf9fc0e6752a43463a9d723710940325000a5a49effa979db516a573e2e85bbc3f52d27b60aecdcf9916ee62f98e7c4f5f541cab370fb5c7dbc9ae78cce45d56fe4d7628edb0029255e810b546b16828d5ad7ccd5f9faa7c00769102ed0a21efa385bb8cd4103bd689aaf9db264f3d405b80af9a6ed51aab2e6b3fe54fced42a5b73f7fe5edc8bc42ca6e9deccd1f3ca97b5992f35752c0aa7ea3250ee65b5f23167c6537ff1dc19766903421951dfe57540058886a9d51d4a31ade6a8b53fcaafa6d433ad8be63dc221550000652c1da305653a9b3343c46647382732557ab629803e8e05bf6bb84cd5e2d1b0afa08d6e3310a0611c5043b46e7707c5a6cb91469c0ddc6a64581fd79223067e0132969cf7758cb2fa3aae1f82b2935b662f653cf3f222478e161966c646f6fa1f6adcd886b62afdf900d7aa538cef626583dc5836db15bdac36aa56f58396b09c645c722dc5d95fc6ab5c4991bf4eec7c9d5b65112677ec8fa14f789ebacd0a7afd00f58fbfc23bf0c501d125870fa803d7e67e974b20c8a674af822d65f46cc9012cad05ebc1544591f4b530a7e3a449c7d84369487c4bc81634c232b542a82fa58229caa59fd09c72841042056cd7b4a2716ba8978d660cda43806771367a0a06c7d062313ba285775f681473ac880299aca361e0988c83d4ab1886bc72db231ad2e47e59542930190b7b01cf4f35582afaa0643be1465fcb268cc3ea9a86644ae9d6419cd03a3616efdb93303a5ba85a13c9892269943a447e5a2b7c453e07379b992eb2c06156d5161a8c87bccbdbe622c1d127573c3083600a08e76cf6e7cce666d653c04b07c67affb27e87c2bd1e87e5db053b3727d679567e1b286f1250b04e6b8b3cab0b625e48a7fedacf1f405804449d462a609ed20ffa9f30dcee2044e0213d4a0c6e1c7c426344dde0c11db44ad22940f23ccec57a82dad7dcbfc90f1ca1cc9bc6017e7f90aea1b07226deca7e4fff1f0c008cd908ba72ea082bc489851bbb066b3fc70e98ae2faf5a9ad43937a6a0c0a7f59cfd533417a643d38fd98a0b7212abb77710eb2c97c994a08c8f96b5d7986c4d6f3c139c368b864f9e2c599ec24c1c01eb5ed4df82ada70ec3dfc86d3d07db4ce52935a40606aba2a36dd0b6a765802431a089d040f1ff1c5993821ce9856c4e0ab3eb876b732527241b94ed7c5bd14d49a61825ddbeba29ed24c555ee165ad1fd9b1079f2911ff0e8f567ac2e501072ab3ff4a090ae44a6434e35f36c1258a071302723b38369dc784619f1adf281d3a0ef25102f6b5be80bccb0322d7719f57b480a6ed8e36c8f1681974f0c1adaf509abcda616b135c40e373c48250883cf31dfb28df9ec7431437589b55f68a228109a8338a3f8f168749a1371c8a6bf80c03a978c6dfe952b279fd5418457be7c9f51d3c0dc6b124b360f64168f6cadeb6834e41f1070c3345d7d40ec1eb6979fcab1af3a8cfa1d8970ebc1542f66b8c8ecc66c560b385c945dd08ac8441b0f092a4207e19f0b2ec99e4de6d289720a319d1220552014851b6d5f8a82f536c359d94b90386eb5a8685a2402f0ad1767423f24dabf555a5142b43fe39ce03a2bc11b594378df7b94ffe95d43e5c3b7b2925a6c3ab71fb60adafa62ae6839460881fa95cb2d421f201e763c855f76fd168b73d016970de3a1a267cbdba4997edc944150b3cb2e8ab0e6c895f0e9cdef5838d075764bf4ee9841488eab0f47457ec6dbe18fca52d31e9efcce54cf641db511deb3c1b26bd43f1b8652cb31a828de470f4783f8d7e15558fe51c066a8bf55faa017eb1f830339b452cefdd3b596fac8d0a268e5608d799962cc52160cd66d70d05657c437989ee123013fb39b87f196c814b762b6dee337d53f823da5396f7a1badfdd988db31e17182971da04b47abee75c04e96bff06c625e73b44d1447a4771fa20ea0bf3cbe4519f477a29a515860ed9fd38aef7576f0826ef9638adb963967b4c1ff3b5a2fedf894ac25e4dcb51c1f973e1d45294c952737cae31be901871fd940f515a33544a5413cdab1e3f6af8ac350a0820c93ab28ad0a814159a1c60b9e46292e815b944e25c488b44ffccb3aa8839ea082d8a366e26470f00a306d702cbc33e5970cab5fefc7bcc527552c0873c35493ab4d5326270b4395d3156f40f457123f85b228e77d9b31165e18903b4b4b7ce1c70874267dbffbfcd82bafa32c2fff52c81cf1f7653314fd139635c5064304bcee0f4caf983581c80771ed9eb493f495985a58827a070dc866b88abb9a31eb553a185c1f791dcf289475e72389b2fad335eef4eb6077e941a349f2527e969ce12d7c1331c5ef011580bc94a06eb3dbe9831d8ef2df74d26be4fc0584d3d4a8e1efd40070b8034073b7e1b66f4cc0aeb862f9aafb9545d4c57508c21328f1ca68dd513e2c388c31bf9a8a5f5044579d3ddde42d87f8e1511a1d714021a38285e61514331f2317a97ab7817a82afdf0c9ade0dc866c939e81766ee2bd32188eb73e642ae8b619b1bf348a38bbcb1e9bb4f8c2b73c0b8e06c5f9303edef34f0860ae314c1e31b163dae60b96b089a9cf16cd78214a2a06384d6ddd9a9fa76d95f866db3080bcd00cb32156f3f06b05d5a5b6a20f1661e1c2427a04638c984a3cf7e2c9f4f0f2cc2046f5314609dadb1314a567a8a0abf05f2d086f6fadbfcfca2f191d36e2e7ae7df2a54988d70a05958a5023ad275242c5193bfee1119820759aa9bae2f6dd9610e9e52738c405de42b7ae91524cb8ec1b0e9e6051f58b286c4f4e8f824a3cfa957eaa070c670472617e49e5faaff31b5d236a3ec4c6c01123e91d605a0fdbbb4d27bfaac1a51c491021a9c1f05be688d66f6cc62483eb1c5be083c93fdd0b3d4b94208b5504bdcce61aa8a16dd48a0df06bb65d323ae1c113898a4cf49f8858cef93dbb01a93c6a2a27390cfb5905b98f92c377faf99e5505838edce867338691ebfd8130c3328bf04c2a197c76a266f2f7188c965813908c56f823ebfd967eb899f64fac48399a7f83c00b0af7ca91e6b6f4c18be2a1b851112f78c8381059395956002ee3406f58ea8f26e8386ad5d7969640c1d7603d76f7e2b58541205647016c9ebe6bfe42ffc4918ea720a0ac4f3b99a70540e95966f8d5fe3e223e68859697f88155224c95ee31fac02767aa840db584b7ed6c1575a7de4e6f9886aa36d2faf6f50e87799501b60d29b4415f1a1e990e936a7c0a0f782d8dbf527614ba94204a33c157a636ed99e080ddce8a09da7e1cc300d6718a9189e6b769bc152b08e078ba83797288176b7aa804bb83eb46ca7cd9646122d58232f2e36631a30c83b29c8cc6c3312aed200ee8867c7b3b8327f862fed20ba04790604887a52ede69b5287161443144acca33ff477fffc037dc04d1d3ae089caae3e13cf582e22fb861da049b01c28538176b96d08dc9d74db423f0b337379c2c4c61e30eb68745ebedaf36df2a2226126974954062c4ca87281b0efecf0ce2ac626c7adc19fe737817ed3f59202ce424b0516cc3d35cb81a98d02fc7446f47fc496c97f3f389f9db9f5a18510104e0168709b846fc1fabc32d028e32147ab5edde24ba40e2883a194b71d6341ec690e976bb0f86674bcad67b097a84c2c9094cd875e45b7a7a5fde6797fc45a212fbcaeeefc1e7fbcb286d9c98f0b7629c4cbdede370f561a8d2fc058910609ea47c77aa518909c4b4999c09ceadb276254a078c621625599e653a5bcf5c66997f76d0b1bc6de5b2b6802f485c53e2a500ae9d4b8dcb20f08f251c53a35aa070c3a9d251c8a73b32a9f756c2bf7735f2a481d9f0aaa21dca71bd87e9fd0d440ae7781ddce0973595bc31fa1ece197402142a302be573526acb682464713383d7c98612b707e263ea6e874cf6f4ce8fc3f92c7db6475fcdc34a64b7343c806ee458f61d479a71a0f910c34211d9a486bc7bc35b9943b8b8823eaa2ceaaffa4078c146de66ebe","title":"1737. 满足三条件之一需改变的最少字符数","link":"https://leetcode-cn.com/problems/change-minimum-characters-to-satisfy-one-of-three-conditions/","question_id":1859,"issue_number":38},"36":{"day":36,"pres":["数组","排序"],"tags":["排序"],"whys":null,"difficulty":"- 中等","description":"```\n给你一个整数数组 nums,请你将该数组升序排列。\n\n \n\n示例 1:\n\n输入:nums = [5,2,3,1]\n输出:[1,2,3,5]\n示例 2:\n\n输入:nums = [5,1,1,2,0,0]\n输出:[0,0,1,1,2,5]\n \n\n提示:\n\n1 <= nums.length <= 50000\n-50000 <= nums[i] <= 50000\n\n```","content":"096221cf5b628be1e73e8bcfe626c7347c86218a04fb2b870a545626520c013734310ec8ab1a6ec9ebd627f465eaac46b8280bc2d829199fbe23f761a0f8f223fc3b6776d4c7cee11d6ec3abc49c4f6d36fd32ecfee24fdebd7bdd491c6d2a62b6aa10d90bdf9b2e295b80a45355157dfa0ea4ade3807535aa61475bf51cca27adb7606db39cc4a514fe41fb07cb69ef6e165f8b1e6f0630bdf24326cce7983c1f291c4900d48e4052074b9f22f53a46a34489d22559210c378ee3684b19a17b03a4179e4d099170240ca6fe47f9b0ce2cb718ffc0e71a5ee526b0bc68302dc587d10a885c75fb3436beff1ae6e2db911664f17986fd5188a829961c332801a2ec710f49600cfe11839cc4c758f78cf74c133ca428d5104a83e8c525b7825184efb1675ac0142d768c14f6c4fe7a0e6607267030e8b44192ca4e9672f05de626c8ca6b06c3fb9aaa5a258c084540db556f70046c1c383adb00fe5a03e09ace45472406fe6b63f43cf481e6af85fd3040aa2943f4279da5dd9dff7c3e81cddc3830e62a05057ab949fb99642e59e50b3ebadd9f51988967b8b346e869f49ee806b88b43574edd0aac138d116ec7efb9eb45634b7da44fed017f21c558c7cba2bfac12b4ce02a001a8d8fb5f4820035e767ff222d8866e2d4b3035d1c9271b7bd844d65233249af32089b5dc63190227a8a9bfaf09bdd2128bc121e943fbc854e6c65e0e89ce0ca9695de75293dad578f4a806ceedc6376dd9988643c99ce6b9c0665f5e7d97a7a8cd516ee4233a79237f7e5637001c6182c6d71e7c020daa513826431cb6a1f3cbee4f613a792ce74d2349a51ff60c49904796ff35acfaa86853c0defb03b6d6af96cae8932aa7de5b99a8b4efa999ccb19e1073ad3a496410182a044f869472a99cf55a6726f81d07acbf7c7c70df81ad6a9f429ad81bb9cdc14bf15218c111430eb7baeae1346a2f1ec65d2baf31eafba2be33bf1884c06ac38b0de7591958fc32954d5565fd22ba8cda4d34393fe30837e19f6e768cf31bc2bc719655545a13ca11a0d0e6a7d04d9ee587a6eda1347c5d19f1b039cfa924be2f6d1af8b40dfd38bd69b9b91fe40370cfc9d38f3029c32cc2be8fa77511a404769739747021e955e704bf6cac24fd34389e9ea4145627c6d4c58379522e6d775f49075856f5a39803786a9bc68433f95b06243304dce34f91436dbf49f32aa2f4c5a5fba98dd214940bee9bb18d10b3f929f33362fdb1389960993fd63f2dfa6fa68129fb2026a68770ebabba5b39548d8bbe8b4a4f4ed6ff9cdbef8ad1ae88f315accb4752f84e833e07b8850d988af04bd90b3786f46e9ea50d8e260ba063c01c3b8e2ac7e9197f52b0bec7c5aee109e1e3754afb95ba9fab17a038d6b34d96b88c8113fc8095f8843d539b0490cf8e6ef0abfb6c386aeb825061f1c4121cb1e6cd924d04e5f246eb678a28af3ae5397c7402cb1469b0ff07b11de5f3485204f3064aa91702bab82039f5e07f576b5d650b6c1293c1f61cbe77293e2aabd9479874651f938409bd74c2da94c34bcb2a090f4aaa1a6b00f1256dfd908e2ab1ece9b84a8dfc7e547066f7e10ade793ff6270b51f2535fba387d63aa3a5513b7236f773cdc957d163f970abdc5e875256ac118883ef1c4a0fb6144f60517db3f3208027dab54a9df778c94b43c04041596ed5fc18a6d4054223ad5a58c789a954b168df37c954c737701fa8d60be447fb26c90cf13cd373a6f3580d9549e121524e11998193a91db8ef3c8d3500c159b168cade48bee5e7d64ac5d3a7ba070cc8c8b1c75e6c5690bf1f07cf7bd6f8de46e9fc7ac861eb2b191ec5f47050d47071e742ebd122eb8489f075e3201f6c8c1640f4b7214aba4a545150ec0ff9b2be267c2793673f9dad3393a4f5902c9ca6488880af814cc50f32119a8bad1c78cc010709921b4d1c75ac59ead2cd2c130b8449c47ac80190077fe33abb7b24c7dce6b6099d4e4c2fa0cbf0b8a55ea0ac5d53e35c39fab88c64e378941bf6598282b8a2f2c1180f78e5d955635fba8cb24dab1d179d9975ae253c8b451e4a3d9730be120887666fa2bc49e543cc74d95781a69161f21c9d95d368b9fa0863c7a58a5f5eee1cc2f3d1a4190f11132a10891ec9b85023f7e2584765881da9659f6355ac7a1bb6e0a6fd01ab1559e303b2e83133ee251c3c07229bbf0639a7911d040d1bbc088c136191abc44c426edc459732595181426106d49704d318d7fac8dd867fc16932efa2bccb1b7b5e8ffaa24635ec9a2527632f7195846ad8c43808a13e4af9f9728b1149baf40e9d6e6f0f05ca3e17c5563e386f39bfacb1e3ce90f1098e91337fa92439c0efa8ba5ec939270e60e238c253d15dc8b4a967ba6d7df65dd5ead02f00493cd7887edf5437137a911a51c2e0517bb189a6643b1add74dd529c29a89d4d7a4f6601298bf507a1a11c7697503179293a3dffe28bf5b2ffd295f99aa057fe80a00e99f88ac9c3057e95bb9ba6a1b0abda3a2821ec4f1bd27f933f12c064425a193299a1ee4c22240c4cf7a9c486b69c4fad21f87e866b2dbadd934df112776cccdcd152c395b284037e91f4887a34513b628d0d82250cc4d950919ff5b0bf939e97f877e6e016cbd40664907a299363578deacd3fa74cd67fe8322f827cce83976e68df219fd55c222ad7e34217bc6ddbff01bf0f5c4d76230bc7330503a4b7ffb47662f151266a5843b1b474b759f30bc90886bbde36bcbdedb412c2e9e0319fe0041a4fdbe7cbad740386292d4315acd5fca3db7b8e3edaeeed2d1524b3a52d561fc951d2a5eb699d195bfcbcd1086584cc4f264777c44a81bd7d7150a1a40270d41bfadb36c5feec5d4732bd1768d78dad4138dd1a9fe332502161dbc2e4bf810c04cdf22eb35b13aa68de7cc81531a18765ecc4cb7191dd0057dad9cad9c6dbd605d916eedc38d56bb05bba853250958abaa815f26c8e1d008f617690fd61913f1e3feac94e069284b293bd6acc28c4ac8a02b49393b8da860271f52283b29290e2cf951b04602be43f7a0d2ea9759045c0e3f2546932205eefcf89d52a99f24e864efed36d67baf3042f369708a55a1f473057e924b5e21079b9fd80ada3a86772df35fe878fa237ecb2e74d30620564312701d0d3a08f02577f41b0f6d5b30ea6acc6c580e8250633399936b8ee1ebde48d7a682dab96c30547bb850a72d07c610a27a287039ee0c43ff763538c1d840748e50ad232e8bebf09ad8c045b0ffbddff042ed1e60b23a15587fcc0d9a8aca8dfebe7b04cfa511ffcbfa4e3ad94386c7b13ace8f0112194c5eab72d564948770579517c09c9ba31ed7e5e4d38d4e64c124e2f57f3726023789ea5117f4d352c6e13b6963f377427db0fe99d2077a3e4a5408db825edfba3be47220460acb00f5ef21444350b639159ed0ba831b6bd0a64e67987da2c3f8716d28123ac2d331a3a83527f23246f68a59c049d3c78baa076c3488a78270df545df9490a461f47aab02a994aacc01a3efff5a7aab9d1c26d0ca5bac8a9f3e0a2c0a64b0d8796221ad40b0d0ba1d327f79fc6ede86765a2fc6b1d8c5717a602398bce7a36fc4510b3e9471cd8144846de803a977e6f1886e116947084bc1e47c3abbb9397f1fff3fbf0d406baf2c3e4b1c3a9d3989e8871dfed089c3c3573e3506c95e71205f9277d068f2f360c1c6ac5417d22e98c9baa70186beecc1db415c5dd094042d62a665b9a32bd669fd212c8e9586eac6f75a16f4bcf1c95cb160882a664c08073c543867fadf804eda2d7708c8b6d6260125b6f373877c5029a34eed9bb904fee161859d5ceaaced6563421aac6216dbf9ba7f7438249d59960a5a9894222fe036c5c0234466c1b7b8f30a8d9991fa7c90c76e0cc366351334a3d6939d052eea0a30ae4857070003a7225281a615f39d4f148c996aee2f46c38fe846147754ba026881de1cf1fe961e4f61ab18f3d26d5b54e00466fb42fc96719935d10bcb9a7fcfd3d6b04d779eab8d5c8553fca4fee43abc50ba36142722adda733fab154d88a362310ac1a50ecc242e819425a564cc1df830c8b006ff3afdf985cb436a55fed4d29179fe091af410f9e398c7b3dbac2818f8bc68f9f1b544119285a2b723aeccd5bab931fa55ad9cf8deb43448a5662e1b138815c5b8d3db6e2500a70235b5647b69ff8cc6bb6c83ccf39f231d4bd2bb2e2287fa6d6e9746f52523b5f0523c7a5ca94f150a3c48b17b6adddef97806d3d263936cf42518de19d04afd6068ae740275b5aed51b32447f0d6d9beea22f7cacd92b8c9b44a979a1057f06a1d79bcf19e3ad45cac73d547a151e5af7359cc493d81cbbc5feb799dfe60065c345f5c9ef30b8092c5d3244e074147b7aebc4fd533a0274215219f3744e1adaf5876c128410ce457692637522434187154a1e3e6acc44c20fa9363be4a3adea05c98c931519facf2453e0737b2db371d2ef6f891a7466560cfcbcfe412b93d03118c0d8acd10cc1c76ed90cce9708f4f3932f4695b8300475f471e2b9454ba72d5089116875ba04712113a242d2796e3901fe8f184833ba2829b125042199c19f02ff1e28a96084fb1eb9e80b410586ad34a4e30b431eb0e6566d7bfd0e1e23672c3b941f5fae207c9353ba740a58fd7baef3a70c93070c62776a7fc0053a8d2eb15b0acf004e4301939345d86d4b5ddbdab3e0025d4f4256d8764c448f6c1d69cd32536118ad04b3325c5ea23c44e7611179b271cdc78e92c947b997f2fde358c9a6c61bc5716be91de0f84024d73b46806d4e4bbde7dbe262511d94239a4e28696d62bcd65a7a46ac92ea604499d0a31777954af39195544318bc7f00922f8c3a74c4c9a038c7b093932006589da004b41e3d73612684f3df9c540dcfe9b53e8d69693cb8750fdf920ff791d8fb121171b203a444178439449480e1dfabb4111b7070dcb75c391ffb5873616b09a19d29e0e7155b092903b745b8406749a802232be3a443d532a7d1177443180d728a08e3b13bc565ec4c49edecbf632d1d12d572e3088605a4fba2aa2abcda738d709a4180b8579f4af22e699f84687b49e304e4e04d6741072067d29055aac625ef03b83466f114de8e5c1d6091b27257081757719e5c71fea8f20dce56645e76c094a4e3d1c3f18070398ae9f43b45088650ed875ce8c3482999889f19d5c15f597acc611547fc7e6e8fc3726d689311ab10d1029c5ee05fe35ea01408acec013f20a39688209d2d17ce752d3d43437b3b0d0b7e595e6793443a64893a59ac5031646eeb74d25c534a4e3c6e5df94bce8ccb22c0d2f167f16fb0005ef68a4f77e4698f48b7fadf7ef6c3624c9437e0ed9b2c177ed2ab58fa46c13fde8cd2ec1b0a27ffe4b239fabe159a6934917d0d655a6cb6c1d5df2bbce6b75686928569caf7458961e1e8c4c2cb4f1f47ab9249110a300159efd9c457defea0cccbd9822a471095d33c677938a8dae0af30e1d4eb1110972a0257e6f6ef0d22ba1785b19a5e8bfd1c88ab249753b3e5fab16cbff2e6c711bfc2344546684a028c63081c41b4d488ef909ee83e21fb16eee0e637505380093d425c3b2c8b58e160f474caab50d2df67d42d49812a3f8b261759b473b98a6a7cfc612978f6daedc3f3de68100d603be779f59db85922f1246365c6457d625a4a8397fb44b442ba77f26377e8950e5c39f9af8f975d8fa00897ff0df074936bcd7ed9a44561c7104bd4fd08ac8085e5b09634248a4980a3dd5ca178281a3146525dd180a62e6f97a9bedf94e1b1dbb259a58d01db4fe0f73dbbde99f174287c68abcd6545ea9daf6d73cdf3e092dea925f989ea39741b3433549b68d4b4e592a1f95f0d7d57cf74f9da069ba712f6f3dbfb5d89f754a456f08763c07d3f321b8117391161ad36e6d73e211463816f35b0bf1feb3892e4d0a11596800241315d3d871b1a2fb32110199c22c810247002fda91a6eba31d804a96bdc21e80600657905674457584449946ed520ecb4164cc0295d2416836049dc037c03198382bf57524bb0693058cc65cc4370f1e6b6c71287166bc55a67da71ecb75526156a53632953244ce54b78ae56b6a58f38089f482a012a95898d0e30acf3e8443ec7c210063e8a98cdad174fc3f9a931186517d84f21c9401cbc6ae7e751266f71f213cf6760aa902bddd60eb580ef237edd94f5067f6869aa9ef2e5cf08226bc2f99dfc42c29a2c3e07b1f7cb5b195b73bb9b1b60c1f842f074d4545ae2e2ce0e31bbb44d309c90ee85bb5375bf22e2295d2ecf8bcae8a1cf6cc9e7f70e55eb6816b54a102961e8091a244a8538b4ed3c1eb52beb932f1e38ce3ddf4cbd038e3ec98763a190916d664c4e679952ebafcf9b511ece394cce959936fd097a6ce84c05c1390a69a619cd9b5664ae624ab508bf1db9f3dd7d8feb96e5ec1c7b8b53e733406de34229de917ac42c70a3bfed29527ae50836dc3c783796099890017f11a4ec003dbe1dab0ac3c581b1857f692c4b46cccf381f068f70e5205fe5f79d550935cf44bea031e321adb794724afa20e6bdb0bbf15fd370428bcdbcc807a0d8e8eaa9699a015c28ea0c056fdbd8d209129b1f514c18587fe84bd934535f3503d7bffb5e23f1fdaa1b736ae38657400d2cf268a15ccaa2420e714f1b7c2df46f0451669889aadbc06ca4f2598","title":"912. 排序数组","link":"https://leetcode-cn.com/problems/sort-an-array/","question_id":948,"issue_number":39},"37":{"day":37,"pres":["二分法"],"tags":["二分"],"whys":null,"difficulty":"- 简单","description":"```\n实现 int sqrt(int x) 函数。\n\n计算并返回 x 的平方根,其中 x 是非负整数。\n\n由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。\n\n示例 1:\n\n输入: 4\n输出: 2\n示例 2:\n\n输入: 8\n输出: 2\n说明: 8 的平方根是 2.82842...,\n 由于返回类型是整数,小数部分将被舍去\n```","content":"096221cf5b628be1e73e8bcfe626c734738e3d845c3d428f6b0b6073212a5f6a10a12dc8c9066ecde89f32f426e3ac57af2400c3906714dff32ff523fffaef2ef2326f68889bd2e21b37dacfe3de1e3fb201b80f74488b6ed23ed11f8dc9fdc319a433e9e44a41a8d5fd80854e551251fb3ea2aeea91763e95686e67fb27c824afba4450780c2f4f1dde44f63bda6ed24c1a6dae12792b3e97db4205e7e786111e2b134829cb8e59670b778208165a7e41e9cd9f18317a169d57a35d379b3a762d90f811cbc50d0ceafe2c20d9ce9ab8397f905f1643ad09e5ed2d0f642d29cf81ed5bb35d6730a99a6e2f850b4c4256880673d38eda65642d4ec03066a7ae2d308b6bd9a3e139a213e798851dfbceaa0c4b24e176fc3ada145bc525b08b78ae5701c960e6cdafe647884d141ac6247999c90d21582bc5cfbf76e9c1498a50a3134abc9c1204514389af53d10d18c78ed7eaddc1b2e08469d35bded5450a11f8e54079748c8979db5a55641b55569e972b98ac0acc1b37785849e83d9df0d43912e60e330b4ba3a67e1ea07751b2791cd8420697ebb712c78d2061cb32354e0fa480414a7f319531dae83719aad3d351c9a8caf6a55dde014b3c2cd268e14ce0a54ffdf9838a13b1f21432535a665234d554f146dfdab483976b5353f3842c9846bf091c9e4f53ae64c6d61672226a120a620a7ee5cf65e9c1942eeb75c959cac75d2eb9e417aaae22e61bcfe68be44763869e93e171ca67bc935116316a7254ee79797d52edab943f5660c1a6cee602602c6e0c56f503c8f0287c0f16a87c082d473ab6aff4c8cb6e601e502ef54f21629711da0249984996de11c67c469abc7072b8c4c9dbcbd3efa1ef1be1b6763f473b746dc6e0d4d90012d02738d69ad381884085b47c869c19ca166ecc5fc5d2d45e282cc84ea45e82428bf31681d7ce66f95218e811770a09d2d0bd60747762ee3272ac6599f1fdd70cd35096853fd5de65e81d476ca9558dc3555cf79b2a361cdd83fe911c84f60d0d87bd441df05b4fac5edfc392e60158cd52184a40af66ed9ca72ec61ae2bf7cfbce5af7cc64ad4d1611a6d328b1648a02d08a558d3c0085dfbde92a8c2e71d3cac5863d4ca16828a07a0f654fba7899769425f03a9c4f2d2e0f4dd0d7df13d3feb772562f6d77414a0a7f57e09198107a6a87cf8a1ed15810333235f0e357ac4d588546ea00a3c1dba6eca98ce8229a30d19496a516bfededac150f90a86cca73e561e54b5bfd10db9f448a1979e19f06b89bde01061be583cbd3451933e9b3d3f4b9f2e9fccbea76cfe82035ddc96f573bddda0feac2ed10822f79dec0e492a21f85231829b83a8983c75bcf8e46431de5abacb9b861323741d68373366e1d08dd3d839878af4f7e645a85277f0448c66e62ff96350654d6f0aad16e1b5de48d7962d9cb170192e6cd81423ed2f341cc64a8086bba6f32784201d93362b4f307a123e4cd67959a7907778b152f87b41837f5cf6b586f49a3a4c09cf3d79e4b9c09581f66dad52cea6a1560b3ca6995136ab9314f48f33c082744ab244c03d90c6ed8af8f0485e1d2bd489ffe7d754464c1e806f27332f50b0d4ac4786bef617c28739f86be79a4167463002c7f5171569819124ac8f2c25ecc13aa3a732126d9cc33bc8d1aad9b020142472b9ab33ea2c1cc0b7a7716f98261aafb431e08307fafadf53babcc120cfa817bd51044145fcbde39a6160fa606ecd67e940175092ede419653ccfaf05051ea2249dad7f660771a36129f749f0aa3d2a3ef7658648b753a628670c69b863077e4fb6008ecceb3673bab7b44ef7d6a611b7fceadd6a34338513f255c3c066ca96266a139f816396c009381c90258771a49aed4fc525277d7b1e73e8837e13e49728a8ee6b68bb4b20ef5c4882df966f7729d798c5c06e3e3f9b1f1c16f0b99432e6e11d50d5c4f85157681f8ce4b8d2e68fc0043ed3db78db8475fc3537899d4c1c3de13b40d885be110c4c22c35c691aabcdf4d16a8866ac915814e2eb22e1998f38a697be7774f210f7aecee8c74b4ef508bcda6d97091ffe13d6dda784e1f2dc765711f9e80799b03c356bb95b82fa61e8f978ab68c8636675b97ebe1f0c22009034a94f01d0aa2069ec497a82f3f733a87656487f1ab5adb065ae182b6621f6df536b376873219124af5df7e02f3a91932e0ad5debcfc957ae5303781504562768ff609f72dfad28794dff1b754e2906f2fc46358c7d8dbdd869c515af26fa2bffbf9fb9e1dfaf266072c69057b2ef038ccdb2650ada5909bb392be2ea05ed618cfe07ceb16ca8a266c99d6a2239cade9490bc49acf0871748faea7b75fcc4248d53a6b4c9a5bdd720d0597d9a67592c4a894cba7699f21cc8715ead02fe339bc36ba3eed5417312ac12b9272d231fbb33a0a9c30069572eb20c4576f7f326a8e36d1182a0524f2d12f458f3652bf8eb92b9a22eda0b047228d45521b2df45ccb0465a0a031b4c4eaa2f9efc3f125cde9fcf1e7784efc76cff66ae2b4ceba06fce05c148e5aa686285b36cc0275a0ab8c59b5092bd33ba9cd4c76a9f284615ff9267bdc98ff4e3dc8ee83f67868a54119309144eb45dd25d95040639eba43cbb46913410160b1acf4a0b0b12cae22c6e26c001795db5003bf2da4bed7b96d55230cce8b934bcef09e26fcafbf0d7c5c891f02fc8f7cfe26010beb683cc396b7dfd48722529266b8f85381e6f4d6b8b32bb96887a8dec62c9d3c2752c0ebe0139db85fb022b1bf87f4dd1efcd1610bb9fc94be0d228f84b22160a2014325d5ac45faa79341c167bb49dd77b0d1b50dc44d1b79ba945f993ab5e9e2712f7e5f5c4cfca867646398c9b62072da69d7db129ee5b21fb443d5d48ccd19286ee30c3a03b8c34934fcd63ee17fe3333231d45c2a591b1ca4c8a0387d878d4fb61296948eb7b87cd4bf5590a02df729f5746ce88cec5256f11ceb4053558d75094f5bfe1dff5750e44085c67cdede390fd6e238206970e65aafcf5ef1765d5e5d3df90f3939fe18c659e2cea54ff0fa2e5167244daa38b80d5b58b2386d162633e70d8c35c844a4ec525a96fbd2fa7866bc9b606866848de8d997084cf8dd0192e1c9156fd1dc8e57dde2ddf29a1e420a19973ca96ff96a8c8c6b8f2d75792b25381c8c3cbf750ce08f1f5c91fdee7cf6655fa0f6a170aa17704821c11ddf4cff77df60aebba43d476daf3fcf56ee9ee31d882dd5d7485e4289508b5b4500c606f0c05a46e6e180d7bbe6bf780505015736ede1489115b769a997a16ddae09a49bad053ecc448594d87a8d8a5b12064b1dfe0e9c349bdf63148608dbd1d1ba178acf8389fd1c365dab287db882ba919bd2cd51d26b589b665efd8e973eb5f04a8b322c59ceda818cfaba1e18f11a08c564bbc7d1dd5dd74077e4deec9915a4d32616317fbde1216fdcda35a02b503ecce8e08d810a1bd33106d5ab2fd5d5513a885dea054f14659bc0344d3e14b410a8d02fa0caaaffc85d31fe76bd2e10d6f1317e6f2b151262cf0c6025436053162a3a14c3de6c4cd4fb54df9ec66c39a71d520e1d25e5ab053ad9af60fc9e6e9fad4e6bd9f168c5d35a0d657b57dfedcd1b45e267c6f0a90a248632b6312cd9dc676e133551594f652a3355f12f7a2206734e1e3d003e41d25728a03afa8dfc25829dd9e41e53ff35bad76ea3a1d5908b7adee0f90c10326ff49fac5468d228b900728f84da3aa6838742d752e42c4ccd7a449ee1186f25e839049b1c5012d4836b47fc4a227303eb37bb3674c0750f11c60142ca9de0c2a3f5e681fe14cc4981491e333b8072ba329e6e5a6f3b6c9f83af634499aa05624570e744c1545efc2c3e5cb9b016e9a981d0b696a0cfcd27f5054a019a7025f09f647ebcc4c2b2a5b28abe049122112d8f0b61e6859586a1c0beee8a3a5d1135e95f6d5e69078be4541ca4d8d6c54ceb4dec3078d415f06a1d90783aac8f7c28cf898ef220ea6cc4de4e938b205963795de4cf884dd95b7005649aee2fc255c06d6e826bfcd6b78f2928ee3632e03d4eb297d779becc4b74855d9c8dc6ec66ebd283ca73d9ec68161968fc7aa12bc57e98e7a2293e1e0c869b1e13817bfb0f52461466463b67d1b69b95b6ddec85d76d61f82007828f1a904d387084ce35b8fa6c788f159be129f8134197dbbcbf82fec8582e3933c33c35f0089f56ba2576ea2d09efe50b543c9caadbd5efcab9e6682a0e0f749533794398032c09171728b4bfc8c8ab1deb36c9a5409b3f119d2e2efa889dbb5d952b848e714f1c1b1ba0371fb5f6b9e0fc2fc5ce1d16e34d0130c4f08777ec0bae3144975cc44202b99344c5c56e4e0cb9a823b8812b16dcc9809b6337890d15296643300300218cd205a515d865afa1f728d3491db1393ccdb021ebd3860ed491cfa18eeda9c38e1585b8f9ea9221","title":"69. x 的平方根","link":"https://leetcode-cn.com/problems/sqrtx","question_id":69,"issue_number":40},"38":{"day":38,"pres":["二分法"],"tags":["二分"],"whys":null,"difficulty":"- 简单","description":"```\n你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。\n\n假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。\n\n你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。\n\n示例:\n\n给定 n = 5,并且 version = 4 是第一个错误的版本。\n\n调用 isBadVersion(3) -> false\n调用 isBadVersion(5) -> true\n调用 isBadVersion(4) -> true\n\n所以,4 是第一个错误的版本。\n\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f21931c3385f243423d7847585e26598c9d2a6cc1fd231c0b8153ef1365dd67ce65ad9d3e03c1ae76b561bceff835f3316e60d6d7cfbd0a2ccfea998f527d3be17095dba7058c27ad68cce6a7e19b5c30dc006ebbf1446a7247fa4f14415d9751b4cfbcbe22aa14b6fccbf732f72792854455720d11561ffa67f406fc68df5b17558113482535a8c08478cfb8fd0463772b0567e4f32f5e4a2c87ac1960494df6d492253b7729be5aa87334bd1d75378a15bd530fba44a3db536bfb687821b174965f144f9de67f40ea9232500382dedbd950f0c530a98d6d1185e2c6e392066f34c6fca756274a6e9c6a661c42d5ff0dec9ee9c774cb3969144fce3e136d9a869360be09fe1ea7712a812e4d0bbe3366e6d4e62f2c67449c56142bf6c6cc2e0fb656e2ed009283f80655da8b689a10679079a4ab97e6d6e9739bb6ce01e7c0ad8bec2602509655c48e8e705c6ad783f0d4768bb97ada5b5a4b095f718c97018dac1dca1b02745b40f43eb0e6d22718e50d20096d95a66a16ad5053b05005db582397e8b712c78d2d58c4322e4903988e40427d32b939d4f11b1abafad95dc3a4d5fdaa4fd7007f202ac16b0cdc83e76999a19e1ac50270f846412f31767773fd2cccad8c98e1f865c19a46012d9f7cbd021c5dfdeb43fa9f8c3f194160a7cee2aa71d2d466f2d7478d6499b9599bbe7f44394acb33c25deb7391cfe995770dc0bbd99c626ab01d3a84b481b7e0f626dcf3b9c9afd6b142044186fec0877e7743392b1f8f31a58d17147d38ca0f31421d2adaf8f2a6b84225747b769b516b3b85609f3325f344f15aa0299da11218c4b52644cacecf143c2fec3ceeb95031abadf56d796b741cbab816ba83f2bcd0ccf549b9a5708c93f5434325e10882cd8b0b3676b866f632aa21c0d17cded7a80ff53e77d17e0b12fed2f8bc6f695063e836708f7a95f7c4d42efd5fb9bd3fccc264ef38445e97548beb535cc9cc08fc8f52485f11945a3090f86f30d4ee779ba528e747301ce90a1e8195ebbde7419a5c5e58be2ff7869def1124ce392eed1e0b51759193519623d61193f371c0780ecc80b98754bf652fc5984b6abc8652e5ff64bc757405e567d906b86aae33ec38248d9d99295815f2d4c6987369186c5c5f4f026c56f5a39a116067a3cf8600fa592f0e3322f9e248b04d4d9d48d21fa1e0c4a7db8680ed339539f69484a614a9ffee9d270f84956bf15de46bf7497ecc1feebe48ad0a79c4880c8398d30e0c16cab6c7de791933e9753a05164fb18ee8af3fe8bd5605bc43e7ba9fba9b389b9aec9760943f81e181d880b404bfa967f8b8462fc477c98d4553d8237f38527e2e072750c79b61fcc59edb5dbf490ed433aaf4f9af6ea8b5df8fb95a3490867cba801597b25f814a5e81fc542c591b87c371662041d9ef237bb44ab01bac66bc6fb0a1949602b265b8fc06bd1a201fb8f7d137b4977182fe6532b08134945a92eafa3148291c7695ca77e67a65a6e93c23ab1b8c9788444a8553ded616d9c583519c99c5bf2ba8cb00e00a6fd385862db93c71f335b89f34571b3acf855bd52943e34c4165a12058e0576d2a56bb83a35e49809fecdcaa475e7c5853bcad834d6e1df558d73792411933cd1aa51e46bc055d5817f5ab9016747484b9b43432e798ff875ba8f1791d283abc19c9a711cfac2b7db0a103b8162f6d67888c2fc14e23f17bf2b42a89652a386ba758ff0dcaac8c4c1b8221f715a3d4cc7dd55539fb2cbb4bd7e7fc807d3b18b43c7c66d12fd2d9e209e1e7d96408e3d771e286a9644ee64a59601648ceadd6a4403b9cb24d14297703a4111c8e48a70e52371dfbf5d865187070259ead954e173cd1fc8338e145cb7a1972f8eee2fcdeb2fa79e6afcc32880be117d952f00113a885d7c68eeb104ba7229ed9c776d493951ad6db36f200d0cd6d6c9f79458f4db7c7f24b17a36e23e0db8b90c35ee508ed30c05799f34371eedbc783970424e9db7eaa4da62b9f152c36a3f3b2767ad36187a79679c1d88776b7e543bc0bc9ef07e9c4a8545d812e517b78ea2bc9815426e34f935e9f391d7ebf3f16a69383b9ad8f0e645b80dfefc6e52f02084b82e7100a9d0b8fcc94800f3e7d3e85514780f2b659c9265fdaa154de4a03f973ec61d64e3770e43154a87aa98d5c69c2f706f15c4db67290ddda2d2e908cd2fe7e8170cfa3c6c99361c294c5fdbbe8cea3e960f9445b37ba189244fa3cf12e35634d6e2c48fad1f30e06c4f6eb0bdf8b85374b8e2755ff576e7703e864932468c60532c03423f37f73f39dfc5a4f52283305aafa13becb3c47d7b01d7dec13ca610e6d632601a00f86fe27aa9dabc14ea40499396e16c2719131ae36ac220a81466d6ff8b5a761d629b1baba8e72842fbbf51d694fed12ae6f5c315b976c31a7d4647cf495eca218946685c4705f76367da608b79772699a0621ccdf57ccae5b5a1203dcf5eaaa27a8fe3334b37e030082db407678a96ff76893c3ebaa3708b15fc3104eadf8036ad859e0e0ae7e5e1a98042ef507585c0fb942b8e2d05f0e6db70613582b43372198cb417cf0ca2ec59991229342dd79bc8939f5b93ca34607e8ec8cc5eb0a98898dea240ebe939228b696d87a84e03449bb65bc066ce0f81e2f56f31255e4798236701a3e50166c79e0607b0c73e2ed77ffde89b9f19d71bad0b3fadba02328f1a091cba67ff5494b22b5405c8f2a4410b6a7b6468bf5711611e6bee723f4d45b0048da9861495dff1b58d12b1f15253b5e4fd791a6ac39e0392ef28df8731d3f1f736b4fc15ecdad3674bba5fcb94d973805d5eff7d19cd78f05525fd9cf2b482af2e37dfd34ff1336a00a6b2e3b9d83c6d9f53cc3a33fc070941d8d76901efe3e2d23540b96f6f5e5ca01c3479a94739de73f69600bf560ffcd56f5490602cf7ed6496487dbac846119549cb004335a9a1d91b1aaf5848d6f2444085c67cdede390fd6e719f06970e68a6e7d7a3176ed5b7dadf9fa1b98dcb8c659e2cea54ba43f1a03c720d9ca3c6c991b5812986c32e60736186e24d9f604ec525a9329705a7866bc9e443803d0790c09c2fae9fa79c28045cd116d737a2a42b9f37f54aa7a42da29c2581b6afd1ea9892fbaa8e31d3e10081bb8c87a2048747bff58c478ae3cf7106e779620c1dc2384ae1535f89a680bb7dad20ebba43d46a8facb0f164ada7748c93b11426d6b04ad44cc3a3470b7c720c0da46e6e10023ced39f7c010103f59049f42819093ccfcb327568cff62f2da8746728d17d6dde561c18d0f46494b068f249c349bdf3341c413dadb9db659d683cecc934d3600a33a19ec82e2989b89e751d26b589b2f10a9c79c7fa9ed4a9a770652ced289defab71e54f81a168921fe9b98b95dc65b5de4deec9915a4d32616392bb5e4374bc98353fe53037783a6e8c0c84e5b94655dade2689d814c2e9e4efe15543e659bc0341f3e09b40aa9dd63e8d3fd908e092de324f4695882f86a54322b505e318a0c3b0f4360535f646e148e97285198be128b95823e6de0184f47516ba3ee171fcbb44afc9e6e9fad4e6bd9f135efd3134b6d361e9be7dd782bfc3fcfab830a248660f365798b926722081f51594f373e5e408f72772b685435760d2a1401921762f310acccae258c97d9e20f1af93db28727a1fed69a9b2fc9a7a22e59610db5dbda113a8161f64e7b8fdff076e3cad955b01ba02757d63014dfb3592225b3704acf59170ac392384ca7146d2742a737ed7326933c405f952b42cacfaf9696f5edd5e60fc652f00050677ec737e86f9e1a122a6600d6d1fc3744dbeb413f3935b517881b10d62c6c19e7ea6ea7a981dca58ba69ae761a04b0908f96241b0d76a5d96fce3b98f98cab201862956428a1320a8d684eec48cebbac33956456e91467f54714ed5fe30078ef2d68c02bf1ae92047c047ac2e1198783ae89b7c21accec6a629ea37eede07dddf20152f2109f58ec15bd95b703029ceeb68c002a5223c8a63ae9ff0c72a60ac7a3bad371aa78ad82ba59e7a5eaf5d9c8dc6ec66a29483c277c3ca294f6f61ae22e86cd97b99a7e9322c3457ac9b1e13817bfb0f52145d6848673fc3fb9f98f2c3e1c88f3242f86c079f8f5784097d37d79a2ec9d06c788f159be129f85f04d1caf0f1c7b3c85a2e3a6bdd6a56b4088356f76c6fc92d5beff856335fd8aad6d5ac94c7b33a640e4331d36762699803345e6e0f33ccbadcddd379e1714565f67782b358b4a83f203b20c925218ea45b421cddfe73aafd737d3d1f21b8670b879071fbe62f81b88b78814fad3fab1ef1c5763ab5be56c5e9654e0fab67b31464baac1e111e43dda766","title":"278. 第一个错误的版本","link":"https://leetcode-cn.com/problems/first-bad-version","question_id":278,"issue_number":41},"39":{"day":39,"pres":["二分法"],"tags":["二分"],"whys":null,"difficulty":"- 困难","description":"```\n给定一个数组 nums ,如果 i < j 且 nums[i] > 2*nums[j] 我们就将 (i, j) 称作一个重要翻转对。\n\n你需要返回给定数组中的重要翻转对的数量。\n\n示例 1:\n\n输入: [1,3,2,3,1]\n输出: 2\n示例 2:\n\n输入: [2,4,3,5,1]\n输出: 3\n注意:\n\n给定数组的长度不会超过50000。\n输入数组中的所有数字都在32位整数的表示范围内。\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f279d173385f25055317d6b5949355fa48dc8c9066ecde89f32f426e3ac57af2400c3906714dff32ff523fffaef2ef2326f68889bd3f61f26d0b68cd04d7e3ef66eecfee24fdeb15ce047074a2b7dbfa53bd80bdfca6069b8e7852f091039a43ac1c1ddc3101df81f7d0e8c339e7a98d53e443853263341cd289b3f9837de2b7b69e24a4c4a74b0a53f33af99a15d7436741417a2d14e237842f892701d5c26abe6e1773a35609309e96460f4051358ba67f4546ac84cc89f55118e6608728235cc61522c909a0a7ebfc611377f8cbaadd92894fc7bef9d2147a7b0a0fff1416f71a4d5cd233d3b28a91c3f0f3ca8e05a87a4a29c5eaea9cdc3c5493e2f579a879f61ba10fd0dba9cba26ebf27dfa0c01afd246c1b9d44984421922e4294ca5c32a379cef7fcebd5de4c87b8957b81a569a9c1201becc1c68cb9a8de700c5f14f3e710cec8a7ad046ec39da99d1588ed0cd76a29e976bf99d3e1400249ace90296ab767140d4f5947f23d87cfd33a2e0bbfc08db535a44a2da16656b15405da6f1897ebb712e68d0b420da2d0bb22b8e3187615718267adf75d5c4b750ac12582c8b9f5419144abf2a221b1821b273fd52b6d66df4ff8a374872f69655f000bcf69a987d5c2d69613c95ba8a2eb56d599177019cd8d19f2cad005731f65c1add7e830dabb3fd59313a23cd09815fea3cfaa67798f63d5388a58f7bdd2e61b1eb8c0cee03b44cf743ed3c9bedcb8c26db2e9d99b8db2cd7d6d0996a2b2be351b64665029ef6ebbd86e1d1541ce6bb2c81c12e9fbc5a57eefb397f223c35a2157b4c358f2903cf75f6286ff3017a7bc92ef0801abe87c146005ef20feba67326d03634728b2e6af6d1193ae8d87a2dc968495291cb8006e19284e508d31dd7011dd932ce349a4529c902f4b1583c7cd47f35105e811560ab5adfbef13422c3ed4562fae32cdd5ac8613bf09aa11e7535db3963c21ddf70c84a23579ad53b2ff8976496813977b119ff1753ef7e079be962ade781b3f3680ed4586b02a18ad189f8fcc58f67f723171d5fe5af4fb6bbb4a1408abd3329c63b00e3c7699049492424410ea3bae2e77e4c8f4b9315ba7869a27bc775626e57ff905975741b45afe81e8e198473a218183ebda2a664a334d203b34010fd23777bcf3a03ba9e225b80b07b9df51d5a83cb73337aa22be2bddaae1e0435d81dc089a21e85c646f95560929219ec738df1dc138bb52b31469bf6dc5f22d9b522acce246bd4a1ed6e987157c1541d592c22421183a3b0a7b770267f02636ecc52dac07dcf0304cad0c4c128010ebf540100b187db90efab929a47a82d60caa0a00d0ab9b3a7c6552782d1c730488c16e70345052dc77ccd879ae7b737454992737171d4af3b17060fd0b5c977e1d2dfe8f9e7b6fa8eb175f96f83d630c4898a57d2df542a1d705da64c351e0b78301ddff284ad00792e6e37b520bd7064aae160d8eb51832f8ec755a7b6367137c9dc4fd9c54b601710a69ccdc2ce775144bb5ca6abb1358b0feca178826695147ec455b488028138ba0eb9b3feecba1489de37f617b6ae8c205cc5532f50b0a71e35c429d3a5d722c9ee0c540ca6f70235423f09ac5fc965fcfd87c277edc18af16f1f593fb6473f91b1d14ea9b0f3f40440da2b229a5ccea30bdc9fc6f6f901606afda8c9ef846406ec640798db23f28c1de1445176ffcdf3285183c9704f7c876b209793b3cdc61b453cccdf0735fea2b6ed7f3f1a7fabd3613be75931aacf69e2885fc64a56437538f70c69f841748e6e64409d4d87cc0a8aa4d63e341776d1960cf92f4ac5236502b3d5d0527638d4365aa20f635386c1eb883ec3a97efd9844e152be0d671cb9b098e25fc6cbf4a67be81e9986409f85aeaafce038b17fe16f85afb07071d7314497b01c6e52995772b499a3f4533ec5a3fd1e220fa48ab8e099ed30ab979512ed0a245bcb0083201495fbc7b91249207d6465bd6b6285b3d4015f9cc641383658564a04294eae33c2e04ffbf7cf24f390fbe353a1bea0220dc0dcd6071c155646dfb8806e2c8f7e832a3715cd3dc32cd079b1fe093d728afcb393f4c25044092c89d3f5a296f3da6fcafc40c149baa538f69321730c9f2d7a60fba8c400c0b9568b29c7a037ef48cab48b777ed11f5a3b64afdd72dac144ca0af6168a22785f519f7536f620745dddcd231f802a66502ece3e33896dc8ae1eda6b1dbe720f85a5137b914933d833688a4fd9bdf9ac1c37a7d36a6a0020c1e47d5e7e6a1835e455abbe5b3bf9614bb1ab79f4afceb09aeeb39c5fbd9b7f15a89e5befafe323fc5131081f41e2ad59870a9ce0e06231d345fec6cc7bbe06f077e6bda339a1effd3b407eb17fe328ca84d02dd062d45cfb6ac2d12b81d2d1b28bb189a83f51e6a4cedd40ed294a6d4bd46b07e6de48e251d2a6c9b6e840810b293a2c0fc009d590cf7ac35abe47c6e916c1393fab1c07c542fc100f899127539ddcc9c381ecfefbc33c1f726c68eb8aaa190219834fdcc225ac7e352906179ae300b5757988233afacd4c7709e3b7c15f6a3a40a84d6ffb18499b15054e6f74a73eb0c5711b836428206f18945ffb92ea381ef097e6c0766aa7689e76ccc95506b6e9d033336a14168d0932ed822cfd23079fbaff13fd290378525ed9ba9d3b54561f932ccf5fbe563189f732c44fdb5dbfa707a2f14346a938b3b08754749913086ba8469b1ec74dcd2c263e9fa0f0010f38fc80b2830c47d53e0efcf2c1bbcb6cb6ff9d125f18ecccc751041b092f32aed24bfa34a4a63dcd4d7fce2c5af4093393eee913966292e9369b2ee556f1a0d5a2d18c0a1e5d98b2b8cfb3172d022ec4190a71de65a2eff0600010e1cbd0e6ef008f64cdf15eb029131a297097e4bd6ffebe8e0088a1e87a305bff37d776945e7329bcd37ef630602cf7edd463f8bcb9acb6c214281b11974509e5099fc89bc9fe7450e06410f228eb9edd9b33d6cd01fde8cc9103b4707d1d65a73474058481b495120a0368a2cfd61ca0a75d0ddbf5906430e332c4eb52a06fbebfbb8642fe9148ce177e00cea78873740de59719d70accd530f4c98405f1204ad99169b9052af0d40f81b9d71a65274aa7379b75b3138203e1267116f57d298b890216a0b726a976a9e356856d86a2e45aff323958b9be62db8982ed88c42315140bb5f942e12d31295682b593de00f77fd623731eae24c53bc508c1820a8faf0a7c4c175ba3a14233da12d9a8e1914f0c5a85bdf6e187f437707ab92074a8e474a40ddd64aad725302ac077f8894d5a9db0a9659911e1abcdd0ce306556b579f6b5f094b2a84e59066d19d2b05795f212d21e644a2ef0fa3da50016c942877d15ea39c59cab589c2f3bed1845ddfb317e762164533c601e1f922697a50a23016a2f2b9961f68feaf4c5fbfbb053f368296f28485c9f23f4f2cf7bb3cd5ce023d9e2db15111244fb180740d6e4d9e04acd830b6c295f5c25c79aa6bba737282f86a542b6e5312308a5a25771025231e2d3c4786c46d1ddeb212ea9cd41470e05506035160a3bb0c28cbcf37d69e6e9fad4e6bd9f1298b8013566d2634b1e7805201fc3fcfabc545768673b67862d9bd7d44133551594f3763741da532372242635f475e537b0286596ae969bfcea85a8d91d2ff0f5bf27fb2db27edab8ad0e56686e9a22610326ff49fac54299c7bb90b6f8fc89f38eb81da5f971be90d5dd650449ee1186f25e83904d955030ad29b364be9336d2157e373b73635c95f0f11c60142cacfa5c4b3f3fdd3fd5dc91cf86334737bc05890f52aff9ef5c882072966dec65e10a1f8e1c721d77493ed6ae5eeb12859cc63337d5f444e334f43e04fa18cf302e8aa351a94fa5120527c171e0c43c11593bec17bd1e9024256554c49503a05f897d7c672cba390e0e1473ae5996045494bb6378838fac304c660f8f81b83933206cdb5580c4b558f2ffc7516986416839da6ccfb33741ed66ed2bfc1c45e3ef941fa62a8f711a37d577315d2a508d3b168c08b010513b03253fceb40c32b4b695ea34e57457da8591ffccc91b739ff1be62bfbd4eac233697b4bc8921adc1dd78b56060e5b6100f690513f4f4e717764c8ed663aac2943f3c6048d09fec6011aa02c3dc2e8408937e143b94500975b5f63004a091e5a632e891c3de40847cd74aa897ceefb4dd2211a76dbaa124e7d1613474200ca94f752b3d8852c8cafe9e59db45c8ac5c9b11ca568aacb2be86b59d2603dfaebd2a2328f01aece310f4c4263a33105aab8eafdb551808a5e59f0331d62a0f59564c668e96bce41a5028cef2e5d87440181dbe623e165d3f8751669315a0780ea03c7a2c5dbe1f599c2ab5668538f4bd178bb9bdf609e3143b9adf01b3f9a7f770bb9382c6d64146b665f3455eaade890d9597bee8246b4526385e624ccc6387bb5b2f280c4d7a31b61f395891b42356fdbf1a56a684e3fc07fc48c9e7ead2e679405a1f42a2a682cd52c88adb272f5ea4be4e5dba1fdaa49bb029a38875ec14989158baa8cf796a0ee217755ba4b361003f43e6f1ddee98ea6059c09c13120225096c73e65314f28bc9cf7758cf6bf7cae16c5bdb4572f3c2d55a7b7701486455c2ad20fa2ce57248fcd9ae900dfa340aed40b8f2aebd64528b4a75bb97804906ce845899cd9f9f589a268d9a6fa5e2c9a871105d542b53ad28a8ba0b44c2d8b6575dd332fd2e70fc64f691219862910e657e01ba7ba46dfa832d80c6ec1a218edd0eaad6eec30958833822d7cf6800b727aac1de7cb41ca9e120d363a1ab7b2e72ba663d12fb510a50386f4d8d85d933ed1a88a4de0721beaaf331b4bc8891edb6dee9eb3fc91e44e4badedaa3640eec0ae87c868159d5e1868e90f72175a2a12cf55348e38ede34f2df8e1dcc1d0d98bb9c055873513f2521788a97a069c6b848c05036511ffdb2105bf1a59f7fb8e441d53f4b1ce7896a05f4f8cdb51a0ebb180c8ebdce1c2c25d5ce1414bbf85159bab42153d0f436bea4f50e0d98bf923c68edc1baa5e774e338418bf0cdda443fe3541be695fbd554e09388ea9faeb59ed9085dbb8bcf4d07ba7cc5ec71391c099b14c6e3d149e88a0a1965d7be0ea3cf825e49ff55a4ca0b50ee5ece78286a3e8a184c6055a1588229e6a929f42930159d647755818244ccab95d0a3943d5ccd457153975d7b5165fda8949e080f22e93cd759e2ce4d64e5340d4499ead8354c12117e813f15f498bf23f360609475967fcf0d8258f4e2e5559f2f5e46d2191d955f64c242e04481415725739abd6d0f4db5264c8821bd7abfa4446aafd814b97147c2c68379f065a55a9a7a118ec47031f619be06e3028ab3d4b37b17ba4ed612212af484db69d0f38da432faafb9a747062e08883fc8ce6193bf0de0794831ae5e96d11738a65e16df321ccb9455563d4ab3055d51c6334aa63b8ccd5c52bf276105539c263f1e2f05cffddc40ce0ad88e63a3faf72ca83835e6a48251b3f48a4d7d6af8965861e0aa5fc9f9b27f5c4a9fd0e6de15c9f0952e7aadf6a5dcc325b60be01f15caea7a4c9feb46945fe3e21720f5ab5c2cca0057ac3c467a7895e199665775eeaa368d7a3422a660657d44a028b7e198a9b7a49ed42ff0fb804dd16687aaebac0fe81b1d10ac6680db1a80aed90b8139393a7f25ab27133090f0101ff2972d42ab96038d4faf362471f4be888c9f2e44f92523b0cdf97c78f8b84c4060ce4d84e3eaa6d1b0c9e95e11ef2a87f2f1eb71b6f7b8bb3ec36c45dd856b73963a6a84a552818cfad10404f1312d5b46d5a5e79b530d793f6052ac52b58464ed24d95f3d540ac6a9cf59cda30584635847f91116f986af5dda7b25f070306b3c5bd9299e5938a645afc1289b60eb59629e6a1a04cc8eb909963cd9f47527b298288baeacbb0c6e8c5c45a13f777575ef7c1a7445dbc4699e3c6971c5e35504d850a315133629120d8d4ff2891cfcb55a60ccd4f9701148c0b64d902939940793e5ad28e6ad73f876377a7706fec69de56cbce55c635181b76766e2f3822f818f46aa803cd2a3d6f3fdd7068cb510b8a5bde19049b2bd35b6a0f3e762bf057e47e342bd00eb74fc928ee8aa5b52a3b5f2a58fa10b75c6b9c5fb92cd3ef76d45b9dc6d27b625435f508271ae1501cbf0aee886bed0741a630f7da1c4a20b9e1c9a0ef7524b5d16ee463b2e7bc2467f78efa77026cf3b1c6e266c0bffa4951943306010d45f6272bcaaf5ea709c909d613f91ce03b46ad04358ee4acf4b9caa851a0810bc4f03ae503ab4159a1c60b9e0f6f2dcf4d981df0274c0dd7650df4610b495c0c3f174ca1267037b094abcc8c79a34a03fa5595332b2a35f93b2446268e07e8e2301e49610b04c796543b05a62851709fe62bb93c861b551c118a114b4b7ca48b5b313c57bffbfc9965fca3312fb91e870fe0ac693b0aeb54d15bcd481649ef954531a6b23581cb07b75324700b6a95db51584dff8adb58c27e361b08e90ddcdf843f1f651d836dda7da976c4e1eb9c7aa6dea2603ea741f108bc477ecd83ac7d3e40769bcd4f40cdc7dddd6799dbe9831d8ef2df74d824baaf5195e4d4b8cbef834839f4464039b7fdb623098ea6f634b43c7a3a458dae75cc5a9eed6165ac15baab9ed919f155116ecbd9abbe2fd43d25983c3060fdde85d186e7224f2b4bc0a38f352317fb3fe3d428ccaf8d49c9f4278826cf5c90df8c42a435901e31b169810707c93bf649ec661b2d7751348a30a3b7581229d1dd54b94969cb0d0dc775d743449fdfed29b066a48a325474ed542bcf4d3acc42634d1a09585cf34186a92b92cf54a6c8142aabe2db76366d1e3034b93e28744b1bcc1204aec0a7a80032f4122277bf1a04060db4552e0ab3cba9eb51e279dd3b57615b70130d6045102a40f8e8901d5ae6961b57dc1be9fc70400fbb1c077a0b9225ee58199e0713aac8fb6c25d93546df06358d4710fd507ada15688a8ed3b8b2d4436289042d1a47573db4320911d82f30d6c66347e3b7495bf01239da4a43e05729e7dcc2f1deea50cb50331c1f16ed7a21a38a261681de06b9cd21d149fe7c04fdeff9392f3fc7904b5217332611cbc0479ac42b49aa4719a5538e1749c31bdc17ba16d88abdcaf29bd93a5a442f7147069c56633466e82606154fd64048adfe872b7a22d0b7c993ec0aaa9b699b7265cca091ed309d063b3902fda0a0b38abd8baa00955c46bc6f60bdc824af0001c1c4b946363437a0bacba576bb1427ef82b4e257916bb3870253005ea3472b2dbd924af38842483b47a83b096bf1d0aec18b5c430383332c321d1a570d6e5e16c9dceeb8a842f50c5dae434f81600b792de991e572288557ca515ffb7a2f9c9bf63398dbec15a551fb4897c4c7bf0d991c02b333527d49b2784e3c2dfd67f09c6ac08d688c6ecaf5c3574dbcf96d382d0b6af1276165095d43120eaac1a4e0c9a972aac8b6376bc2a184de23fce29ee62b60d486dcbc6cd96ee9a578409d7c04eb50399772a511de317c0f810deb22a2424653a15d6d0ceedec3ffcccab474a2c47928ebc99c84cac5b7a509a1ac1a3e47832edc2e7c7369aacb38ff50c3f25e8f1ad0e2ccd1a2272fd37fbe672fc5c3509bc69e247175ae1c2ecf5531e520311dcf4965a6879a25e961f79c5f3d135cfb72c4696cfcc4effec9bd066b7b507b007db6a1848a1c279a8affa4628009ce491e97a0d18758ee6b879aa9e7c350dd46a0693b0664ceded78566170dc2a6918124c5795de4b75015c9601e35b99ab5e3938b13164f157273bb86a0311331c43ca229de8ec141a0ae4be3501d3076cda470ff343c925a03a10132d99d316595207a1ec9cb6d5410676947612c10f73cfdc6d85f7e60f335311f4e47bcb489e806d40a83fea2fab743afddc7bff03b1faf3990ca2dd3722fd705f7fb53c7b31639bcaf18ea54aa67c4084557add551b5a3337a25cef422521d818a40403625b8ecc642486346b7e6d4a7895875ed03b41a6efe08607c936f5ab514c021e218525288741a707f6dc611df68e7ed79d717f5c6812494e96d21278ca787b827fc25042c5fb4edc16afa31b1d0fa2c1c44efec91c8c2b857a4b5ba8ab0d35d6cb82af4d33476ef78025092e60427eb0eb0f39224be07a9f136dc02d70c478c1630682d95473bc9f565f0d766988d35ebb2d9b7b2f84192743da167949b57e9cbfdaf0dca3d611e58707be445a1c62d961ff35d47925d50787f6a858fa9f6b2f2a8f27bdd02774b0c90601a608c05344068909a9e436c56a4dd784041222fb521e2069c337bb189bb3fdc80d316ab145fed2301994baab22df6e921933ae51ebd80a7ca03dade7af23910a6f60a1a0fc107e4ad797690e785e7008f3e37b0a38b6149ba1a51961bcedf46da0a524a065d1433c49bf2c397e8ec6e69677cb70d000065b80abc1fd87ef7b51cd80fef698e7187bbcc65de8c0e68eebde2f7266433fef51c1919c88724662ee2adcce77ecfc62194fb194f9693a6c3d6e3b0616cf930a239d26f0d9462490618453ba1d90a4fcbe8c6f18575d911004b690a214fb8284b6a232547703663da37349d0a91dc689df47f92aef91d3e5dff8b007e3efb716ba28b11dece91fdd500af7a1875aa44c67757515588f480de9d09330e29d1cde540433e46b2941125803f1598606f7afdbacc94e79a33f8c57392ca213ad567d1df398ee86320d17172e59bf0ab27a0cd8e8303c1323233604b44f5021183fe6f4994034b5770af48511b541b9b1f2b9f54049b935792c718f8cc3dce95373dfd7de8caaa16ab2ea67d6ee3bb24a246fa9adb367e5b061bd2db43836089f154278c2df76960efc7de97a0372b8457c4ca7a5d43745911448a0325aa52aeb6da20acd776f28d9f910658a00c04ff178e9fa75c7ee465d342ccc75ab7421ed36e8b66479d4ad2b68d933e19e6e80cb1e21a1c558baf9ce9b3d0c1a7ee9a8b9b9f4b67ce78128114d7c336aadac341629a7054a3616f996d113ed8c69b080cd0c01a3321910814ad4604846ed15d76aa4ad3a2c7b672d972aeff711c25e222d906123e837f8cfe46f7b2e31a137be7b48afb49b8ad0cab2714a0f60184058f68cdd3324815293d1c6d7c06fee12a58e1dd158a208fa129a02f11445b114eff489172d2bcfd21110647b18b8a03f4678fc5aac5886cdbd7f250fbe807777bd4300465756178769e107eff81c3faf981a3bd9ab29dca7c1c08a52b9e3fe3104458c6ab2569539ddf793a0d32a9c56121c4f570a5ce5ab134ddf50ff388780587fc60d61899e52c1f0304b79d7b4a7e0e7e30d932ee3f0df117a8d8e023c31d40428e6d7fd545913125d451deceacdbb9f7b0328b779dfa65d10893c22cff0d04a4ed41e25521e15baec12cbff33a2d1a43638ef047a819490bcc122c41412b6e759e8da8ed6baea666815719f3b5a4898d0fce6ac23f7f226a6b80ca2f6598116f8b124258dcb52c970c4fe39a753958450432373a598a2d39259f757e7f048c6177a4f982dbf3e26a6006cb1d85683b3dbc26c44e89cedb57b5e71fa190d74a04f1ce563b12fb96b09d145fdd01c555d05d7dc8c39782062bb6e6b68c1c5193b05ea813fa0a06803f70f914ed558c7f89330a072ceae2b272176190c068e8f68aacfc4034965f65a268181a791386e1f233d43698b0e3b82a1bbc2423922769e6c044a245b34ddd31388ca082a0a69e7ee306084c52ca7a4231b973a6689098c3a5656fe01fc1568c804e68cb7e2d7b6f3ef325bad82bedd586656b4ed190cf2fddaf5f3c6b2a776155a4a9158e314f57f98bdf4362c000221ac0a09b7601fe2310c1f3364ed92236bbd275a4a1371718d8539cff33d9b1567973bd2f33dc1b0ab9e50db6373983952941625e0e273c7557b36c277f05229414b38e84242d2f50a77874fbc94c06a478212db4a9aef21f64efe83d8fa7e0f9873b1a8a7e9471c3852474588e119ce0ea38b152ad4e9f253823746390181c455df5f286d52da970c150ec53267e0511a4c2b80cc3a3935fd9abb495c61694f60e798bcb060a66f3686adc9c5f04c768d73bb2a560bbaa3a61d25bebaca6a1af2982ab6a6fe4bd55aac172752a9c61bf5ccca785e3dbad385a8879092486c2eb4db64080cb7ac367f6134c8bf5ce8a786145ad347daf8f6c1a9daa0373d6f7acd43e6da76eafee9f6651b175828a29d08fe276941696a32175f435ffbd07062fa6c17c94763db7d178fd0157d9e01f6c809fe5b39a04e1e44603ea6ee2dcc92ef1c13bf1b236b2b00c9284d8b4e3945b0b4ee550d72bb273bb3b8ac36668432379117df0d3a63d29e426680a451c48876f732592ec37d8c59ad0e3504672b71df6e00e0261e887dc573cfd9600001225b5bf71b27411b0f5b7a934e38d164954e7c4c5cdf5574a61b011f254341065137fc4057081f0ef551651612ff73ddc7e26daa6ea969746c311ad0cd2919dbb5236fe403adaeb7b9452442e3a919a506920c7963eed9512d5807b6a75363fb2b33bf8185d6b188fe435b19b05f120e6ddcd436cb168c154affabda965cb03b659c0f7ca8636b45e23f22dd7a8b2812f8642f40e101b0478ccba93f62d496c4471976c18e1782cb147bf566d52e683b1e4169dab3384f290163cbd31731756f4d332fbfdcdc9fa80fdc1a95271f597aa2f8fbcfd290a581da4693acba9806d2c7da49ca5747669aeb404f00623aee6abbfc1b2983772026b093dcea50ee06a0dc1dd0e323cb33d3aeac19422d069b72eef67822d68e69a4d7404fdca8fa174c7e59445b474e63f512184cf87d325b2f1d6eb0ff99e46b1165ba12460bf3bc887ec2afb8412824154c4f665b066506826033638558ede3c51440c16a597b7afaef9fcd1c5446f92024cd1055cde7dd19b45331b1b3fdd10256be8973716e92b223fc33e97cdb020bcd98bf8006fe74a92122d0d4cd354087f52576f7452177180c300713f8677ce0001f4484c3999dc589629015f68966e4bd439806dd6bee20fd7544e46221f49735facfe64ea3eb73e56cd1334a341b22463d057ab4a6cfc7e92028cf3981791ab8a63c01f92b430f51f8afa9f98bea87c34d9c70673027f84a9464e99ff09aced3b55014276207854811572c8c7aac41c10f1c60e2ec513435f714e302a07532164e0d0d889b32c4405c4fc413f72acbd9a658e439c30dbacfaae9ce9dc119ecdc5bdd4e67ed41065e066913fbba5df238e1ea5f073052c0967bc4ee2a5fb88b1d67026cd0a63e694ef9db9353f8212e67405c5e6b55fdfa2523cf9c7b4f24c827d24581e6582865060aca5d31ae86da7ac9540409362af686ed2b445cd00ae78c6882ddfbb220101b7a61355b742493905f0ae352a69a79bd1d566d2d65bc02e53a07a8a5b8fe755f076294aed06c16b31c436071920f95a111fe579dd7c7ece6821c9d78522a33e9a464a04102918ff9fa016a62a1141d213e41b6b98651b9722fa45a5cea59432ec67cc180d641d3c4963c6e60894450b2f0b907a0a8c34932cb6fd191f71cee9e7882791b48392504955ecb03a982adac20b1a4e6881d5290ee1fa2aeff88505e3784f9e4da2c3a005d977b2ae2432a089a9c38e869c703f1d3777eb303bd991a47435857f2ff0b1f95eed1203f2d721a314b8138916ab871eb46cabc8b6a1224c6fd67bcef8ec6a9a8d8a431c0bca7a499b2a07742b0ba93b0f42c87e710083eb0d744c9eb815b3eefec4b054da777b8e4f51d298257e3295deae0457fc38d1484be635b3a097affa6e017bde93ab6797b4cbabec814cabeb78803c0f3b772c3629332c65c0e7f5f00d20d08f5d6dd2aeec524ec7187650097bec65f472c110a8991a7dd584735131377c7b81b50f15d7b0787c7d5b7fbfd1a25de608b9bfdaa37f69a65d77cd968853af8d9a3dc555d4a43d40b503d1dbdbc248293c9fc40df13a3528e7e317a886e511bd3c9a191fd63d48a1ee8e06da0aa4f5160e953e60fd8c568e748fe75911ffe8e93703c1e83bd44499a317c6008f1da95f1338beebbcf59b1186c5da4401042db436279f9c0489533be8e62db8837863cdca3363c3a9da6208dda982862b788aa13c451573c05fe1d480e9e1ec394da40b5d1404fd5b520762c4662ec97b57af004b26a845e69983f686f8c532f1a4ea5d462dffee27cd3192380d92fcfe49c68574066ac3e4cfb54c5c3f25d65d1e6670a702cde343f13ccdf194677d3c5ad0706daf4008ac1f5dd569d9347176f04718bd59ad947ff6de18ada1b53bca5cf5aea04b63be6f9c0bb224771cfbc675ed5d95e431ae2344229b134ac6350b905653f4a66b72dfc18b249a7c47e9a352b20b288506df09a779a973713da4c84eec059860f1d61fd183571879e8b7c3bd926591111e2bbd8b5cdca0a80168d08506237975b712d4106bb9a4f02b3751a7d71390db242535b325250570040c3f3589a8fad659852a21afcd471275524799b2d6fc10bc13763ff4dc96b178c5c4c1e7be30b247700d42c85753c6d67444d3bb0577b50178c9a8677a7ef67b422d65528285d2d2db57fae131635ce36147d04462d61f4010a873a8a3e1b11f830a1f7fcfb4bd8e0f68d03711d4c8d38021f42a9704e13f6ecb475eef9dd12f5495653c7162104b54ac81453ac59bb72a9f5ea185dac76e33c936846cd6c4cb9d0dee2a233de3bc","title":"493. 翻转对","link":"https://leetcode-cn.com/problems/reverse-pairs","question_id":493,"issue_number":42},"40":{"day":40,"pres":["排序","二分法"],"tags":["二分"],"whys":null,"difficulty":"- 困难","description":"本题和力扣 [475. 供暖器](https://leetcode-cn.com/problems/heaters/) 类似。 **因此大家也可以用 475. 供暖器 来打卡。(因为 binarysearch 现在 down 掉了,可能打不了卡)**\n\n```\nYou are given a list of integers nums representing coordinates of houses on a 1-dimensional line. You have 3 street lights that you can put anywhere on the coordinate line and a light at coordinate x lights up houses in [x - r, x + r], inclusive. Return the smallest r required such that we can place the 3 lights and all the houses are lit up.\n\nConstraints\n\nn ≤ 100,000 where n is the length of nums\nExample 1\nInput\nnums = [3, 4, 5, 6]\nOutput\n0.5\nExplanation\nIf we place the lamps on 3.5, 4.5 and 5.5 then with r = 0.5 we can light up all 4 houses.\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f249d123385588680b0adb2d1c6c0d97f6cb6e33c7bddf1997b34b506c338b3331bd78670589ebf25f42fa2f3ee24f12c696dd5d7cefe4633d0aa8b91587224ab508f9aa8018b39f409c7e0abb8c06b23cb0074a6f1446a7247fa4f14415d9751b4cfbcbe22aa14b6fccbfb0ac7259ca8446e5d0f1c5ddb69edf534fc68e56817558113482531b2c64118f0e78b3013310b4815e861c2e6c7ebfb88781f4b1744645bbf59250bf2378adedb3088b354ad4cfe524027e067592e16d72d0a2b139109f0d322899b0855a0c902387f958b415b5feceb3ea5826e309ce4ccfa93214cf1105d76feac82259614303732a8c9433c14650baa5cd0fddec405bed8af1d5068ed35eb748c5e144d8d7d1f827cd8e42619c34d6426d443a8828c59ec21bc977203c4b065aa05d8269d61cc20b7510fa1d44b26022286d40ef382845ccda8d19c7c183f05d8152ad4a83620649dfee25375859d7be84758562e534d829f26abac0fe719176d9ebe35b5693242f6fb60c7c385f5d8cd4151d860ec3183f250f754fff7e34fdbe6756e8658122063a5ea2d69146f8d6589ed7a7183ba8a68656a62572db533ee9ce8ba728b992327669c6f22668a43ab9477a999e9ecb1b1861ab1295001551530bf1c1eb2aeb9598c29d2e4db131dcd004948e6f8c8bd4c433461e23e2fa0011d8e66b60a52930d01aacea3a50fbb64dc0b93133b1e1b91eb474b5515b78430bc8b3a417078341bb630536e52794b57be899a09753364f18ab8ffc3db0afc0e11e8efbac12f8798b28ec2737e155729b6ecef9deb12a7e4a6799c58cace7fb61739c4ad6843dada133ffec44d3c2214332f64ed2336ad992c45792e4d352a58e1fa57e0c8fce8d0cec1c16d5de7114663e098ac1dc502391187f7ea0b9962fb33d809618a1875089b349bb031988ee227441670e3d3e9d617c6e251b8513b2c55b624db4c48bb061ef755ce83a57ac3622ec2b92fe6716d519a8da4d61195b50e1dd5bb0a07bf5b4aae108ad2c8e30051de95eea7c2488a791b4ba322b889d9f55422d53561eb58bc82f66c16d56be510e05f62d911eeb66b6d7360dc50bdb82b460568aafe2be2b0e81537cc9b30c753d314f26bc911b8d36b5b4282d9c947441650b682c7ebafb2c4a281d57b5308f2a3895e3703d520d0cd93e4bd006aa560dfd856db36d266714818502a4461b55c98435c1d54f97c0e7d64da9d1209a644d545ae27c0a536963572c273bdd925279e613746d2fc90002f5b069fdecb20380b267f0038345f67a6657bf79b6ae304def17d0aac4a0413c50ff0f84d11101e3ae64aa2b477e362dad444ee1c0893e7943c7d2255373419270c8bc3612e7d59538460c8c57add723e7031fd6339508daa5334a4a07db9891eb8b65f818fcee4955261c3fdfeac30e6cca84e14ccf269f78938af68a2ab6c4c1d6de15e3e9d75eb0a9123562d352dbb555d09fb9d00b4272df4d769567642a0aaf79dc5f49c6cae09761f64f2c12ec75a16429dc57f8d1159bb3b0bdb02cf020b46a60c6802d42a6ef48849ca58613f3dc36215ebd2d3ef2e19cb11b5ba098db3eaae365fe24551294c9286b762a43751ac8f80a9c5f59f379acfd87c2655e5198732f3cabcf64b78f80935dc0f380e194b483088b20aab042e6c21617ab4ab07f0cf144b30580ab3c8ad12cdbe29b86df965b3a2c3155ee6dd00a91421b305cedf78a8047a0024df499452c6c536a5976cb5b34a211b697dd74a0afb2ca54bf6c2ff9a6039269730685a15fb3a424ae5b46e12cdcd8be81da9a6c22571ae276d2a436288d1c1f11a13177e3432772e0ff25101ed2d924e151d41b8e5bd003e2e193ac4f19f2c421dafa38da46bb621b7c0a97015603989999805f4c5893fc3a3219f0734a83774cfa984989c867566c64a987f519a22563985d1e3343d846acc73639f484d805591c4d659d147b9ab54351b4a169f7b55b93f840e8e9e016e7414acb3f2a3a7e5de69a477922586202d3891f2ae677ae351889b9676ebcc8e5290e454870be0e606efc0ab5b738e2b5c7860fa28cfa55d0ed94da2449532219c0babd1d4bec2e08afa929a9df8e08dabe3436a3725cbe879659d62efeaebf12755c6f8433878eca99a37b52d30bcbbf1f49cab8c2fdd2aa459650ec5b4dc6c95674b88e22c61c351cfc550b35b332d4a579a4c7298cf0fb78a8d75277996524420773059233c05e420bfcbaa6d9369b36f9522a7c59fdc88ecce4366f356060c2d15855e610adba21edd8a74bd83e1c80cee5ba4ff18e7b15c9ba852f59c771a3ae4f596b0ad863a538e227afad57b76ecd229be60a490c9a7becce81eca7d9f6958075a8b599177a2ebde44d7568a18f00582cc70a6e6f3497d309913990f2f3f02b9138f6d4797ace062d635ea94b7fd50d7ce277d8de92a7d6f6ef9c66dcc4e93c4fed0b66cb23fbd58af098ee7687092643e9df2a3c7477a2cd41cfb85277901dec798081dfcdfbd33c032f23c06431dad9717970ff5cc134fc7e36c967c4c6bc5dedc1580ea6898daa4d438c23e2778f9cbfd26c389ece3ccb2e73b58849860148e2a157aad5cdf53940801fd6f15f90be092171c1f173dcf4b000a08fde1287826c202736e800126d5df55f3b3516c5028f6e7b62fb4c901e342f4f0f5d3c7d58af234ce32077361129570396c3b4d72fb457a2f2b2a67aaba3b3f76434da53198b58875a8e96ada3d733f473bcb5d0ab7fdd173570aa50d5389a8da5c44b1dcb670af8c24bbc5e6aeedfed0654b3643df6ce490d8d537efb1b3f9a3adbf05c93b6f928d7016096ddb71f8835b007e3e2a5f2fa5cfc9700891eca51428b83c992dbfc6976eb89b825826504b33cb4a76a64ad406892c9c7e8572f6a3b190923f7b233c0ce33ac62f48bf2f11382fa1a77abe7f769076e9c09764ba05a3a9662ec4cfeaf3bd084bfcb99a2894415c64467b62c8b982bdcc679da2b0c3b42c6fc74b1bdaf47144726bb4f3101d61191c5c5518604fc53c06c09d79b96740be7807592c5fc9dfe0cc7a860bfdc6f6a96e2ff2368fd46a2fa3a021836f19d20c0a8e11d8fb177d52f018784a75bbebb401955dbfc822d948e86fce237fc32d4af505005f412f7f1d302b0bd62d74e71f0f5e4530f141cb51570cba76633dbd55a95a6a0d359b0a04891c43dd314b53bb42942c27cd10a27a2a6432e00c61f5443f32f8e2404ba75193302e93fef286f405963036105e35e7628fbdd3b09d9eb00e865270c782e5fe69565873da35412880dc3fd253096eaf6e1b95fd8699b16c861ff00277fbde7d800a181652d61b60411415c8ac8f05a6885a474a085c3343977af4912cf29b585114b85328c70bfdbed6ce94d4c1a9bada807cdfb527e76f354603f202c1f32353455d8f0ad3345f0321bdff64ef2167e307a89696532157194e96fe59f8994056e0591be0eb36e838aad1f8cc050599defbbb3b84403ba66a5b2220200963b669a7699d2d6baecae8ecafb6a466aca699eaa7e9fba2c68b4720bc97300fd610190782d028d3a7c4cae7646481f37f2a8d6110a93e2281f77538cf6214a7c3a886b25d671795bb58f9793246968b439f25f483561fc7cc391f99fad2f2c9cfdb2692f1fee9b8df9dd29f9d8549d4ef209b3511460ff598d5f70b0a9c37f7dc27b7e4cb8a8624caacaa62597322b1cbe90661c802b900728fd78e37b191d3429a55f56a0ead4039b4e1186f25ad77409b01501cc58e6a56a76b22374aaa7afe6231925f0f11c60104859da5dff6eee681e11cc615ee41725a5ce806c93b84445a6f66469f83af630dddf205226f32ae1784170a837e255ea5b14ce9fc9ecafddeb19aa32edf054a5cb02d0fb0df6d1296ee8de18f86d7fe2ac8031a07cc4720b5d695f5ee8cebe88621464320c37b6a496064c8fe7e1ca4d8d68c51eb0cf33d0b9847ea37198d5773b0de0159e5898ef220ea6cc49b4999df3d1530301ca7978814d902391c25dff723d464ea6d6e8239b982e2dd3060c13b3bbb3464eeca97019d50d5e541c7324b6e5da2705e4569ad582ec9cdb0ba39d931e50cf21c783efd98b5c81d0dd9a925bd47af97d6bbeaa0aff04257176a3605614c5b86e73fd7935921d21c8c8fbc305724983cd0d84a821d25b354d6e93158786d01431e1424f2cb6e5b56b70b805633f7b124adfac5d2cf82f61f2a77134a5e554ac9e592b504cc67310cd61065452e137ea73500319a239b51aa9102e5775ed33d2e99c7d9a36dbf01c4ce311f45310aa92219b4b8cafdab5091875258a44d5c2beeb083728021f774cd45b40aace5304fce00239dc5e100b80392ab26161a7e16529af601dab6bc94b3a1918fc4106801ca1d942ae8b0af3cd72f55fff6fb0234c5763c02a3122c6d64146b2f19347feaacf5e3851105abc62afd01378def0eccc63829f0e6a7d2cb99e0317cf385a33142356fb798c2021c7b708f7f96a6d730ad4f7dbe05a1f72ae2f7951c8b24692fa43243c367513d2e1660cd54e90def64d909ed0dae016c137a7a1c4ee6ecfd72d482d5b84af792f3456f2472bc548814bc64397a9bc7774f314f28bcd8b2338ca6f02ffd1b89b0b51b63346532e2e335468f5f762a804af69b056a8f8cd4ba2accb741d6aa0198ef212ecec66d72bc15bdac36aa56f58396f3d331126326d3a623c6e50873d3964eed7ccb040e5c6323a9dd8b4f78ddf598442eb8528aedbf9974d9d535d166c91dec6899a13b9f2749afce4693d9370ef42587014db72febc1544591f4b530a7aae011848a1665556a5cf42330df29b602bd2eebda64d6fbdb9dd5778a333f0567cab4b35b6ba8978d660cda43c6616536714e1789ce1d2b7fb8af775f681473ac880299ace02eb5d6d8c686d47afda165cb7e0a95e4070b4e3e5e110c3a06c632355337fab14e3be1465f9872cd91ffd4c86419bcd757a9911f676bcedbdf757453ca5339c9892269943a447e592a6a456a072d81d82ea78e2d13994d4dc8d8c28e89cc22c1d127573c3083604b46b43eaeb3d4fd66de74cf5458831c90fc76e6cbbd1587a9d24733072ecb7446315433740b46993c1b8d75db0b210b46bbd084e6701227663fd43b234ac99a46b6da3090ee7a16b2736e6045201c2e032d0398e8d011b4158d645ac53cc6897a89da85d5bfc6001ce7e686c611547f90aea1b07226de83384faf161001c5d144b634a7132e83d4ea13f20a6b2dd10782842faf5a9ad43937f4a0dda7b8d5b9533943b762ce8f9ac55e3c46eee508719023a6b0d1baa68f96b5d7986c4d6f3c55d3648bcc4fd72e59d1834f1200e31cddd482ada70ec3dfc86d3d559e18b07b7ba44a52a4a9ac47d3b9b201fe0b2289aaab69c3915943b9a85ca9c5260f5cf2c18569617669242592ef214ed6510ba61706f7beba29bd718719a71315c7b287527cf9911efeeae467ac7612441bc036a0dfddfd4da6186435f36c1258a025305b71f1e8308f761556a3f9facf86edbc6a44576b11e84282b0606c7010e47352523c8fb031f979cfd01b441ac7f547fe80f56dff60895d6d7006764f94c8649ce6d9d6931b4a475deee62478df333a9a8338a3f8f12e3b815d6fc8a3bed79266d9db24f6946b7afdd55c8404ea2eda1487ac9925551f7e0f3f169771a6a8367a804b5522bc5526373d9156ffdbdacab9e375dbfa168920a58e547a2fb2c9abce763258345cc054fa8ac8441b0f09630c01a486173887830ce4cef4582b71d51a4338aebc39dfba9c19124afc6cc406fa15fdfe136edbf7e09f4c68878fccbc89554495d0a58c3bc83f1f5eedba12d792f3935eb81b3c5af68f400e592a1f95f0809d35bb0a9da827ef3c7c143f8bf28e9f38035e691864164ddefe3a921173911653956e383aa741087d5ca17150dbfeb3892e4d0a420e29502c5d409ec732e6ebea321641c6f306810247002f939aadf0891d8017bcbdc2548d6d1d7d900b5e4528ae44991bc75247c50420d514b7955c6e3215dd856cda25873f2bf57362f7209316cd8a10cf585d1625393c7b7d66f559a638bb1f963b2a727cc3766f9f1744d630ccf0a4392b15f3dbc7a192c857fb23e58de3449a21923db9246f6079e4ba91889074b515d4f453c30306a4851c940bc4eca86d6e4474ec08751feb6b07b543eedd6fed6602f52debd5031d21ea859ddb927538a5cf3df56380d4c22423becffe324b29ebbddbab38bebfb600168b2f21180507fa753ecab831e901875c9b40e815a9345ce94836c9b0f8dcb5c5ed5aa1890ad6e420c212b06b59a1c60b9e46292dc856814ea2095722923759d67d01527328174066bc26602c9a94abcc8c79a34a51f949c97273333ee37f65086ec34488ab04177f6145518ac55a7740e86f0538cde669af379e310e36118a114b4b7ce1c70874267df6bdfc912ba9ee6254f0638743a5b32e3d12ef75d65e88431741eee70f1785983581cb07b75324700b6a95db1b5846a1df98208730627716e60cc4f4d13b147206e5289475e72389b2fa957abcf4a2603ea70db84ff4415fd7cca0683a406adfd8015bd5f1c7db27cedbe28359c7b39231c561e3a97b84ced4b8cbefd40070b803402e9de1b66f4cc0aeb861f96f6b330cd1847d8f0fccbf242bf82bb6bfd8cc27f45d5f34c3dbb7b41cca2e79ff7e7532f4dedefb86ad2244364bd1898f352317a97ab78128c7fb8a5ed4de4b892adc33a13d2cee629d21daaa3da107a6c235ab31f348a38bbcb1e9e6658c2b73c0b8e06c5fc146b9f929ebc80ab14a99f8725746ed28b6494ca7dcba2cb7a10af8d063e799999cb3d05c991fc62ee358218c4f41eeb3262f34ffca919fede833aad2f7a0fe46d0be2e0c4b71bdbc7edfe2e309be82d4e3fd187b4ef0cba19412aa79893a58615b6d1201616a594a40a8bd931b6ca5904a00dc67e3fc2bc1c7179ffda7cd2795bd4558d05359a19be36629c24b0e9e5235855d0fae237ae94176c3c09bf5f1b409564ab88fcdc5e8b12fa8c6a90cc0a070c670472617e4d711feff3bb4c33dafec5a71114a56ea954df2f5a2a3d227b2af5f69ee994c4fd14c7ef726c923aeb1625423b1c1be1f358eb4d3bedfe9084dfd764b9f8134e4de1ff701e6df0ef22b9766f61c0f25caafce51f9c5dfe787cd92399ac6f0e727c59dfbd44a8cac2c7d00eed59a13176bb9c69666753b09fdcc09686665ec7f8befd382325b740530c69a659c394e89658d2eb7c62ef69bdc3f84c48899eab1781b9aaf7ca91e700a1e18f72a008e4515e48cc4824ccdd0d96102b31e2cb1c1fdb022c686fe12353f21040a7d13833d2c7a58544e5a2c23549ceaf0f8ec15df4913ea3e0602cc99fecf30074387a4768005e2fb28fb834a2976a7500b71d852984cff7a7e63bf4083175023a38628172eeaa4bccf23ed6526a36f4cf86e9f0c102ed7dd1e36c08be990e936ee8ef4a58b8c93a7797a2ce00c0ce4271e6f37798bfc4b0cdaf1fba5a8b88120413d5df31ac42737c28411b2cd45d8b26a9939f66689f0a347b87be56eaec8a5405d76402b70723a3150729a1803e28c2c733884d8436558ca4c475ef7f800a6458d7cb29b0c03a21c9f766d9b0d903c5a43d1e26a66977ffa2166cd8103fac9cdb3a18827c9b747b8f3b66c22508b0d7eaf8cc11ee97cf78e1f3dd6f168320bf596ef16731f92f046a3c9ed606a75a26e18260e2eda145f432e16e958d79a28656a079d52e34300072245be1be51c246142a141590204e2171f0d3a3d488646e0ee4cb7431551fab0fc0418233e6a19f5d088a19df8746223e8b6b566bc67b57f6d3ff6256a8c0de0b93aa18aa914425961a7dc02900c31d783fff305cf113d8b63939b484588901b207b7e57a8df4d90f7ec3a5a0f997037bcb791ed00ff243d68c0a0a6eb60524b7a1181807cc20614e95982bfd51afefa54c1769fbfbd852eeadd4ab34c72493cf2e90dcaa0aea95fc298696377fbb3021d2b6ce6da6f81a1abc527217c6206f2a627cc064008cf780d64d6305902be1acd27767704f86f7827523f9f16b72ccfaf11e44e95d5eee95fad47a5ff56316b02a32bc091c3ff023222fa0ee43d3e42cfa5c0296151491d13c0655530444f5eb29539e71c13e69f67a4a89672018cee5ec14016c1b57ece2128cf13b54cdbf0519de0dfc128e5fe5373a07450f24747b55d7e97e7dded0fce117aef679f9b1ba68cf7ea41ca3c6b0b175812d21d81fc4f9f45a3dfb5647b5d35f1a713465b2c337f1f1ec67fc7edcdc30cdadfcf3ac0dbdfac403858b99bde6e72a2fab6b1e77dbc599217ec9779220c04fa4502d047bddc2a99a55cdb0576b14f2dea4fb606d4795222addb7f00f525b1974003775847894eb4bb2d3d8581c0a254cc7173f5aec82f47f9551c994e88df0399134a5a34522c61d78f3d116e6d20ace59af1589d91c4f902cd30931ce65773ab4ec658fd48c5112a21b8482afeff045c6919a6ecc61263d2d63aeb87e0fdab26356622ee5e00991b3da5c3502501046c0e75cff9308200fc74cac81afb8d9cbe869b031c8ec80e231c674ff6359c848dd5a3e5d20deff7c1e5b6f2bfaacf1cbbb606d0735dfd677c83236251a4bb9c1b4491d2b153cbad0f08d76958584a41c90ce7dce910805ed793c9f54e4b515c6cf2f8f4c746051fc7ebd2d54453afeb47f1b12fa6fccf383f7b5c7015f6574ab7094fe9b44aae2c51f43b59b5b075711ea0dea4c868e4888e4ad631b3f9f5a499f72c85a2012b911bea571b046aa04716520053ce5d25dc1b49c097408eda40bf856095c92a65a77cfef4b728ed40e37dad43192465fd745f729bbbcc94dc0074488a70f3db0773cd7ff7acd569047e3565e4e40895170ea9e29ac6d690914bdcaa39943d3e1c881d10cc56483a1dc2c4179dee2584207432a6806c8858c9330acc6688a07aef4efec159d752733830fa814d2f820624c3a9960916487e2e17402b2710035e1bdfa46eda7e","title":"796. Minimum Light Radius","link":"https://binarysearch.com/problems/Minimum-Light-Radius","question_id":401,"issue_number":43},"41":{"day":41,"pres":["排序","二分法"],"tags":["二分"],"whys":null,"difficulty":"- 困难","description":"本题和 [719. 找出第 K 小的数对距离](https://leetcode.cn/problems/find-k-th-smallest-pair-distance/) 类似。 **因此大家也可以用 719. 找出第 K 小的数对距离 来打卡。(因为 binarysearch 现在 down 掉了,可能打不了卡)**\n\n```\nGiven a list of integers nums and an integer k, return the k-th (0-indexed) smallest abs(x - y) for every pair of elements (x, y) in nums. Note that (x, y) and (y, x) are considered the same pair.\n\nConstraints\n\nn ≤ 100,000 where n is the length of nums\nExample 1\nInput\nnums = [1, 5, 3, 2]\nk = 3\nOutput\n2\nExplanation\nHere are all the pair distances:\n\nabs(1 - 5) = 4\nabs(1 - 3) = 2\nabs(1 - 2) = 1\nabs(5 - 3) = 2\nabs(5 - 2) = 3\nabs(3 - 2) = 1\nSorted in ascending order we have [1, 1, 2, 2, 3, 4].\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f2b961633855e9b86f490a6d594a1f47177b6a20079dc775081d103e7bd46ab345588da281edfbc3ee33db5ebef22f870696a969bd1e10621cea0848e125423ec30b695a81ed310b036dae6adaf8833488c4a21307eeba0d1eef85a374f49afbc2e78750a7b23a3625870f52afa26a3b84677510c2150f170e3334dee01b74b450bb660241b45c1e03c7bd48bfd3a6e76190761fae32d564e2fa5821b407540ecf6930e1f703b8850b05ddb1988b09dd1529c0f4b93e04054eb69dd48751d9f9120f0d0ebc299512bb48987bdba0aded0e150eaf9dd0d39a882f9a3de86ee06095ec481fe7b88a827b4233f0f3ca8c26741673a4ee702832178558c5c073cd2932cc3386daa2ddae1a44498dd08b10d69fcf70b83ba1a884eae85d303f6e92240f3da0c308a4c40dc6f16d51cb4759786601edda7d2af512fc61700148f453c285530406d438218be0b5aa2979611143e12fd7b5db248f45a6a345471bc931aa169be6d1834775871f83eace7de2b28e50c3f085a90a74a11a35c6475dbb407f99297f7b910dab32e4ecff7f6e805a883436074319531d6c4261495c8d147f4608ec0e833da77200a6eb16a69a9bb891082e7ec1298ab9a77b48cbbfaa4f48e06a6241783a9d6f54dc153a5e1bc52dcbd391e5ac7ef4bd2a28d0a384f4c95ccd39372e3d164d4fd4b8378909d7f540bcfaae3a44f800ed1149b18750c5292ec55535516b8ca3cfcdf0649602a2f5aae201e2e526b5141fb8d8009703477fc99aead97d847a85c0df3efe8cc6e9dd0a7dbdd7e6b130e76eea4f496af18b1a1b638d90bc4c07ca81623deec7d44899e0271b6c4557b66523d7d28e1323babc06d413824507a375aa8f15af1c0b9fe84d1888e7d05b4481a33a99ee306c30a391fced7a5248462a27bcb5161da407208904097f13692cda62b1b5f7eafdda8f61792f44cb802262055e432d20d50bf064df014d1c6f76fd37e359ed641856d764186dfb1d71e95e673729bf889e03b0b17ff43c3c28cbb450685d0f0ab854ede63480ab92efdc8d9fc1a31c93861ec51e99fe67245be5cf851e1467a9c44af922809407ac629a7bf275c4b21f9af10a0b03fb0b3df8620c522e94fe2769e4ad7ee7b0f5cd7c4b0553a3b4de682c3eba9b2c5ed80b913580ffaf0e2692a42d93cd088c7bdd26974b47cd9f25cc728d527220b26103c6e5ff81ede474d0b24d3065229298fdd1258ea02f731f67a8cf771d77c3b9f17d6f2302fd8243a168cb4d3582f1e649b9cd469605b787f5c7f345169a1433aa1c677f6459db56f16a2420454a70bfcab124b445b3aa643bfa967fc5da9cc53ba1a0dddae96757b3942722f0d6e03808f2e6839544ed164c8963cb6643b3060c66c3a414403ecff393cb6061fda370408a5a88e627bca8e5a51d464998f9199057bd5b132cd05388666a2a958521d5fe8b2a0289b5ba55788f02d062559e8d120d172aada770895be4c3a324df3d5e0f0767759d722ce2b061da7d66575d0175ab1c654b51f62bdfef5268a3645514acf4470648f140a8da0d572b58ab79d3cf2e4301e5f04a8fb679b78449306762efe1738be410d637ef3daa533ff061b310347d9d5bae30cd08efe15607c8f72907ea5c9f4b241de74b24690245c7106192925ddd417e388f0a3f6cd77aa8d04d7eb146f025d16b1c5a204c3a53e71bd8203a9072f40658a9725099bbaf351f9b50bac6a2716689540fe36c0aea1661d821f3985c28ed8f2d55f21fa21ae4ac2ecfc9465390483317c4ed016e7dfd5252489c9026ded9713edfeca672988711021011089839ceb7a450e3547071e7433ac133f934b9c295f2922f9fdd065136c731cafafa173d2f96bfdbb09e350d77c2e5ef5d9d0ffceb4f941cfa1cf348a19d515c46af22332aaa6cc017f4f105fac2294dbc64ecc93bc16d0db083d9d5ecd5e489a675b63dffda7eb155fb4347ce3bee1888222f354b43d8a12969e0455ba81d2d6dd314b84e116d17fe656a05f713ff0bbb73a1fe037d8b7c022d8b3ec7cda9062e251f9b466cf6426fb08c531072244bd51d1cb223cb110af11d62f5e2ab8637689f8f681c1d0030e25b09da5e37ba2ae6a1ea39a6f0ec6559ab0dda145595a6fd47107fdebc13cd0b2b6bfacf1322f178f0dd32ba97a6c2ae67009800ae1841932e0af77d40a3b933ad4d0beb19d551c67f3469f71f8822a7056f13666422c0f31442b830aba17011d3dcf50d0299da84bbdad9ae0e3a7264f7cc8aa657d32f7af94982d57945618bb425b557a8b5b847873cc0767cc5722be2043d9b7bc1a0f0271190aeabb12edd64f1997e5071ea35dd04b0e6d632612ad00cae868aacbf2d41db352f5356e77ce71da38b41cac220acc0f296fe5d4a17e9970e5e0baa47d8b2fa9df1d694fa512b36f27393aec2505e1d92d4eed9da5c520ca3585862f5b727639e95dcf973b69d348219e9e198beb534b1e0390b3a464f23730d297997e030082db407630ec2ea7399d8baeeb3541ea0686110387df037bf259e0e0ae7e0952d1486bf5734f4519e67292e2d05f0e6db70613582b43636ec8c74179fcd76488cdd56add039c02b2c17cb4e96cec165de5b1f397a50ad4a3cdaa642494f0e211eabcbc7590a03c03eb1df65d39c6fe5b7b78d35155ad2ae077346c7b02452536e5603f4273b78231b690ccfdf1db3ee8d0eab5c7e8096dfeabd395e92ff54c5d0efc6523d0785f1cb8b9ef018de4301004e1bee664f2d1402203e29e2b0b73ff6517fc05022166751718fd8bf3e575b8733df2cdb833375c32571b09eb43dabc4e1fd593f9ab5d8e276194e8ed85cfd6ca534c7d8f8a681c2ceeab34ff7df01964f3113d57379dca88dabd3e86e66ca66c894f846ef550ad6a2d6a1a5f96f3feffca518a4dd2952b9be67b7f2c0cee60ffcd56f54956508631cd463897f79f90603a54d2aa03281892069db6f7b38dbb266a101650678abfa6d1a92b719e55c04a34acfcf2ac17ab4518135e0939132be1a6659e2cea12b05da2ed5f3c599ceac6d491a59a29cfc37e7d726d8ce951845b55c56ca264b405a7866bc9ed2cd46855dec0d0348484c293332655df02fd57c8f87d972dd460f6ff6da2dd6fc0d0bacab3d491b3a1c45792b25381c8c3cbf70be408f1f5c91fdea6813555e70f76501ede244c8a5d538efc81a230a571a2c743d93a94bbb1eb5ce79333d188dd5d7485e4289508b5bb3f58353d4258c7203a104c7cab62d58b100e3f080acc0b929bcfc5b0be3a4794e41ab78ed2143c8d07cdbeab35c1df5813004958a52cd73485df2348ee449292d1a873decfced08e4d6409f26f63a3d2ea9180a3e751d26b589b665eb6cadc2dc7ed579a3b5b73ceda818cb3f44a18a35f5b973cefc38dc712965354fff4ec9915a481630b2a79f3ad366cdbdc0fe62b107e8cc2ca8e820a9607c9c32f44ae0e3466049d4dfd15929ed85357bb6714dc2bfe2938d02c405e7c3686e846bc31d7f34542ce9ce1aad3a7f20b96cce0ebc690ffc6443e4619a9972d2ed611390b96d625ea9cc5edec666f9df3733b8c6d3ca913214e20d934ec421c8fe3ab9ea8534725958d703f84ab469a8b49ae1ff6967d1ad2fed095f39ceaa1a5f48560ad94ade2c399a684c686ce14feb665926a4964851b401f71eec3b62b7d068b2336071c51d143790de28a9ca8793668cec6d270b9c7c82b426fe62564439a1f86669bf4d61b445a7992ac854a132e851c94d73c079b9f60dc89b6a471f8279ab27cdccabe49c9e157082822302600452bf04edf298d8693ff18f890185be1c3aafcf25a2b3fabdb2063a48ca6f25f827cd19673b8a9897c23fc286f7a07347664107f87319dc09b2b90ca3f46e1f40a625e378fdc83b8021db5b6c351d8e52b61526e5349642306d58fd4f94dcaa8b3e1d46639f3b56042788c46f60be769cc3fe362c3c41ba9a7323ad573ae894a6aaa29cc66f42d154099d2e4c99a64584da17280c8d2ad2a25a329c12dd9e646f150131f29b6e724bfd17bb6f40a4f72b87e23efb139d558176823fa51f8a90fb8326ed6b7dcb453b53b8d50fe7d2a3795257045c0dd1ed43bdf3dbac280b5bfc5b6a218477bd1e6c3285014e6f442462d8e81578909fdeb2b1bb43cfa27b713b95243aa3c8ae952317f246f5344828df5f36cb4d11ec004d530e5a82a9acfc5ea051925d86f52523a4b3de623e592a3b1259fbfc30fc6c6ca8cfa8523663f5961f32ed62a29dc32f89807e7996ea2b720c015e30a14b4c9bedfd450acd64b7e1103239e4907be8b7bc8d3ef75350f9f6be43898458b51c7520abbb366c8ea4b4f3b936b9e066886b4ddf0b69779168a343d2754753a052a2b80f9c772925ca4611813ab10dc9575660390cc3ab9a18265aeb6a8cb9bafffe7f7b148765f635e85b56e4088399c824b47bf0565a5be1a3d361b005158b6b96f2667a9e2f0c2713205c84222b529c1402447f832f6b41fb6687692e5f48010aa2a6b0c873067e46471372f2346ce75d3c8358950d3410faf256d0543792f77e4d7c97fdcb8d6bf5dfbaad449732bbb4ed08817b3abb7fc5265f48ba8e728f8d5b1338c3003d569f052fc3597a0b9bed9682bdcd01ffa99ba118c4e14cde51b497b35ee0466c82c53c4194caaff04518ccc06b21468ac0456b1cad0b5d3f6a882ae3e06f87a1f99921d01ee44b920e08b888db3753067f7f71a640380b2249d16417a7aac4f48cf14ab00d830bf105ad553d0a30f26932560aae75487ad2b8b0b8f2e71fa803e7e70992e273ce2400f92e384b3d000f9860fd83ed6530c8f82294276551d15894b9ebcc2ee507d04cfaf303d49fea71df66a022e36fd8ced4f6ebce39f2342f9e8ad84dc6812ac5e2149ea2f78d882cf923cfd349a3bede47221decaded4fb3b26fd8a4af6adf3f3623b878c6f8fdd73e910796f4c7ea3e2455cbc5dd84b3fd978771bedde947fffff71062224d5624c3049297d4c770a7e98d032fbc36f5dd4c7ac27b7bc0c576ae65b7de3cfb6f934ee82c40ca3775d4400a71a890bdc9659f10e74b349677bb920602ce3f7cd8e10f8d7f4f5d0e4e8b32ab68935d345c8cffcce6c2c5115ccd788e9fb4fbee6f12017905c57a67d28eb8f749dee8ed99ad995bde89c3e2c48b170c06fe5f574fa6262b33072147c1d0caa8b31513503adc4b00c02abbabba0680fdbe73ad6da943903cf68982cf4d84f546f19f8c5f78116a314419f019e074bfe832e656f3433305a9a86eba602ce4a28695ef9d16823a4d659d442e3dd632c2d5333755ed2f16f72009e37f08632d76f5982d64f083faa6add002c2a63946ddf8c247b4114d049ef9d15c2c9276f0afb54657b2b9d61a4647f6ea21cd5520cded167a3f86c430afdbe8b765b6c47244ac0a33053d9588606eee468077eb167e272c32bf0ac4c617ed6980d55d63d6322b36190d3d8ee3cf1603d5509de62d8cbf267eed7c415257a3ae4381aac4ce681a3556a693c162f76a6ffe1ae866687121fa4f697993ddac59cc0cab12cd37a8150f5a8de427fcf1e5d698a1df15c84a589d3fd985146dc1ee682ab9e1603caa80173f7d966b39c5f2cb7676374eaa657d48f40296a3157d1510ca241198dbe737fe141c039b937f7166857a39ccaf18187d02dd16b148ea610ef5568bc929c93f95e9470220f052d03ff156cd819976037c2f5f27a44084ee58dcff2e145916a1b0efc94c8849e84d40c08fedeadb40fab82a39cbbf21ad2ab55cc78af5c3153efddfe7caa7abc1f89478e4a3a93b8ae8c400bf7b686d6c04a56cfb5868626c23c1445a38c10c0dbe9f43dbc577c19a6ac031932794c9583cfd160ef43d2e63dc53c7c147786f0809f764c5f7619776f0892b83692707f915d5a8f44653ae20d5b385cfa3a5e88b1e1dd264420420e29502c5d409ecf38f7ebb47d0e46d69762ce5638477dd6dbf9b5db15c403d0fbcb4ea76d1d7d9056744528ae44991b8e5213834566cf47dada1f177b5791c0649470ca6c27f53f6bef7e934fc4ca5e94201c58627c346a7166b91ce8308853cb74523c7c8f39389f1844c454d7daa4392b15a4938eed8ae2368069988dee44fb089e14ec68212478ebbbc3a29f74a771cfde53c30306f9af36940bc4ecf83f275b35b350754c8e244bf002a0dd26be164da67ea2974f5868ed98c9abf2753cf08f6eb049c99a962467f78eb3771f6cb9e39eb623b8f1fa081f90514f4d4845bf2737caaf17e95387419b50e415810105f8797f83f8cdc3ecf98a1ff5cc58d6f920cf48ab4a44a1d70b9d467368d357d50ca00f4034d77413ba7b085f2704035e23e50c7037b094abcc8c79f40218f3439b3e7b666db72d362273c35493ab4d1763610b04c7db1d7f05bb28593cd6ed20f635973e5a1c03a0114b4b7ce1c70874267dbffbb5df65bfec6461ed61c912f18020281ffa45da4dcd4b0a40b5ee1151afd32fabcb07b75324700b6a95db1b5846e28aca20c263365616e5449d9a955c1f791dcf289475e72389b2fad036efb1b84a3ea741f108bc153b9e8ded2d6e0538df89010880f1dde46eb8dbf8a91d8ef2df749124b1e014d09b86f6cba3fe4030f8296a10c791b60c0384eba24bd32f2b7306c7d45f8e15d1a16135e314acb1d2d40ca9461a6997d8acef1dd01432b43c7e35b08d89d1cfe376447247d1c0c161235ca050ecab7a82afdf4fd5905e9c66c638ee1742ee7f9d6f8fe76eaf54ef982d8938e862a38bbcb1a5f401cb2b308fedae385f8e03fdb77baac75ea05089ad0c92e962e048fed5112632fa3843f62fb21d97c7d1d96f4fd31eeb0e21fc464c0b8db66711e7bacb04515c75682ce5670237c9aa0982a22e0c4b6ff2bc2d8abfbc05f4cb87b7ed4e180af9cbfae95ae335cc731e7c5b22462e336205570ae6f4de261e9fed512adc3cc9fc628f9317dab3e39a72dca254198a4d59b69bc02f6bdf6140cb1f66b85820ae2633e9403bd9bbcf88e1b3141f0ead8f94d5e3e30ea3cfa957eaa070c633087359b09e54b7ff38fa8a78beec4a71104a56ea954df2f5a2a3d239f1ed0806ee91021ac13505be688d34b398371a70b1c7bf0e72dafd83e79afa186cbb4761d6cf60e48d50bb1ee5d750fe26876cfc0058769eff9d1ce49ec1fdd188d37ec7c6e9ab73cbe5b5d41edeba262879bad5d35d436bd7c6d8327a3c10aedf5a6f696db70dd98b97c76a263c6062929227d97e07c7288d3ffa8827a9cfd82394cccdcceaab3509ab857ca91e2d6b1e13ea2a43d01140b6c2c4c4028e839c6a25a77a42b0d6edb66e8e98ad4c74202a4819601593587e66111a530a7e23568ce1f7f1f14ee54513b877080c9891ad9a330100879642c500ebea49e68e596e23b8462434f707b25ce4507e34f7099c1d027fe78d3b0e7df8e6abc12deb3926856f02ad239728556093d5173fdba1a0debd36e095e5f6948c93a7252440b40c07e46602727063dfe14642c3f9ee8aefedc3735d7514a650cc69628ad753d5cd0591b815d46a8d76f4eb8947f13de531b6ceba56143c406e64216f2e0a7ec17556a7df7f7f38cfd103010cca010e1af7e500ea45867ce8804b46f6508b7625ce5ad8454169d1e26a66977fb36723899b15a0869ee0e8ca6b8cbf09edbee52c675b96496aa6cbcf71ba2ff7851f2ccddb68320bf599c50b7352dbe603fa9cae354039e7284c3d2473f0091f46486fc619daf128062543d848c9694047620fb34db936206556ee180d135589415e036f6901ca48b7df669d00594d83e3fc77573d2e6a05e8d088f2f3b721206ffdeabb2afa24a72d0936dc366580718fbb792a5a7fafffb5f17009cb38e3b93d33bef02fbeffa60f63dd9b8cdd1237fce2fdbca06f399d073962b7afe0e053219671267bc948b0f8ec24284f49e48a9ed8c475d02e9145468115c7bf109e533ce92afd5139385fe787d05df41fbd9bc57b22ed41527e3ce41e18a389e50e1cd6faada57e0e3ac8be9f92525737300b9fcf49c50283a83af5e1be57a8dc439128d86efec28822f49da199c818f21ee91002d444d25a49428436c347616785b98a9225f2373a361bc7bf8d37ef3aadf3a9481c4fefad97dee9f95de8e3f0d8f18d072df178a7db6733a33e0e50dcfa0f74f94d93ef8f24ba00a8f13492509f5313800a6c3c52d81437c9b427a3ba7c99c873f9ec97a8bbe51aa85e3da167949b57e9cbb9ea4bca70244c5e7720c759a2953c960de54f788f15503e363f92a5ecb8f6fbb2d87bdd02774b0ccd605f2cdf407d1742da969e17291bf4dd654012766ee775ee47932952f0dabb33d0c1ea38ec5d1bed2e01885080b22df6e976db73a95bbdc9a78b34da9333b63951e8b2577a25dd1ae4e837328acdd7a254da6c79b0e2c93224f3544abc1b879946c97535197d1469638acfa4cc96e0bf596c54219d4e4f552bec75f2508c01b0e759995baa3b8638c9bbf2558ecc1a75edf4acfa607e66e7e735172195c96d2068ebad97cd7ecfc62194fb194fdadce884d6e9ff3f3fad219539c27427be62490618453ba1d943019fadc6a2dd6fe30a2a4b690a214fb8284b2c6c7747787f2d8e3766d35ec69a34c2f47edff6ea51365afcdf456577a97160baa14af4ce91fdd500af7a1875aa44c6201f1819cdf4dcd585146e342bfc88a60405255eacbc2612fd283fcc213d3db8eea8dda1dc3af89e5992ca213ad5679bdf3293e8720ad17172a990fbb00da0cd8e8354897b7e76600244b4353bceb72b53be034b5770af4851581b4ed54b2b9449049dd617c28542829c7880d13f73a830e69be36ba204a67d6ee3e961f613a8d4db75310e484f80f1489e6098867e7aa66db7294ac5cdd45224cda570b94450b698f7cf9feabac4132580963532da6eac13ee684b2a01c1c30491f42d821a5834ac99800bd60c5f3d9f05bff71fc026a0fa3f8f4830420f84de5279c82b4c9883e55e2e2107037607095c5f113450d7cbcebdef4e805a0ef054020aa4b711b3bc6d908812ffc3be1111559b903c78953325fe005ae10943ca67d5777baac30f755d7ab548b7516dccb5e031d91687a8af698419239c4e0267f6bdc9222e253cf31c2ec077eeee7162d069be608db3f17f1e5b7af7bc83e0e70f9f0c55a45bd600fd2c3be017bbd6feffd4ee638d08ad502403bcf3c9d5091a52ad0eef7e4f6d0c69ff342179ed752da7ebb44898402c3327b7a77e9be24e48692a6959592d001558279490a238f0048036a5f990490ae2e4e75b5ed1fdb7dbecd36f22f175be59028f67be0e58cb3851ffeb7335d035994258c3a4bdc30d397b06b192d7301de70ba8c40ea16a327197058c97bf47c38d5ab401fdbe61994606260618122c8d4dd82d3de14bc70f78ea1af99278248d319fab06df6928dc3819e1e7a6aeef5d7a8332f0c2e763fb8ce36b01abdf254b4c2bfe5347d05eaa89674235584ac661f50aa4b61ce1c65d59f1be57b9d3f60b032688e57f8d0340afdf62284f5f12393a2a52c828782bde745b7901c1070821234c580542a73730af4a8a16730aed70e11af1da61dd7c399c7c435eafc638bd5a7060c5e2dc965e31e369b97d943e5693a6aae77b33570804e8434cddee42fd44d168be5bbc81251dc75e835a94302f1822c0f0be6326619af46acff28c96d84034965c6d966a2c1b7a03b1e3d43410c56138187d2314a52e3180285cc1cc43a6448045df02058e9b97ad8bb677f0050b7b46c4404a31814aa95385512d7df3b41fa816a41c18270de93e76670c65f75fe5f55bb6ffe215401daeb0ba74ffd0390318577d1319b4e35eb77a1273b5e0cc1b1fff4a7c12b5ffab11a130a3f00254e4b954a55efdf216e5946a48309e0eaf916acf63c18d81c41f3fd05f432936db33b9dbe6f2e29bbbd59d9fedd8c060d893a696d4a108b385842e7b05b9778320743d8cd00db6abfe63741f775f30bfd364f6b0edead4adaf7ff278865248ecffcc32d5055f2fd37bd036991fd6eeb7b4ae26f1e4d0b459646615af39c74aaa36c38fd4cda51f4d5fdb1c23139a732b77356dd35f3586a2054dfdfda276c3bd782b999772a04882775c923a2bfbed0a946b207c3742d8a4","title":"822. Kth-Pair-Distance","link":"https://binarysearch.com/problems/Kth-Pair-Distance","question_id":52,"issue_number":44},"42":{"day":42,"pres":[],"tags":["二分"],"whys":null,"difficulty":"- 困难","description":"在一个 N x N 的坐标方格  grid 中,每一个方格的值 grid[i][j] 表示在位置 (i,j) 的平台高度。\n\n现在开始下雨了。当时间为  t  时,此时雨水导致水池中任意位置的水位为  t 。你可以从一个平台游向四周相邻的任意一个平台,但是前提是此时水位必须同时淹没这两个平台。假定你可以瞬间移动无限距离,也就是默认在方格内部游动是不耗时的。当然,在你游泳的时候你必须待在坐标方格里面。\n\n你从坐标方格的左上平台 (0,0) 出发。最少耗时多久你才能到达坐标方格的右下平台  (N-1, N-1)?\n\n示例 1:\n\n输入: [[0,2],[1,3]]\n输出: 3\n解释:\n时间为 0 时,你位于坐标方格的位置为 (0, 0)。\n此时你不能游向任意方向,因为四个相邻方向平台的高度都大于当前时间为 0 时的水位。\n\n等时间到达 3 时,你才可以游向平台 (1, 1). 因为此时的水位是 3,坐标方格中的平台没有比水位 3 更高的,所以你可以游向坐标方格中的任意位置\n示例 2:\n\n输入: [[0,1,2,3,4],[24,23,22,21,5],[12,13,14,15,16],[11,17,18,19,20],[10,9,8,7,6]]\n输出: 16\n解释:\n0 1 2 3 4\n24 23 22 21 5\n12 13 14 15 16\n11 17 18 19 20\n10 9 8 7 6\n\n最终的路线用加粗进行了标记。\n我们必须等到时间为 16,此时才能保证平台 (0, 0) 和 (4, 4) 是连通的\n\n提示:\n\n2 <= N <= 50.\ngrid[i][j] 位于区间 [0, ..., N*N - 1] 内。","content":"096221cf5b628be1e73e8bcfe626c7f3f93f24931c3385f35f5a3d7d4a585e065595832559eafc0a2b0ab97bed3764d463ff891446a5cb38d746f23aa4faee7bbf7166609ec0c2fc0d268fa687d35e703aab6d949ba3009b39aa6addf0aaa1c0502c821b68a692202e7c107ebed4dad714950769beaf36499e0e357b956eee711c3993e3fd0033681ef86bf530d3ad3aaf818be24a4c833fa8c0410dc0e794211f1d184733f2884847eef9330817477f4fd6c192273d7b3fbd599a6436892f7707bb17936e0f8f72afe740ad4ae4babf5ddd79f3d8ebcfb9632b86a9a79d7896b7ace00294fb6be0800f4bb299a1fadb4e7358aed7c92e26382e9403300230a8f6698690a15fef1890fed102cb435e5bfcd7b311ff2f974b9fe3c5079a855ab15d02f68f52ade4c42fc9667d4aea7223b78a733aceb64bb6c14b939c42e121b4620fa1d44d0836cc3568c85ccbc0608fe2fb3e560128d44cb92be2b5dab0d15b47a3e92dfd823b6bde90fb6a2b7de9ea242943b764dd4675263bc775eecfb46d21b1bfaa084997a74934a0706675a2a546f7fc51999d71b8945904c3505b5e59feac18da327767f35a0fbf189af8d95dc3a6c7d2a96dd3007d2d29c4530de6bbe66f9da2881602ec8a77beb6a0de8cfbb2542ded9f8383dcf54dc1977c032c81527b9ffe9217408489b4ec602e142aa79ab3ab0ebee6268dfb2c04d398af469bbd6d453f44ca2dc25cda759fcec5964403c5a7f79c6379b3051d8ab9b1bce4c0e097d329b0aa1fc34c5a019595bcae3d185c695e28c36e9edc6235264ac95d5e724f50e2bf9f96f33a32261e4ff22d795ff644d64e3b9422c3e44e7191c2420c5a933b90eef2a5b4d0ebb524a1d1765df694bdf6acbee0bc6c2c9c71146f757f124e1ebdcc04a0d6885b1552c051fcf2d86c222dca65a66da84ca1ce1680decc51c35229eb13623ebd8bf3e23b7b2f1cdd571eae30fedfa2a839b11b89c240d58b33c1581e5afa0d92ae1167ae568efea5444b670796533491c76c3cd3cd7b938c2aca5c17333b86f16f500349408e64ee868a28c9370c0e3c93c811b9d637d06e4a76959e528e20d915a6fe4ef9793eda888c83569a562ffa9e8d84761d9a1478a438767002e661c605847eae38fc3422a69d941a5530cfd6e69a72562f6d48514a155854c1b99e1f5266a6dc853ce653143f302be1e068b54d6a8048e812a1d6eca5f4b081d5009810cf99948c1a92c0ecaa2a0c84916dec4fe676d04a52e111e1a7449a3b79dea50a84953cb4794ec5eb94e01f6337a7f5fcb3c9d6b0b4d0ae09cdbe7413bb7bef552ceeda0dcf044f9d8522540a5144939d2e8f1005a44dd51c3fa12bcff815476fb38dfcc4b3db8dbee80312e1fcd4bcd472ae483ee43face0f5a667a6baf78eb56735b9b27dbca8139883b133290bbba8250bc9523621384c5b1587bc0439eb4b6c8e134188a8727a1c5bec98bc3275ebc10c93934e108a73b9a933dda55770c3853165a7e2de32fba9b9fec6475ac70b066a2569c8ebf0753c654cdeb45ed94e581f2b4548f80a020b46aa1f6102d4076fd2ae8c0ca5eef1924b81c17e5b4365d5e507c24d30c70a0a72fc9af437f2c5fce3f4e0a1d6a5275b6a2b16a9c0ff9c0eb8c8e74d2642d218af09f0f0a8f86971f9041ad1132a043e73442895b02abec1c718795538fd995ba4ed491c240773a3bcf82499c12228f88061d80351145dcbd20a94153eb105ccdc74951e790200dc6ead5febfff2704422adfdd9dbdea7c7b4363eab759521a8ec9802e63b2fb9324562dc01efdfea3b29bddfc4de4c940efbf4f34e28bd61130c2b1ca79a9df059470e204d2b037433a9120fbe8d389996a995374974652c6b72149aadb46d1405fdfe9900e06ffb7b1351fbfee6395deca06dacd5fe64cd04b766cd3db40779f5a787bb908a4c5cc64abeb99354b7ea9a499acf52689e149546ce4ac73ff261f189c5176bae3f79f0bde7a7810dfe55b912863c8f9f1f76b886f7d6e0384890f116ed71e75a9d5e6a1ef1aca33805d836d4a2c91adbb0d547d8bd420d0ae4eb05cbcf6de9d4639a00205bbe48f41492e90e9803c656bc97a52db2ac1f445e31085281c48f2d563b7e77fcd3a3f51d4fd9bb12c236615e2995f5d7bc3ef3b9597c0e8d65948d620f6fed80b958ca7b9600e5afaf46ac9d3ac17978a085b7f67099681203fd426b52cf8310467590ff28a74f13ecf1e32b96c8a0a1bcf2f69aa932ab14100cf941f906bb3c937279270d277213e0eae52417d5b2bf5adfdcd46509c34506ab0b3a3550b82bc52c2c835f5ee6f2d15aa2c25b5a46fe87c5a7f4d3393df5361396d61c22e49f73a802e0a2a9f9809068e10235b7253d15f6885eaf77a2e2d35dd458b035f1218bcf649fefd8737c18b912ba2be8a298b217836f5299aff87bd407c29492c653f3c5295b8cea0f476d7bcdc63ddc873e47327ffc1dbe9d9f66659a1228cc19ef4366c4e4dba3663150c8b914ff000d5efa991aa8f1527664b46f99688fdeebbf75068618dc104ed6bc7e00b824e02433d39a8036c1826fceaa845c87489ee2de510061b76819362b4e3730e5cb849655148e2afaff219b4209fa114ea47b7e83268eda0b92f39aa571b0c5bed76c6cc0a4b20bb6b3fd7d8df43f4ca941f046219bf10163249a6c4cb53ff86222633747007175e124775031eae773b9dd8daea59e6ce784a2fcc0e54069b9f3dce08f40fb4d5c49de092ab1bc8df53c411872cde9251404e7f7a163fd94146237dbda635543f0294dd16d524b736d4b0ce8d7fca230ec2e7797c9bd7c5f3a1e656444c95fcabc063ae6c2b6a95790361984abeac0ddcbc54d07389dc6016260bfb7bb11942688eb976eb49e97582b604802f0494fa949d0014fe75dbada66b3ea99f0cf0e1f7f294089129b4f5fd9502f86e2dd8c21c35a09cc598caea408f32bc9ed664b6e67e0d399067cf4b88c3297496e6a7e6760d4aa8090d1a8514125384caab80e8e40eaa0295c341fb7a653161c4e3d3934170d17e456ba7992428e667e80b5b738657a69543106ec265fa4d588ee7e499914e58b65b96acf1fea2124ad770ace4bd1914660159b32072d5df69cb057eb7cd95373ba648919c85723e64319eb6e594f026c4d70711d59bb09339b175b05775e9554a737554ed0420a479de42394ab9bde1ab2ab0dd88a583d6f4db569ad2e35da128f4e2a6432e22354fe413a32e2cb4d7b935d8919228ff4f095e4c352a5fcb9d2fa71ce1b7d95d696c7c137d20e7676082b3ff3ea3d2cce531d3de2b431b7133437f6617d25718c9bb5639c32f22341fcdd688c0d2b1852ea174d761734e9a38417a7b244445a175f1147954ae19004d899664a168c492ade00f2b1cd01462d4861141e08f1dfa00721a2d3db9b1a941219ed117035d00145e2c7f22bf0ec3c21cf956cff0850f64d6027091b0a15cf2c428726f01046f68a58f25ed0d0b9a03b5cf7ed9c3e9e825b19a5684622222ecdb569e37ac99d2f4dadeecbedb5afaa5883a69dcca4cbffa0f69e4a0fa299170bd12b370bb0ce29eca3c7c9ca6c63a0f04d168c42226ec7ad8af37434c74a1788cea2aab2524503969854fa5f0447908a866ab6f6967d1aceced589f89cefabaad780638ab8afdad39aaa98c4a5c415ed8c6fa65645639c19551671e3dc70cf3e53a55f6c227d08ec272e22b2d59dec373f0e91d748ec23aeb4020015ea4f037bee5e802ce2f25994d90126ace7ed66abc002b594d71c0882a6ad6ae4cfa32ea03df2ee6cb0a7b7cc0b84424e632b696f2f0276fb1b910beb3419ff1cf87ea91da9dace7c6cb5c3ef2314c080417a2970b301920056a4257633ede544a7f992caa2f4a39cae6bb005065cac300fe2c50e5496a7c9f4c6dccae344da651a0ccc1529b5d99af5fca6ebbac3755a576e974a6b482d0381ba721cb4d4d69c0ba567a1690b8547a462548c2c27f4cb3537e5848ee30aea6cc4de42918c650f49645df5c3881fd9463c5d759aee2fc24ee16d7fa839b982e2dd3060eb505da8310e84a01fb40e53f9fe43d51d4b7b73a277684676b65536c0ce9d9e38eb0de63fd5107620ffb8abcb3213ddb323bd74bb97c0b6eaa5abfa6050156b120b6249589cf83dd2ac5b15fb1ca19eb41873eb3762a9c624d22145ec6882872f11386246390fa9eba1c408ebd273852a926dc232bb2d9c555ccda5dc1d2e6c106e605c7ac4edaa99b1259dbfc301c5c4cb83df9c207b345b42c72dcd1027eb0df8851feb8260412a72b43589aea4b7f7b2dcc86ba7d04170260b20a75c0181ba7bced5ef761b0fb167e4058146a955c76f31bab14dc5e3644e1ab9a27dd7f87216dee4b0917401892c2e2a555f3d063f2a88e2c45a8c5292671a378113fb9a77473b9ed92cb8aca6678880aaff80acfbeef29176b0aca5c5c4b30700824cc5ac012b9562c6306bb9a2fb80400550defb58401fb986adcf1f692faef2a4b709eb421166f62dd3b92688674496edfcae1ab0246a09af305fdb665c192e3d5acd74fa0fea4dd03df7008b1f6f366ebca8802c6659d4462719cc6892ebd52f2f3b07c07fc34ba2e1e3ce0502dfdf314746b18dfb1b81e7b6b332fe0d5441d7bcf1ece01372cbaa86110e7fc5856a37c0da09497c03e20057c53f4001e3ae2328c695d3cf52fa1223f50af4300c0f37499dd5bdfc503b8f0036c0f53b664e821afc4d8b898bb04a3067edd11a4f3c819e1497076b7a70b44f4ef916932cd92682114ecf53d28b0d0f9f257694e34e81fcc4dd18ea797a90dd223d3788daebec1dd0c7453d13365efe2307d822ff09a66baace73c9e4c2cf822b96012a136886f1f60f28e7d3c8694e960c84276e776b5e0adbdf546358ecce3e112f477ce5db4ed8e2a420f892d1ecacd779fd37bb1cecd87ace599d80f8b391adfcb249f499f2f8660b3e62b50e1085e9106fc8a4a54e7d99c3509a97153f75ab9f9a6f5e798a137999d0082ad87b172d1c1761092253379ad766d98e2613dd4049c39dc59c92ab4b8fa6660379628b330e0af260eba0d3e66cc412e25158924dd6b525b2b0f45bd3d4e342335830d63d18694e57214615e2310af0759a076f0c0bf5ab84975a5f663e37af76621296844ab996309aa1340be464374a0c6e1c69516447e5e1fa11b458c4205ad83c9d803fccdacadcec8c5b14fce6acc611547f90aea1b0366398ca2a0aac0d4b1fc5d704f364e65a3383d4ea13f20a6b2dd10782842faf5ad392396fa6bec0ebb0d2f514660ae241ce829ad45e7314eebd086d9076eaacc6a0d58f88b59bdd2245286e1c971f9bb146d76f59dd834d0944ba17c1c5b8b78d0ec3dfc86d3d07db4ce52935a40652abfbfb39c6abbc2bb2202f8cae810a8cd51c5993821ce9856c4e43f5eb81776961417c2ba6fa091a811e08ef0836ddbeba29ed24c555ee501583fdd21030bcc308e5f3e06ca4591d5c33f81cee8a90ae44a6434e35f36c1211e62538622fa3f060dc655b19f9e1b7cfdbe7bd2a1b746b1ce8538eb02c297756f721484215da886c95318186461630daf509abcda616b135c40e633c43380892c530c4b486abe7441f4c22a3b55f68a228109a8338a3f8b8683bc04b37c8b6f880db35d9986db3923817b5d5418457be7c9f51d3c0dc6b124b365d7542d123e3a84120e6181008bc5526373dc61eb6979fcab1fc7fc9b413c875e19a5c6a6af5d8abc7071858345cc054fa8ac8441b0f48641155b9cb0a39d4ca04e5c8e7542029dd590a6eeabc6dd6f69c1c1b1eb63f82159d5cb9f21336dbfae08e404287c68abc811c17e59ff6df728a735a56a3ef5f849ef3de17fc173c49ff864055732a1f95f0809d35bb0a9da827ef6575143890b592da76571b6d153b304d86f23acb117891075a9521373ab648086c54b71214d7feeb852e140a4f0e3859065d409e8b7db1ebf7325b0882ba69d557154e2fd2d4feda891d804a96bdc254da255431d556384534b344cb01ed520e8304289c47c7da0f3d7b1ad884648970c22027fe3f7fa92c9c0ac4913a94725d1625393c7b7d66f559ef7ee90e873d2c3431c67d349f0848c444dec08e392b15f3dbc7a1cfe257fb23e58de344c873ca69a13f65603cadecf3889f74a771cfde53c30306f9ea7ac74edec6f83f271235b84d755da4244bf002a0dd6abe0b4deb37e69744583889cbc9a0ef7576f0826ef963c9c9d36129f793b3245a38b1b8f1e276eabffa4951c3290a191d17f1277be0c95ba941ad76f830981583354cac1e55a4b8ecf8bfd4f035b6801985aa20bc4ce7140de889459e1d037dd45a9907a2462f70d7790df87b09562702045e6ee8682437fdddefc08c30ed1e51e70a9b3b352e70ee732c5b369748c3ea04457f284550cb961d7551b836577080af73ed68d275591c47cf521f042efd914d377232ede7b5d731e2bd372ffe4cce19acff3c505abb119f1fc506434dfaee0714af8635c6994ef35d7739512f9dd21b5546f38a962ec22636075fb144ccc6842f1f671d887add319c33f4bca9dc20f9fcab6033a750f154e015629e91ed3d67056a9a915447cebcd2e122e09ef2a91d8ef2df749124b1fb1784c693ea82abaf580dc35a3d73a9e1fb2608c9aeea24ad3a397d45d1c5399f1f85c76165ac47fff8909800e7105772c38ae3f313cc0968bc6f793ab8d68cd18bad3344304dd1d08f283e17ee28fec50192d2d15fd38448c06f8f7bba0625ee30d8758ff873a153f4972d9a1bf348a38bbcb1e9bb06ca2b7b96f1b3250bd647e3ef34f0860aeb4484ef580e1be421eb3154d9c9a8229dcd28c4f3269ffcddd9a9fa76d95f863bfa5b429a454aacfa212f01e2cdca8df7a876fbd9bbf8800982a267421f6fbbfe7fc5e3b057fb989aaafd117459f186b3fa1eaa2189781624573e1f4c3368100409b2ad9a4417f2bf186ed567bfa062cbd544d2feaa893695b61114821655aac2a22f3b903247ca1771cf121afc6277ae152ad6c0c2b3b2a744560ea88f86d2e8a124a8cfb85beaf6399539136353e89e18f8b636f38724abec0337525931a3d141f2adaea38b70f7e60220eec74b49d54b40fa648d21a4852641259b84f05b3c8efd9dfac8f45713b4124bcdc467fff41ff748a0822c9165d323ae555f6ccab2cc55e7a2c2d99cdcdf629b90e7e127df9da9825b9dad263436a79bce0d096db981977b70605da6fb09263328bf04c2a1de893e26232f2dc68a7eb6394e8920c36ab7db67eb9b9d3fd0d983f0c98c436dd9c167831e2d201e18f72a528d5e12b6ca8d8a5981ca9c6728fe2f06bc8eb4f229d1cfe9532a203e4954314bd73b756d181a416e2a231ac9a7a3f1ec4ef54913ac711d44c4d8fece7d1e4dc9ed3cde0da1fb28e6c40b69328e5c222ad955c219ec596563f54bdb510225abd57d173cbceeab846ae43f66eb144bd058867f5c7bb9d5173fdba1e990e96b8dc0a0a5c78c8ea7693243b4105ca52702277e65dfed4b0bc1e8b6c0e6bb8520063a51ed44e62e37cf8400cfcd488fb476982f8d7eb8eb955ab829ec39bdabe9055d7e0c2b6c6f3a635972887c57e2c165373899d8462b07ca095c1afae54ce345897ca8d2260ea2509676629b1f8b165a4398a46a6ed339e06f2b8c8c5c8a9692e0f8c66bdaf65aa4eaa0242e1d851b3ee2859334b256f78e1f3dd6f168320bf5c4ef0b7352dbe646b3c9b1320475af6e093d242eda495f066245ac588cb028386a42d101a6435b2d2245f21bf81c692806a14a59131fc817530d273d05cf02bdcf4ca6583f0cd0b0fc0418717b3e4ca79ed583d9b721206fadbff966b367a7320e3195316f882989ff75255c0cdbe4d1a43d5ac738aaf7696edff92fe5d5a60f63ddc9c9894704e0b0f0fed9616ad2553040a4e187f31a7a965b2c710ccc1d3e51cfa381cf60606b73338bda39bb7f50abd37029d929c7f96dce75b89bbc8732250dbff06db5bbdc7936fb0603fcf34697f87b0a29cb11aa876930e44028d7a4a082ebd490ddb13b09f565c7072fa81d343d8e04d46cd3bf2dbdb085c676b0dc2470019f0a8c2ccfaf11d47d99e9e0ae3bc380e8fd05404a57e01da2eadd9a5d2442a3147c91968e0f188b73401028127c9d6ce391d8270eb72db62aee9f67f4199ac8f04776cdf3349e737961d2ef64e4a64b13ab53d7d670724eb4af2483a04531fc4f129a5205e860350a7c7551c946c49164cf3290358fb8b92df16eb692d5daa9dc6cad6950af3a8a0facda5afd95b1b1eb071928205b3e3450b352b7bfc4b957dcb1af10a457","title":"778. 水位上升的泳池中游泳","link":"https://leetcode-cn.com/problems/swim-in-rising-water","question_id":794,"issue_number":45},"43":{"day":43,"pres":[],"tags":["滑动窗口"],"whys":null,"difficulty":"- 中等","description":"```\n给你字符串 s 和整数 k 。\n\n请返回字符串 s 中长度为 k 的单个子字符串中可能包含的最大元音字母数。\n\n英文中的 元音字母 为(a, e, i, o, u)。\n\n\n\n示例 1:\n\n输入:s = \"abciiidef\", k = 3\n输出:3\n解释:子字符串 \"iii\" 包含 3 个元音字母。\n示例 2:\n\n输入:s = \"aeiou\", k = 2\n输出:2\n解释:任意长度为 2 的子字符串都包含 2 个元音字母。\n示例 3:\n\n输入:s = \"leetcode\", k = 3\n输出:2\n解释:\"lee\"、\"eet\" 和 \"ode\" 都包含 2 个元音字母。\n示例 4:\n\n输入:s = \"rhythms\", k = 4\n输出:0\n解释:字符串 s 中不含任何元音字母。\n示例 5:\n\n输入:s = \"tryhard\", k = 4\n输出:1\n\n\n提示:\n\n1 <= s.length <= 10^5\ns 由小写英文字母组成\n1 <= k <= s.length\n\n```","content":"096221cf5b628be1e73e8bcfe626c734748326920a3d40bb75074c7f2211766808aae07a6e8b9f3a7173bb3c930b2fae5ba2cb0013dfc75646e2b344dae2e935e02d302ad4d8c4f61d20cda18cd05e7179e7728bdbb11e9136b520c3f4eca18c412bc21c6cf8953b2433026de7decef068d9532c3759bec970aab3c660fc18b36241cba3bac4c6b0d625a465cd12a03eab9d88799ecaa9f50b624118edeb95321d0315481af761c2f4caebfb936e1d6c01a9c4e17a323c60bb13e86c51fa2a0054956af4546ac470f49c712b837c1d72b70ccf775424978f074e82cb352371b294a2cc2795ff6fe2a2334ab785a1fbf1414d49acf2ef280220cb22acf58d42edd70ccc820775f30c457c600ee3735a71e9da832b128239811d92ba1ce8d74b14beac6b8e5488e6ea292cd0d28050256495cb0d119edc6ac09a4206729a0ca61012519c971328516ba8ac47dac9d855483c65d1cea0eea542d35bda13bb9a11f8e540797bb78f75de40584011556097973685ad2cf5dddcf75a64f1329dffde3f38e50d1acdbe1fa46b30a14559b1542fdb7a2294d39012f1af2d5ad13305650597a34c794d328c04d6fb341bb8d1d07dcfa5ccfaa850d00d5a342aff7d0de98ae760a9a48828288110956b0b5f04332942935fc81781a2e5f94eda966c192d93717b532f0492d52c0f0248e0bb87a6040a352cb62eb33ce7982e8cd3752bfc99857f443d4f0fbba604f8f47cbdd3e11b0083c8c9e3adca68b289024c66313513a430157f5e2a5405e6ccdd23f1e4907c7971300b295882c6cf24731d28a15522275626b6b2ecc9f2786d254aeb5fa0adbb33d99d2524f554d87099ecf89e5053ffd2727b9fb7eba3b4a08567c4dcd35ee98bbdf3a97a6ad3340e3c9e45620315270d49b9b3e7110e33e291a601d912681dcef2ea6dc170dcfb14b6a47582b194735bbd78ff550409d8d8c39c62467262f63d7eb66994f5e2d42eed961f0430f9e966d82c467a8855bbe15464f92f81a5d77e28352edbc1a7599c4d728eec1cc2b97c9642655a24e8926d378829019a1ab4b00afea92472bf939ce82eb5c426d8756be03f0b943bec55e942759600fbba4d475b2f8f03fac0a291f8f95e4ece300a38967b4b09e970f50c985869d21cb883edfbad80d5df13125ed0046282a7a7a2c9a0ce5ad880981355668be4428a705810193032caed4aa64e7faf48f42ca5ccea4984a2deb127f78d5b939793f93993b7874a6cbdd634ebac20eb778eb6308e3573c06e95bc636cc9393702b4754df6eaa8d415423d715f93f2fc86d19e83f509acf65452f3658108277d4ca29b9cca49d2133daad380cda170d70a71c24ebe6510c463e88f524a1bd59840c6b3fb8db9e6c79aaea6c73b3619ad3e53d172fde28a48d77d3a521c51a7bb787cfe0400d67c1068ab96e4eaa55361fec81b3d8a337c2ea17ac5843dc639dd30d18845e7e0c4d847cba3641a8f4ec66856f7889062d2ac36fbe42abb0c05f8e6755a5243adb1ed9feafa9f599608620b67f4e52cf74af8cb171fd71d9dc2032645dd41d088d9ad3acacbec09eaeb622a4ab215edd8984aaad67f645a6ae0e7e975edf72142555ba33074e074722945b43d0bb437fe8fff868f621a360cde40424a93af97459c45f427722427d5cb27a7951befde8ef69cced7507bf0684b3eacf08ce16e6791621b9a93dcd5ff5d4a6eb25948c4fc7a379258c6ad9e904356ed09d27cad7093d839cf270b6e0299db32bc516bf35b76e72551d7edc04a5713f3aef911b544fcc310020a573dd86b4b308d3cb298fa6f7c9f855c578aee35a9a3dc2b6e982659294241a8dcf8d81a1a277d2213753b1dff7823e916934e33024dbcffb1063a2e0624c9cb9b2d4a1fa3a68460bc59a0232235bffeae82c0e48755a1efec64d506b769c438943997472740c491ec1c709020a3c8c75adc908f26d1e1203c925ac777629d5f638d6f9ecbdc4f14af5d23f4ca8a9cc950db0aec14e256a6e284ba381eaaa6fa89de7a08842e9e2129b132221d8cf3a95270e05e8991be7aeff88d4590e457a20ad4f905cdeea848668c28647669f32bcc8b571fcd4fb2779c180272bf3914a3918bbe89862d4d5b96c4efd7f42c1e294b81e51016890d87d778358030441284444c80eba35ae33a5ad2b2ba6f006de129b24a8b330a168c08382d866fcc6830baf245994238dd65c1b9e08ac13c001a9978c71beac75c682482321a36136d76634c0c8370ab91d874e3159804fa37f1b6aab5eec185265342ca9d487b0fe01a636aa1807a8d8a22e78285961d821499a446d3f208acf7fa2e593427589fc2e2ecabdb6262ec7b46ad9164359af65fd67fe70eafc594562efc5e7e8d5d522b708a6eb477a2edd142d0bb1bee76ec684b9a4e033fb0f7e3649522f8a6e78e30ca77df904a2c03be1add3b0e7815d06c2bedd46461c2d4e3dd5d9d1fe68b3e573b367faf1ace976f749a487480935790f25b091c4f99b8ad38db3630afa199350a2a82db407678a96ff73ad697bef82b08bc44a4730aadf50332bc0de0b2eb2d5e07981435df071d105c8f1dc6feb3174f3ff645471d795d3772dd9f412df0996bdfd0bd63cb0abf16e89527fdb067f86c55adb8d997a50ad4e289ee6c23d5f7eb43edf8b632c3e57010f00ef74d6493f95c262cc23f11a52daf703d773a46012d31fb673b4459a6a831b6cd91e6dbf13ee8d0eaf3c1fc092fb7ee8784a033e800085bf44d2ad6784457b5acf04891e9794954b9ede56cb1dd513162d0df2b130ea4423d9d7e4b5c6a755e148e95a1a73bee7a678dcff86e1d255f743e4bdb58ccb01a72f79ab5eb57de7c4b96afa2af9c9986050975d9cf620637bcf432e467ba1f79bd546b2e119d83c68ebd758fe671c33e8947cd63ee1eb43e3023441096f5bbadca1fdf4189943ddbf2666d610dfc7b9fc65dfc630602cf7e9f0f6cce88cec5252657ceeb1e39409c1397bbf7bd96e93c2c175d1e698ea5a2c29c3a2bc842d7434fb7fcfda3176ed5b7dadf9ffc938dcb8c26d179a400f404b9cf3c720d9ca3c6c991b5d36cd5c37f7d536996a152c90b16cd77ec3cb12fe4c93e87e20fcf4255dec0d069aee88dc1332e4ed402a84f86e52f9b7ec44abace2da89d59ea59612c6f6f4f702d6fb20e1e971c6e0573789661b8356f4ddb421c449ae420a1b75e3ae712044686b712686331d547ce7036874d851e7651719d332b95695459cdb10149ee28aa707c939cada7466ae528541041358662d6c001193f5304f44bcc115b60760f939206448c6b7243daca48bb60521dac074cba9ef887d2399b59910d1abdff00dd2d575f6a9f667c08731d88cc996cfd89c6a8ef985e216e9666e39d32cb99616714844122cb36fea9d30a422c44651dd8b040de931be4463f440ffd03e9f1226b7c5e8e001683fcb8bf3dad2d294d4a9d7cbbf4f87467250031ceca0f651689ec219d46f68a5beb5ddcebada01677f2c293d02ccd262cf32a5e4a7211b0eb63b331cff54b59c791c18dd18ac206adcde0eacd94c3c4aba622519dc15f25b64e055ffbdf6f919d8697f1013aabaf0c2ff93a20d29f6fe8d9d934c168148feba884b25d5119948054f0530345b68d439722f9ba5a19c8e1d7aed491e8bdabf5b160bc89acecee9099be2a334117f2be65b4444b54941b431972d5ff73d63a5cb5666d24700af923212487d59cf432210891f348e026b9b6170e1fdf4e024fff5fa90ce1e84697df3a2e84c3e34088c0009097d40509928663f882b79b61f03181b16ff6ca9541c4d2650b3d0cf6eca84609f94ec91a8e9484fe2de17f9d11a1c6c3a0c9304428f8813322c1a7cfb66bc504fbd138b7e9dc7057833d3a17016b11686ecd27f5084a9b3a9aca1f5ce1c3106042364a04533be348ed82a708dfaa705b2232620a24266bb0bb91a77a8bfe91a0815457541ca4d5d644a93a8809e9c23cc360f8f21b89993d39efb64d30467ca12cd9541bbe55d231daffcc9b4e574ea94980fdd8a7060a4c864ee76da908dc3979344ad1f360f1f82ddbce66156ced0a12a5ec259904070361d12c5e0505a2386eff90dc8e7cb72ca658ef7dc4ad3b2834c42d1ed8841abe518f95fcb0ea8d84f8527d14693906496b5796fb3dc4be5701d61fbca8be3d57258335f0d049ae0f279f68d5cc12516c45edf381d6b188ad4ce6b9249946c840a99a73e9c149f8c9bfc7d86c4d643b7b1b21e29dcba0f75db4fa863e90aff3dd94a94ed0b683f99642d6495cd97685b5548da63f203b22ee2aed2b3eb4e78cdfd343a6e34a7f251222b7690181babea3c1ab26135aff4994638621d55199383bcfcd5aa0a9502377bb0eec3b06e18ababba4fe1318d44c1d7c1c5b5151264dd7ca980ca13def5b546bbb6ca789193129e853bc7c15026789afaae4b5414c9baf922d3049252284e90767e561bb47d4bb468388347bdff3a4c189999a6870f3e6d341681f1f82a5ed25260813dd3bc096fd1aed0f3dee5c8bb7666b3b7fd55fc7e1e76fbcb805bac199e8aeef4eaa3bc83c814ee30e9f50cdf996adf9eca82d7706a04b654451f83e65498da0cbef0cd04191392d650481ed774f314f28bc9cf727c9a5bf61ae42e1fcf013277d247fa7e33559d645412a9060f69b056a8f8cd4ba7cd0b445c8ad0198ef3c3ed79d6d658038b1ab73ad5af2ca91ffd47e152a6fc2a143cf9c5c3281c24ee67c8f0b0043263eecc6ef4f2a9cbbdf0126f35b90c7bfdf3b8bd57cd12f871dbe2985a32d97403dc8f549a9ad2d6dba25d14e1af263b8eb544591f4b530a7e3ed0f84c55374012452ad771dc834a418a726eea52985f7dbd89b33834d7a4837caa9b3092efbbd8d660cda43c628237077584fc0d0496511f0c439182d1c38a0c447d7a4b327bcccf2c686d47afdf3209f2b58dbe4271c562b741a113a0e95497c2e37b3ff4e6dae111a877585c3a6d4dd372ca0974fafd8127116b29488303800c37939c9892269943a447e1c642e1732547ec89931b2d62e4798495c89cfd398d2cc22c1d127573c3083604b46b425ade7d3ea7bde0f935311c664ffa823b485bd5eada99e4b33552ed67404780028730815b07459da35964b457461a9fdd59b395d6323f048810960de924fb0de669dc4365ef06d3d094569527a036042c09e9f46f1149728298c6e878b3d8289dbdcf6875b1cbec5869d3b7e7f90aea1f93426d6997e52e2590d07c0df08af60ea0964c68b8e54a6426324d11b82cf26855a9ad43937a6a0c0f5b0c8a8017a43b653e4a59ac55e3c0fa0b10823d535eafe94b097a596b5d7981f083b20369b25d98d0c83270bd283511e10e30add8bedfaa766828c801e7853c752ed206eff2c52aba9be6d93f9f26a90256bd8aaac039794581d9b8559ee8c770f4ef7e3c16c272c21651299ab735598175ee70868ffb9ef2ee43fef55ee5015dea0c93a1abc914db1a9bd22ed7115444abd36ee8ad6e116a64b077ba76c5b58bd25202123eaa975dc335d19b8a6f988f9a0ef635f7d6b11e80bc4b0683f7c0abe304e483a8bbc2bc634d2990c445b88945da384af1fb81fc40e633c433808c0806491e69aeec01d41122289b55f68a2615ece837bf6aaf1333b9a5668d3c5f180927b9f847af6d46b73e1d508844abe6d84519ac0c06b41457a4a7e51d039a5a1276caa005529bc443d3774cd15bf97c4e09baf3a8cfa1d8931a5db12326ea6c4f6c06e5716601d891aa9829b4a584748782301ac825e71878f05a18889582071dd520a7fe6bc34dff6901b4947fe77fc1dd015fdfe136edbbea69f443bc29284ffce5243a4d6b88c7ad97d191ee2bd3ed096bade1cfc5c3c44ff97495c7a001f95f0809d35bb0a9da827ef7f29467cc9aeecb5250313205c7f3c4d8cbb69920c73fc5707dd60287bba05097d0ff65b138eacba92044d0a420e747a065d409e8b2ff4bfa2601508d0ad7f9a281a2a6fd3da87dae36e8029d9f9874ea7475d3dd01c276f7eef169956860a78cc536dd014c7c70f7b2e19d2942ddb3eca6474f93f66a92cc82fc48353db3c0e42257d75382966e859e87dbe5ab12b2c34078d783a9318468156dbdaa6702919f3d988a3c3e255ae219884f86e9a739b2cb876732565ade0d998845ea771899101c30b4abcfb36dd0bd9ece824275b35a44d3e46a46d40fb0ba0860cbe164da637e497471c60e09fc7e8ae267ea3f927846ac09ac46133fc85a85d1f6ce49bf1e276a6faae490586361f4d5545ed6263d1c91be947c80e9b48a450b47a41e9197fc5f4acf2fc99a00feecc11d6e5209c0de70417e69243854660268a14d504ea570c708c530dba34465361464a492fe2727e7ff1c7a39ff730de4358bf52de3f2b717bac552c0873c31dd5ab45532a225f0a8fd7073356dd622c79dfe674e171c73c58073ba0114b4b7cb3825c743b7dd2baa8d16bb1e26927ed5bca0da9ff353f0eb20ab51fc55b692ebcee5d09fbcd67cfcb55f2073f5a5671bf9b5b186cc8e9ba02c21d795f1abb6ebadac4365c294de502d739a670dab289da36e9a0eb2f70a71adb58e95777d7cef7076e0538df8c4f4180f1d5f818fc8caccf4e86a18b26d86af6b20288ce9df69fef9f0970e3294073b7e1b66f198ee1ea25bc3d2e773ac4c121d019d6ac337bac11b0afd5d41aa10d5f71c4d6f9ff5499052bbe3c3729fad285d6c9aa2e44311ed6d4941f2317a97ab78133ccfbdf4fd48a0dd5669f7aba5662bd628021cab117a107a6c2688178bd1ca3c5bcace9e841df622985b0e977759303edac7ba58e11b11fd4aa160346a428f66301969cb36c818b2793a02a8fddd4d9f2d076d95f866db3080b87460eaafa6f6259b0d2cbd6ecea22a289afe3fc46d5e72b11112cf4e97edea7e37ef7cb97b7b6283b11d3cbfabe12aa798973557b0f3e4d5d3368160005aabbd00b58e0a305228f1caa816b94b917dab3e3cd3a95ee5057d10744aad6ef7765982f5d9252768d4654b50133a715768ac0dbdfe1af091f4aa4dd9b8abdaa6aa38ee704f18a70c670477b3db98575eabf32d0ad72fd29c3dcc7ecde2f0fcb375d04656cc0f0ec3906e391c4ad0ad6b22aad09cb3071c08da4374b6ce138e1f5d3f39e7e9feaa85c8f071bf16969db6fda696a997eff5509a31cd6b150282c886f4f2168602a5faa15093e1877ffc7a4dd1af4","title":"1456. 定长子串中元音的最大数目","link":"https://leetcode-cn.com/problems/maximum-number-of-vowels-in-a-substring-of-given-length","question_id":1567,"issue_number":46},"44":{"day":44,"pres":[],"tags":["二分","滑动窗口"],"whys":null,"difficulty":"- 中等","description":"```\n爱丽丝参与一个大致基于纸牌游戏 “21点” 规则的游戏,描述如下:\n\n爱丽丝以 0 分开始,并在她的得分少于 K 分时抽取数字。 抽取时,她从 [1, W] 的范围中随机获得一个整数作为分数进行累计,其中 W 是整数。 每次抽取都是独立的,其结果具有相同的概率。\n\n当爱丽丝获得不少于 K 分时,她就停止抽取数字。 爱丽丝的分数不超过 N 的概率是多少?\n\n \n\n示例 1:\n\n输入:N = 10, K = 1, W = 10\n输出:1.00000\n说明:爱丽丝得到一张卡,然后停止。\n示例 2:\n\n输入:N = 6, K = 1, W = 10\n输出:0.60000\n说明:爱丽丝得到一张卡,然后停止。\n在 W = 10 的 6 种可能下,她的得分不超过 N = 6 分。\n示例 3:\n\n输入:N = 21, K = 17, W = 10\n输出:0.73278\n \n\n提示:\n\n0 <= K <= N <= 10000\n1 <= W <= 10000\n如果答案与正确答案的误差不超过 10^-5,则该答案将被视为正确答案通过。\n此问题的判断限制时间已经减少。\n```","content":"096221cf5b628be1e73e8bcfe626c7347d84248a04fb33a5cfdce8e0203e5fa5ba126cb6b71e6983b7c364be6cfbaa5dbf2242c49b6414deb063ea3cbfe8f124fd2d256b9ec38ca1586ec5a48498371574a73d037164857edd3ed52860577de73373814965a5db6569b7dc8e2f3b003ab421c1c6f8cd0924f93c410e8301994094db0c64384d0e3355f42a832e942af128487ee87c68447cbfa72b3eae9aba5e5c1177121ba3f94420617df993691e6c29abd9d1773c0b60a404eb4e55f02b119dd34b900d6fa00cc2e82f34f821172ffd21acf31771a7e667482e04add3f1591ba3ee2097e05aef9b1f479aa9a0e1d2414d49acf2ef243e2e299716310a29a4f27386a7a39a7195477d7f0fd47b5876d8dbb528ff17bf4a92fdc51c858b71975139e58f668ce2c7222cd0d280502a668acb3b017259c808c148809d72eacc37d50cbee24b021c2195dc0ef38e6aed4b6c65ddc692ed8a503fc4471334025f9fcac379993b1bbd8876253c141e2b8fff729cf99e4d9dcfb7b43bd46aecf88661269c502f6f3187cd150cc42c74ff0921993f35c59b984fb9b34705d96f5a416cfeb41c1c78582063b3f7adcdc5d78f03cfdd48b5ea51b66c5c6055d60c53fee1897af6fb844cad0410a16a086f013329649b79d63d6ec0eea135d1ce253656d847fe97a79e98e1228b92e860302c2094a6bfb920bec0288bde17e943fbc448e9c44d266674be6ef33642b556b0e5f4181290c1ffc43b65c3743ed3cba8cfbffa427595d7cfefb0b33d7b58c6a5d6e63c472f64399330b90248d0c7ba45d46d504e7853c8ab9f96f33713121e57c7214a65f447ef4d199020cbfa4c59a8c06f069eec070094e8a3bcd4e99d34ace14251ecbdbef98db2f69d6728ba71286a74480f88f125cf0c9ed586741656d855e7c811083645b64de3309917c0ce64d1dd950ff11877d35a0a25d9d0e58269414561f70470984597d1d8d513e050b1ad30f8d566e530444d9b54b1c55752cc25829a38f8486d2d9769249dc0483cd3f477a5912acd7816040680c17c513840856bdeefb3ac2bd12e07091591f304b5f132d2486d75b29452933dd503a0f06cd47b35f684b08d92c4417bae97d6f86169c61614ef14150a3fb013c76ecc74ce56c65a81405bcb38345cc1b299bb11083a2a2d6236675e22b481e295da41bb45685ff4064c0d5e9778eb698fa1d8d010c844c3e987fff9484468b94d9d435c6029ce134a2534f8c92519b941d5e868c44943e218fd819c3387a07337d90eff990a7b6bebe093f41d7616a5edc6b1e7f2b3aafbac1bf9bf7b35ba7fc55518fcd03ef3c3e31b8f0e56dff9f890b736891f164d2af340479f455f5b127b625f10a29f84a4eca2825b350f3a60110add33e69669f72372306cd77d3a415829366d8aeb1d9cc34a8d007bbd92de322bca6cd6c612199eedcabe4c14fbf062df678a11ae3cd833484801df3868b4df04a413efca475234e507628d141696ba3516fed678b53146ed1a0b59415d4bc421095702a079412dd857177598cb6980125ab4f4d9228a19545050ca477f718c020d8c98e479838db9aa2a3736b8c6dfb46f846bf92357f8ae096efc5e628cfed623768d6a2934fd191a09194ff1e711588b151255dce0b14ac01fa923673349cdc33fa3933e6b057867781b5c89cea22a136fb1aad598d8a2e947897d6a551a2cdc91879720148da4223aae1194f4d1a94d07b409c1aa26d14658a008b1a1abda1ac526964d7b26f8ce08787bbdaaf6dcba9d4468be19cc14c58ab7ab0b7d2cd7794632941ebca0e6636eac84534388ca14a5adca2a7387e1c4b5f8d41ddac5c719292f70071e753c1efc5608eb1d964018224cb9e1b0380d2d3b0fc7eab72e5f06adb88b6d8645a720293f9de443ffc3a7f576e7a1cc1a8a19d515fc7ff22d30a493f0c49cd91378952c99ebc442e391a820d0dc3b3d9a61cb4b6c7387b909df12017ed014a35d22c1f589b8c05ef4370eb84e937b9e2e7bb8becedbd72d4885f3ad659e75b854cbf08d3a7367abf729b0417a40f37b3512a60c39db3ed57569d4436b21be8b1df387faad74af3d41d09d38c95c831ffc94e269ef9f58760262574fd691d37e17602c76b9fce0c95e1c98e74880607b1f7c80fb0300cb3962e9a58538b7302e780a54f98cd08e2cc628bb7d643cfd713eaeb0674d89fb2f3bd953c0cf50a91b283a0947dcc2dd7bbf4ea45615f5fbf62083ca85ffedb7b0cae664fc1b4051b616dc5ae86fd6242b394d6f2a48abb2bd4955cbe1e2049b88c1325194015bec2f666150a3ed469dfe29c1b34683a855e65bfab7d6594c52ee93f46e6dce94fcfafe6a74c8db29b378a6b3cda6b8f62def677d875b55177f816ab2748dffd258df57be01f020a3c36ca6efc46c7215891097212d3e39b5278c6c6489a0ec70d416e05c4a4a9b6c0f9c1bb183534d3e10c572f04a29f8e987baa41cd7343ab7c13cc0945c1ad34b6ac1f41268dc337afd57a2836a1c25b88e824d47ecb3c329a97aec99c92d16c5cd1cf14ac1aa6b798271f89f4a7d6bd1e8dd22a0e84291d8b0e539f0342465cfcaf517c39de2edfbb8e4086485aa5ed74588176f8657de6096251ffd6d0dfa09db90020e1e2d01cc61330827d3249ff027c51f795b97031ad3dc43e975bcfc5c36faeab304bfcf03ed6ddef0f6d5022ee6960c4a1897d30a6e9907545771395d9f2e414872340accb76f666b0be33930a8be864194ef4effd3c3572e33a6013bdf403fb42a14c87242f9eef8221283bfcb59fdd305f38fc4c7b0da93395b5dee1ba9bd8e7c4b7ed1dad8f62d61c614a05b54c7f36452717d8dde1c57c0a6e1858084e805cded540891eca53a15ba1f8e2183c878e1e6c0a310839e8e79ed15239f2aaa3cdf478d18da6781e8b3c5cd2e307d20688a11824f4eeb95de2e38695ce767c8a35632f3a2c46fe55b97e6083d5e0083c2d8776789e791922717690f396427abbcdeccc4c70b61625657f3e62dfd18f6ccb78bfd6490c3101855173c615c116749cd38e942df39b72de56d6301ebde09553d71199d4045c0ba908f0754fb43f1d602a800a021836e25f60d2e9cd47955d1b7139426e8a704b58cda2fea3aa940e5398e56961de72cec601af75a5962376d7d767d026bbb2722971952c382f79774ac37566cda783345adfe28938b99e61ab39c1fd88960337553b85eac2d0fd310a277266a1def32493ab69330e7d043628a52a61225b5fafc9fc1c17488203a6675ad228d993a546f224de242d5de9499fdbb7e06e6ad48f9dacd3b72cb588494e13588910f09084b5ae02c8d389ba8334ac4559b9bd1fc59a9e58e90ce674ecc06f7f6623c27080a4f5fde1ae4cc9b220e868eac36f0ed5fde6b7d10c5cbfc8cf1ba5a488a5303855cef99839d53c85b56e49abce25cafa45b567f24bddaabb5240fba02c4c0af0a506f482b82943dc4ce1a6eaf1a1a8a98078976be979ec7b1eaf3f9afd02ee92631d221596a7d34ade57ea833eec3444ef393e780d2a8c6cf48305e0a1d539bfad3dc1b212815c8c55b8b9ece660d2fc9aac6f4f66767813593b48f6d20aa05034e10c8fd1fb81c8fe7a9afa15e771194b973f7403f45a29542a93af8907914e1cfd7aeff9cff99a6eabd609b9aa2e3d39aabb1cfa2ed1ac89166ba6d4b5588177b0873c4ee7efc135dbc546d266508dc222f2fa5d7b3e1323f2b97c8700293c5dd09415ec02c597f9932aa64bcd11fece45667b9aa8d55fc8330d9fcf991b4530ea72d6b3d0b803ccc3b65cc756118bb018a666c602d62620e2474e72c52ef191ef7a31a72abfd02c292f0df80270c69cbf55d3189f8d5d42fda5893eb50ead198297ed268357f5f4d77304e41e27ba68ec73ceab5141aa9ec531b417613340c57e91a8a87c162cfe51f5e527b594a780fc97fd6bbe605af99162f86574eb992131c4e27c711d66ef5a741dc12a6cf52eb805042e1cf223d0637b07ba96771c16550e78edaa0c5550710951cfaf894e32266f7178a72c7a938cf356d3d48cec363e2d72ce9c468245fee1d2caee8299804030346ef2269090d8e336ef3b1d19461b20181bd59115137ffbf9aca0b1fd18f2dbd53be96dd98eaafbcfb457e17770f064b525ab1c331d1855835f31d92bbbc047eed32584652ff4ccfa966b600415305732b475f4e82941b418c313ce451a915bb2d61b02d28a0b45e4d3c97e4ccfffed193e62c6f480f3ad0646b52ff4224004c016daabc909d9749eb32ceb557b1540b9d6760ae849d916d9562cada784f110549a32f05a6eca398e705c5ce1d16be67187beeadc74cd65ca431811b9a02f4a00b00e8006dc888b209a229d4e47416537e5f1cd4f10dc7ffaad38af999edee1b6876c307be2ae8deaf21d76310b1feb55730d07f5f02bf0f2c037e3e6b665f3411eab0e8e3960b2fabc62afd4567f6a673ccdb386a9f98f2808599f01b7cf3c3ec63427c6f92bfa538294637d777ee8cda30bc437db314adf4273b6136ff2c88adb23bf5f74ba0eb99e8eabf71a600c86cc045c00cc051d1d1d7feb7a0a45c7713f519365a03bd702e01cca7c2fe0dc1408f4e6420508ace7e4f3e4f5f969cf7758cf6bf7cae008ea8a541697d602fdca70d3ec6051c00aa40fc5e81c74931767fb01926a82238bf35e56551a99816a476a9741ba26fd258452b5116ab94e9f42da251cedd2b3b85e843e6bb06d786a6b2b2682267f2da186f1e8bb20256e5e5d4d44c82d156fbe9308b779e4323fa3a8d9d6a63a8661695abf421e80926c026ef0ec8e9556f36f502666dcb3c50ada9db83bd7eceff48c8678c54a76114bf85e7dbc48633e819231867a4b4af466bb9879d761c15df6a39232a250a3889cc1d2b00b295674fa788df6916b55c0470e8154d1f7c221cf47c34ae28edd45a22c6c9defff3d696bcc07ebd355726eacf563f2edaf30ea20b07317ad56046f9e413d617c793d35f5b19f8f09756e9f15f2ce4de02f9e4dc364e3045b39fd31321d23437bbd7459ec81e3d525273209a4ed123462c4e94644b8928d32e4d3a69815dd72498ce6cb67f59fa22570ad0283e59f798968e7cb2ebb891cf8d839165f48466bd77a1a7ffa12e03255de29de2e09d10a6968f3645c67827f7664aa9971ae6f8c681b8b5eb9fb4cc044113b11f72eee9fa62f45162b205781253000ca0ad326216098df8b91f01673cf3268d9f334f39f1f296171fcd5c842ff6dc4d7464d6579caea36fc31921eb34ff5c6cb6f231260508665865d7f0dd218f742b5c70cef3da422190fc59d17e242e044a3719714f35a8d1d5f9fa6ba331688c77c091533ac6c3e926874c031022ad04057779a9a68b13c277edac0dc2ca266e04c9556243ee7ee9a4555c6ea50f1181c65436942c39f688b33ce1cce1b98df5b8e9f789b08320dbd5378a94787635bd22b8699346e1d1187117bfba752ded792013eb269b99b5c875b86f4d1e19832cf48b9a70aba8fc6685abff910f66f570bcdfb2341d5c47683429d5cfbae1a62ded0177dac8ffe926b6a1bfa76968a032934439d4cb906d30a62808098575ab43c6fc9b8584b7073ac0575358640fba8fafa5661fdfac3a82d71034fd0c7b34b9bd0c8dbc0d474b480dc01c65b3316686fb00458414c676fd339549661fcbb083a9b6f79129b6231fe1f21f8cef867ae2b0fe8a52db323a5977136aa00a3ca50631a1fd5c4566fe81c9c7293272375fc09061090fc4ba2523eed9d6634bffba3311ca04206cc49a0184064230a8af38df9ca0421b20b23a97d24cb9fd9d631ef1dda0df0c38deecc9f0c04f44e5ecb99327de3a1518b9c55f849ef39a52ba17720ca894513232675a9da3c5d173b70af3b227a672281877a9afc6d66b571f202b653c0490aa33921c6d91501fda2f3120c80d5b385cfa5b50dbfdb34fb5fccfe886eeda9b98ef1d4fe1092e5b8494942a2d971bc7c9bae8192d685f0ad804cd532d6d9015f71d0a9091cee1ee35f55cb14f958434c1871f885b73253d7b5791c06494708e3c27e83f56b051930fc48b7b94795d612c133c7b7d66f559a638be138c112b69318f24388f3244c454d7daa4392b53bc89c7e8cfab19fb71a4c3a4019218db6987762a6046a4e7f3889f74a771cfde53c30306f9e6709442c4f0e53f49081fb84d755da4244bf002a0dd26be164da63af2ec062529becbd88aef7576f0826ef963c99a962430bec0cc244a21b9bac6e232bac4b3347be97b4f4d4845bf27378cac49e9488715d540ba54ae3d4de16f7f83f8bdb4fc89b113f5c149dfe30acf03ab4159a1c60b9e46292dc548ae079c5c1870803043c56713572749427a4ca1267037b094abcc8c79a34a06f648e4212e3770bc622c4c23b81deeab40172731704dc79d544c788c285170d6e620a43cc574014943c4110f1b07f1ba225e663dffd1d6f316fcc07e6bfc04ad77e5bf2730099147de4dc5480653aeff680de2dd359ccb41e21d67244225dbdb13164ae2c1c6728f3f6e6b0bf24d90c1ae761f3a52817bc075a37389affadb3febf4c3326ce618f943bc1e3bd3ccb55d3a5638d4c5131c8efaddec22bbcbe09837a4f2df38d470b1e518ca8a9befb8ba99006db8135b59b7e1f0201ec0a6f424ad6f22335897cf6ecc139ef1612eac4cffb5d1c039f543442a8a9cf5fa54c56a2cb23c3029bbde8d9886b13f447842d1cddf4e6a6aa967b79061a8afdf0c9a89448622c021c94261ee6980219efa46e87abde868816cd962a38bfafebbbb47c06e27c0f1e0715fd803e0ac6abec817e301c1e3484c46a425e66a11d6b6fa6c9d8b2dd8db2af9d6c0d9feb3389d10d11ee6450bc10043e3eb1f2817abb3c2d6afa421ebcaf6acfd7ad7ef674f026fffec4bc3afbb05f38ac2c7a9064f11d3cbfabe12fd30c7375962286b0b4038235913109da1a3533db5ed0c00f667e3ae27dbc64594b3a79d4185930a33df1c73eadbee0547b32058df52568c5618b40119e75536c081d0b4cbec455e19f78fad91a4ad70ea80e757b18a70c670472647b1dc13e3bc72bec82db5a002714f142bf8842ab3b8e7ab9b3eaee67d20eed84c4e9c7409be21c332f6bb6b48659b84f05b3c8efd9dfad3f7034e8d5c56828124e48243f726a0c11bbb0ed328ae6b183898a4cf49f8858cbfc6a29a3093c6a2a273908bfa815c92bc69227a95a89a0e1725fc91c5767b3c1fb19472483323bf15bfad97c71d753a6230db9a7490391ccc73c377b7cb358fcf9d6dd0c48399a7bc6c7ba0d27cb41e3c3b3418f72a52cb1140b6848b960d89cad22e28a7341bf59fb3f227839ab05d17726407577159d7295466111a1a442a231ac9a7a3f1a81e8e006eea234f339fc4fd9a72543acfc72cc50debfb34e683592076f55c192482559840e43b7763c8138515027cb6c8390a06ad9be2882fef3e6aaf3d47fe23c71f5524c3ae5e42c08be990e936a7c0a0a5c78c8ea7202706e8450ce96e273b29368bf14242f8effd93e6e0d1730b3e6fe05fc12e40b29f2acfcd48d8fc3fd46ad05cf4eb8947b87be539b4c4bd500f300c79293c21495972c1325ec8d1065978c49820016fba710e79b8a145f06fac3cfa894f5ef27ad53a23c84c8b65150f84b62329d97fe84d36908a1cc3c584cae8ca6b8cfb46b8fca9252253871e65b7ebdb79ac74bec04b3db8fd687b45a1c48407731b95e046d9c0fc206a75a26e18260e2eda0019066a2eac4591b0386c6a55d806b6114e07334be200d21c692806a14a5913498d544b4268210cc913ff8809a943515cd8dbfc0f1806722566a79e88a9d9b7212029e2edf96efa29f3640e62c16541d72783b32c790e6ad2f9fda4745adb25aa9c6938f58e2fe8d5b71463949087d41256eae0c7ac8e6177d244637ae2d0adb35a3abc71267b8d18cb93ec60660a34a5d5cda4832bd039911814e51da9bf1d9e383ce263a209390e14b4e59172ef28bdd5903671960f077520b85255a480e54658c79aadc37e4d6f97f6e4cb2f52001a1b84cf00c80f8aa829edd3bb6fa8c902972bce6eb0c9942e89dceecaad1dfa6ca04b23d433d2514953f936ce472537b7bede9964a1195e7f50c7d59615ae78fe9ee0061c44bda981d8d6f605a5b384c89e8d072df178a7864d6eb8144e109c99637efbcb581707cd678b7d238e7da41cacf7cf524e580a95818c5f3cd26412b17007ce47340d657d79fb863135ca6ce39253c3c6b92dc250b993d8dab1de6cad4e50bb10833ba611a9593b3e41278da5","title":"837. 新 21 点","link":"https://leetcode-cn.com/problems/new-21-game","question_id":867,"issue_number":47},"45":{"day":45,"pres":["Sliding Window","哈希表"],"tags":["滑动窗口"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。\n\n字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。\n\n说明:\n\n字母异位词指字母相同,但排列不同的字符串。\n不考虑答案输出的顺序。\n示例 1:\n\n输入:\ns: \"cbaebabacd\" p: \"abc\"\n\n输出:\n[0, 6]\n\n解释:\n起始索引等于 0 的子串是 \"cba\", 它是 \"abc\" 的字母异位词。\n起始索引等于 6 的子串是 \"bac\", 它是 \"abc\" 的字母异位词。\n 示例 2:\n\n输入:\ns: \"abab\" p: \"ab\"\n\n输出:\n[0, 1, 2]\n\n解释:\n起始索引等于 0 的子串是 \"ab\", 它是 \"ab\" 的字母异位词。\n起始索引等于 1 的子串是 \"ba\", 它是 \"ab\" 的字母异位词。\n起始索引等于 2 的子串是 \"ab\", 它是 \"ab\" 的字母异位词。\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f27971c3385f366503c4877594b1b57b4a2267bdcfe01350a815bef1340d776d0890878afcb3339f117a67f0772fd1954006d8fc0d1e0536c8da98c98497c38e078cb97af429d3bb46adef5acae815c2fdc4667bc952a64300b73e7d0c6bc79c445242807face33e6ff9867fb13ae711ca8c7feca89337ee72493219b1dd429675e07fcf18df6ccfc397accb4f323557428206bc3d32f5f602da6b91a724e4ee4f993101e703b9b58976c35ac0a770097179a72038366a2c65264e6577937817e90471b648ee64077e8941c521d82dce1c65cffe4309d9e6e0787e9f1ce93346635f1efa57302476fb2684c2943ddd603c69fe9c558cf2345d10de7575b54dfd8932df0279c45a7ffc63e8d8a41b6503ccd8f6191e4e21dc14e5944ea48209b95700cedb65599c36aa3917de123be780382fe4b2c3923b9c602fba08543e5acc5b656262b13d6d36eedd47d04f8724a6a952889dd17c933174c6a3f6e0a7ab900697ddd434a6d18d656f628a4832879ac3caae7f61c631816dc2f57fb0a0ab13f0dc1740d953d69c305d84e58667afcb4241e487de52ca48c335ac6ed84c13c608dcfc131eb64213f65bb7775a1aebb10b4d0ef06846f40acfa9d263f5b7766ca20c487445446f469c495480e2da075bd2f389e0d4943f4aa8d28004160a5cfe68272e6d168c1f649945d9a8c669a99774f3f48c735dd5df9609eeaf496441ec38ae59d6658b2082f8b9bb2bdfbf127e1d1b8ce9fdca559e6e4ccb4cde435582f670556e422cbe4027f0a09ab5937277d2fbb94cac8c8596c306f2dd2442b6e9d1cc11f45a85096fd3d2bb0801e0ec871e8c4c9c0ca14222fef1ec0b74c06a88bffa4a1e7bc84057c8011456317d0909897351977b1b119ca186cdc50ffc4de5203c05a04ef41f505a8a44ebaba956481181dbe7a6a6bffa099a90b1a523c97221bcc6afdabf9b670d924c8ac4087d50e902c2f308536f2ea273be760e6a080112d52b494591891f87630f2f87886b229d2671a021880f65752184a4c8144ef81a52ec61ae2523dceb203db61b20dc3fb7ba1a5519c250a86452cd946fdfa0002526ed042aaae680f1b26f9d640eef328969904149312f8591ec8108e55fd975371264a17198eb7f40f9c0617322d6127655a11be81e8787d0afff5ec98609c4f295152e49431ad1934a0017b83252e09614f2681fb1a9a35c05c096891505929f3356dfd941f97708d33eb2e20e57aa9b420fe371249ef5cb3f291357a47c7ea93fb1d532ea5eff575694fb18ee8ac3ed9bf7b07b95bca90b73f5ee15d084748c41d3ea2d744547bf609bdb4a057d31f0eb628d0e4187b7ab1a7c7c9b8cc8a87efed8fa6bee7d5827a339f8c5eddfae083de72e5207a1b19fef1786cfb440ed6670a75a9c38c2011ca6cc7e11106aa387c7f9bb06a25f642b16f86416ae875297f6f5db265bdc8048e39e7c269500cc6055f8a152d847ca894facc7e5a794aa182ee9fe4d25ad6608cefaaa0aacf4999425dda1542881fd605a59f8003f85a423a2ff220255be46224e5c3e9133fe0e4a248b0f37f4f5d67f3f404d24933c02acefb665d46833b485c2eafd2c544ecaaddeedd82615dbad635d3b8cbd0e29b08df1f7f8ecff6b37a18b01f4688015f560f170e3ed6d4100ecce934784a19fdb641a8d3671d1f377289a33daf0ac3371cfab775d5107b177fc21bab4892b83ac193fc12ce1533abaf5b9b39969bd1922d53957b72b2a9d4c2b98d5d66b01ccb2cc9667a688cd68813f7f231bc1bbc87cc6c5ea6894b6b6678b46d4823aba869af92a5f1904651163cf68c967d3b33772906f2562804a7338b9a6f24838fe32fbdc1a88cc5d9aa2c6021a4a58f629c6baa153535bffea1becde7a35bacf8df66d50eb476ed3fae3d78de828f9d988a6e4fc77db4bab379b7eebb4a91f251479016b4670ac16731ee611228bb6d54cf58439ac5fec3dd36bf098f5ddf3fc9dd3236dbb6a691e84d15a0895ff9108872c1307a826634ea6732ba5befffb317b2ccc7ea4f200b9d69a5fc7693ebc03e52eb74551320f440b6b43657f83fcb4fc861071ae43640dba0f5e0abc55a4720f0c685aaeb786b032bc9ed5e6e9b68e2f3f0fc18520232c73b5ac2a4a531ba1e3dbe9cff322d24872bcdc73bf8a370e32a54855da8895b6acfc00bda6e4e885f94c7dcc289234b4aa82cb7288a986a2a40a5506405b3f8d8e9896dbd0cd09a873cd964d1269147fddbf2848aab894d346fb1c25d0d6bdd4e0b74eade72f4d020adefbdfd648e4ee9a4204924ccfcf243a1c1795964c888e88cfac83c3fdb1119a0fa1e1fd99249800ffeada8ee919067eb0c03a8232d3119e96cd91da9aa8d47b43e9b6b9136e5a45cc893cb23392eeb63b27e741f46e232e82e72d4dec1249016a7dbb29e31ffbe574debae3e103074956eb90a379793a3fbfe28bf520bdead02a6e64b729174219ef29bc4687e2cc221fba3007805e4c6a81412c1ecbd33c038f43f06442ca1900c9809f4cf3d64c5c37d9e54686bcdf6df00a8e6748fdaaaf83aee0b2443eacdcd152c3990b4faf3b8300fd990367db3404154ed04ee0aeb334da1587f842c83e7017e611f608e5d6a6f29a0bc1e3960e069225afd7f38b385778a028ba3080f928db447e2fd649d6ebeb6d4bcb8e1e0933da986d1b63639f70e1f03614bf114e5d02f332c6a9492381e774172a9339ba9877eb300c778d2df5b2d23ba031ae586e2242a04fa7c7de1e5fe3510b9a5cb52fbd21bdc8fc1dfb0d3ac38637bee25a9beac4a4857d9dbcdc5e1dd994f86293cfbb63b4c382dbf515d611414114013004fb287bc5b772b59637929d574a777d9dc0e8beca8fe2603021627b33769fe39f34cd502e801843bb097e7cc9196efbb7670e84c98361dd21d72b892acab64b449619e55e5cfb067bb1096a9482a0a5890aa9c7626eff414c2501c6d3134401eabbccec1ebe9046f5b5f61c2e52afa1ad1e9725372678ceb1d177917264d5439434ae408ea57d1378c072a8adec5031a02511b7300bf4074e0b891a70672d943fec6c537bf6f79b72d43ce6a719254afef7a0665a44359290eaf86d80cea3aa94020d848e851de237dd22e65fc052f5741307813392202e13b76ca3e0d6c4433cb4bcf457d0cac766319999d66870d748729f4c01bb4d775450b6cf13e8d687fe547fc6c773a398f687eab1d0d5f9bcc2b229422cc2f40dac48f176808ede592ad89b246a77176d488b59f9f2e854269edc1b077a2fb5b52c5355d1c83d805df59116e8e5b1a81e18e8faa608b1ffb0773f6d85283261a156bf91a5744d0dc08375da3a49c544b45375d3462995cfb9d06d39b544e15ab5428c93ffeaac0077f2c49770dd99477ddb233e577184526cdec565d21716651930516bbecba82106aee9e4d68a67c8dd6fb7c40280b20ccc33faa9a2b27c50e47e68459c449d0fbbda00c46f2e199dd06ef2401c82342417c1992e849a431c1c84563d992d197dca9c40abcc8e1dbed96f1ffadb42cbd02529bbed6101609bed1ca7fc298d2a7235eca814472e65d51f225c70f3d983ef469b0633ba2aab2ebbed41a4eb22ce581e94b72c732d57e689c13fbd4391f11190f7d22225c8f6262290e371c057b496d15ce3e66f47fbdc8ae3bdf9edcf91f32f832f5c866aaf890aa9b34cfa7e526433e6f87cbfe1d269528e90972d4aef076e3c5d333d348f43b34980401d9a44a7125ba7c579b015001d498386eee2e693647877ee86268de7d060aec0142cacfecd0f6affb81ae40881cfe05523367dc72ea3283735a21330ad383f33f44caa4497a2137b30cc95d5ee02c3c17a1a00ae0fd9b91f8d7ded4e727f5054a5cb07f4ae48a761a96f58cea94b2e0fe44d2295349983c5db595ddf5f38ca5ff94755a5f3ab81d2e613e64c8fe7e1cabd71117bd77c32039cf1dd561efe319a0bc301ef6b55019a4f220ea6c829155ddd7635d22365db6c3921f894824120bd2e234e71cb82c378a62f5fcb78f7e60a77a77e83206d5c9d726b7902073f8569796ecec66ebd28cc5f83a02af81aee153f2678a1eb57c5efdffbda6cb3c3fd7a61ebe61897846142f007a718afb8185f791b8c8832978f46c42d1cb57c4092877848d6bc1ae6c658f4595ad6cb65415df96f9f7edfe811e2e77249e7174af08c618b36c2ee37d55a3bd455e2190a2dfcefe94dda26321070f2fbf33794398036945441160a7a89cc9bc1ebb7b9de108bf7c59dc7c4fae80d8a8339c30ae8e714f1c1b49e56309afc3edf7aa55c5c31d11ff602126e3abed37c621a43b8113f14bb9a0744a8a7b398dc5e209af2995ea216b1a600b52c4aa6689b8efdbe1f59986ee1068019858c77ee5d3b40bd76310b1a39f7d79967f164be512243f21473f66422911fab9c2e3960b2fabc62afd5372dee14f8882306bbca9d8808599f01473361903f4c59eab435163e7edcce832b9080912801c8ad22dc2266fef80e0eb5f9b4d0231f8555561a0eb99e8f9a743a338c8798558d141d415d2a4d2bbf2e7ba697f5cb34b6d3a03f43e2e538de985b40a15db09f1fab2972163b1e4ae8a8f265a4af0486e1fb836d80e6566d59ce9e2c93770da8240e5fd00804af69b056a8f8c97f26bcde354c1b35185f26f288dd65e23935ee9a465fe17a7d79fe8f93112266897a63ec6ff1a328981069d28ca001f112b77ebcea63278c3e898542792528aedbfdf3b8bd57cd12f874ffb7a83ed758c6120c8a632e0d02d24b76dfc5508fa7febcc5442d0f3c83bacf88e49849716271c3919e4230edf34fa41f20ca58f2985f7dbd89b3c8cdc9096af542d74e1cf6e3c12ae9361857bade7ae98ced7031599bdd71911b1e9f8d3d93a4ea23886e02eb5d6d8c686d42eb8be709f365888ea30115a291545047f48823b2e7937fab14e3be1465f886ef797ee9985645ae99d45d5a556320dcedbdf757453ca533980cf2261d7723f2a59297e457a0779949e01f3903b13cd0d26859d96cbdbe622c1d127573c62c6331f4bb977c1e781af28de128e184e8872b1f76dcccbbd1587a99e4b335a21d6b3fcab92dd8083a54af79945b0469aaad3b32d03045cc1a1e1d8831d80858f2e7a25fa9f30dcee660bb268324a4d72597d572d1e85e8c0189e58c4205ad83ccec57a82dad78efa9a015db1888e9545152dc4a7ba9a7226deca2365d55943528cc14da769b8146ad88b9308d857416d9147a8ae4cdf2a9ab77673e3baea8db5dcbd1064138c0b82cec9965e4f09a2b05c38df28eab8bef0d9cddafc9482464d6f3c558521c89800857e1082d71c5b02aa5999a4e6ece05c82929b656e538905ab6e35f70a52f8fdec24ddbef27bdd6138f5ebab0a8cd51c5993d459aad1231c16faa5923b20777f775addeb3549d71657b0402ce7b7b629a565961d941547ccf5c0063cac98569ba6b222a43f5c1060f470e6d99ee201e8041a7dfb651244a0753e7666edee3d94704f10f1ffb7d586f2a1630d38380ac26882b0606c395eb07347493cc2bc2bc13cc897520c0ac1f540abd1a646bf79814024680b3001db802d9aedc1f0b9164a0908a3b55f68a228109acb79f0b08a7e40816e3bc5eff6c19506d2c033dcdc223db5d5418457be7c9f519b818f2369184d464d168971aae9201ca7464e08bc5526373dc61eb6cab5cab1af3a8cfa1d8978e39a1c7335bd81bfd32d50196714ba11a8c5c144494a5a241200f783213ec6dd47a091aa430a5bdd520a7fe6bc34dfb09c1c1303bd38d654d008fdae1d229eb9a7cb04608edd8af5810017b691ba9a3ccd27125eaaf45fcd95f8d74cd6173c49ff864055732a1f95f0c8dc66f371ced36e923c71147083b2bb92281839205c7f3c4ddefe3a921173915e12c6261e6999445b355caa551c9eb0f4dd6645033f0e24502b1c47e38076aac1f7325b0882e82c810247002fdadca5b8c84ec84a8ba0c21ccc3e5507d5043b4c28fc01ca1597075dcb7b6add048cd2463d7657c1ce28d13e8d386ffd362dab2c820cdfa91094725d1625393c26574cf559a638e95ac26e2a7928da6b769f4a01974ffddaa4392b48d986dc8b8fa217d10995d4b70cd53dd7a16bf5e7f38468584e4c02c762d07518c076c48e54698a3dcf5c4c3f9dbed6ad1588c5f16bb8e73690211b9a17d2d039b9161f4f0a6cf09fc96540cdbf572da165cf013a3ae2df784908e3d9c23c747454b1501b3ffaf906e3e385c9cd789d930356842c9b019f3be22db076be906404ba3d506920504c21973276fcd6b26596036df9d6644bbc59caafe21db4830fad09407011c1827dbef1df88c587abc364abc7f03c126e6b16be0dda9733875dc7ebb9d015b7b3b1b543c35636fe1735204751829690a39fa63851b66170ef38905199e4d88a06d6ccd0b55843083f632470675051fa4565b1b87c8334981657a2e2f6739017da4b9f8aa3132a97d6af88fa1d67cf38c7e2c8a5ac3d6adfc3ca242354b76aeef281f965dc305e1cfcdae5bf0bb539bd688e4a1258bf50ccadf62871e952f16bf3517e84a7c76d2e456886ef4259c1efc7a01dfc97bcd754c1bcc55e9124b1b215c188d4fe82a190613ef9441232fab2be3c098ce8b461aa756b6011c588759c409ebe3537a547f2e690f400f24424638dc383e97e9e402cb23c3060fd8ac483c1e876442b4b92c6c3796654fd33f8cf298ccc9059d48a489a6edf7f90172cee629d21daaa7cef54a6df68fa4cd948a38bbcb1e9bb4fca6421c0f1e025119351ace23ce0c012a651d4b0515e5cc728eb63118d9cfa6c9d8b6988e925849fddc7b4fa3a9c118e3dba1221ce000ea2b36f7c44b099c2d6afa476a2d0f3b1ed4cd6d93439566fb6bc7ccfe1b855b7b6e7b7f648321bd3cbfabe12aa79897316355b3e4640333e101140b2a98c0f52e19602519567eefc2ecadd1f8aba9eb03a88f31109982d59aa9bae2f6dd9610e9e5235c3125dae2b33a71532cf8c86a1a0fd4e5a1edfdca597e8f524ef8ae75fbaa90dbb5a472617e49e5faaff72fa8778a3ad1536440507b9ee048f88a2aecf70ebcc132cee91021a9c1f05be688d2fb0cc36096cf6c1a4206ff5b4e0879aac1e46f646619f8134e4de1ff748a0df06bb65d323ae585474cab5da4eed8ed8d58ef3d34deeeca2a27390cfb5d41edef9696663a8d5d6565963ed879775713d54fdcc142623329504c2a197c76a266f2f30c69a659c394ec86e9064f68b7ee081d96599c48e99ebbd7208e0a67ca21e3c293418f72a52cb1140b690819058d3cd9c3b66bd1e46b5ce82d8aa1e0669c4c6accb8398a3d512e2d8a19baddfeba9e68a686f20542ae6458d8b4afad7ce0b002b52e2ef855541ea76a02f66882523fbe8cf68d2fbb24e871b9b64f1baff05866bcccbc23407e1f6b979403f30e566eb8d69d1be69be4cc7c5c6545fa0fa74222e0172f11b6b660d77451516aedab42f90a02dccd3ffae834241d08a110d6c425c2852db88e0b46cf279ed976dae2a0752f1115b9312c23cb05b5b4dd903bf7d99221963052d275863232129639edb69f4bf6e4b96d7328e1d9a8ac449a4c98b6c2d87698315c9b0c3cfae007abc3622db4fd23c190f90b13966f12df63633808613d3e2d7a3bcd0418cbf09a9fba3605d628b073ef2f3e53cba39bbc8133d85f872180bf5c4ef0b735288f10ae8c7b87b5d75e121546a4b6d8e001048314bcf17d9fe7c20380f9478e34300072245f25db74e696b4ee018595a51c84405273a3d488646bdc44cb743155f95fcba0a513f386c09eadbc6fdd1f469613da495d366b367e3210162a3216f805883f54f3e4b569df7a8e1711ccb38e9bf2861fce305e5d5a60f63dd9bc59b1205ebfcfaebb71a299a143f17f9e7b0b34a209671267bc948b0f8ec6d661b0de084cde6c877963dd52e1ee35495c23ab4533ce927f64339304ecbafdc55a05bb586d57a379f152d336fea525dedcee3034592d5e3a8300f3b85bea1ce69425930219fcf498147c5a829f8eba057e5914c8773e662fc84983fb794a298ac438017e94b28d444d2090c0ec238873c222f8da5a39269ad6446555fc7a28d3fae78addbac40123baba999f2cdfe7abba6ad97ebd5656ca3718df16733a37a4b16dcfa0737a34b91ff8f24cd1da2e90dd902995a0697517e580795473bc9f565a392799bcf379eb2dfa2e0984189433db04d949b57e9cbb9ea188f3c6242607136e66fa5d35ecc09f5531d851911673f04a3a5aff4b7a8e1d808924e221f45df2e004a8c057d082d9c96d85e675f95932407403723b47dbd439d3c33b1d1a12e83d4fa67814445ed7055cb42aabf33f6853f8827d212f39ddacc34da9333b63951e8f344030fc01a9f951d188acd85e7008f3e71e2e6da6154ba7c03d34ad2dc08d7067b503e406163d1acd88dc2a5bf15231a20d25f00432df958bc56967ea4ce06944aa161de78faf5a3288e824f38bef8acb32e2a20e1e3365e2084ee762363a7e398ef3d8787739dd1334f9693a6c3d6aaf92c71bf73cd68dc265eeb2704564c1c33a8c3204fcbad8aa2c06ff311004b28447241f9781b2f6d614f603f49f03734ce4fdd9a6698f57992ece4543d14e9ca433932f3362efda941d7c291b1904ea729117cb06ec67757515588f4d49bd0596e1b38d3dca7040e3e57ffda6a3c867f3f9560233fb3b29c9d9a9633abbe3aefe0213ad5679bdf3293e8720a972337b495b9e564f288c3c61add732d22215010e03511ceb72b53be034b5770af0e035e0515df5a68cd11498a984eca8c17ec955280d13f73a830bbb1e36ba24de07d28b1fe75ac0fa9e59e7b2e0f5f1392c1629e6098db54278c2df76960efc7de97e12e30c35ad19a75131b61105407ce554ae45afebfda2bacc67fd8a79f910658a05841e002d48ba5423beb6f8826d9ca49e62269d0810fcb8120e8172c0b5696bf2056bcbbe87a369a0d2b8d9099177b03272f145e05cda356e254808577281cc999c3d59442fea63fe8ae7aa3f8d9500c14ce8a40c4753b6f980c3e874b0443e74b94c13ec1024252708348a97a64edaded12c21ebf84ac6e83181e834e0556f7a7f3232e2c3dfc282ed249e8c54d62ee77be609f5c68d4d8c0d6f99db6e7db0570abe06131d94bb424679c30eb8ec59db0c130d43dff091a68cddf9197365007ac75b1661b362d05ae2b4d23ddfbfa11b8e778f5bfe5b3ecfcfc5eceb755150e2d00064c4b5f231b4baac201a15a882efb3e87f86481","title":"438. 找到字符串中所有字母异位词","link":"https://leetcode-cn.com/problems/find-all-anagrams-in-a-string/","question_id":438,"issue_number":48},"46":{"day":46,"pres":["Sliding Window","哈希表"],"tags":["滑动窗口"],"whys":null,"difficulty":"- 困难","description":"```\n给你一个字符串 S、一个字符串 T 。请你设计一种算法,可以在 O(n) 的时间复杂度内,从字符串 S 里面找出:包含 T 所有字符的最小子串。\n\n\n\n示例:\n\n输入:S = \"ADOBECODEBANC\", T = \"ABC\"\n输出:\"BANC\"\n\n\n提示:\n\n如果 S 中不存这样的子串,则返回空字符串 \"\"。\n如果 S 中存在这样的子串,我们保证它是唯一的答案。\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d84cd871bf055483c4f5f59422b54a2822750c8f505140a957eee1342d547cc891c64affd193ae60dab5f297adb147e626489d0817acbdb474d5918878a77ec7c9490e18962fc3cd60464434ee733618c49e7757ca9e4ef6d15e7914e668f53aee1bc8004459124d8e130aa5a298c8d47777be3a3fbdba756a341e63358c4d0cc2d1f623b31b3ec4101f8e7883bd2a4a581aea0f748205444f58e791f7d3fabc3e67b052dae1db564a0a563d8a992189e7e8d924e852e1ce6ee09eaf3fa74b45aa19ca9476682bd2142e4d9fe474e267cce1929b3686da6d16563351507c181b6416362e8a24b63b0684d0342c2df03de8c0775be4cc3cd1650f03f007b9a878c6ca022ff0faa9c8c04e9d55f3ee762cbeb089d81a3188c3f5c34976060e994249f2c7306a8a71aa3cf1ed166f25b54eddd0f6c0c46d8ec669b83f701dbdaaa88d0c9879f128e6b8faf789abd500963537482bc7bf662544c3b55698d9607a1ac2ee11829525160d03fb3cede2809e61906096d8d63a294ad4f40bc7127d85e0c94f9bd1ae1932c6ee6322d63c04c2c427370319c08d6c6081b8ef3d17bcba6f4dda865dc0168172bea5808c6850bff134def0e986f469535515389dd7951e720c9928b9bfc43f15453e3cf8f73be1ef4d8fa382be5206d4aa9b7f3ef150a7841d4187e8a86c53deb5ec5ce4ae40387e1cd870d8043b28471e6b2c9c81139bc2d7f9c7868b30c37437d25bce4d724edfeb8df92d79a420a4e9efec0877c535b3b0f018434a28d0f03721dda0c235c1c1fe9fad6b9b9722f7940795debe631917b724c079222edcc8a9f3cc2421b9ffc0301b0faae8bcbe9a833a3c45d5ce0a1bdf590b5e4b06e1ca7701670744f3f400984cc3ab2d58b6f1557c752dfcad6741d2dfd75a4779b49a5c3f8583e48e36394b378136403b58ad1e11958212bf4b89d0ef622232d54ff39d10d73be0d09ec02b68ef7fa219fa20850a367aa1238d18ef058f07c7dced7ffd283c624ce88439b40575529fd9e513964560ac56eacdea55ca11658500bf8b334dda53bb72c553af8ac30f022a86badb81ff8177cdbfcd7be09c77576afbec9f36578c4051dee2413090ea910e567cd40e85ac17749a1cfca11255fe89b9b89140a1f082069216d523fbf86f77a742af3f0fb5ce8164f286151c7a13dba1f37b42bbe31ed6c3c63849ce0b310fc4bf3f5cea464d4d7affb1365febd07975f9d33d21a21f669a78302f90f10a5a75ee38db251217f8c8d8c8a427343f9d59df5e888cc9089d53bacc86950ce618a0c0a5735af5fccd8348c3279dde2e091b0038f1037ae58e81f19872bc6df197f75b081f0c4b9db8dbfd7c7fb61fdc7b5d564ac480cf238aed2f59569a983f58f89493696ad7f828b13a7bfb3130dcee09265d0571e91ef77761e044c06ce1ef7426b8d15ad2eee3e7e6b00e0026a92fb07b11de6ea4b5000dc075f93152fb8b32438f9ef655a646ba3a2f390e9c29f4ea708510665ffee2de55e1757a7c7528f195eb3fefe0e8911495142df467a4a812c0a8f9bdd77bfacb5ad2df3c032db92eb218e5ff3246cd94c4f62a3074fe257682b66b185b354ab2c7e6a0d22aae7db9d1ba5c4dc42296fd518853efbf79ff76c79fa1a13d2180f0c1d524629b1bb2e88c1d41a755209f2a36fabf4461c240e75b3af1797c3b6257db0a3018922206c458aa10dc64c16f069e7b62a8468200b689d72fe3efaad885816ac2f3986c58cf8f0d6590ef73f9a4bd1e8fcb37d3b28a7326755d23ed0ddf80f27a3d90152ef9621c4fde26723bc4d10190e1ca0b39fd56c450f134d321f7e369612068345a41c5e3124f7e6d967194b7321b5ac834d162ee1fdb827e17fce701246176c29790e697d97284219ea04ef34d09154a75323f4edf5ad3453d50ab34de8ecb413ccd7f71483b4084220f921e8ce9c686a816ba1c5c87c17a37920c0fb642e6cc132df60dd1456afc84c6de7d9dabf5b98a7046816d642e75a945f4014f3948f3b20fd34eeb625975d77482f88a604b954a7c46d93d0fb3c52c09ae197bf33a43d4b9255f90eca67f2682f20e63a58d582cde19fd65d54271573004652bee7e1ca430a103d8706b9ec958d2cf2d7806ad6eb61abb908b42e0cbda9e8322c0a8c28f62bb07a89f60af4bb070bc3ac1937d5a05dc50832bd3bdbfcbfaeac571772fc688771c287294b45fe286c452f12d8ce84a9e51687ca83609366bbb5f932c9bfa5ace1de87246065c19a7e7413cc1b565aadbf5082b02de793aa50f3629a646f838dec61fcce67adcf565563fd8adf9ff4c5203ed92c1f89c91e2ad57dec13c761cbc2f0e1dd67468bff6329010d19de50db2e8aabbf6fb41c8669ba2ae7a04cca8cea223f18e879a19be8b3837d4d943d19abf94fb842ea2e0874940bd6bd7c67e8863b1102549863b00b01899294fcfe15b6581ac5ae1680e77450927c285b1753579fbeeaa8099839dbbd5ec4a7c50f6c87fafe60d451a70f6fa6eb314be45f4ac3ac685dbabd49cd26563eb9f48c5ea48f3a9bb5d8c34591354e19e3aea531a7d5cba385938e5f71e5f64858e1147c10a43a8472ef79148a301091a30b14f9fb919762b07066401da3a8123575ca6b275dff401fb3834d802fa5a93c099e80bd45c0c16b9c70b287c4be9ae9edb726a4aad2b41c0cf61c060a5d50139e4414721848159de14830d3c9a867b64818887a85ec7fe8d2e0712622a6efa1714d54717324ab145285bde45e5faf1a4aba2452c93b84c0c6b2e59a3a7b5728cd26bfa445445fdcdaead8e0d4844f86293cfbb63a573e2e8e71bfd543631115551b3ec2b2fb1f738b8df31370c715e168bea22ce6bf98815a0f404b0ddd4952a14bf0008939ac7e8568f9978791a23b79140102eb00c4234ebe2d3af7b8dac14ed6105ac432d2a902823fcb4c24ce4c5463251b110959e9babd3296645c66716860e3a28b94f0a0697b262053aabb2f8d68c7a22b753833b8a95f001f701c330f210c0bfe57956e916889656e99b7802b644a4f5215230386c3627d33280452c842fcdec570f92bfc7be249f773739b67adfc730757af4d7b0906898ad91ce13a914e2dd65be863e8e7906d2d50c40710794d13721f202708d52b7ad5200e785f31e65ecf5b630fbf7f691d99935196e2c2e14ec7a84684bb1e546ddd70f6c2652a864a8d12606c7dba182aa278576ff6b23944ef2a85706ba59cadaf878a74e5a0a48bbf5aa77243d7aa9b9c931987674d0160177a88fe5b52d136441883c223d04d1963aa751ab4e58e9eae639a20f73b7d196b02e83b5574749d4665064f1e88e08e6bc6a7292a445e253921c473acd030a3c04a0279a6286bf55ea3ad9d5559460c5b7582a2db300b9422ef5618109a46fa77ce1a771ad22472e0ebf0ed110cabb532ad64ed409fa2608b90fdab2012dd254cc6b429b7d1196cd207bd15276a37d28e734d735dfa30a9d727aa95eec9da5b64ad63f43a54828b3e062665521236c60c3b0f6960535f640355de8b4b19d9ec53c8c18b6c7ce03c48571427e6ad123586f51afc836ed1e8196bb1b03b8dbe521b71281692fcaa7801fc3fcfe2cd5e24c867fb3131d9886922567b160d073f6a6f378f32376b423810571708770f865761a027fa9de72596d889b71506fb68b2d32ceca2b2d9cf6686e9a226107f2ea491fc013cda7cb7433aced6bb22eb8cda539a56e17753911510f1b37c2a63a96c48cf140441d2877950c6342a3a0ae737ab3f74cd751e18dd2b68cacfa596bfe9fc81ff18c652b649777d6fc535ff6090033b171930feefda064899e7446b2c38e759c14452fc7e294a81a002f3a9ce99e1d2f486a274874c0d14e42d12b0cf3f7ebca7c9b98fd184aa449e6c5c53cc5a20a5da95a7a7cba3eec368130175e925381c254e9fb63750e1d8dede4bf805f569178514aa2e11906b6ebc8e757ae5d2a4d820ea6cc4de07dddf635d22365db68b8802d9157e1e20dbf107d246b82429ca3ff5cd9da57e60a77a77e8714ee7ccd723fad6317ac612d2d987a528b8b9c69336d3e06102197fd65ba1239773d4eead3b25340c86d25047812dba43525b146241633199be86d9f58be5c8952979e346079f8f57d909387b84df2e92b32a788743daad29e40e418797daecc7fe811e2e316bcc717cb4088356f72173b76e13e4f3103375d8aad6d5fed193e6682a0e4235c53d2916cc0b2a0d48527ea7b69586d353eb7b80e15bb13f4cb7042efa889de677952bd3c63803591b41a8221ea4f0b9affa058b9b501fbe3c7601eeb0c737c621a43b8113f102b6e67c0190492a80dcb204a265d7ed7216117e0752c8a300ccf6e6dbbadfb386ee106801ca1d942ae8deaf21d76310fdbbfb5764962d5f45eb462c6064582e200b341aeaa1f3c9960b2fabc62afd01378def0eccc6387be7f7a1ecc0dfa41b61f3c9e677162e45dbf1a56a680870927f858cd730ad4f7dec40f286636d2078d53188fffb7cbda3508aeb99e8aeef0aef7dc871c016c86be21581aa9efebca0ee217755ba087e5151f47d2e4e8dba8bf84d911eee6d6c6715dd937e541b4f28bc9cf7758cf6bf7cae5282baf01b6a3c7471e4f83e40c70c1279eb0faf934663868c8f90009fe30084fe0185ef6f7b83951662c13ff4e262aa00b4cf96eed37c537666d0e36acef555328cc25ffd568f4d4f112677ec8fa14f78ddf598442ef1148ae5e99e778bc97cc126ad1dbe29d7e67e974b20c8a632e0d02d24f425870100f67ba88959488adeb530a7e3a449849716271c3919b7774fc021a144b973f1876a89f78d99d73a98333f0567cab4b35b6ba8978d6651f069c6282336380a4f89d0002b11eec0310b631f6886880299ace02eb5d685ecacd47afdf3209f2b5889ad34114f707f0a263a06c63268791dfab14e3bb3030b9e74c2c3e7919b644af49a6d9c8c1e7853b6d5b2140c2cbc3255bcec22769438467e06647d4b24523c86cd2ebac0611b8f415fe9d8d09fd7e6708482551e7b78d7604046a565f0cddc85689e52a43268b646ba9f39a28ea73fade9de0b70057efc371a7c072e21355aae645eb93a980b34745bbde9d8d219080d663fd43b701ecc9b41bd9f7d95a01142fc653b1d4d73487c4a634498bbdc11e70c9669149f3c9acc7ad9f0fddcbfc90f1cf5cc869054172bdffcbdf93c72c0ca2a1dba1a0c00c89b1ae62ae64a6391e4c013f20a6b2dd107d4c16cfb15c8c87079f2bec0f4a7d9be1c6607ae5adb9996d557276cc4e508719066eae394e6c3dd9efc99cc6c046f2145c864c2d04f836c0a85d947534df81794cea3a48d0ec3dfc86d3d07db17cf2935a40652aba9be6d93f9f27f86242090b9ef71d8ae5524ee8917f2af6c4e0ab3ebc6252078100e56dda3741a9f1e45ef0278f7f2ff6fb924d845f57a1583fdd21030bc9104fff2b270ed78144460a026f5a090ae44a6434e35f3255c0ca0667f6f6df7a974cc636c19f1adf281d3a0ef300b2f225faf42d0f53477135eb07301066ecaf52cdb6881c50a587394b14cf3cdbb16d85bb0710e5d3b2322c0806491e6c8ab9341024044e6bd0d21e5604486d036f0b1ab6b33c11a11c8eff180927bd9cb73dcdc223db5d5418457be7c9f519a8e886b5b05724a68169971fed37528ed03015fbc4e0c373dc61eb6979fcab1af3a8ca94fcc72eac010492fbbc5e7965013532f76c054fa8ac8441b0f092a4255ed8d5628d5db4fe7d3e723693f99175202f8bc24dff0d54e4818b62f994f946eb4b0572b838afc82183ac285c5eec5675eabdbb3870f83595a56a3ef5f849ef3de17fc176763ff864055732a1f95f0809d35bb0a9da864a06932407cc9aeec9f250313205c7f3c4ddefe3acf3b59911653956e653ae20d5b385cf5545088b6fac7654d5d0b406d1f7b77409e8b7db1ebf7325b0882e87bc94b0b4527d0d5f8bedd1d9d5796e9cc07c4375875995f5e4528ae44991bc7520e830428c76dc7da0f3d7b5791c0649470ca6c27f53f64e6249b578dc458c07f1153636d376a747aa71cf251a71e873671167c8f39389f1844c454d7daa4392b15f380eda1cfe257fb23e58de3449a73d769ec76216031adaf9cdcf63ae33497de4ec3514fbee7629406c4a0bd79731924a367755da4244bf002a0dd26be164da67ea2974f5829f18e9da0f27525fed13bbb309dc89e6822b1dabf774d29edd895a633b2b6e16351c37b4f4d4845bf2737cae31be9018701b140e815e07a08e9047f8ef8acb8fc84a056bb98589abc669b6ae5051cf9c6169e155261c45e8133e1472f70d7790dba34461a2746420d66a1267064e2d1e883de3dd80614f952f23c3f3f28ca72211359c35493ab4d1763610b04c796543b05a661177885b465e773c5752e5054cc45220538a49f7568722ffab8b3cb2187ef7469ed77c919e0a71a7370bb119f1fc5064304bcee0f4caf983581902db75324700b6a95db1b5846e28aca72c27e361b5fe20bc5d4d07b126237cf289475e72389b2fa957abcf4a2603efa6bf108bc153b9e8ded2d6e0538dfc50115ccf9d2f465b8c0c3831d8ef2df749124b1b2518493feb8cbefd40070b8034073b7e1e4260b88fab36ae2456b3345978475cc5ac3c74b65ac47fff8909849f3550b7f91d9fea111ca5b06b23c3060a0f4d8caaced62041c61a1d0db7d6c59a919f8c53f9885f54cda9e5d914ccc3afb447fee11d26d8ffe74ee49bce8688131f30ce6cdbcfca0f538c565378fefe83f1adf45e1ac28bfc80db74dd0e30c4d46be7cb96a118082fa3fc9d973a2a06384d6ddd9a9fa3ad55fc522e6465f8b5202a2dd637c07e499dfd6bfa876c1cbe7adfe4cd0aa6e4e1f23fef238d9a6bc05dd84cff9a9106002adc2d0be12aa7989731635103e5b402314595740e6e8de4817e7a80526dc26adaf6292935e94f5efcd3897c41119820759aa9bae69228b615c9e1b7bc3401ce06c76af7b7f90ea86f5e1af091f4aa48fdedee8bb6bf681fd12b8db23bd223a5b17ef835fbbd572fa8778f7ec477101517ceadc0bf2a6d9f1af70b3a81378eed04c5e9c5c4aeb26d923a4b731336cccf9f046218ebec981c9ca513b9b46619f8134e4de1ff748a0df06bb65d323ae571133d7e18a36aacb8caedd889a3093c6a2a224d886f9911e95f9747b2aa290d41b543fb0dcef3234695dfdd109263328bf04c2a197c723606f7d30cb9a299c324e9820df6ae59e7abfe59d6dd0c48399a7f83c00b0af7ca91e2d201e18f76b1c98115db691bf8817d3888d0702ee3406f58ea8f26e8386ad5d7969640c0e7d04d76f7e2b585412162a2e1a85a7a8f1fd42f51b56be376544cc91b09a7d544dd4ed2cc50debfb34a5cc0c6e22b0472477f150e521e45d6363ae6ad0580277abc87d5a7de4e6f9886aa36d66e96f51d66fb1021c2e9381177e95e5e9d3a663e994e5f7bcdff5eb141c06fd110ca73a2b684c67f69c46539596a8dee6edcc734f6e14a95fcc2e37cf8400cfcd4893fc32c96a9c5cf4eb8947b87be539e681e9055d7e0c2b206f317e5963eb3203e28c2c7338848a4f7f59984f0e5bb9b62aaa05c65690c306cb26fd50cbc05e850dd3f2e5175cda6c9d55996a66037fc643310a256c67ad311dcc77382afc9819ad4119a6879a5fe0783812b353d635f0a80b86c42b93e19b6e2b83344f33e7ec1ea2aa80bc0e5ada8dc794abf0339d1636024f67075adb798ab793e7c15fdd45beacb2806ed6e31770c0641609f5a1e443e32b00d43a43660c142866046c71beb3fb60120e606211e485cc6a2b79a22bed61d1d748","title":"76. 最小覆盖子串","link":"https://leetcode-cn.com/problems/minimum-window-substring","question_id":76,"issue_number":49},"47":{"day":47,"pres":["二分法","滑动窗口"],"tags":["滑动窗口"],"whys":null,"difficulty":"- 中等","description":"本题和 [1423. 可获得的最大点数](https://leetcode-cn.com/problems/maximum-points-you-can-obtain-from-cards/) 类似。 **因此大家也可以用 1423. 可获得的最大点数。(因为 binarysearch 现在 down 掉了,可能打不了卡)**\n\nYou are given a list of positive integers nums and an integer target. Consider an operation where we remove a number v from either the front or the back of nums and decrement target by v.\n\nReturn the minimum number of operations required to decrement target to zero. If it's not possible, return -1.\n\nConstraints\n\nn ≤ 100,000 where n is the length of nums Example 1 Input nums = [3, 1, 1, 2, 5, 1, 1] target = 7 Output 3 Explanation We can remove 1, 1 and 5 from the back to decrement target to zero.\n\nExample 2 Input nums = [2, 4] target = 7 Output -1 Explanation There's no way to decrement target = 7 to zero.","content":"096221cf5b628be1e73e8bcfe626c7f3f93f5dd1497fc067cf81bfe088cc83fed16c6dadad1d3acdf7cc4cbe6afdac5fbe291b87a12b05d6b838ba3abfaac724e231e5b972beabfb1d37d2b6d3d2127d3eea7c948db2099f26ba2d80e4aca1c24930c00b6db0963d661f1272a8d4daf071d009062b4fe1c16aeebd8560a40eaf3b77c7aeaf8cc4b39536e047c90eea37bade9b62db9ac6a44748aebe6b22f03e5f7a132669d6ed2f5155c11719d1d80e16d787f70c543d1ff21ba63169ab43343cd3489d075aa10ef1dc230ad4202a1bfc11b1357a68ceb35e2892a6690f17ce83e1b608cba36bbbfd1126f381c40901dc9fa271466ea7e7c7b54be0b2c8892e3ec502536050ae5ecca59d8e04a892b61f4765e56de537d252124ed67e409471c1ac280b82086e25d447b39f8e16bea96001f5de0a3796072fc022581fe34bff657be3f333603445d9c16b999ac7ed626c6614ba8c8fd75b8bc4601ef05c49e982c0db74b2af78ee77b7d1ac93ede9ea24c6f3324df782f75a64f13ca5c9318fbd2295494f4dd8d85f52cb4724ea5c8f34312edd97a56db89b45c238e689fad3362c41755f3f8e36d6d5081bb8d1d07dcfa5ccfaaa57ea025037927a829f327772cf366864cf47ff9b71be88e4e0b9bf8c1ba863471648047cb40400eee3aa449536c2fa930d06cd005a1ba8eec8ba05493b6ebb343ef40f12c023bf0d4e9b5342a4d2e7b700a3695fd34592e9d1917e07060d5f9c454ab33f0f868aa2bdf2cc24ececb8fda5db9e7e0b7a81396b37abcde5ff523cc460a0df62240d45d46d5e5e7b53f7b89cace7381c2d1b4bff26785af462d84d19aae41139c4ad6e5f89d31b23f88c0cb5c884b793a0a42031aed76dd7d7c4c6e0ded33418d31b0234134d442135e19119d58995257d62870aee601be493933f9462b761cf05269b4e3b46c90897fc318599ae3d515f76e98ea0f01bc4f203bf1f3b2157f325c50d4aa20e1ea314d2c7f77edc372edea82ea1676a1286cca2d91595bb593b9ab61800fb4e54ef1281d2d3fb00038cc1eba1cb0089625e58a866ef8d95eb113bd22624a356e99fe67254d16ba046ac50649609befd0813586ac003bda22f0f0d6eb69a55acff78bce784cf20951e804fe224d859b3d463080cc3dede47541b56e48bcfe0a6b28cf68fc13c5809bfb2fa3b394cb25aeecdc7a0c52724a17dcef255c735c82b3905630d730937fc0e8d001a0b668356096860c686764aa803ba71a33edea13cd735748d79d2f33162846179429ee99217684a1ada8ac8612f1e273041765d0a69fa3d7cb09531ac1190e5324cf116460bc846beaa5f0c110474b447aeba4dc71495cd52ba0d0894a98c2610404f37a3e0a34dd69f71366d010cd164c5d326b23230305284606e180d03b2b67769ee4e0c9971103bfecf9d225eb8e5140298e43033566dc5ec3f60fa0cf65fff6bbf6f8df3d4c55694ad3953c11b9e2043e795817fc2c35ed1e36b2effd16976c79fe3fa0a4f280909095ac721abb5f6ec2e0fab0bb39d9417748f1d9583513b17cb02d39bd2ea7f8ee1d749ebe50c005cb1537a3e788d6310fddb9de32c0ac30baff71ec18db823d7b969aac5b8ab650746a863fe90acc6c53f127172bc7058059db0960fdd0db85d25636b99de71e7ce47a386cbd9cd8d930109b270452ee4f899b22722d46d20878ec2cbe213002cbd6f5cddf47e748445c1a69fc73953ec5b95bd65c1183db15fece5abf955d97fd31f3973a59b6ce9fd4b2d1a273844f0b33fa608d8244c606d9eb3ac3adef1f71573d2b785366fe4fe4105c3f49347366f26768c247d03404abd3f546b1a1a277d2213753b1dff782304a71aa299aa84faddd8653f4d701fb54113ead1b16bff8319ee68e095a434a2ffa098fdeabe79aed2ea64e90cb770e93d8c147af693849cb48b4d6fc77da4b9b445b6cd974089d750658a15a7610bf6483dd270ff85e619688e3650ccbcd5a3810eff56af1d8429a49d3163bdbecdd5c12b4b91e115fd79e66b9f515306f3b8af390aec3dd395cb23ebb1d65dd8a757ee74e4b67bf1a2d86b0bc4070d0c44bf75eb0ec6d327cf4a83990e399c0b6079a2fbd7a9c1ef1d0c06ba9f86c2be591f692eb1957509ce528bb0fab84940426ff15306d0f702c833cadb3f577e33360f801cf22888676503da711c9a0ae2ac1934e8ac59f20b17a43ae6c4b0ac81561640ff57ae73d798ecb0b6759ebd83b3a5f2b0c8fb67fc4002da43f015a239ff22c3b1a9a0e1e391294c7dc7847c773edc175040a0b46c818c2121212f96308915b38544d2f909b9dd3cd0c93406589ffdfeecabd3a6a914f3de5d5fdbbd5303ad418d245a6da49cf22efa6a729279583a6c88438e74a2ca1cc8b2319366a915e58d61c69ee12c3717e879ad7573364ae014e81d57dbf2fe28b826a8d6869e38efbe5c51e5a815110e479e6697e6a12057fdecb169b63251d8f45297a0096ff90b14ff93a58d157452aa2f97fb0f0151e1bdc7195682d6c56cca64a1274d2e27d2c730f34bc99b686fb7b37ddc26433dbbf68a5daba13da480d4c0469f266a15f79eab2cb7d6f2a384bd965d64c2f46c6feb246616823a8769c478148a3d1aa167def8651b445011821105606ce4bd525d6c912e0435814a64e8982dee3ccccd2e74c183f10ffa9005ae26c1b9afdba06f0ffe31d9f5d8de63079c73207d3b5166f648732c1f2e6b9ea03b3e7b4171ab3d87b98f68a8e36ac2d2c1612f06800215f984ce1a2821f57c52f4edd83d1293b7ca62d4d305d488fcc85f74d272753668d766e68ef2a7f573d8ded1eed28d4d812e30ef93ffb2b92ca47ab2db4c60010a58063bc2bccc1c429b81d81ab71cb1ee54bbac3cc1b9bf9d5e2364a4b0754a4cb749e32f883e897fb153fb9d92919b0779033e02cb09c6087ebb351732e3e6b022fd77cd2de05a1610c17e5aa5ec0b07680da2ecd4414588f1a355dc5e313b6ea2af277010580f7dc2e2afd5b83a60cd0f9b4726f9f2beec5a6185e5959dd3b9dedec4c92bdd7eb304ab02e3ab527f49d9e09490c1e18c7ad2912b33797bcde05c43f0ea0da22aaa3289600bc20d2d911bf4ef1b6578f114648d857a6d48d819b35c9abc7d1b875fa56842aa7362bb4e1d36061913751faa8b2fd3e39c1d64046f61957ea6396a7dda651881621ab54b355e8b37ff04c44e508cf4084dd93f885a7ccf55ff777d3917a86e4e98f29ef799ef2b2cbd02cf177fd0f0a5fad9ad2a82a3d7f69128cd7005a0a1fac99559fa471a5c62772892913f7d8d5a4a4fd3e54ab54f570b970750bb9ecfa71dde48ff449bcd234fc4810d191853e61b6a421414c91901eb3567bcd1f89794c5a214862817df2353be89df75a2a058ca69491b829fccdff5f75b7bb94e729828ef561b3e9840d3997f70eccd54f694630b7fee1a37a186390fba00c9d1920a485d4521a9913dc72c8ae2ab3d238f8e3c8d5eb77e146698c33489a59773c741b3492159657d0ea8eb57ab32c5f94d64d024367f5d5d2cdcc3fc894303232f4e4464d7c3601ed6ad12e8da8a7b6aca7f46431130fad54f798ae719fced21d3f81a2296bf72efd3134b6d725bdde7d31d4daa7ac7f8c646628a32d73d2c8d9d352956615843653763741da532376b0b385f4b58543e20d21666e43ab4c2a8258b99c7f01e07ac73e0df73b2f9d6d9df4c86e9a22610326ff4cbed062f977cb91d72dcd1977e82ccd3529a4fe1751a93046e9ee1186f25e83904da52034f8ccf7447e968437a03e037aa1c74c0750f11c6014283cfb896a2a7b581a377a252ab491e333b8072fc7dcc6e106f2f089fd1ee2d03dca2497a2178864dc84e74fc2c6c19ede544a7a9d399f18af4dffa27947e00219a2d0fb0df245496a7c9b98f989db60d9e6c1a4ecc5b3db59c95b4a0c8ebeec36b13452f91487d483f64c8fe7e1ca4d8d68c02bf4da1690b8547f06259c32c5b8fcf0159e5898ef220ea6cc4de07dddf2015636414f5c8951fc86c705d689aa366864eea6d6e8222bad6e38f637da72e36ba360bfa90d76af9c461698510d5c3cead28b8de83867bdea009021929fc79eb239a739deea63b343d05ac9b1e13817bfb0f5214517b556171def6c3d1ff85ec89d07a68e57107d3ca19d168317b8fdf3f92bf202bca15daaf7ad25301d7b4da8fb78e817d61752ed65b56f448c315a73c18aa630fefab4455239da28090bd85dcb47463405b6a93333716d55065450d1c7ce6aeddcfbe16bf7280ba71b13f119d2121fa4d324ab1398c4d3cd9651c1b49e52a04b3b8d7b2fa058b9b5045b0341571abb8ce2cec21a43b815abf56ffee395eb6413f8fcde609bf29d3e86543572b5a1380e644c7eda288efb7dcc1a75e6008c61dda7fa58da164992718b8f2b5477096721656e2406b28300f41665f3411a3f6e8ebd84e78df8778ba44638df213ccd6317be7f7a6d5d7d7f07567d985a331427c218ff1e63f3a7b25df7f988cc72b874f7dbe05e8ba7e2a256d8d40cde3b226f5e7508aeb99e8aea644bb7d84348642955cc8059aaa9ef1b3a0a2643101a04bf08bb23194a694075e40148615db09f1fab2972e6b7b4f7855287a0746b0267e78f61997647f35bcb4b5bae66002dc46cf02147eaa4af69b052cc0ded4b263d1b700cdfe1c85ff747bca950a62af24bde53da15fdf8396f3d36a38266897a63ec6b65c71d4903db3318f4652116822a1dcda0605c6df98442eb8528aedbf8873c29939d127c448ec5a82ab7e89562086e36594917f63b17187074bb766ebdf4945ddb1f364aee3ab46845299bcda908773efef49f87b8c5fb662358d4045771c03a9cd5c68712698f3f60fac12334bfdbd1fe94eefa981fda5cc4c7c9ae2a636af775f681473ac8802c286e02eb5d6d8c686d47afdf320d66d58d3a7260b682e39111127068877622776a8f60b6fe84650c426495e18127cfa92410ac3687c9d898623617bb0c6ff0ecba387cc751dd568033b48a394e1b19ccf1033f4340491d67287c929075f7c4f2099551892c8fa87156c4b800ff82d51116a8d48db3b87ce5cb090fc76e6cbbd1587a99e4b33552ed674567015254d035be22c0abd348e03221f5384eeda975a5b276b3f987e651e9ed90feb962bf6c4660bb221744a45201c2e032d40cdbaa344f958c93d5a9669839601ce9f9188c2d20f13facc406fa592d139683a01b78c560df4f83af6c0943033cd64ba2ec4ed4d7464d5479a412dd10782842faf5a9ad43937eae586f3fe97e6793443a648ce8f9ac5031646eee5082cba66eae394f2c9dbc3e79998210c3750109d6496d14fc76246cc8e135b5ee379ddc8a8e0e656af9a8676175af10ca5691f8e0c586e2d13ab2e5b37b152a4cb792d15ba86df3673571998e9cb6c8a92292d73b5e7be9eede34266ee9c5cbee78c6621f7780dbf249351906afdd33e5f178ab6730df7b5c9ba6cad3b761d607abf7443273a8122ee888851a988de6fb98a2b09896cc367beef9a36175644430f2bffe6b9f7852ded0d74fbe9429b15e0c795e60c5dd4e834c9c31b5c49c0fa06e788e342f27a804b6e7f0d364b8fcd6bc4e98eee9e5a1f4a41e5f00d67abe78c364ba71a3e71b9fe5882ff5455360c1ebf416bee414aeb8a2113f5129216ec59f9620766cfd7e1bec990b741c42bf60d4b6ed0d0e624ffe3a7ac00a63951234677199d4b40b94c942d5bf7baa353246740b4dcc2929f60f63f0e4f819599cca5db93294f98c02e5a911d461ff3e6e2689d96d32030b617697d8980f335c467da65ac3576b3a1475b2637fdae3b6f4c0b17d5a071565542b616c99ece032bc724584c5bd040bcf9f24141cde1b08abd534b1458b101cd131fe17c89b991c00a22495a8a8cd7bbd9b7b2d21749b454b9c256acf79502207fb66e147c19fa92d26336340aead6b987949a9fb0e708cadf2de2f1f83d1c41d6a079c30c044f629cdbf7bc9a0497538ea8da419b625138d502370a6ceb445abb6552c9388aed35ea024d9dfae0f891d474ff70993866a73fe815aa50a566469413b7d380e1a083bed2e931c223fd4cc904fdf0fad43efe823bdde148904b6d6196bcd65371020b7424fe78e64f0d26ee1ab077c229eea7a4ac2d386c2b5bec0cb641699550b6ce6616f329bc036d74f6ad9af03cd9b6fd060e","title":"Number of Operations to Decrement Target to Zero","link":"https://binarysearch.com/problems/Number-of-Operations-to-Decrement-Target-to-Zero","question_id":198,"issue_number":50},"48":{"day":48,"pres":[],"tags":["回溯"],"whys":null,"difficulty":"- 简单","description":"```\n二进制手表顶部有 4 个 LED 代表 小时(0-11),底部的 6 个 LED 代表 分钟(0-59)。\n\n每个 LED 代表一个 0 或 1,最低位在右侧。\n```\n\n![](https://p.ipic.vip/3jkqhl.jpg)\n\n```\n例如,上面的二进制手表读取 “3:25”。\n\n给定一个非负整数 n 代表当前 LED 亮着的数量,返回所有可能的时间。\n\n\n\n示例:\n\n输入: n = 1\n返回: [\"1:00\", \"2:00\", \"4:00\", \"8:00\", \"0:01\", \"0:02\", \"0:04\", \"0:08\", \"0:16\", \"0:32\"]\n\n\n提示:\n\n输出的顺序没有要求。\n小时不会以零开头,比如 “01:00” 是不允许的,应为 “1:00”。\n分钟必须由两位数组成,可能会以零开头,比如 “10:2” 是无效的,应为 “10:02”。\n超过表示范围(小时 0-11,分钟 0-59)的数据将会被舍弃,也就是说不会出现 \"13:00\", \"0:61\" 等时间。\n\n来源:力扣(LeetCode)\n链接:https://leetcode-cn.com/problems/binary-watch\n著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。\n\n```","content":"096221cf5b628be1e73e8bcfe626c7347187228a04f91f99075142254f0a00053bf0a56aea6410d1ec9878a833a0e65ebe221bc49a2e129cbe22b42dbfe7b231e23168699ed9d2bc0b2acca49b84106836f07e8edbcb66dd77f9a02b222a4c64ded2298e9564f144787f47f95a2d4f69bc518bcebcb01749bc1f3570bd6dc27af98f38ed3872373041eded3e965ccf149ddcab4ba52f1f5e6a04f7bdad90999bbed5c08f6afee62d447e2e91921a706046f2e293041d7b3fad5a936e378f077705bd1a985501b9426a3d8dde47230a11f627a6374a54c38052299a87adf5d179d4f7dd5dcad53e87806c3894eefae85547535daeecc92f392c26860f332031aaca6f84a793996483467b710ece505e5bfc1fe92cbf6db414dbc8884489e20a8a0f64d0d409b6a74daa05f9d145d04b21a0929cb5557300b3bb14b6d7f066e539d5039fcd4b3212cc3566cb9b83e002e5da4f3e7f0f28d954ad29f19d36357d90d8fa79997858fd6b300757670f56e5f82cc5c01faf5c073e1f6ab558a0a6a70cbe359544557f1f0fb4f0642c77f6042496f757c1f1e162ebe6756a53fa8cf90fa4854b467c32ba14dae8371bb8d116d76fa4d0f76d9916a0e56374f1024aee27e47d9fae9a35cd37702ef7d8f06c6b180cf447463d8288e9f469c3538dcb8f1c18e0147f1fd58d1ceecad02fb797efcea2cc20a7b4e00c88e72eea64f1c54bf3c45908664b9c6ef71f817ef45f0d129e8f2c062e24f68221e6db10142a772c54a9251a3e5c7c5655f4df844268326fb794bbb89eb961e84e088d7e2429ab4f3a2d473ab7a7f1c7c37c6e077c2fc7452c6d8a1cf01f47994f9bf10224b39d1f39ec717964b0617c0667ed8819a7de5bb347d6e2d4c7f4c2d83014d22c07350d6e4a1c39e3bc20d7a6a3e09ee38c0dc4a290467c77c304cb5b33e66005d2dce4860ef43777c2720b1be2def8896941456ccd2672b84897c6c4d60ade53a28b3fe0d064ef384540a95b80f3535cc9cc08123815096a5ace6a7ac5e2ffd283d70ccea36a49cf9c9cb64540e75d3d5a40bb60301b71ef77a2d885bb58769f627bb307ebddb33d028e29b012a01634c15eaea8434b102d8219f9fb68034b3ee9ce11beb226bcb1dc9030c35dcf04e07b8449e583225b0e928a8b51125215b4de98b6fae4f188e4b9bdb2ed787439f4f3f8b25a5416203030f3e34f914273824be12ea0fec9a5ff8f8cf3189a1ced9fab8bf9d6cb86f2385ffc810595639a32ec092dc341a4a72df81324acbb65e2b8a25b3b7145edaff2cacf9d716599d5c24fb08cc3ad2bc4be4634b76ddd570fd9d03ef3c1dd398e26621a9ae4ea2bae5aaf76c750b47a212b2bf7ef145567b0a5cfc8b6fa8e93dc0317e5fee0bcda64a34a0dd0319aceff877ba595df80a06337a5947e9d891f8c86b037220ba6af2f38f5945b15f5a4f404491cd625ea58b1d00cd6a2a94e6f1e72c75e1880987bad5dbcfa2e0f24b75a48231317966da88e2d64183f4939c5b85691caf8924b86066c2e67ebdb22f359176183cc56b51352b0fdf2184f8cc086fba11e4d03e10c62fabf49a1183d68fa119e9f027f1917ff876ed12567fc405250ae1877ef56682976948f9f50a73360690c11abe5f0901981c4dc7d2446f018b822f3c5a33ecfcf2ca89304a197cba0cf9b850476b2e389d5650a5b7b8db600cdedf8f0542333d5978d7296be481284fc6c92477579ab085efd6a9ffe730ecadb9bc11e226d039f16a72c143f62b88d38b2f253290d343e5fb4eb32f24682280377279caeed52b8b7b946b939530ceab37a4c938c1811f147f3de5528bd5d1318251c95a790e97a473f3b4f060376318611098e4b8c21590926fbf2d2640f517e118ca3a4741a3dfcf18210e16cf47a0044fbf0f0ffe08bfa7ccaa7d20e841ecf15e15df00307a5b7ccc9a9d21d409423bdf7c76ddf939415d0ff303baa7222c18e1987d363f63b02b8797ccd6d6b9bc4cbcfca3051bb2992841fbb9e2972bb8edbd4d706a72041aba86d9f2a9e17978a7d607aafec66fd407e46ea3c210ae45c6f81288c3a3dd24c7374e3db51a5deb1a43ea8254dddd630874d9b15ec94fb60f585566d43714c09dc83d4711d7a6039a8ede4da5e1c96e10f83637c781283fac66fe67307e7f528b67f9855c29cb753208145b7bf488f3d2d3960b991ea74f1c047295565c399423fd157f157520407934972872d95386528287b43ff2a77433110355f076cb028d2ba923dcc73d331b645edc2f3b4a6a696543c7481cf733c67cf670e6cc732f080b928e6b09c943cab19b49b47d1fe0a81fd3fe8eef3d3a91780ce84338f0e4b841159f8cd5e75c3f129b65ca4a6cba58ee62cde4e72846e581f7a8d56bc769cf8d25afc55a90eff0faacf64a9e6f34d71378013a439203d10b913b5a99ed2f5e62a8917aacc9e9d20fab77d78e880101030749465bd09239890a0c6fc07b4520bdaac0a97e774505782fb165a1f039d3976c5509e9baf7b25dec49b2a1cfad2bf32dc31d62f067b3ba3b0235fcf59c20e68cbfa7a9e647a69c4fadc31a4e849aed880f33aef04256afbc7d611c3a3f0eef19b21d69e0c30fdd76f88167c8250e1519b3d01fe7123fb19e290051e1e2d01c36f05081acce32e5425d417795fbb0130c3de6cc070a9cebe9a9c9bbf47e0d66aaa41bfb5e4bc86dfe0a63fa68ad0bc3a121b9cd08cbda18214ebd02c0b346a91b93b307c425ea5df465712f4452a83361709b6baed4687ed343f1ae1a0ec29e8d5092378b3d4201a0efc68d20dd18debfcb2df9a384f492aef0fb5a8744850d5d8e6c0e1d3868842cbb45438ff9a93eb1ede770d92f4b9c79cd0c805593a8a9c620a2ff9c833e464ac5a36b50a25493b90838f82bd01ddb3728576a34f842dba1efe3e2d621a5898fefff5c21fde518f997195be32277306e770d59e02a741440bc12cd55a3f9a80dcc9256801c9ea445654d210f2df65426563f7ba82a1fca17144263f72a6801f8c64ee65bfbdf1a3593b98b7d7dfdef5934a5028a02e842ff96cca0d6ad5d2afb689004909701e8a4258e1babe890d75e6ae600e8565f9369769e8d46b80b64f9a68079f8e97718c8fc48f3b3a109118a850c8ee7dcf24d67acde46de8dd358fceffc5a89d95b8fa822ec1fb11cd8dbc85a21d8c4da3fd8016c48c813555e70f275e4ecd3856825e1194bacfa732a559a2f80f914594bbb1fa62ffe6748ddef75074cce828e15ae0a31c421f3d4205ed203a104c35ed62dd815e43311840db4a9b8a95c4f1ba3a5d9de652f0da8c4621d945ded6a23b93955a081d0d0fa9249b249cd63a6b8404d2b8fbf05ade0b555349cdc523892173acd2bbb2d8c5a602816b2bd42a0ba98e9e78f7c7579a3b061d8b9c81debffb5a7ab85449c57898d3d7d015ce0818a898e0995bf19e3c5f3665e9a4642496c749f25204459fbcb2f09b20529d650687e2689dc509689e1eb146077727d7854b036b59f602b29120aa97a8ee820960aa6aa13d1d9f9e2b183c6e1c0848cf0c60254360535f646e148ede6e51dbf147c5c1ce236de0451c030325f7aa5e7bcbcf5a81b46e9fad4e6bd9f168c5d3134b24701ed6aece0755b925e5ab830a248632b6312cd9dc676e1335510b0a63362653a5747e27163b0d0d5b417303961628e120faccfc39dfce85bb5b1ef723bac972aaa7989a802bc4a0ec67447b20bacca42f79de28ab0c729b88da6eefc5c249961bb33520da5007d1b4563b2ce1302e9b1c504f91cf3802a760227351ae63ee643ac033465d924410c283e4dbb4e3e981f2478813ab551e22298c72f773ce66093a2b4a9fc0e02e06d0e4446b263fa917c92f4ff02c7e15edf148a7b1ae95f19dbb81a973fc0c4376b02d0fb0df245496e687ea8f85caad018621132dcc4720b5d695f5eecaa4e8c33c135820c35d7952620bc0b33752acccda8c4cea00a1620b944ead787ede2c3af4867c73e5898ef220ac2396de46dd966e15332b0ea68aca539c393e0825d8e6348e07e37744826bfcd6b78f7e60a77a77e8714eae8a9164e5972374cc139cdd89bf35a290cf8f41defd25495c76f43ff46e977ed4a7a13b516659c3920439817bfb0f5246142f00333fdefbd2d1b6c3ecc89e6826ab6246dbcb5f8a5d6a73c5d62e99fa6e628d1590e17aac4149d597febe8dabd24a262367cc766cb3018a7cf76c32e32d5beff8595c218df898d5b298c0b2606b405c7dbf733903b229a1daff96b0463c11183ff356b32042942d93d41390e7432d597edd5ab72848d9fed880c52de5eb211127755da1005e8cd006e85c6aee75759bc663a4fc3a8b34a87f67f1a0069ac3c8c6e7446db53e6ebf80dee6a25295a3893b14ef99e130091728a8e7c550b15cb5531b07b71fe298767a2f93e11b7f070264a888a9fc9eadd3cff7b148b02d5816cda22f038572c5ac082a9e6a0f98e07d2c43470b3935b7ca371d39fede8f45f1b1e52a38515ad133c4df8430de0031eb51e8bb6430422cd52c88e9f77df5a50ee1affba1e0ae58b60a8925835e9d128d59c7a69eb0e9edf4213e1bee42361d1df4526700d992d6ef57ad56a539642b509bc7774f630a7ce9ceb975f7a5eb2ea613c2fcfb132567267facb72340d44d1e238e18bcce563e879ed8ba2d8fe40984b84ed7ef2e7bcadb16308071fae93ebb44fc83d0bc8131502621d9a66c87f81b7789d45eef7cc60b4f19643ea287e046739fbcd64c6cb15b84aef08a75dfdd7bc0288e1da334d7a82bda360a88e672cafae8a073e009978838b62d4cd0832d5d71ad122418e24204a3e88095df3bf58712ce36d150e00d3eee304e13503bfc1fb5f9add60c081a9ddc3e5e3af2c579de02b499f2a0aa8b1170c694946539dc9ad3aab4213cc1390e269521135c7c415acd3b60955aaeef1373fc9cb4f4b08a89f28859fb82ddf1520089814546338e63d8a0e49090649e6b22cc555b9fa4a521416cbae8e982076d99da38669b7d0d2a54316c4b344833dad826bf9d3f04c41c199d8880c497a36795926813793040c0e94673d765222802ed49804983a4c625ad9776b59ffc47876c2bcdf0f58cfcb1d2ba91f3b7828c5df4a57fb14d8eaafb982e381c5df2a3e0dc9b119eaf8e0265ca5508f37c44a3a109e7ddc9808a9ceba9adc038431589329c59a09f6d9f0a5dd14554601a2c7cc7834c093b71d6d5f359242975f6b21d6adc65","title":"401. 二进制手表","link":"https://leetcode-cn.com/problems/binary-watch/","question_id":401,"issue_number":51},"49":{"day":49,"pres":["回溯","深度优先遍历"],"tags":["回溯"],"whys":null,"difficulty":"- 困难","description":"```\nn 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。\n\n给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。\n\n\n示例 1:\n```\n\n![](https://p.ipic.vip/e9jfjh.jpg)\n\n```\n输入:n = 4\n输出:2\n解释:如上图所示,4 皇后问题存在两个不同的解法。\n示例 2:\n\n输入:n = 1\n输出:1\n \n\n提示:\n\n1 <= n <= 9\n皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。\n```","content":"096221cf5b628be1e73e8bcfe626c73470853d846a3d428f680b494ee7f5afa5ba126cb6b71e6983b7c364be6cfbaa5dbf2242c49b6414deb063ea3cbfe8f124fd2d256bd6c5d4f60c2dd1e8809412155da73ec61144c917d450a23e0124585c33489e47213060d0afebc8fa7a004c65ba5fa5dab2880b4fa20f3a548a6fe26ff19f0e296765405768ad719a47c001ba716a068c6529014ec1d81a78f2a4f3146e7b2d2c6be2cc2b45662fa0ae1960494cc1c49e393c7a0f9159924434b6167a2a991bb970099166aded7068c279750ea77e9a621773a6e57761e7b533532da1d8cbd3b37a64f427fc2b25f7acf86b7f85cf34d0f7a7712da8cb0bacf6443ef3b551c7360752fec938771871d7d1b7f85d1fe52a806f810cdbf4af4ab2dde714d4e12b6082e7a1a03aa13f612d995b68e48e0e9f9ff371cf8c44ebe27e8a5eb5104c8797131d5176b96b85be8d845fc2a8dfb3b9bc86d6628b29d79d35265a580989e4fd38df07e5321e50682b55e4c810ccf518a24419330648b866b7a7a1027b913b455069d9ee5550fd4325c25861865a5af2c3e06ee5ed73708543062d67a3ef2478fadde73aaa8f225cc6edb605f7ea8ec8f933c654e5e9efbd5667aeb8951082d928c4026c62993f7d476a403f06d65d6cd3dcaa83805d8ee945666c9f19dd047128c48f05e6c9f20171327fc1add5e316d9568a649c0ab43dc1aad64fce793a89a44fea43b243a52b7d05068af5551d5a56aec43ce2c2000073312c55a56c193b1862114fab8bc723133a63f9f423612456ee2dc1d41df4ba9f6eddb22a4525b698c1c1e244bb97106cde204358fe45e24c079220cbda4f57a2c073369df5210b90de7214b5958f61d4d0302ee3d8fbd5c7f7c0d9143cd22c0938285a46102be0b918d6a9972857608e05f2a9b16c932df45ba668988a17ae4ea2542201d72475dd530232c8595f3ba6ccc36ccc2172a46c9ef3de019c9516272e31ecfd64d1064c6b85b81d7690e076e66c380ecf8de9b4977b129ce87b3dd6d57986822bcb621a3f3682ea5551385c43b445efbc9122fa140c0c0691e60cb6d92cdf66457ca3ac50a23bd431a3f241c07a20cb80aa8857b34723c9928fa4541ca23175ae18775624e567f3079c42ad23d83b09a4938d2e533ae6d7c4807e4f2e6340504a147254e18299275a609bcd68d830dca2b9f69469e15c984c6f9649c404aee3ee49692b44b002e24bd5d32124d3d5ccb8f1154ffc8510945a883fd62121d6714b118e3e9775c6ab0c8baf3cb4b0d38c9790877d72ad6c759ccce18aecb26664b3acf6545dd5416fbab67e1f64ffb98f1ac594d2d3dafc91813a8d051067a377c69e01f75f8f72571ff1a0aca986a5d2ab895a10a68ef5d4a76ff51719bc70b1b8a3ae18fc9698e8af366c80ea23aec94698d7cf0f447bb2fd4d2a91fe77648bb6929d3479c5bb3ed926da0cc86ad64727725381380cedf16ace0ea9954b379059e817985171a7f87e3c8cb241133340c1dcdce494cad511b15f2b1e2fabdc75984e5a1c80920f8750068383802be75a7d2b2dfa002863e46f1be0c4d41cddb7c1f203809b18791b3ff08677d7246df64c5151a3326aef7f4d2b6ead86b762a437516b3616abfdde970ab9c5e1462442c7198514fcf488fb6548fb2a1914b29b0f395c49129db02a89c1d32c7b792cfdbf4da2d37eca925a2d90c5bc35cfab027ca4bf03a5162e4c498ebb0b23fa7fb87b92eb18cd0a216d188ad97fd00f6378e4de70f2aa136c0b2f311cf0fe76f4048c250d3328047d2ad77068f45bb6bf82c86c5b8484746383ce15a8bfcb255c86247d35415584150b248b815e39245c08156c8d41658e34ff14366c2c8988e808d4a4fa439cc2f6757e77fcbfe62bbf37e80d4966a289f5911e6a790ef5c1813ee166de439174ad533adfedda9efbd37d81422ab2d6c66fd5908711d2e61a3ea975cd4d5b9a675b63dff09dc41449803651c2bcd3898335de5482078533ae9f1d5bb9aec9dbd70a42b1fe19eb60e449ac98a9cd79fbb253ef35b780a5a3f03574814982e674a809f8d105cdeea96162812f737b40ed2bc49e5d0ed94d81749e3517719b02169fb388bda4840f6558afcbefd7f42e22234a94fd1d2bad099dd1948c1e3e5b248455548ecda353ee345bf68fba6e206fd51ab27d80331b398d381de957c3cd5c03b8d2679a7b16de60ddbad291c2332e1da649c629f2c4606224a90d1a243b6b52464f26947c92a01da91d96176f840d6168260936ac9a4c32518dc25d1a6bdd4e054deddf5edfd12ca7eeaac969ac6feba11c8ece68f2db63a0e9425964f088dea4f7d10632c01219a0fa1c3cdf9257a802e0a2a9fb8b9347c90c0fb921003913d25ad93fb5aa8c6eb9109d69ba20e69265c7a8c3201a20eb62bc76753d4ddd2905831782d0896d8568c7edf5c01ba8e34fd47f60c1d4b5d44dc6f0502bfbd090b69802d73331b7c10ac09d6c1ae7626ac3fada82703976c056b89b690325b891814467e9b3df33a859f85577756df88668c7239d900b32b9df34fa452508eb918634cd8c76c384b85cae1dc1e2db5f1f6d789abf9e97e3f0ba3003de84356c9088829071988761c07926b636199e896c9005311e232dcf52010932cfe0095d2ac71c7b7c8d0105fbdc77e076a6e3502bdee8b923bef91bec53daf0f1c7cdd99f1c846d320773a0a83cee9003614b1ea05f1542254812a9e3630e171944f44fa41851f4c0b149b096d130503ac97901b4f0fa70750ea82770403b625d4b9dddbb46a78b31bbeecaaeeee8d0606c364bfd60d9bc1c1562730d5c5c2733098e0c96a15924f61c2551d846d28266307f393c5d1babcde8740891ec63adb7b92aaa269eec78d4d6c2873d46762079ed2f22aa216c984f418202d8568e2d337e0696e7bbb7ca44821287c46495fb3b256404f6721a51ec30d9a002977e59b3cc07037601b8c2d969708af098921ed8313e51d762dfaf4dcec4c2045675bad7ab86158f43f9a01873393892ab7a15127f3cbc57106644fa2eeb64e3378130218fdb4db689c5ca917024ba4f77ecba9cb1e8c351848ed368ed36df7aa110ac66c9d260a7a7c9760647a541580b05af96d934fe3bad7422e95ce243c9cdce6eebddb75b1f380409fef1b5aa05f21f7adb210e774431fc6fc76d4fa36cf48cc17515ad5c0d5144815d04881c718db59db630f651a5ef0e967f88b3fcf60dade43ab8c1b20921d7aa28ce46e0ab571d67606805e7205a400d67ac2fdd925f473f9c992c876173025d12993a5c9d8418b388c60b72ce589a946e9d76f50f5149654de476dd799b8f7a04c48105141745e5195551fa8e476469f32061adcfe2d6da8922fe41adee27a1c462edd13ce2c714d575550dce8eced8bbf67069a45f4dd972ef8f83d508881809ad91a2991deada2604552bbde1217d889560e8014d3edcf3ca8d81491dd3365287a62ece81512e9600f21506713297c077027218b417a9dc6fe58ca7b38e1433e37fde695882f823126f23475d35cf127d250d6953044e6e148e972851cafb41809ed51470e05506035132e6ab596785af60fc9e6e9ff0646bd9f168cadc138efd90d8324746eea8349c526d3794e31bbcb6402c1e66c3aa8e9896c4c1f0d7e51db532f2c4fab8f7b51711f1dd7e93b325fe641234ba6410141b9ee318b42917e05d0f5c4462af27446788b6186ff49fac5b67d2ec20bfb71f151cce6c004de85fb330e2c06595ed3327b1cfe35490c321b897c60b0ba5af8d60227303a772ef363689215c11db011cc28ceadaf6fba8d1fa18880eab075f3a3b8672b23a8f6e467366089683a2635590b12f3f6f70e713891d12b92c645ba4b117aea988b3f1def4d4e727fa0a4a991f9bc90c7fe0c93863541448226eef6ed2291a07cc476cf08295a5ee91ebf88a21401168c3027a55711dd3d47e1ca4d8d68c0db04d67c3a1f58339cf9343a2fe6c2cbac77b4c2b77e750cb016ea9f7df201563645db78adc4cd95b701f21cef066804ee22f27d638fcdbb79e777b8d7a77e8714eae85d82be5d836748e5d8d8d005cda2c46010ea63b6cf0abd1a550b40eac5fd04929179fe1a9a141069039817bfb0f52461b2000707092fb1d4c0ac3bcc85992e63dc5aa5926f71fb591bd3041e90f74abc228d02b4fee42b7843f29daecc7fe811e2e3e64cc792cfd4d830af73c3be33147efe90bdcc774aade9bbfd1cfe638230e116a952270435c9bc780d3c0ee52645b00779b74dc475bfc748fbf5a948a3e153021ea1b2b4013dc8b86b58d7dc38c5a397f045bc25f51d98e14a0e68f2a2d6af05baf8e3b8113f102ffe43a5aca4e61c8dafd5ea22292ba2a1659315a5288a31c85b8e78ba8b099daee406101d601943be4dea76f96634cb1aebc5767887f070bb8382c6d6414364c5f344cf19ae8e3d24d7ca38826fd113b8dff02ccd6347ba5bbe9aa8599a25e28a6d7ed3110703cc0dbf871424830d255af86dd4f68cbd078b80331b0acad8473ea361dcd31ffdd61adeb5f5f3826bd7bb84cdc06ab378452934e36243908312abbd99312faf28b8f3d828e9b0b484305bf14d411ffcd8b96276eb2eab989860e595fc24a551ab908c704605cd69cfde2f22371c7824ff2c8ef04e73026a7af150a1022b09f8c08caff08afe26fbc0a0fdfd555fa3901f017f43019103c4f8bdb86da523b8c0e26fff5354a8866d448f7ebd4bad7253b0189c052f5d68bb21497316d7952bf4c5ce6189813d83a84115bdc52d1a60c3ea8e0bf256afd0fadc4c930ea655791ca083238b4615f0d8d1922d19bb7ff8a02b8d321a67dc821b90b48b23c3173695c863ad1b7a5a8561875f3da6e2b24a0bb4c8a71bcea95a5ced33314988bd53a25b1e0edd3cf074db9276b6d9a76767a003d40bf7949e7119c9e4851b6dcacb3e39ec9958902a9b09bb96578f9b527eeee0c9c28c3c791903034a6de41d211d987de63581beec79650e0f655336a3dc06a1764136b690c234f2b97973fbcc3295287481f9c8a8fd3cefe37d7de6b127964c02f0f03b4af4b4581689350d727b5ce51a47d67d9e6d8aa7e87faca0a6155eb63f2959df657e4c29227bf9c34ec69cec0d1cf732e513ec9d4b4eef97c8ae4f03a17aa765bac6b2bc99c7181de8fef9bda8780e8a9182d7a9177f86fe5c25ef85345bf37791344140e81ab335f330e8eedba2d196631feef5442bbcb6b9ae3f0a692738e34a20e3eda9dda1cfd5a6564814ec18a79e60a95807873e0b6d6a9bfccba5a1e","title":"52. N 皇后 II","link":"https://leetcode-cn.com/problems/n-queens-ii/","question_id":52,"issue_number":52},"50":{"day":50,"pres":null,"tags":["BFS","DFS"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个包含了一些 0 和 1 的非空二维数组 grid 。\n一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,\n这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。\n你可以假设 grid 的四个边缘都被 0(代表水)包围着。\n找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 0 。)\n\n示例 1:\n\n[[0,0,1,0,0,0,0,1,0,0,0,0,0],\n [0,0,0,0,0,0,0,1,1,1,0,0,0],\n [0,1,1,0,1,0,0,0,0,0,0,0,0],\n [0,1,0,0,1,1,0,0,1,0,1,0,0],\n [0,1,0,0,1,1,0,0,1,1,1,0,0],\n [0,0,0,0,0,0,0,0,0,0,1,0,0],\n [0,0,0,0,0,0,0,1,1,1,0,0,0],\n [0,0,0,0,0,0,0,1,1,0,0,0,0]]\n对于上面这个给定矩阵应返回 6。注意答案不应该是 11 ,因为岛屿只能包含水平或垂直的四个方向的 1 。\n\n示例 2:\n\n[[0,0,0,0,0,0,0,0]]\n对于上面这个给定的矩阵,返回 0。\n\n \n注意:给定的矩阵 grid 的长度和宽度都不超过 50\n```","content":"096221cf5b628be1e73e8bcfe626c734738e268a04f8178e0a5f66275d38001030fda0652af3b85e3f4321d103e7bd46ab345588da2612d4a92ff52ab5a7fe2fbe3d6568d4c4d3fc0b2fc7a89ad2507e2fa97c9491a0419132f42cddeba2a2891648a54a22f51ecbecb8e7962d212e3a8a072e436a04b3e258d4f20e81055a8450608228794e4c784dab4eae4df322b6755607a263280c43c7fe2879f082fd33567a101268dec421457e2c87acf5f2c58a6e88d6185a32391db521f49355f8999017b65dbbec27c969592217d9212a33139107f3177386e442470425ae94b7c399d3b622dea15888f234121a0b260115a2086ad28cef51661a41cc377c4828c8b57bcad8b7f93a9423234b7049eb9d3eecb32cb9386f8026d4e6be45a4d709a43866f0de0ab0b1a01ba21851c402a5a22dcf163d72b75da8c14aa6ba5a897481105bbab10e6e2c69d8df5a9895e003d2d4a2afe4c58a8b11af4aa893e1785297dbc29728bbd03cc93121446a2c7defcc1303af0ac31b27475946d83cb3c4de1516ee092ce73d80da1833c82f56d10f05b23029c997854ebe89440ac5565b7962fcb4001e487d20b0138e2079cbf48d04d3e88eedf930ea57230f59ba6a6ea1ac971282f3ee3c9b6e688f3e5543644c2906f67eafb7e62d82ad718cfc6e6a709919da307f10c3ab04095c01e1b74055accfc19b72e3f668d0c249b24196a24b96836e80b32b9302ad03c116d7fd8bc24a6a9aae90f55b0fce264cfeaee6d8de7026dccdb8fabad89e420940b3fec0877d4447380c078d1d9e8f3c1e7e1ae30f24421e12f4f8e1aabb6c1278497494546635b6569b2923ff78fbb50c4efab86650c8f07d78a5b7f4afb7beb76bf8d23c31d4d9e6d9c7c1c6d51536d1330238284a829886e6a9161839192754798c08ec6a00d493c00bba72fa2386146dc2146e04d94587bc69dadda2621b4f2ab6d1f9d95eb8b778e65d7f6800ba679a1d08e74f5daf449092fb2e9e276b80f07b9b2e1212a99dfc8f5cd0b94954c4f45b45af0716e343c3c290bb4941c185dfe2af00a53a171be176b4d899a8586791606db31bf8dda333079829ac00d11a1cd93faeb4504b0023820ff8e67b035b30e9d810a0a126adbfdc8630aa53e904997b9249f191224b00929c8a4b005205bade8eb5e4f780b2c283061177bf8bb3377f4e887c8c8483f9876534f92487e3149f77916a7c44733e2a6e75c24c815f501b25c31f4b252483d93408a440f330fa6780f474c71c46a7f81829a7bd67e0afbc5700518db0b68a425440facc9efbc588c9bd85d126ace1575de057802b0b9f9fb49ca4e54bd9363ebef783db8e72cb1770ff40b24037c961da8f6568d8642b6aceabcd8c9ccd0317fbffefaad940ac4839fe3f91e3f5b772a58adb8e936a36a0bd7caeba1389b2b2101609989f251fe2964c2bf694cfc13b0dad8e5e42b2126fcb0045dc275c5f830606284ddb23b85b2dfb99807fd2de33dda7266cb4843166a7e2de3fea83b8c3f299c27ee8736f6e3fd68572d53d4963d28d70da6c66d884cc47f709020b46a61d5503f21449c8108a11b7025bd70d1d9e2b531906c08e5fe5276ce3414050a12058e0414c2552a24044ae2aee3d2c5b3ac994cac7538f8681624c1fc440da22b2a290a30946927a15b16b046ca2ca91b95534f20e2e7fa0bd0817b6e76cf565f8d7925b3ba4c5971fc2931e7d95b2ef3b8bead101eda6619e5f901c04e4deb173bfacbba31a1ca92d99faa92e6bb2c0f557381c302e0affa178f85cc43e0e346b83b1ad51aebee70ca1620257b3f4354e88880906fa227f2aedae6cae97aacb985b411c39d3d1c4f7cad7f7fcf935c5b03e837eddd7ebc16c4a3be69aa2e5c041257dbadcff2f3023628642a7280138a5e6afb9d9eca06d43ade128893bdc18cb5c3489ad7d2a86b9bb89446dc67581ba936eb5ceb949a0eb5b64a61897520ac14d3ff17afe93df1541a53577e7bdf2a78012fc58991084148f94185fb681d6d7c93648bdd016d559e468be5c7222f1aca43a10c43be896c730e4b1d55fdbb86ce355cbb67bf1a0f75008ea150b1e4a51c77075ef9a3ddc5b8709b494b971a89843760f2b5209c2c7d36a03793d35e7e4ffc90577ff629e77eed4e1f102410111cd3b59e5aaa60ab73713be98fb3d2b0c8f03ff28bf4a672be7700ea30bdb9c1a15dbae75c50a14b634f2e2bda2a95b0142ff78b7b7194bbfaab77dd2dc4d090c377829609419d7a2bf3ffc62d332b045dbddf3b89da595553d4b81c35414ae0a8d84881e51a73e5ec6213625406eb771e5872381f26df2fe72a3fd5c5a46fe89eaa7fcd50a3ce90f12a7da1d07d39e50b303c6a3abd5b69378e0cafc75afd9cc95338d54ce397316d37d91f415b668ba90058d91a85e3b69bf57e40d417b11c44fb723179bc8897cb06dcffef4f411a9fc5711ab8d506a1410c046fd5332face93ba9815d52733bae627c9bd601bce736ac7e0d6995b315ed3937c6ce87205d229c60d6f85f0da66f34d42b9d2e1a07402a64e8e5920bce41251d89d784a67c3dcdf3284e967b0daaaf8fc495d7e7c9a88cf71b8af9d97cbfe80350eef96344d884c487fe600e909c43a4c9666709e3883c4087c403c60ba7a6c5106a1b432f0f29730103b9d6966c1892ee00bcfc424b04aec9721b2f72eee79dff1fceac6d99ffe2cebfbf8de632c9c7e1e4d3a7f6cfd48722f332c6a918c313c7f437b84319dab846caeec7ce1d0e35de9af0f0031e084c80e252ce77253c1edec2e11a4a0c873e93db76f5a4d6a757405edcbf9ff7fa3501edb8ef8b786f596a7ca23a2019e31dbb8375b192daa51b1e77c69253fecc0d24d463b1653872b13ccbb7ddb68b85e68bd2e032e11edda92c6f23b8f8578c82946d33e07905ebe7e7d7a7e48dafee8e2ca3fc54fd28c31dafb280f6904e77b918810f504475aae2cda4e0388e19d89642155c6b00830529e509fa7eab8c5a7036d175c270b84beb7ebb42077ff36d74a68a9fcb4ed4374ffb7dadf9ffc938dcbc165832ca611b107e5b75f3604b6a3c6c991b58129868a247d7328dff45c94504e9760fd3aef61a79641c9b606d46855dec09e3499c2c1847d265bc31fb966d89874f42ddf60e7e46de8dd328ecfff99a8c4f1b8aacd7d92b253818c868df714885bf9bcc51f94af9b1f55e70f275e4e8b7704821c1194b2cfbe7dea0afbba0c863a93eee2a527e0ee758a93bd5d6885f428da5ab5ac1546283d0c1fed727f441967a362cdea10103f59049f42c8dec7ccb0fa7c56dab601b6a1ce3b09c76ad689b635d1c50f090c5148f76a9c24b1df3341c4449292d1f359decf8982c7091f40de1a799182ff988ba3e751d26b589b665efdc7d136b9a2079a26061d888989c5fab11e09fd1a429e0bef9283935dc65b5de4deec9957eb877210322ba0ad206fdbcf6cbb0c502fc0e8aa84ab0a529d650687e2689d814c2ed20bb841542365df8667457718b40de09463f4cbccba8e092de324f4695882f86a06266c5d4662d20c246310681a5364241485973958b2be128b95ce3e70e05506035132e6ab596785b45bfc956eccf80363a2a52795df130922624ad4aa8c524db9799ba783586dc17ae24c25f3dc676e133551594f712c261dec327e25422c1e4b5045360cdb4d02a03afa8dfc25dfd895b75b53f03ce09a6de7e2d6d99d27c8aee72e5e3b75de9fac5468d228b900728f84da76e3c5d31ed448a03a5d9b111c96a0563c29e87d42c81419439185310b8d60227303eb37bb362685215a43880103849c8fd6b6e782abd02df852c8065a7621aa58fa72de2d0a3f4c05d3c2fc3044eae5496a3b39a80ac10f74ac792e55a4a644eee78799bc9facb5b562b46a0c35e3614efe9b2c1dd8f3b2c4f4e5cab9169b6d1307976d20b5d695bca0d8ebf7822d130c6ed314121c254ec8b8314ea4d09fc256bf04a1740b955ca42b54c22c7da6cf387da9ccc0b574a277c4970cd6d6204e49645df5c3ce508b46781426cea32c8653ea7d758221fccab7c82c29e30167957f02ebc4907fff8c613e8e56958d9dc666ebd283ca3e90a8254a4124e171cc62c33bdaa3ec632d794dde971e54c42f925c1e075a6b61617a9ff39bddb689e0c8d97b21bc650e84a557d9093826aedf2e92fa3e3ddb40c9af29b552198cb4adc6edaed35778703f897135fa5c8311b2385bb0611aa1bc6a4b3099a29f9baad1daea6863405b74df3f790ad65712383f2f28a1a8d5d9f053b05180e15bb176579d2667fa949df677c97784c77151011b0eb72a0ee9f4fcfca0518dce414abe2d5c37eea0c76b9a21ee3b9f0ef145ade93872d27d6384cdfc4ef66192f77a165d2c5f16afea31f2f292dbfce89996e710332bca1d942ae8deaf21852644e4acfb57698d551602a312714764146b66186658aecba19eed4152abdb2aed1a1d8def0ecc947d2fe0e0bc809499fb1b3bb6d1ca620e74219f90f72f2900399272859ddb30e7437df957e8b0232a632c9269dcc4e177b4b90fc1b9dca9a6a60ae47dd97dc05c99418f47c8ee97feb7a0a964233ce907775e47956c6b1285a089bb4fd0418f28682b17c98e33461b4f28bc9cf7758cf6bf7cae52c0fcb75673147733e6f93475d4001d22c946f6d105618f9dd8ba6dcdaa448de52bd8c54526a9d55622eb15d7ed60eb5696ccd2b6c91b386628d7ec7f90f77671cd831db57cfc020344723ea3c1a11452ddf598447eed10c6a4fcdf72c5817c9c6edf7cec6c968938fe186c89e876e89963708f58fc7c4df07da2855d45cadeb530a7e3a44984975f69483954f62f2edf25b04af426b5940385f7dbd89b338319794a35cabcfa153fa8c58d7b0cca58c67a232a384d1dc0940e6754ecc22317731421a7830b99f7ca2eb5d6d8c686d47afdf3209f6d1789e47b10552f74520c2706d629351037e6b10969a80224db5b828fee9a92301ff29a47d9d3523f4dcedbdf757453ca5339c9892269943a447e55222e4d30553791e22e8ef5656edd0511858d9fcb80cc22c1d127573c3083604b46b46cebe781af28de12c7565fbd4bbabf23b4aaef50c6a9834b7d1079d63d18692f6c5c5d3fe2310af075d60b6f5e0be8ab949b5a1227663fd47f651996955db3db3cdcbc6a0bf12d740910727d7c466c0a83c2d011b458c4205ad83ccec57a82dad7dcbfc90f1cb88ddea743113e90b3a1dd337296c4330ea7510007def25ab67d914a1786ce8d52aa6b3968900e99ae2faf5a9ad43937a6a0c0a7f59cfd53341e8c48ce8f9ac55e3c46eee50871cd4ceae394a08c8f96b58ab26c4d6f3c55d3648b9e0a83370b82834f1a1c82459884b387a70ec3df95471707db4ce57967ed5013ffecbe3bdcb0b62b902730d7a2e55ef7a8672493c54ea0c1604e43fdbfc6667577486b01d1a33d54cb1e06f31e4fb8f2b629a46a912e935056d6afb34275fd984dea8cb222a43f5c1060bd7fa88a98ed11f4310162f3701248a0796c3a60f6fb1b932f4607ecadb5d39ae4e12f1a332c45a042deec602f6c0cd33c4d0672cae565c96081d41a5e7995b909b5d0a651e37c807573414d744d8ec730d9e694f7935118404cd8f60a3ad06747e7f87bf6aa926177b51326d5efe1899220f3cb28f6dc223db5d5418457be2eda0586929270384b360f30168471adf50d61aa4b5522bc55263832c653f7c5d4e0b1af3a8cfa1d8931e2c01d761db6d4f0bc624f254f1f950699c584391b12093a597fa4cb5e7c879e0ca8c2f60a41239813716f9bbc3fc2f6c2553160f36cd61dd015fdfe572888ffa7cd052c8bc6c9e9d36e58b29ffbdf6386731903f18c10c892f39d42ae766e0cbe8f5b7f732a1f95f0809d35ff4ccea060bd7538187781e094ed6a54132b5c6e304d9dab68f15e3f9d1610c03c0468a74c522376fa5b50dbfeb3892e094c11066e0265194c9ec828e399b8655708c1bd7ee24d0b0022938ba1f0ca48d22bc4f8835d96471d7d9056744528ae00df48cf155cca40249c0492887d722c5b918331c613852027fe3f3cac2cd05096e242d133540d0f393c7b7d3bdf048c78a91ae844124f7cec767cdad7d87e7efd9ae4796146d98d86f3cfaf16a342b7c8a22bdc1a8425ad3865602cadbb8cc6dc20ee3e81de5b84514fbda636cf21c4ecb47a73126db850751af66d0f8b12ddd36afb580af236aebd4f5829a392c9bdef3224b9c660b52687ddc26c7cdd8eb33b5a38b9e39eb176f7bfea527bc37b09180606eb6e7884e35faf528f159740a21ce02122e9047f8ef7a3b8b58466a77acc01d6f56acfc513ce59f9ec0b9e462964c718dd07e14218708e7951e6340c1a395b425566fd7a707db088abdc8c25ff4a18bf1a9b627b262cb7387e4137b81deed0076a63601604d69f546940f27d033ed6f63b8e3c9731555b43c3553002019a8d75743b7db2eae7b365fca3317dfc4ad20febff767a51bb55d94ccd4f430fbcff034ce591358acb43f1002c390b6795ca17580ceb8ac1728638651316ad44da9a89760e701dc428d033b42bc0befadf7ab7f4b369258d41f15596153bd8c2bf2d66497d8bc548159dbc84bb6efadbf5834495f2967f9a2db1e97b84ced4b8c4e0d449707ebbcf73eee1ba254c06163761a1456b334597c23a9e5a96a12431ac0dffe5908852a15a5f36c3cfe5f31e954b25b2671a60fdde85d186e464443e0c83c0cb4e6a6ad230ca887ad985df0c9ade0dc8668f24ff442cf362f0608ee233ec46feca3ac462ff48e7cdefb9a0b74fc6227adb92e06c5f9303edf151a5c85ee342f6e3580a6ced28b92645d8ceb46ccfce3a938a3e9ffc9d99e9d05cd35543e91eceb66cc5942476c7da820e29c8dc858e7ba242057563be1667e3efd9d21979aa0c602cbfbaa492faf71b3b0ed3c6fa799b30b03ee7d3b1f6f8fbe2f6a4df98dc5cecb1405abfa3582ef64d2678e54a1d811f3c7a0bb71128adb0469aec6d2705e9fe6cae923294b941dac200eca81ed3de3b07334c2927a9d0d60849766f2e448d65783f9e5d34b965ed83baad2006ff6e67d23c38fd3050ecb4baefbb67218e5257641846b57e5cd4a2595791af599ab276ff02a35943a6d3bb790a6f928b003b354b5d0ba7468a190ecbe27ba09b1f3eca18178138a148906b86a2f7565bd348fe9bdfb4d287dd79c78ef7e07dd380f8db5f84b57a7f3df7cd8f0b027db68a8077602a12b99409e5938abfc3792f526ec7e3f8bdf75d35658f2e258973972be5dbeb10495ecd72ee461d203db2967436c36cb1a2e4859d328fc10d82c8706a7503b7254639f6ec7283c35a196b52c4462c169bd0eaa1a6dcfdfa57b1decdd4829c80b7a3df7c04676947897bfed5798b87db75540d2dbad5c11d67a400897f389444a9585b0bfd5d0b70da4f8253eb00702aef099356543efbc735083fb2bee88620f32a2685","title":"695. 岛屿的最大面积","link":"https://leetcode-cn.com/problems/max-area-of-island/","question_id":695,"issue_number":53},"51":{"day":51,"pres":null,"tags":["BFS"],"whys":null,"difficulty":"- 中等","description":"```\n你现在手里有一份大小为 N x N 的 网格 grid,上面的每个 单元格 都用 0 和 1 标记好了。\n其中 0 代表海洋,1 代表陆地,请你找出一个海洋单元格,\n这个海洋单元格到离它最近的陆地单元格的距离是最大的。\n\n我们这里说的距离是「曼哈顿距离」( Manhattan Distance):\n(x0, y0) 和 (x1, y1) 这两个单元格之间的距离是 |x0 - x1| + |y0 - y1| 。\n\n如果网格上只有陆地或者海洋,请返回 -1。\n\n \n\n示例 1:\n```\n\n![image](https://p.ipic.vip/mmk1kt.png)\n\n```\n\n\n输入:[[1,0,1],[0,0,0],[1,0,1]]\n输出:2\n解释:\n海洋单元格 (1, 1) 和所有陆地单元格之间的距离都达到最大,最大距离为 2。\n示例 2:\n\n```\n\n![image](https://p.ipic.vip/4qlqlt.png)\n\n```\n\n输入:[[1,0,0],[0,0,0],[0,0,0]]\n输出:4\n解释:\n海洋单元格 (2, 2) 和所有陆地单元格之间的距离都达到最大,最大距离为 4。\n \n\n提示:\n\n1 <= grid.length == grid[0].length <= 100\ngrid[i][j] 不是 0 就是 1\n\n```","content":"096221cf5b628be1e73e8bcfe626c734748625960a3d40895f0b427e2234606a2e882dc8c9066ecde89f32f426e3ac57af2400c3906714dff32ff523fffaef2ef2326f68889bc0e04425c3b7c49b4f703aa971879aa5419f27f435c1f4b0a58f552780630bf6d86eacd4c2f64a384f4d9851b0f85120a28e3e60694cf432d7268b9646755d0028451efa75fb0ff86ac84a157f911174013994ce4201c8e785351e2b374a2aef8d40540070b1cd79750034eb89f42659270af3078c3271a44c09393df838cbc6cb4acd9e66336dcebdb55bdd79d9f9e808230654b0ca37119d20166bb501dda07a8e1081813321afc3ed4f747fade6ce233d12cb22efb6cdaea9ed4b86b2bd9a4284454e7a02ee575b47f7dbb408fc33a74799dcc512828955a47621054a94054f6747bc5ed144cd5d20ad90b6d80a3a81c7997ee8c070855bb8127081950107507e956b0ef1b88562eba9e5887cc58b8d11a166a893e078529df5c6b13329fa3d87743a33210028a5cd7e99cf77c77fa5323b6ab863a5829bb55ca1511b4e3d9eeb1701f32e78de0339b2e670d19abc56b5a8610bfa51585450f7b028125f60e43c938d1642c7d28c05f7c08ce5e733e653233344b7677ea3828213b9fbe716ae8110a1430971293124589271c7d2e9b28395528fd37d6b438c1bfd0c7210fe8f38eec6d714703d4bc1b3dce50aebb90dfb9e2b8d3fdf9d11e4a52d171e238931af20cd18ead588d65962bca396f95ce05f7423f2cabef4b4c559bcf4d19aa58bc24168069e84bda5221853705433e76eb5d46209124bef5650756651f5a498aed33135153a6b30a8aaba708d0cc8cf30801a23dead72459f59c6d87458b6586e4c622328fd7477f95cdfbd9bed0a226910a8ed07bd6f7c784f3b4c1ea1cd2c9bd69e551546eb50c7f6d5571223c755a54c974292dc159ee5ce71c67530248eddae7f170737fadde2a40ecba703fb5136754c54f755ada6dd698825f75a3d4bf80f86a11060af7e88fdbd584b4c379978139ce4453ee3ff77aba329c6581408008acd615d2d794d9f6aefa0b40fe6b5d95619f65cb792e1893d2e5529fb883f39b1df30ac1c9904fe926b466b66df42aeaf17070368ad8452b6bf25ecbd85da699451954db264d314b690650f02d2dedd4e3a7455f68ea88fc22e12110b36fed2c1058bd82a63529461e184e8e59b7928e548878909826b8d771135498bb8f7b01ec642d3e619031b94d8e0932506a4a382976ab730e32721d562a49e2efb172c632fd828370797bd16f783c9e77a183bc8bce2d3baf3e6f1e1dc76ccd82515e327dc3b7cca8b65e5a08f1af7797e8191e7cbf22ad47a1cf72bcb7a46856990d5712164d5ffee86fff6f4e0cb5c4bf9a07d03df7191a751f06df6e09b1bc5afa6ea6229beb379049007779f7a5132eeffc66a6fb4f40a48dbae602c1f54c2ff6462b312ac06fd27f323a2ee888b009187021f8149b80a9e752655d6471dbf6bcc516db4843166a7938fea690a7049215121c42ddee1b6dd126b22c149177d8dcc56a7c2e8d7bcc647e836020b50444474518f3e008dadfc74b08bb7b5113750aad7dfb0664106ed4c31f3240856cf5345813b797c2f9af5c659c06c5f305819c694c8cc51afa48c475d1dcc46d61ba9a3ada00876af743fb4661f4c6d432d55a9d477a083b434000a34a1e65bf74fc619323c9cf18d1797ccab3d7fbba00a8d32c3fbd64d07b40997e87f85583ef446eae8e3ad07c43bd10e227293ce5fb3b15a220f3435f270b222b1199c7b667d7a85b8d9598989be6854fbdeda06279bce264d5cb039a8abfe2454af0355b4acf348551941f68295b84d3e3e7405a2fd8a238df5052d612e9c8fe33352413ea62a683ae91412d6f1b42b0cd5a72037359aeaaf91ffe7a74daef3c965d62eb54dcb3c8013c6a9b2eac889cd1157872c8fccc857c991892bd0fe23309d5f75e3860d93a91aef370d3a998542a5a75238014a4ad721dd378b548a184e9ce66811235615ddce62059562946da34697a7c366606badb02ca0007b43fb392747f80f30c269982d3384076922bdc300e384ffa63fbe7f43d69bba14a312f73d5f2e8c61659b3f1a6c5709c68dd9f0c685a7db45681701c9f36a6fbd5ee3eadcfe3460050ae13876d9a99832ba0725b3a2cd3d0e138e26d5259676640cee7229a20bd3a51530c3af79f8071fa43ad5e6b79ba85b2f7ef272bf70c9992a4b52fc0d504f1c27367f0c6dbd26d3b695f936b564a9fa3fe4bc97a3e4c3a4cad1ed0ece7d2f69e949cd8e234bda83ac34e7ba87961d8b1a93b64bdec90bb2f63ddffd3c01509ed2f4ee8bc66e65f877778f9f590896f27ad644dfcbfdf2e0ee678e4432e14e2c7347c2308f11ffd2b605ce1cf9398b6ba4910ab389aa6132689772e4247f751ad64e821c1ab8ca896d8e61f3f0f4e017aaf56510b68251703e11f249f1570ef9e3b37f7be9419d51cfec5281a20f7ff5e6849cd4a5c54f4325f0291413a2bd5cf19ac4187586f9d76df757ac0b492d3ff2ce38f441c5a66b5db2bf69d5294333bbeeab5dbf9530b695d6f5759d03571fc3a2a8389dd5f1b5858b815054f0f74a73e73176109e088d50ff7a06963335bd65efdc68296c97f65e91f39eaaa18e14f0f39b0c1ed837c465f1bb2df10fcfc50a75f3bff319dd9c148c25cba4a3e7ae838d876afbbe97ec126d8a08909fa9b48b6d2b70489f83aecf8f4f6448082e8951c7a3ce32848d0fe8869f4166b4050308d186e81dedfd38ff8d132aa60159e7a0aa39d4b758facc99cae9541e3e6151c45f6cf48a11345db785dc989ae9ce06bb586ae1f3437a7c75b61bf3f11401144018344e8b88b25778e4d4cf7931df749270dbfc308dc790fc061c0e272fb23542f220f64cf03be226b2fefb9d92918f207912380fdd3fc43d7cbe2223f785d0cb7bd7104bf433f7bac76ae85abee4061657009ed4d556698be98354c4733219581730d2e3c29399f05f2a783f35e0a245c5698fc22d3a4026d3f4737846739f35310e0f15cd58be6b9160aa6a63b7b4a41566577c541d11e03f65a7c1aeeb624b990af4877c806df717ea080ca27516ce52c993774915a531072551f69f9459c864da7241b865961bf86d22f87f1be76b5a7f186d596b7d3a5cb8172f971b6e0c575b500bad673d5ea219201afcec41ca9bce8931d3c23ebcd942450760c0318c707fd345fc6261fca927a6eeff691b3fc3ed405f9351903f2095c4f0b0f2c175adffb8dcfd73fc1479b6d583c9c325e60e626709201cf2c12023ce691927e458a716ade9a37d958b5f08530a12f52ad564d29c3d178d149dc596ab169f86c09ade0a6d2389a8916f467b305e0f45954fde9c07de9b517119a9542ad037f2a1f40b5e2c44743bd99646dfb915ee732da9b9995efb9a63732805ad617f9098c58f7b1bfdec1468e3038e95ae6a2e492d47b6fb54dca0425ef8582bcceb3bcb37adebfbcd2c0fa8e1f6b418837834a55d4d202f19cfb948e754cb913b5eafe8ffef8dbfa47981a68ccaa5c2eaa1c6844802bf970c15dd173908b1df26fc8fc6c0d56767acf347358f6c0f6eccf90b3b8af1ad6f53135aa2aab25c5c1497a96cf9782b459991409b3ff4bd6c18fac3d4a8df96d39ba5c8bd62a99fa3ddca9abea9006d1597077ba0ff571e398a501b3515717971c7235ebd496d30680bfd0a2f1aa9d98bc931233c92c14cee2c97b41b2f15ea4f0068df5c9624e3c67899fd3824a4ffe07499c11cb796e60f0a909260da86b5bf4bf20b98b058d5c99d47c7d75d09313d333739470bd24fdf1f8f9f9bf820d090185bd5c4a7e1c5501f15496e98d178372724b314924e51f37c6250bdac07a9ff9ac9fe8ae79fb070be0b000cf724259a18aaf4530a7c7f321d0271d01db5b6c164f6e42e5a524f4a4b650d05e6a6d4fe52c980932f440c65d0d51d7e13309277d338ae973d8238c2915987fc5a04bbe76746125ee644ee034a851877b0d1fbc995565e4eb15b81e4dfac070ea11bc0e067ad22c9d6fcb48c7ea502e9be5cff890c13fd01ba97a8cd2398201d0349e3226a3c05a23c60c8a7ddbc51b719ac51e643283990e091894f23a139ab78f80f96dd97e8809215f4f6d219394e24403eefdc77aaab3e40cb6379612fcc90605d66c01bff65b1cb69b85311ceb4b3a086add21e5d7e27992535fb46997cf76c32e3691ea9f846582dbce38581bf9fd0a360794b433299333e11d1477345281b7bb281f0d4aa079032ceb526cc361190302eb3c6c9fc5d952b848e714f1c1b07e57e4aabfdf7baa0578c8a143cbe675c2beeb0c7379575e16bd213ec02f2b15609c2006dc888b209f37cd7fe6316077e551d98ef09caeca694afa697c2ab413d44c2669c63e4dee528d7255fe3fefc5730d87f4443ed5569652a1d6b20106611a0b0a1ad96596ee5816ff54f3e8da648cc816a32f1c9bbfdfed38d1b61ee85b24c4b1f6fdbf1a56a680870db3985c0927ea51e28fb50e4fd2a37752cc52cc7ffb277b0b943f1bedcbdebe60af260c83fc01c9f41da0f81f8dbaae9f2a0212401ff1b653a03f43e2e538de985ec4d9900ca39286e1e9396220a640a21bc82f76596dcbf7cae52cbfcf013277d247fe1f82214f94515648018b7d5422f87c091f422ceb645d1bb088cf5457b83951662c13fbdac36aa56f58396f38b3d127f688aa66f93f309778f9201b630ca0b1b19367ec68fa14f78ddf598442eb8528aedbfdf3bcd9a2ed177ce11be709de637d94b5bc0fe32ebd03c28f47c8e0d4dbf77ebcc54549df4ec39abe3ac1188974f27173908be7b4f8538fd4ab026a88f388c8ac1f29b3383193f0567cab4b35b6ba8978d660cda43c661653660434f97cd003b11e3cb335f305d73b0884c99edae6ab58f92c698c97aedf361d16f5882ae73451b357450427e0681607c174ca2f83340b80c22cb3b91c3bbceff6457e99a04d2d85b3f16e4dbdf757453ca5339c9892269946b113b4921200427573b9bdd74fbd66f1fdd5d468c94bccbdbe622c1d127573c3083604b46b46cebe781af28de128e5f598f72c1a43f9bb0e45ffaa9834b3e4404d674563d547d214615e2310aa321935b3c5e00f5ab85b1701227663fd43b234acc975bafcd7edcbd324ee2725e0a05603604605d73988b9f55f142ee0a1a987c8d952aa8999b9dec9a0f6fba80d392581b3190f58bb07226de893101ac0d431bc2c708b764914e178ad3c048e2066b3cdd0792882fa24bc7cf1337a6a0c0e4bad2ae07340ae81ccecbc3be4a4146f3e553609c66faef94ad9d8396a58a836c4d6f3c7f8331c98006947873cc83025b0dad43dd88e9f5c347908b89237e42d31aa06a61eb544efdecfd39dcabee629a357dc1edab4dde9c585093d936e9856c4e0ab3ebc66c6e713a4a56c0a33348d65a4bf50576b2b6b332c724c555ee501583fd834575e9d451e1e7fb70b87612446cbd7fa0de8eb044f7584e3afc6c430de57075ffae1b6ccb54bdfba9372d5544733ce3639ad0f811b803cbe260237f5eeb2b0d063797df65953c81974f0c1a8cb04aff82f40ae770875a2c6e5f7146949e7a91a2c0c59f161c4c4bf7fa0d60cc24108b9328b3f1f8353bc71c3b0c755d4709ef1f7eb831478679cea83af94dbeb411c1165d69ad9de4f297bad004ed68259726f8021159f5285d7d4001a4125f08777629a1495a81a331a592543266f581e4817f18507d129454b38ad5440b1409634249a4a5457cce9507a1aba3582071dd520a7fbd9634dff6d34e1b4af36cd61dd053b2ac136692b9b49f06689ac69aa7815617f99f98c472c078515f89ef5f849ef3de17fc173c49ff86405573635995f8c7cf7cff71d4d55ca5417c096ac2a4cfb5250313205c7f3c4ddefe3a921173911608bf6e653ae20d5b385cfa5b50dbfeb3892e4d0a420e785e7c0813d68330f0a0b24d0b49cbba24c80e474a269a8187f0891d804a96bdc2548d6d1d7d9056744528ae44dd608e2f75c979288147d7c1253d7b5791c0649470ca6c27f53f2da02cce05c4831094725d1625393c7b5766f559a638e95ac233523c7c8f39389f1844931c9e96e1392314a2d582ec9fb60ef32aeca7e3449a73d769ec767a4a31adfdd9889f74a771cfde53825652b6af7dc25bc4f1f86e295467f7032155ad3f61f002a0dd26be164da67ea2971e5679ec9bc1a9f45f76f0826ef963c99a962467f7c8fc251f64f0ff8fe23feaa2fa594ac3324f514851a4277ec1e812c301875c9b40e815e07a08e90424a4f8acb8fc84a01ff5cc58d6f920cf03ab0817f5c645db11512d9c189e18b1524339852a59ba3f465e7f3d0b706aa1683560c994b6ccc72ff34402fa45d43c3f7a7bb73b75733abe4fb9ab4d1763610b04c796543b05a62851709fa020ac72d2662d1c0d8a014b1720e1894d235e7da1e6fcf765a0ff3161fc49fe5db9ff777a06e711d15a927f431aa1ee6145af973a8103911d9491dccff033d71b90d1714255d5e87e361b5fa144909a84761f791dcf289475e72389f1b5db2ef5baf725258d6bf108bc153b9e8ded2d6e0538dfc50115c9fa94a82ac895acd465f3899131c65dccb24f848aaff39dbfda4639ea50140eccaae03f4293ebfb2eb72b16334e97957ccc5594eda4e30e8141445403e76780cbef7c28f636f40284b4282cf7da5918054d4320924dfede414c27a5eaae0fbf0b1172470f43c802441c0fdc2bb03a8be963d294e7721cf93aa96f7bce448d6380361b7919797ddf18eecc7fb4e0a8c727c55b3cbe0d58967d811b59fc93db40ef76edd514373fc5304dfb0968e10f1e5346604df811c02161b3ce864ac6b9347ad3dc8c363807460961d334410f536c892567cdc2daca3e7588356a18b2b2cb5f2e6b93899e3f7d6a768517be0fe8d395c77a464a3c14595740e6e8de4817b5ed512adc67e3fc39a59317dab3e3cd3a95ee1119820759aa9bae2f6dd92575d01762bb6f26e06e64de687697c0c28eaaf959110ceddd8d8a95836ff59fa704afe33f88343a261ce48f44aaf078fa42e54429eedcc7d1e02f18fd354f06674ada3e7eb8e97917c7b50f0bc126e24bd06f09d2f9fa282f34c39c46680d3e0211c5cb639aea0f44b1791a82688d3e68c000f9169006d590a7027626db2c50492c634d30b082c6a8ad5990cfb5d41edef969662aeed59a13176bb9c6c53265670da882412e7e69f441bdf1d68e382e216a67be9665d27c19f029ca719ddb2ea5cf9d6dd0c48399a7f83c00b0af21831e2d201e18f72a52cb1140b69feec40d81839c7a28ee692cf58ea8f26e8386ad14373d645e196b50ca7273770a301a442a231ac9a7a3b7a31cf5415aa46a4f0dcc8cb08a665404d4f12cab16ebb23fed8a732076f5155f248a1cc376e4507e63bf40d0580277abc83b152fe4eeb0c63ea3272fb26f12b62386024960fdce1775d0aae0bae936a7c0a0a5c78c8ea769615dca0c0ce46e503b372b8be14b428fbca8deafabcc7b083c5ded2485534c85f900d2d048c8fc39d26ac90dbd96f20dc57bf924e693f915547e03216ca996d29cd55bfa8d7d459bfdf01b7fcd91a80c919adf485ac477e841e134c1c9ae3e940eec725ca52fd0dadf146fda6f9b7f76fef00253c44c2c1a287773af1604cf6d2220ed92d95ac4bf31315db272b957125bfa6c55ae8eab304068ced3cedbbe4984c9fc7b4075a26e18260e2eda495f066245ac588ce26d366a1a9d1fa21b08556716fe1bbc6720557deb37500835c8171f0d3a3d488646bdc44cea69150cd0b0fc04187126144ca79e88a9d9b721722af9eaab28b335e2375c48dc652acc7ae0ee2b4e4e4492d5d1ae379f43956c4acbf66f7fea4d7360b1d3d791a6f71f5668072a2c44f5af56f8abd75b3f373595a606b692ea0dd21ef8ab3f2f5f4961504072379f16bc3e91c521d26526d622f3f96dd97b87b2bc99102d21a3309a1d131cb7be0aa3c288ef2cdfd92b79278fa653422905b8fdcd40776246b7d61d1e6497a137d70b878260bd6f7b8861639616ff18e10d6051a572137f7062ed3bd373e5ee7cf516c1c58619a904f3e9a35651172adb75cce0b0c36b6a2d9367c0415b48b1dbfe4b256012412283275f5f1d672ceb957e78a3951921a7f192fc142cf0b376a31a1964b563db2200dd108c64d7d7549edcfdc230cfff516f65e1d7f2676573a2a3dea77d79ed47e5bd67ea105cde73020e7e8e4edde2f1bdf0e92cd4740f219223af726bd458541f","title":"1162. 地图分析","link":"https://leetcode-cn.com/problems/as-far-from-land-as-possible/","question_id":1117,"issue_number":54},"52":{"day":52,"pres":["BFS"],"tags":["BFS"],"whys":null,"difficulty":"- 困难","description":"```\n\n给你 n 个盒子,每个盒子的格式为 [status, candies, keys, containedBoxes] ,其中:\n\n状态字 status[i]:整数,如果 box[i] 是开的,那么是 1 ,否则是 0 。\n糖果数 candies[i]: 整数,表示 box[i] 中糖果的数目。\n钥匙 keys[i]:数组,表示你打开 box[i] 后,可以得到一些盒子的钥匙,每个元素分别为该钥匙对应盒子的下标。\n内含的盒子 containedBoxes[i]:整数,表示放在 box[i] 里的盒子所对应的下标。\n给你一个 initialBoxes 数组,表示你现在得到的盒子,你可以获得里面的糖果,也可以用盒子里的钥匙打开新的盒子,还可以继续探索从这个盒子里找到的其他盒子。\n\n请你按照上述规则,返回可以获得糖果的 最大数目 。\n\n \n\n示例 1:\n\n输入:status = [1,0,1,0], candies = [7,5,4,100], keys = [[],[],[1],[]], containedBoxes = [[1,2],[3],[],[]], initialBoxes = [0]\n输出:16\n解释:\n一开始你有盒子 0 。你将获得它里面的 7 个糖果和盒子 1 和 2。\n盒子 1 目前状态是关闭的,而且你还没有对应它的钥匙。所以你将会打开盒子 2 ,并得到里面的 4 个糖果和盒子 1 的钥匙。\n在盒子 1 中,你会获得 5 个糖果和盒子 3 ,但是你没法获得盒子 3 的钥匙所以盒子 3 会保持关闭状态。\n你总共可以获得的糖果数目 = 7 + 4 + 5 = 16 个。\n示例 2:\n\n输入:status = [1,0,0,0,0,0], candies = [1,1,1,1,1,1], keys = [[1,2,3,4,5],[],[],[],[],[]], containedBoxes = [[1,2,3,4,5],[],[],[],[],[]], initialBoxes = [0]\n输出:6\n解释:\n你一开始拥有盒子 0 。打开它你可以找到盒子 1,2,3,4,5 和它们对应的钥匙。\n打开这些盒子,你将获得所有盒子的糖果,所以总糖果数为 6 个。\n示例 3:\n\n输入:status = [1,1,1], candies = [100,1,100], keys = [[],[0,2],[]], containedBoxes = [[],[],[]], initialBoxes = [1]\n输出:1\n示例 4:\n\n输入:status = [1], candies = [100], keys = [[]], containedBoxes = [[]], initialBoxes = []\n输出:0\n示例 5:\n\n输入:status = [1,1,1], candies = [2,3,2], keys = [[],[],[]], containedBoxes = [[],[],[]], initialBoxes = [2,1,0]\n输出:7\n \n\n提示:\n\n1 <= status.length <= 1000\nstatus.length == candies.length == keys.length == containedBoxes.length == n\nstatus[i] 要么是 0 要么是 1 。\n1 <= candies[i] <= 1000\n0 <= keys[i].length <= status.length\n0 <= keys[i][j] < status.length\nkeys[i] 中的值都是互不相同的。\n0 <= containedBoxes[i].length <= status.length\n0 <= containedBoxes[i][j] < status.length\ncontainedBoxes[i] 中的值都是互不相同的。\n每个盒子最多被一个盒子包含。\n0 <= initialBoxes.length <= status.length\n0 <= initialBoxes[i] < status.length\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d84c0a525fc6e7d3d784a59422654a0842463d9fd231c0a9847ee3b6bdb79df883c5ba5cb3d35d527a9543c78ef08b89cbc122e1f76d3e5445d4618a6afbe1ea309484d8843d23ce10961654e0889f348f2b93046ddadebe9f6500f4c659e51a6f0bcb01744a62a35469a60d858f1a80c2e5d6ba3e4d5622487139b0fee2b5748e858764b718ba7222ea0bd8c5c5d1e743305aede7f23796ef896771d4224a8f3f478271b6eb527eb4f7f19a1b09e1714bb6f0180544073e6ad2582c39f13b809f31a5195e655680425a09772b18ba2cb077a4df4243a620088e6ddcf90345f34d6e9ae770a93f311b7f88d40f0f003e281e9c450cb38551446f9323a5796b1bb6da61ffd38b99dbc22e8c94af90717adf470c394f74f9a53fba918b8b27d5fac90573f804d5191631c9f42a574da9a771ccce4d1ab4c64861d55098a1d2268573d426c599346e3135ca5979119096714f66c15fb13bbd0f6eddfb56503b52943b764dd4675263bc775eecfb46d21b1bfaa8db55f49fb53ff5128e84c479eb970d19abf5fba925b07ce4752746cfea32b1e487de71aa18e326cc5cfb207effc8de1c231eb5e072794219e8a327272d9392469c446e29d6df6cda2e6aee2c354a6235910460f7eb40d31aef6ae4fa199177802f18c21d8cad028781b552220bd8a20bddc018bd639cc790c55970a54b6fbea99c036d35ef74a90c0dd9d4209c381f79f40769732c90c565e3101b860b3ebf297b6bfc24168019595b3813a1a7257512bc4a81faa2775262eab791e27732fb587d40e6e1c297e7849772e7744f767e44f34a006d333cba2784f9fc52138c6de0cb4d380b49ab86bf8d23118e5d6fdf7e0fa3a53f0cf5fc98d38285d451b30e3b708d6a9972665738f2dc9a9b16c9323c244a75a8a68852a97412d738034582cc210783eb58cfbe93a712125da55339932ccefa2b905b20aade6770102fb2ed5fe15bf5787c95f60c7238db7d649083500e7041dc99c4d588fd304ccbd5d9642625b11e1987f1067423ccf4286dd8542a22042501cf7b109f0a40bb12c7938fb8e0ef12f9565a4b31ce8077dceded5b526c45258af82fbfb4370c5341bec3c140f2a82fd9a65a127db159e4725e9e0be471d2aa5901d5af89ac3eca6a3c8c081cb3e4e26f68d6ca7d5842de45a3d033a0bc5ec74bd4c768248cf1fa3d0c081c3640b2dc215f0addcc28e7fd4e18df3347bfd941897568033f81521e263a68129f90f1ba5a76ee797b4b47a48fceb92ce1e4627a5edd197ff06387d1820f22519accd3ab0455600edd839fbcbdb21823f70dddcde92a7348d1124a251ff1f1db62bf7d91a5d7cb281d8c4bad186bbe10312e1ffd29ed84ab64538e332acc9f9bc7ba987d28fb95a34aa987cb8b019abbcb1323d0b8db4243fdc956029f799e4c1060ca393568519b665d927aa5a591e6cf45d3188997799559af22c2e22b64f62ec4d1be2e3005192f91e04713dfe9dbbc2d19bf456e65a6f623bc18975e63e4a50d0b878d85b72d69ce948e602083f7aa9384503ec3c6fd3b68e0aa7edfc854e97fa92f1172df8855edf265bf3436b6da20256ef6155246d9385ab45ac3673640334a8e6c19d399ac4df552874dd18810ff3f885f87362f808271465276b675b0655a0e4759f8a9e237e6d10100821ed65f81d1604728da63dacc598379215f25ba24d4c5408d1a1fa5d91ee6392566fb173bcb0bba10bd52beb506b75a99066f4b84c6c55600607fcbb33a5049d7b5c4724ccb7e749a7f2e915cd00674ed09c2f3ad5b04029c410376fa1a36eb594ecc89c4c77163399d296a588e0c9a0a628aaac559e4d84e1d488453a09ac97a2f8c5542278a5b0fd337c70a43bff14aff3d6f5d8dafce9b9f35dd37958888524f219f351fb070747eed8a1f1d3750a844eeae28113cdfff434a7be19480ac008286efb0364c930a8a4b57e46cf6e5299f5edcee23ab22ca655f937004c8437e694a880e64f33918462c1119a5ec1155a822434eb4d137ce08c99ad94b3cffa2f9290cc36cda7ca4f90cdc03c64df76681f2ec362b4ab015bc205c86dfe61071ae9067dd7a7f8e199c05a5725f9c8a8a9c7406b2017c9c7616f8f6de0cff6f1327c0306fa3c62eaabab3cb60319be9efe311c0d8c2bcd2bb846662aea732a9f08e2b5ddbd7fa75ff00a118f38cdcabdaf945a287ef3588070f5a6ecf7e3fc0e564d201e345a356c9215d3b9af3cd96317b83c45dbddffaba2a6aa593853ac2c010e268a647f09e8a8da54147fb9a6eacc0def40acff1ff3bc62a3a864d259e69d38c2c595bb858f1846840c7afbed6975dee7ec00caae92c1a7bbf02efe457fba665b255d8865ab7b97f9d35cc6568a1cf321920adf0feed5417c1da8138e082e1a2eb910aa6e64afacc25d12bd6f98ade153f3c527788cea33476163d0019f5a4d9ef6f8df9b85d60017b4c901c3845d1af8436ac0dfdaad4b3374db54849d682e2fb8bdbc446ed0b1c3276fea6884c3e0aa7108a75f9b5917ade4157b36c16a230edc74dd1c9eea6bac1d029360e2b8c818c1bda81283dcc491106360cc9e1230edd75599dcc52e884edc5fac852988b53ce0071be9f19cc4a517d4d8dca6752885fcf354bdb0e347c8a03c5cb21cb3146cefcb4a23258f6859b926f50a3817060e3e583ad51d3e240eaad34ccb9cccbebe956aa999a4f0cacc467fbbf3d399e9488e111452f81726de740224f592c303bedc7d3b29b896d360c1a03d2662d09a694e47be2475d2260e0f6a685e6fedbcd926eb1abf93424264c90b5c99a0e8c02fa65165ee1f3b4e392f867eb2d77d633e2e5a3203c3b5dc1e74998dee0cb76db1ea4ebda214f7b5989b580d654a20f54a49b848f70c892db37fb66ef99691918626bfaabdd840990f93d46d95708089ac8a44bf4e41937ad0c3987bb925aba57c0d0b699cacb16cc98bd5a757cc783d3c451b3dd4e3ffba99ea7d227f3c39f3a347db7882cb20396314d1c77571667658472148463ca224882dc749c91c59d9eea15a0a660d0a3047891d04f1cbf8967e2fe9148ed65f25bf6f79b72d45cb6b9cc150f291406bd0274b5e37eb19e682229358980779c78d799e34b2b76df5dd08d190ee88b9a9d7b8e98c33d6fb16d2c8decb8c41de18fde4c50eceb6fc3955ac4a7e0d4e96777ff9611da6e4c3e500fa7196c74fd47995a0a8f96ee3ab7ebadcaf182785f928ee73c8ea6e2539463f78e120735e0561a42391a25f487a0a048242b3cfbae6782d89933a7e876e60966cb5098d120a0035d51093e1632fd53b9759911e10affb9710d3c684a059c3cfb5c1f341644ae22f77a5c7b19886899c40c27b25976615b89e8236f0ed2ce1467b55ce99cec2aefb5756b45e6ad879aac1838e5dbd202099d2ecd05bed876f1e3349f2f5217a88da25c07c7af6525b252a1bc5ce27752c4066f2591fe72e8b8162af7e14ad0573f1e8bbdb28fdb3cd22b197b5ba930956f228e56549fff46a172e65515b279c0c7d2538725f4c687c6982976314c1ed129695b5450dec2e7b0f2a1ddef30c7684fa1ebdd720dae92c2481b43bc5ce1330164b12e09a8c297c8133cfe2cd4370cf73fa53638199346e0e352a4b43266f64608ffaa9d887d9c5ca8bba296b30d7028afc553d3ba14517090d7179a773ae8727b4ffd98d9a3588a5e768576627f483b15479c238a92a21dbc58e23b0cb9f1ad45cf46f5dcb4d44dda0562b6cad6a0ad7591e08c587381fba6069365ab839f7733a87214711db1c428980ebc2b7eee6c4f73fc70aee1a107f7ece35ee7a9e73476f286cccd7ee3711cad14c426fb861e505cdf63a94e3fb6df5a62761553835475c125fa817855b5c738dad9ace24488ba78af8c1dc83bb17a9606707d05a20a4c685e5c49ceba6de75585437907471612b028db03948ecd8ca9102ec19e03d5ed649e8271a997872de967c6ff889c5b779b9178da37c97a22009633709b497dd4cd70a35132fceeb4ccd0bb33e15cb161e567317f3a71ddeb248ed870d1711933853fbc641c5314a7d74a35b7e44709a5308ca210924e06ca160d83d80afe47560706ec9c35b40fa3286011e035a68547b3fc2e6d282e282b89dcd2724bd2240cbc77dc9092466849c61dcae2d31c150df8366a05612ecd78d978d8381022e623f8d2529e706cf13b92b66ab0718a0b65f583c96ef92b7b189d6b5136373edf451abf48422a7ace5d89b8b7b3c24123dc959bf184c9c0aa7d42d82e9402c5e46d5bfed0b21b5d796dcf257a6c7577e051222817f069f9d7afffcef763a008c74e4298b44bf54c74f2bbfa9602a7dc894af09eb67dbff6f57561c590a91f042c5fda19cb5bd7b06f20d68529e5cc07fbbd0e364992444f9d4a557658b7f5f4cea46652c2876243e1a676aa3cde8ff96587bea927fae0f7bc8a149988e123bf5f2d8aa869af0ded55e423ebf858aea137e0340420570f019f6a6fd33ae4fbb1eb86963a50042e46cb14f0924f2774f8c1b65516627299b4d77c2b77cb650c54fd3343a594532aae4eeebf97ed690d5a662fba0ed4b510a7ea87a8817b3a1b2fc5e4ac78c91eded071c33ed163331c267eb6e3868b9efe29db6001bb7ae2283e08a45ce715e95fb49345b73963f2b862536a12627d6ca4b0aafa546927b0f936ff0604c0a49d93bd7bbdb520f930024ddf43d6b895dce4ac0ffd69cd3253d248ad4643a04e8eb08fc43503d19921510d441eb1dbb779b5223d22e8e9066639a6b15b29c30bf21c4eb1aea507f91c1053129906f7c1d8d1c1dd19caefc94077d4545c05d8f7eb4662f8bafdd1d702af71895faaae80e2f369efb0e511fe7ca66ea02b089ff8cab883374c790a36708c79acd91ba1437c7311b258f0fd6baa0f51be65137b934eee8752cece2d3fad8d7a093c163b5fcd18f3d0ac0fd69c79960994f6309feff6957203ba31770cbf8ad561e52c5bbcf6653fc5918e7f932fcd6ffdad88781efadb76138bb492ae1a86fc1813558334e125e9d047990949c92a96d4b8f15cb2e4f11669a5bd722a1c45a9a7f6ce7235b1bd008305bd187929472b3ed8f91f0918e9261f8be51ba4aa3abc1852e1f0d9b094666326a873be5ff0e15945e50ac7521faa777bcc78de1b6d987aeebac282e689e72f075e4c154f95957bd19751175210ca78c315620039ecdba0a1a660ad6e16578bbc24f96dffe440cb135935a9dee100868a23691e7e94c984530a76bc23a10a1bd6015506158123ac8878518ec0b210100d384837977cfea3fa0437d51081c482c111023de88e28c9a4fc84e64f212e5f2092fb49fdc7917948be1f9ee4f8fbd8735785414d049efba0bc0de2a601fca565162ed62f1a4654f6cb13e1091e956128d2c1bcc86950a2f5eafe690aae2fb5364efa959a0e163cd92341e1803c70eef56ed50d0266e1ba4be7b33d49b8cbf2261affad6f23cf052235436ee6ff7eff249c8d5e312e0bd8ae6062ca064c783b14668533bd3c2891075576812e8861933a7ec98749ab79a85a94a54a321b3473bee0c79aa8505aba7e740f039c47e3a680b7746d39a4ebb85b8db893c604948e3f60f388828109a8371edacf1637a90707a86abb8c5c1738f8e6ba2937021fc9b159a51be2fcb1087958f67121d734c6459d66de4e6737fac4b1663f2116f726eca1ee0d2dc9efefd26dabf5edd7ef78e1d7c32eb9fa4ce665d016750c002bfc99c0b49135f6f0101eb994235c9ca12b687a31b6f3f89134331a3f85690ae961d174aa52995499f47e1b75d3ac5f1e0d60221d38fcbf0e3534fa0ccffdf29a0735a56a3ef5f849eba9043fc45791aff9b40457f2a568eda809d35bb0a9da827be69394132defc88cb3b03423b767f3c4ddefe3a921135de44539d272b6ee2445b225cb315198fb7f2c54c0252075d207a2c5d409e8b7db1ebf7325b08cbae2c890a14546ec7cffe8bc06080418bbdd7449d7d147d8e56615538be4db31bc7520e8304289c47c7da0f3d7b5791916ac42599242fbc36368a2c9305c4831094720a5e6c75797b7567a457e375b90e9b6671357cd413389f1844c454d7daa4392b15badbdaa19eec11a96cabd9eb4d96738667bc39716838b6d7d9889f74a771cfde53c30306abea659400d9ecbb7e69567cfd1e0e14d93f61f002a0dd26be164da67ea29709177ba3c380eebb753cf0986eb22690c9ed6d1afea4b3771f6cb9b1dbe276eabffa4951c37b060b484db774638bb74eba7acd219b4bf515f57308f4197f9be8bcadf5aea01ff5cc58d6f920cf03ab4159a1c60b9e46292dd016851bb2140d3ade6227ba34461a2746420d66a1267071ffc6abc4c537f74a1bbf1c9b31343424f636624d37a11bcbee1e6c2a1c022ec796543b05a6285170d6e620a43c97311c5a118219181f3db5925b0f6c00bff0e19970ecb32126b9008748b5ef777370bb119f1fc5064304bcee0f4caf983581cb07b753757e5b3fc69313124ff9a0ca72c27e361b5fa119ba9a84761f791dcf28c630b376dbfcfac73fefef88603ea741ac22fc557bb4a7876c384422f5ef4155c0f6d5f62f99dbe9831ddea79d38d867b1fb1fd0ce99f9938c954e34f146137bfeafe21431c0fdec20ad3a383f45deca21b7279eae202be80ebaab9c9800ef442457b8eafeb811c71320b2757e3486a3feac86ee6d0a620a98c7ca714158f13fe48d7acbe18b77e7de44862fdb3ffb5b4ea13ad872d3aa668b07a6c2688131f348eac5e8b1bbfe1c8c3673d0a3ca6c5f9303edac7ba5b90ba64a99ff311912a86fae310f8dcdfa719dc52cdfa00fcd98969ced963f8a0b9a73bb0110e4000ea2b36f7c44b0df8d84afac3fecd0b2aaaa1382eb290b4b26faf052c5f7f556b7e19ab7fd55320af9cbfabe12aa30cf731e3d086a0714666d221e3de6e3c34802a5fd4123dc79e3e9729f831ef0b3e3cd3a95ee1119820759aa9bae2f6d886f4fda163d8a1b46842b33a715768ac086a2a9e6455a4aacded08da1a261abc6a949eab079c62b6d2617e49e5faaff72fa8778f7a5092501137cf7951cfca7e7ee9d26bfee1a37c491021a9c1f05be688d66f6cc300d6db18fed5b7fcfb3d9b3dfe278049b47619f8134e4de1ff748a0df06bb239c71ae1458769ee1d21cb0cbc7eb84dbe172eecf88a27390cfb5d41edef969662aeed59a135e2db9cecd61602809a882726f4e28b419c2b49ec7773b6f3a20d68f6cb6394e8920c36ab7db2ea5cf9d6dd0c48399a7f83c51beee38ed1664290532f72a52cb1140b6c2c4c40d81c5d32828e67d48a18ee1f27483c5e2132d282d42197c32982a3b356a58674d00231ac9a7a3f1ec4ef54913ea3e4f44ccd8f69a755c1e80ac78905e90b249e688442063e5054f2d8a029849f4406e6a9540d0580277abc87d5a7de4e6f9886aa36d2faf6f53a36288465d299ace3d3fdba1e990e936a79d8aa5c78c8ea7696106b24958b13c1e3b656ed8fa61428fbca883ccad8c33654454e91f9c771dcf8400cf890d9efc729532ee37baafc002eb73b67caac7e5050e2a4d7f393c36631a338f764aa7df207373c18159270c894e404eb6ac4eaf01e433e28c5f02a219d83f36d25ec774151b94b1637cbd7fb36766c5c8508ac4d1b8ad996b91bf5aa8eaed296c54960036eaeed56cac2ffea41f3dd6f168320bf595ef16732992b400e19bfc32403cec6e5a69566b894916406216f819d8e57b1e237ae078e34300072245f21bbe533b284fa10317134ed23d1f0d3a3d488646bdc44cb743534382b0b604513f7b7d03e9cac9e097f2654220f5faaa1dfa1abd4e4762dc652acc27cab330640e04d2fffbe67202826ba4b62d77fdb326cfd5a60f63dd9b8cdd1256aeb0bce5f3612394553e3eb8aef8e02170c16b0c7bc948b0f8ec6d661b49a5c8cdb58d3bd03391550ca55497ef55d01734a36a990539791db4ea9105f402bdd5d679239645077a21ea1918b49dca0f6cddadada87e406f85ede4822f4c1d1a0b9fcf008302d0fc2ce9fda169e2a902ce66b537b083da7bf496e383eb59e858b10e7bce6ed25a49428436c3476167ccf7de9264b064577f5f96accc6ffe3db0dae84c156eefecd58d84b805e1e3ffd8e3962d2df12bf39a3366f045442ddcae4965db0edcbac170c54ee7f70e8157885c47960d297a44d4097f80b0368b9e48dd873cb7f1dee3fbab41d357178b27d4db7dc30f226e4b8470e0d485f2c818d56125e723dc6880b98d5194adace73b0a29144f3d0748b441aeb0ff9d54fab4a603aab9d4e21d2d2cd2a4ab3261c58596ccaa7bcf26845ab2b12e4b0ca0141808ad0d9590718fc422cb6c3fa93f51c91edb1e920856624c981e08b67396fb2d2c8097a152dc6869f1871a04267ac41793ff260643feeeba549236b9adb38120cedb83d3dddbb61d2a4b48700978ae91dfeb2dcbbca0a03cb0749d53b6792ad56f812bf12eb70b6e46b42247f4b87875287599bcaf0432a3c8c9093b81aeb145ad82e775cf8de2345933659c9963477b6c0dc8b463a74d9174a9b32468432c32483b676e9c867c394f266da94eb3c5d1efc5bdf5bc474324232e473b3f67f03a3409c64753d14a7faf3f6359bfb68e3d4491c473947225baa53b","title":"1298. 你能从盒子里获得的最大糖果数","link":"https://leetcode.cn/problems/maximum-candies-you-can-get-from-boxes/","question_id":1424,"issue_number":55},"53":{"day":53,"pres":["BFS","哈希表"],"tags":["哈希表","树","BFS"],"whys":null,"difficulty":"- 中等","description":"本题和 [987. 二叉树的垂序遍历](https://leetcode.cn/problems/vertical-order-traversal-of-a-binary-tree/) 类似。 **因此大家也可以用 987. 二叉树的垂序遍历 来打卡。(因为 binarysearch 现在 down 掉了,可能打不了卡)**\n\nGiven a binary tree root, return the top view of the tree, sorted left-to-right.\n\nConstraints\n\nn ≤ 100,000 where n is the number of nodes in root","content":"096221c37c5f85fac03c87f9e42ff6164f863d84c18f29f07c663c784b585d2955978e2463fffe010b05aa43e00c74d447ce872661affd1932f016ab682478cb39bbaea21e1a1776cdce467c4918ae97b23c910e55698f7ed6d34f8da4e32a4dbea502d70bdfd66eacc2effa723d407cb6bc0969bd8a02aa33a790ad408370e335134b57630c1370f148e0334cc420b5637ae507d5e3833f8ada4306e6e7890b1f0e134032ce3fa7b5c99d744d88d589cf630f5bcbcffae2f80385dedb7bdfe7cd44c834c78444842b0bb2fe02a5e2f671b549bc9ee45b7180ac624ae0c4b87e543b7cef1922a02a75ed8f712c121310cde5db684a6122203a26b32130222ba5ef5b6b36ebe372c5015f1479e5fbe6e2460822a8fc329647b2f2c6029c8a779a511fc98f56aae8c62dc35477fe58a4b2795ce585577c894d40866f179e09e8799bc57501c1ead8a35238c40a481293012c245871437a549347e31e41b1cc970a142b1fbe775eb000f9dfb2e1d1bf795dee512cf168d48f300f67b867b4a3bb07be2b9f457675d9ee5551e06f29fb5a61874857fed1e34ef8ee5d4a43ee85ffce38e81e761558896793fa7866a6b0a863aafae7b4cc58b66a43a729cf4f0dcf94e478b8a48828cd3770fb414d2d3b6db18d1dab2d451d540371a30a1be169458c19c71fb7da121eca4ec8e60c731d49c796d6e519f4b403d39d279d3dc7ac12c4a7202d222b9303639268f4313c1b1790a547071710b08b27eb8b175c603d7c08af3a077152785a51ae9e80096d3266b98aa4af97c502ed5948e8fcbad6268c98b689d336335b5d31acfdf89ceb11aca2a63c8d1784d379a31b2484c6166595d80925e985453c3247580566a4a6d77d997c016961126a681cfffc53e6c8fcfed0cbdb867141f1115d66ad92a61a96082c1180f6ae359262bf7d8a572e9d4c5422ca4a9775d17b0a33fcd0e0a36e524f8e789fb761902245691073c43ec89c5b8bcc2b7fb680f43f5497da586be4cc08f194644855369669049dc3593de3ef79b5b62bcb6f1604008cd37552196046a07c00311be366714a2d7eeff859e8ec648c5016099bd110a3648e07d3af4f822c3987fbb9e70cb02c4df0c9cb8d3d4c8c6a198a7a0f654d9a739769a625c90796612debf483460b1f80acf5d01e5e4a0f4a212e3bce877bd8ef13f06b91cd853ae99c9d93300effe267b44d4eb146f90aaef2fba6e4bc87d51b9928d999a59616a8dbec88070da2b760ce46e46ef3487cf21fcb994a9f0e78e1ac0f88b6d2031217df89ccee781b22f6b1c6c6b9f2f3fcc3fd75d1f42b3fdd24e709b5691f6add8f8f27e8795a83585556fc18cb7b29c829ed7c4c9d4297e37f207aec3a7f01ffe3c2efe76548c3a37d021c179f0c52e958f6e496d877c2104246033b4395e80d90c34a9bd9f7134575acf366059fc376679893929f0774f5803ff91dd516cf6bee6c25426a812022ecc46fcc05a693430555dc51159975748ade7d129fb2472a315bdfdfd4c994c2e310b96e2a0439a0dd5575d017558ec750b3114e93ffdd2e8b04475e5de04b637e8636078ea8f8758ea4b49a02f3c33d135132aadc769b78579e1c652ce93538bf5e017460ffeaa13bc13318163846e5d7bae526d380e31552768d478a7d89dbf5be6a1d9f104692015d751e1b1917d1ec38ecaede641f5474b2a806d0ff145a35590d8bc88d11c59821719db90188202e4b5288a619cf501df351f9b50bac653a0d6aa16ffc0cc9ae8b5818a21a389beb8fdad9d3500cfa2cbb4bcfdaf2b775351eb03c7455d31ecaded92725bede0379c49728cffde36325814c100b201694b991f46547162f4d0b237405b5133bab48be365d0714f9dde1652a5b700ca7a3bf4f1509ddfdb902e55fcd95a4e23d80d59089999804d9c48b2fcb65cd79934d85520ae3e5dcadfcd06c098372eae7ac13c9d9f41580be2948cc50af2e4ade0043ed3dbea4ba6b67cd6a7099c6fec1c531be018b55f937c4c22c3ce2a1aa9dee4034888548c719bd40c2305b46aeb8e75c22b95dc0fd943bb1d5f22fb7b003bb61a5de4b93dce23f55ca77481f2fe04bb9a43056e932c96bf36a0316e60448d49dd5e19ced577831fcfa8ba9f45d6b292cc4db746f8f70e0dbc2ff1a6c0317f33942efa8861bb52238b285d833371d8d27d82aab516c2ae6713ea704d3a51529dead6dc70926b035ccc4b086a8571451fd65a378d3b8a5a5e368d98f8afde7a6e4c0e720fd0e28373cdb4ad3339245edf5f2838ba79e6a324480cf460a61d1730b64d4dc41c9dd0781e3a3f169a54de9a6368ffc46f1d04aa3d9545260f689ee88f4d20e3ced171199d11d38d99251a30ce1a9a9f8889378e90f13b72319301bf452d732a3ab8c6db90f826b9136e7a75fca86e026150d07fce70a687503f943a82a1abbfa865a9c67ede4f6e133aaf87911b28c53682010c768fd421bfbca8eb9b125d50702b7d42ac0a16b1cf76eae9efbb5cb52682ef433faa1257533dcc4a21b1cfad2bd14df31e8340773306500f4538e00036e55a1b36de0266039b6c1a15085823ca6b0d5f25a9f284616e898a817bfd6cfad8b9d835f69d8f56046e8305fd52ac042c153ad8539acb937a3575c622475520a991c096f6dc6bd5160739e1433f2329ca07c19fa43b3506c9fb04a26f423d993059b24ecb8a9d4888c999666e6939adb1b6db61d55604bf18971a784ea711634092feeacc38de9f45196ddf05acd8b67bdb9ff367512c6640cb4eef27c7209ab327684b2ef5c4486dca75faeab34b6e1feadd7c7d347653566ff6ee0a11d3048b59dd195bceecc27a69eaf1579aa96b92daa40b2e34d62212558010cc0badd1c578780e23473e53ce672b3a10eecb59c9755024e4907d18fad72d56c4ff70beb32943b839de5d4ac592317e78b00df46871ec01a7d9887aea67ebe75519969e5c0be6fb904a7a95e2e0b768daa896226ede0d00add1f4f073a6a37a989cacef2d508774c5863dde625d11be7f672537260b7ccff9dc4df5a61204a6f1aa103ac2dcf46ca3563d3dd9e592e76013b17468b1f04fecbfb87552fe40b4a469d28ed37b12ffe8d2f90bf0ad4600dd5848838849b86856a271c55cf42d46b78bb66a21acf6820f66d1ac9645363286d714d7c32407dd6ea53447a6fcbb309cecc696f0d844560259a936a8ce1ebda4dc2944d80bd196c623fe251c27403864dac1c7c7d7e9b042ba57d5b71fcb7254602bf0bb6e6d0fda6f4f68b2a82a33a6638eda75259d8ba9d9ea6068a57650f4d1c75b2dc5a7edd37673780f22ad06c306ca9771aa0cc8699b161bf19f13475fbeb6683300b1441f51b58481521dea18413a9994e4540015c3343964edd9d34f19b585416a5762ef738110b590b4b234a763bd7b95cdfa631e66132463feb01c1c821635c5f9503149cfbba83396bd2a4a2ed26b80194a54f2f602cab209606e6c10743ae290e8a823f4e8e4c00762ad5d32e671454f407b0c049e6c2a5f6cf5a7ee350a62c1d98d269546f2b1512268a4a605a3c291d1630116b86c46d1ddeb212ddd4823270ac1040574c0eecb14939cbe603bbd63a82c301259cf872efd0134b6d361e9be7805252b97389a5d54b68862fb6676d95f6646e133551594f3763744ee07e71650e3b1951171d3e0d97117c8a39fa8dfc25dfd895b75b00f33ff49475aeecd08dcf7b86bbeb61586645b7d3ed073bd25bf64c27dbcd9538f9efd35f9a1be4621bd6030bd2b75d6776ad7542971c0200de9b31188d60227303eb37bb3625c0680f52894d0e8f8cf1dfb9e9fb8ff718d907ee41653b69cf3dee3e9e7e53126f6c9f83af634499aa057b6f6de71f9c7e5efc2c6c19ede544f0e19ad5b4dea5cecd27f5054a5cb02d0fb0df2454d5f29bb58fc885ad44cf294b099c0870f993d3a1e685c1bac37513116ec30f381c254e81b87e4ceb8bd6c24deb4de8270bc15d8e6254de2c3af4867c73e5898ef220ea6c80a557928c5d157e641ea0918649980a5a5d689aa366864eea6d6e826bb590b7cc2b32a93632ae2554848ad72bb7976174855d9c8dc6ec66ebd2d2c47fc0f82d455d2cf432f471993f91a8f937256443d59b13139072f2255246142f00333fdefbd2d1b68aaac8dd7c3af63e4ed8c703c323387b84df2e92fa6c788f159be129f8131099dfa0bc82b0c51626723e9e7f2efd4fcb02fb6c62ac7e5be4f81a107cf2aad6d5fed193e668784b5b21c77d790fd1503d4d091378eeb6ddd0bb17aa7bd8fb03ca2e6c912e7db5dac9a3339d6f8ac7250a514841ec6f01a2e1a4fea648878a5c16e67d5c7395a0ba3ecf288e11ab53b142d58ab892460023c84018ab658b0b6d938630541c581127e14f054d1e7b735c2e48d6d6b1c017be00e5de699641aaa7253b31fabf2bddd39825ddb0d7a2bcdaa2c4b8d5772f2f571ecfb50d00844fc4ad2220926003a1ed712a46462c3936a7d53b2f01f6e0aca9675160eed2cddf18ba012810800b8be51ec32d75e5b6c4e96eac4e2036fd426182177f5c6c0329b74db852f7048e0f41cc7a89e4d2b1fbeee725b4f518613b10c47da4e7e4192c0116c36dee4aa3e2e4cc2102c4e7f4d784741d7fb330567af8149745653789b47d6a7f632ffad123e69bbe00856a37c0d10f4a593eed1679c9336ac40142a9c621508ce405a727ac32c55ebb8a92d9","title":"Top-View-of-a-Tree","link":"https://binarysearch.com/problems/Top-View-of-a-Tree","question_id":416,"issue_number":56},"54":{"day":54,"pres":["动态规划"],"tags":["动态规划"],"whys":null,"difficulty":"- 简单","description":"```\n数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。\n\n每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯。\n\n请你找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。\n\n \n\n示例 1:\n\n输入:cost = [10, 15, 20]\n输出:15\n解释:最低花费是从 cost[1] 开始,然后走两步即可到阶梯顶,一共花费 15 。\n 示例 2:\n\n输入:cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]\n输出:6\n解释:最低花费方式是从 cost[0] 开始,逐个经过那些 1 ,跳过 cost[3] ,一共花费 6 。\n \n\n提示:\n\ncost 的长度范围是 [2, 1000]。\ncost[i] 将会是一个整型数据,范围为 [0, 999] 。\n```","content":"09613612cfd488c7f63c83d7e527c7f9f538fb2e95f511ac086675266200002e1f120ee1e04ef31b000b9375ec1379d746c7801b7d7d4387f3a827f1371e35a70cdeefb5745c2b2281f71b226151dbbaeb62bf491b7de5f45eb131daf7b0f6c2162eca0c75b6942a2c7c0471e4d2c7b031c656263946f6cd6da8bf827da419af65478faeb180c4b4922caa3edb08ec3bbc80c007fce380f6cee2237ae5bc1fb1d7b3762526a0eb492d434ff8a06df2ec8a6d4e9f05037a3db1b506f9f1f4051358ba6711e2c50ecaaffc6e64e74d77059f7cbe62f9c11a2dcf2886be690c3bc295f9b43ed0ae5694fd030ef6a4fa87d7070b6aee8cce41652a6dce2a6a4b06e2b771e5da80dd39b60d2e53738a5b3ffb9691a56dbc2fff0c8b9da43de8e27afa0c01afd267c0a4d0489175173bdf287d8dc82f377259c60b051baee01df768fc7a65edcc1e82bea65f2be19ab8d000d3cba2aed8caa7bf128d648e8b5b5c52ff83f7ef77a08279d9545963255955b696388ca628cb1a037b9eb57c3fb0ead21d28e7170f087a86a64b20a3554cb15405da6f1898e3991de9962f77d330274c04a59f41706b3f8a30dbdf2619a2e9f4412c2f1b2916bc0e0b790f2bea610de680e54e9767388ac73778fb7d66263f5e726ff6cf46d1cba883ad428dce6169439018e33d7306fd8d1cc4c7f033710560cc97fae915e6b426ef9324bf31cb9813d198201a1723b50ead05f11bfcce88f2426a9aab91c15e0cc2344df781e1e3c49e7ad394c6caef85b13c766acda4c9e613652e5f0b5cd704cad5277f2a13ab6617264013ba9ff2c8d5776c0d692fc543235abd1dc02945a86e9ac81c2abe891c3eecb91b61cbdaead0eaabec3ceeb7410fab93f6aea2d85236603b8170107c76791c4d21bfc12a8fd69b701666d453d6c8d84f2f23d349a54c974cb9c11685d0c063d85f24e1156d0cb7abd7e33a7d2c23f954009539cdc3a08d36b23982c06cc68403fc5a287efb0999a30857ad6685fc8a488de09e9669035949d53ff1ed7aaea528c74f16011781c957500a53408775e3a39c2be4370b351b7e5c7ff04b89d06d4b77a1bd76b9b1df30ac1cf38c200b84e295e00eb9aaa5395b4b21f9af10bcbc2aada6c08a32c722e9cc7cd85bfe674eb2e11d97ba52c09397b21c011e1f2e5a2c66533db3b7cc77643afdd7cd5ceb3288d0bac43d5fe4488b37842ebe06cda3d4cf8482d2b009f245dacccfb157d5d6acf1225afdb6279457b03fcf1a22fa58a8ba1bf20b1ca7bf69e192875617428dbb964ecbcb87a2d5f95f9dcfb1b0d6ad2dc27bf15ae3596fba7de3ac67fa818811f0fdb7490c444b3acf5bb3b476fd67d68310e25f58d1e7c9793a7b11276d493641c79e6d3a6c010cdd339ceb5e3faccdf5bc4dafa6ea5e293674bae71dacc34a8dd6c90b46538cf34a3591c64d6786bb9398247ad2bb3ed90d12ef24f13b8df0a5c582040dedd86ac60e8c9f4b2554eb4815b87e7fb5db7136beb24024f4eb65d5e0f594cac91cbe69ede5ef3c15914c87d2158baf0e857607baaa8d24de54590eea78822266eb8049c82a6377ba98b6b117f8c402f1f5e1201297bd6030e020075ff95f66a136694f2f8cd4c544ecaaa4be90807c4d6f48ebd6a0e6faa395198964f1496bf6ae6b1aa30845ac2c5f53021b1919d3c126e1bad765085d7497ac0cf1e31a76315b0d87c9a527e884f6a8333adc089194d104edb9834990fa1ceb5571b1cd04116c30941e841394e490c2f42fbd38b5e48ec0dcd8770afa19baa6414f3928095404d64a42de3f7ef49f8b2959e6e45208c2ec7cfdaaa95a63e86f47611f70cc8dd4ac740d503d145d303e6d8073658135f5151860068680cf2e58771a4a80f3fc767174cb84eb33a939d7304a649083c6818999980ef5c48b0dc767e97d9c64935d14cdecd1a3f3f45b098342ebd0b913d9e6f715b3719e3fb34bcd65629f6e598f4991c7d24018b26623f5db87bbe55efd30e328e755bcfb4163d1d6c582981d14274bfa47db21298a222e1b9c346aafbfba47dffe941abbe8e4ae4f5b855a08eecb05cccda963548e09537b66d7ed380e5b2ae34da04793160d70880618af9f8a99a48502675595cbe1fbe22632074b81ed1c1d8f07a5cd9da429d3cbaa855f7f80cda153ee225bc398bb7a206ed504b244bc322f3a4afd91e475f9c0723fb6d0559a6628d041f3b5d296cc071614826ac53bc302a5e32a8000192523614a724f3f8871b4b5d964e716bd12374dfdd172495c2a0bf186f34154c4f6fe3696cdc1650aa78a8812eeb7899715ba19b69545e0d40aa5cf3efdc335215c9fdffde7afe5604fe47b79b393450794fd7ad56ac0c6f0efe1d173807c22e06e367344d4398209134412c635c14ae74bb16f4382076d3f9efcaf20d633cce4f7de06c222a9cd606044ae5dfd3b277826936852cbd92de822456c4ef3009d7d4fa5dbf2c39967943c52dbc45e9ea50847ddccea0b5ad4b64c3171c857a394682017b9b9a4477bdcb9e405aa4ce8554e6f6ccdb968c40290b60d3d85da37fc482506c39b9d33c1824307594027ec25922762f30e29e77d02252b8493b75d7beff5567aea154f1296108a51df7b0ea2330fa564cefe6a366e52029011065b6eff9294b4b29b0c1ef27e94db6764eb8a01a56cd0e0203e4a83beda34ef7ac3f3e0f7025425ff16f6f7eddf6124bdb682cc34494df952742c092e6b99883a3d6041438836a0ba6ade0729cabc8cda3e691fc0591b5b6a902f6e69ec1b1bf4a5a43575ef86b4952941dcb1d7f009052e188d98a7a63ae7501ef2e7b9255c7632682f4c9226b4b91475b592efaa349d3b0a8ef5b9f6d3d5d351403a97cf706263bcb77de17cac532dfe44394a6f9dce8fc0de3adcb254c025c40dcd63fd6daa7f64710703dff1efcab74cc94cd48c7195ee180f6904e77bd5cd56f5004002c73dd05c38ce95d3c56b3a5d82e3112014d11f8ba1adb09ae928700c08417acdfdeabafd6e23824bde4a65b7fcfda3452b81e288919fec88a7e18c659e2cea54ff0febab4209709ce796c98cb5cf6cd1c32b336a5381a60fd04402806bee3bf52fac867ab4ad2cd46855dec0d0348486ddba23531c8c56be529bb106ce50c44ae7e46de8dd73c09cbbd4d3c5a6b8b7cd3edde107fad9bed0dd7ace08f1f5c91fdea6c77a07ef46690a4ec27719820e0addbdcfeb60f649a4e917da769fa0bbec6fb6ee73d398fe777485e4289508b5e61558353d0655966947105135802389881e5d76170cdb12b397c7c1b0a2475a9da0188993874b729f6adf94a035c9960f4654055eea77c83ad79a7d06900c928dd1e359c4cf8d9fdd191f40de6828c6a8e2989b89e751d26b0ade320baf89d172bd9614d5685257829fcfcbaef26303db1a089721b2b8deb91d861b77cebd9ce915c79c621a650197872469c88475eb2b13728dbbb38df2451ec8314fc8ac68c6ab1c7bdc02b7564e14659bc034047040b40aa9d700aa91b2d9c24060a16dba2e2bd6b923063c234357219b4332390a2e0741626e57c1c47c5898e5388b95ce3e70e01c4857512ea3e20c7684e71ef2cd27c5e84662c2db68c5d3134b6d605bd8b3cf001db5719bb5834e748e7cb63a2cc8d57c44133551594f37272466b54f3776423a0f7e067d3e5cd247338a3afa8dfc25df9edae5531af827b2d327faab8ac2cf2f86f5bf265e296fbd94a75d33f828b900728f84da76a795a816e71bbd27109f1e4cdab1632625e53915e61c5b4fd2806b56dc29227e03fa4ab73630900e4611cb0150b7cfae96b5e8fbd5c814885fab5b633a20aa72ba329e6e5a324c6c9f83af634499f8406b3a22a944850425b2517733ede544a7f4f9c4eaf4b494a70ddf751308f86241b0bc6b10d3bde393cfd88aae1df86a56469f1420c699d9a0bac5a4f4d95f13116ec34b7d5a250381b01d53f78cb5c04bf20fe8274cf613e52b068d2469b1ca3a7fe5cac1a174f06ca8975489a4695b371954f5ce961f90082447429aa366864eea6d6ec63bfccbb7f46e1da77077e03d0be0829464e4c3687f9454b68dc6ec66ebd283ca7ac0d378761524b821da32ea73c9eeee7476607796e61213c234a85b2957690500333fdefbd2d1b685a39a9e6068b12207cdce199e4c306988df62d7b4643bc046cfe822e91a5bbd9ef0ecc7fe811e2e316bcc7138e473ca2bf77132ae6415e7bc5b623cd5bbabd9fe95c39d21271c727d9538794bdb4c3a113f1b55e6b3da9db053ea6680ad1eff3752d27d7af388d8aa24d02b94875b4f1c1b49e5634ae7eafce6b2578bce5946c56a4d56c4f08777ec0bae3144975cc44202b99344c5c56e4e0cb9a823b881ee9884b18ae8d0cd484000791e4e65503e783a420ccadb23bc21693be453ced60c5c70cdff59e3ac06cc1a4264603e416b5ff39870795f77538f826d7b88389bb14273b4c8a93015bcb6d8aaafb3fa11b46c3e6a89d43f65146d1faff8b5b81dca401c71f724d5b40991647087ecd58e10b60e692e83305bfd654309ecc1e71be679e25bde1653ee78d205305162066473beb0e1328dadaac65eb6e8e61d2e1e1fc14cf44a95d2e4cc3702dadcf6fba0780473b1147c7ad3169b6c53389db7b8b9ca621eddd01ee598b20a8d5c0dc3ca2e496616ef364ec52d53c51d4fabe30952bcf4079f1c6f96087c","title":"746.使用最小花费爬楼梯","link":"https://leetcode-cn.com/problems/min-cost-climbing-stairs/","question_id":747,"issue_number":57},"55":{"day":55,"pres":[],"tags":["动态规划"],"whys":null,"difficulty":"- 中等","description":"```\n你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。\n\n给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。\n\n \n\n示例 1:\n\n输入:[1,2,3,1]\n输出:4\n解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。\n  偷窃到的最高金额 = 1 + 3 = 4 。\n示例 2:\n\n输入:[2,7,9,3,1]\n输出:12\n解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。\n  偷窃到的最高金额 = 2 + 9 + 1 = 12 。\n \n\n提示:\n\n0 <= nums.length <= 100\n0 <= nums[i] <= 400\n\n```","content":"096221cf5b628be1e73e8bcfe626c734748e2b8a04fb2c860a406f254d170e043d310ec8ab1a6ec9ebd627f465eaac46b8280bc2d829199fbe23f761a0f8f223fc3b6776d4dccee61a268fb7869f5f7a25ab17ecd7e24c1bd17cac2e0e245c6bded61e630be4d56eaed9cbf96f0d4e7fb150a9ebbcb03d49bc1f35508a6cde67f39d14285a534d6e7ba675b947c001b75e7d06905425255bcdca3379f0bcf03c5a772b056be2cc2d6b522d81a1196f5040d9da9e18177a30a65a8d4e34923199b714d13b0e46aa0de7c7c1874ae4751fb17daa521b6cafe6675c0425ae94b7c3a1f5b403d64ddd2a3a6f1abde6ebe87fa2ccf26b80e35365396fce0059451bfd5ae1015c6d753a91032169448d633d3fc695e8308b6ca238dae1a447bde2089f036ef7e6048ba0a228b43f7014976645eb9e2957d9c402b2a11484c71fdd4df97568e3dc21612372d9c35499abe50eebf2ada3d3ca94b9128d4e8f9d4a5d68fc80c4c37a9fa972dd5858663e555e8d942783ac15f01a05545946d83e9cefdf3d1ee43d160a6f99a66a14a37c6cb05c34d84f1d96e5bf1cdfb22e78e731357705a9874c5975319c08d4f0271898c7de5ed1a9e8c7aa4fd70d5d3528c97d0cf5bce64e86a8b426c72d7af844712d3b737878c022d78f8da5ddf74bed9549312e8d77be2b3f5bede540d6ae8e1c0d4377a2c2f8ab73ebd365efcc4799769aa453919d4947307fc831d65cde649ed2c797742dc0add091734cb612296924e2e3c59f6ecf97e5f2ee878f3f574dc1b8f2e536712f671d55e337cbd90c7f373aa87d062b7c27babde6c9c45a60006623c9562247a51fed1947857494eb2e23a0aa1218dbb63573c8efe614b6b7856ce3f83c33e5d9f4ebc4d0fdd42b11d129033b0a74442b23e0af21d58b98e01f7fe452dfcad44a052ee96aa7509642a6fc179cc1cd68de503adb13653eb5adfbe01a7d202fea5b10b23fd3d2a7b0145dbcef84dd698a27cf581d5c3f83f8fb2ad6412ebc8bd777083f02eabaa4554ad9eb4758c221ce71e00a750664d9ebd9bf6a6906c97980d49657a3195f5233f7768c70a40c802f792cfa873f39a8d90ba7ff5bf9bea54156192f5d9f452dce998e8c5711a03b77a01fb3df8ae578c805ac7dae0ff2fd89e7fcbd4b1227470d5e06bf0d2207c2040ca2ce937bd8fc28372998aaea08b7262c554937a0af4dfc2c43d10cc6817b6c596348265775a45c994f9fab8bf9d4dfb3f01162380b67cd450adcbf1257bd72e4f41187eca26f30c53d3b0592acae6fe791fd1f791daee9e1646d65beb3cfa014c3b47f2fba42d2573fde1fb35fc1e81a8c1667dfc9ef56327ded0e7de55077c78313e7534918464fb2b0c90124618c88da0127feffecba1cd9fa2a27bd758f7e2d1bce69f5cce4c55076fe931ac3ad41f09ad6ab97cee7947762f1cd11309b225ecd2c0da3b64742be12bd6261cf54ca3a454798ad289a609e55aaf52e3d00b47876e56d17e3f7005d9ac7131d49fa781a6e59575d43d42acefca6bd6f50f85f3972783de14a37fc04b08b820ad553512dc04492e1da54aae51d4d1abf596d3f72d97f58a4c6dfb37f51e94fe0eb478480bf2bc9876e83c5f0f7375413ec49809fecdcaa475e7c5853bcad834d6e1df558d73792411933cda5fa180bd2033a03257b443ba709ba6c5028f3eed7bd35658a390787989cddf95e027ce7461794af2622d0099dffde8b085efd4a9ffe73ce143efe4aa2f1eafe4e9c699908237fa6956bf3ba4c630c393351bde77cbc58de240b686981b1eb5eb3fcb951bf513041a8e1e6e44808e3ca9347366f2b54bf287209acd408ddfcf5140f1992859b750834ff4d260480304d171e4c94e55ead97aaffde42257bc3dfb227706def63bb26f1a4d63e4569ffee9ef456e642646ad21ab768db3fac3b74cc9989bc8a8a4d57c640b6babf7eb5ce87489bdb5155bf17b24f0bf34f3fe954f085d91579b83952d2b2ccbf8a0ad755b934852b8f9e387bb681d6daf7254b85f015f57ae750bf514a38fdab893720c536d7b3cb20dfb1c55ad0bc600d05eef804d1e3a875588c3f517b42f32bd1af5a15d14da7659319157fa31e17af9688bda487305155b1dee1e0dd2a0e0da426994d30c55587b1cb9045514d6ed96505f2c9c736fa5e3cdbcbf9504903fa72d862d56e267fe83755b465aaa36460e3c407c4554c825d97e4d0c19612496e9322b63f4f46bce3258d061b11176d62754f199e7c9ab8d963f210b70b1644eecdf39f85a6ae6b3f6994c17e1669e5530b49f9de58cadd0cafe2a7e8678b73e8a22b8ce45df3d972651fbadfb21b0c1161338f164484306cf8cc7d7fcfe8288b50a595cda7bffe27da757e9b6e5528658751b27591dfd259fd54a13ff011a7cd70a4edf74e760f8ffc0877480e46ea04e73667dbd1c028a002aaf9a79f0cdabf6f74e88223131270986cbd0a2b9f9fbcdbfc07a05420fca018bee5547f914c3994c6bec574472ef71ff88523750df6c798281efcfeb02eec32ce00832e25fccc36f149d586d6bc7e7b36c16a2606e19b9728cbb259c1b5a19867d45448529791d571be9c9cb3eef18b1a08e192b010942c1962ac51c074901c2b13df7c942780e3207f6333638a73666a0ca1b405365ad76a1c69fe5f37b2b9778a0083a80c3a9d94a346ffd262b64c77fdcef8c6dc8df321f9f6c5dd6002b3712a68357e667e2d407b733621ccba4d657a292e8951c6b0df31899a0fd7989d626c78a54766cbe4902f7a6bcc26dd4b2a26c9af691a03ff7a6add5461426a3c5e19fdd0f32aed04b297454b52f1d2eafde2db8f4da4273dc88f37543f2eb16fbfc65b6f0a26b6b34383abb36773efd0ce7a1dff76934ad7eb008beca8fe0d1200363235cbb64cc56c844f9550fa10d41433239c942f761c1d0df62e03c388785010a4e0e7ba22eb440bee7a09c38f7fb72881a54c308ecb0f45d664758bdcb55acd543224671911f6e3cca398fe72297b3d34d4bd47ed670a21e787b4de1773d5da9b8bd7f2decc938421ce57a354f20fb09816790dd2f68b9aeafc812486d11f713e6c92921584474ed458a074fde03b2ead5a3ec948d29d417919932806155bf7b4ba57e064d9567ab550ac18ee502bf14419e8449cbfc0f8afcbc5ea08cf3eb213c598b8da8a1007ab6c3244b61a3c2f354528938b98e72bb39f071c5199a4b4be00b6cf6423864e8e1d54587e9f22ee7a96c6ba0e0fcce425951ac8a6dac49c1768c1758af28fdcfd72c51a48bbd78bd1c124dc0e634204313bfdd20723f2561208fbbd11bb102c24fd5e66c9dbdec2a701eb008eb1f5323ad55d8a9c99bc0c8d8ac382c10f264cf11c3ba4d6b6c8c893e85e826511cb2f1df3919866e2f80ed573471cc090d1cbf39034de59abcc0cad2b093754c66093da461b6326d21e77eed0c2e42101a18c1e02ab05c7f88f08736c482e809b21c5ce0143ac023c84a13f8b57b890a6c55f58be4d7a44cf0ee09463f4bfe67f3ca52da7748f20588ff878296fef8d96a65786a58afba9f4f0a1fe854b12b5950218dd1739e4f8ff549080a197c8123b97b9033acb3b10d95a05de6b90f175c5c5138cd792d82c7145f2b833a3636e2e99ed3a927eb78d1152e6a99d82511d1f4c7509da1f96f1dcd4bbffbcd89c924114ff9964a176444085175e34b71f03cd66cf9627a3fbe3cdb2a91a4566bbb6f4d77b5904e5ac49a493c4ea224d66d62b43725fde4bdb3420da5000ce9a0a1225e6370ab13695f41109b58663fba1b4834af214b9b05bf0c89f66c4ee7c0b3d0c393b12ab991dc812e11a347f7ed472fb32836e4a744c0adad7af214484aa1524455aa10b935456b0693819a4e559a7b9c899b8dee8d4a972b8564410f56348e4973f54dfacc2b08fc3e0fe4491665454984774f09bc5f5f38ca9a1e97513536ede0f555d7106c6b33f44ac99d68702f118ec3a70cc3aa86216d73710f4863d73f889dab76dba77ee832df78d6541363613f581933599063077425f25c442d640aad426af6755700fdfaf3bd6b140c08a350612843853faf140cd3a4a4f76af5c46464e935615cace83a234ee1aeb16df107215fe8982c31a37da882f7b94071c4fdd96adf7a2703e7a41b6ace4d99725423ffd9c5b13cb1eb39cbf1867eb3e4ca9c40715ff912931a4cf5e1c48285f73458683f4d744b4ec05ce36c634cc90c90745ef3da191b3780b1e525a143b54a19d80c6f62df5c1cc51a3db80d9e0e15174551f419554fe4860d37ea3bd548fb13f2d302fd038ee0023b9c19ddcc752acd64b7c221c2fa56906b7b479dbfded59260e8052e20499ab0df1c77902bab77ec6c5794c298567a60b629198d3fcae977e2388123d2a73473327362ba2c4c760805cbb6911338d11dfb974513a9fda0bba999b649bb6a4d380affef5fc8e517470435086aa6f5a9238ad81a7c50dcfc6fdde267b460e423b69d3fb70431d81681f6cd8f161f1ebcff03355af81d7f822c2b536a56740a5ecc48d1ab032c7c1f4695b28abe05674029f53bb35873fea3cff009e54f2e9ccb7ecf4ee423811ff84aaaa29de7e6e13c7baafb40fda668f33644b00da953602311466e9d1b530de8dc221ae1c9eb1a3392777241ff5f22441d40b5c71ce1fbbd94038d2a6d4b025b5b541d6fe53caad6f6683d3432c826bf4e378aa5ebbd6dba0da31490c6897a931c6c21d759bc22a96568f4d0c5e6824b88fe51f78c0f5e3393592528aa9efa42bf6d561d13f9c37be2993b605863620d5a622fbfa0724f463c8534dbf63ae95540c91e9b522bce3ed4998975872516a17fb3201ca34b94ae226b79429ccfcd0d19b68a9193f05678ee4c81216a88a8d0b4d8e0bc865626e304e1ff299002611b0f87754685a26e1db79d0aced2ea7abd4c6c28401b4f32d9f3a25d2ff59591b265e3b0c3a548366600179faf51e40af13129828c086e593812c57e29a15afc371620dce9b9f355e79a95832c9ea6d2dd1f5d8c4364e3045b39fd0d5f33da5cf55508f4d5cd19d52505821a2601692d2fa8c2aa5dcc871f049281d03ec43b449b29d00961b34e9470c3a8e411f078cbbfee86efb92a5f4bba1d1d25895c950d7fc212f1e4b8ba09fb1195e66356cd4486c06cb8646b5d13087c4365ef06d3d095f0a1c2e032d4ad6bcd043fb1acc761f9b68819766cb9483c2b9c94149b89f8fc64a7e7f90aea1b07226de83384ff717161fdf9d4dbe6cbe036283c7c041b75e3e7f9f07929f05af5a9ad43937a6a081f2a1d3fd006e43bb4880dad796506f0fb4a000788b4ceae394a08c8f96b59ede6c453c6655ce798bdd46d7301c98d6501544ad429096d3bdda15e9dfc86d3d07db4ce56860f04952fbfbfb3b93e4f265812c30a4fbd611a6d51c5993821ce9852d1b5efceb8570722527241b9cfb7c4acd5b13aa4c62a2f3e952fc59cc4ec4501583fdd21030bcd702e3a6ba63f16b131029bd2bee988bae0da65f4e66a9771253ab6c393a7889a969dc784619f1adf281d3a0ae360b326b45a51282ad602f6c0cab5901066ecaf565953c81974f0c598fa709b6cdeb57e93d8a5b2e6f387175c08b64c1b48dfd9f16095c5aaaae7568a228109a8338a3f8f12e3b98417e9eefec80c63689d002f6dc223db5d541840a947c9f51d3c0dc6b1219735b6544ca71eefd757a804b5522bc080c6a26ec5ef6d7b5e0c1f66ec4b5538952ead611284cdfc1e28e7d410c7c138e7eb9c68917480f7a650e00f08211329db40ca881a31c6537dd00453deeef7193b0df4e551fbe3fcc1dbc5caeaa682795a39d964c6599c6c3f2d5063de59ff6df728a735a1fe5ef11cbcaf39042b1442663ff864055732a1f95f0809d35e94fc9fd75a13c6c3e5dc2b5c69f25031320103a720a8ab63a8f113fd4585bdb3b2869eb275b385cfa5b50dbfefacf2e014f0c497d182c405d9e9a679bebf7325b0882e82c810247007dd6cef8a2c71dce1fdbeeb944f0471d7d9056744528ae01d5488248248304289c47c7da0f3d7b57919036d126ca7127bb6a60f3578378ee831094725d1625393c7b7d66b60cf438f45a8f2f20342cdd7c6e93180a911984a1b544223ff3dbc7a1cfe257fb23e58de302d521d720ec3f6f6063ecb39ecd9766ab71839b1d84574ef0b51c940bc4ecf83f271235b84d755da4244bb357f2d126ee4408f07ebf97021971ab9b9be5b9757df0cc3bb430b2d3eb2867b4dbe17e136cfae489c876eabffa4951c37b4f4d4845ed62639fb155e942d20eb100a855ca5002e3c1fb233e111a391e26da5d6a9e68492ac529814c5967719d57f1bde805b513f343999ff618e5b7be5b4e742e4268006666afeafe07006e4821bf1ee894258054eec17e1fbf6e250c59e95790ab8aacfba4ae970e14ecfcbe28027b7dd69d33b72b99791a4942cf1c19043ea3825a796f34f686f4d131a8f36235b611c014f1b7323854f85ed210845c0f17a5f91654ba802097c44bf2167033442ed0d4591409a0858733912a734950f116dfd8c833522a12dc3b837baf6cdce1bf9828f3b6e0256caa08b841b2587f97a7c7316f0835dfc6021545190264f505126b3bda357c19da19ec1c027baec3d4c3a6a69a493ded4e4d00e2acbb1c1982fdfd30ac2a257000ea8c3d980ecebe7b6aa305b6b6d1ca10f2551e7880dff0b01bd34f7ce073722cb893d6deebe46c0d7b1e9c84fc606e1ada2ff5d23fd3fa9a42d99b04c86b8268903de96ae558af4c6fb238c12b46ae3d9837d5164c001a2f28fa43b7df063462a4c03dc47615bd0d799956a6146bf898da41ee43d2d731353cdb0b42de1c69c0191241636d62d61dc726ab0c8dcc72abcb190da8f1f0733960101430b3263e756d1dcf1117a2c7a8a72c33f52520749e3b03142834e2bccc517a3d04b6aa15cc364256147a0340fabce19fc7652c45fbd22f5e9eb6662fb7a832dc8918d5f4aa9972c0ac1f5acd4a56ebc1e23c74ce78168b4a20d51d11eb6e67e45a32cfc0455543afcea4c46126731b7f6ae33860a944fdcb709524067417212bd9695fd0d042fc7029c9e7c5c8c32f3ac2366e276677e33c759bea4620c5a038daa032ac11d13363f58b9e1b415ae0fa277e58501a74a9c625fce05a19b220439f32fd031b9e10a25d94688fa4f055585ea11d0c0d22140212f517526102d1bae5b4af63d6b13d327abdcf951c4765f0968c713a3f14adde5a712467ed43ccebc780630c","title":"198. 打家劫舍","link":"https://leetcode-cn.com/problems/house-robber/","question_id":198,"issue_number":58},"56":{"day":56,"pres":["动态规划"],"tags":["动态规划"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个未排序的整数数组,找到最长递增子序列的个数。\n\n示例 1:\n\n输入: [1,3,5,4,7]\n输出: 2\n解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。\n示例 2:\n\n输入: [2,2,2,2,2]\n输出: 5\n解释: 最长递增子序列的长度是1,并且存在5个子序列的长度为1,因此输出5。\n注意: 给定的数组长度不超过 2000 并且结果一定是32位有符号整数。\n\n```","content":"096221cf5b628be1e73e8bcfe626c7347380208a04fb3995067b6629472e032e2efda95226d4955c107bef418d6b71983dd2df8eff401fc5a93ce974ffa5f124f52a696a9fd18cf0076dc1aa84d24d6d38e6718399b2439021b427cbf5eea38b142ec00766b0883a6438097cb8d4c9ae77d84364285ff1d37bf6a78e7dea1fef1c3981eefd0c2c7312c244f438fa6ac67ff9e53cd8e04b69b1a43c326846459b13043d462cde8c52410144bbcc47780211e489cd10581a3ff00eb7314f988bbe9d7bbb48075aa50cd6f92218d820281ffc16ad365e5bceb9602b86b8620b1ec587c7b939fca36c8dff2f0bf8bedf85cd020673d38eda65643a6ec0304f491ce7b758dad985e838b0232e6b558e41393fc7b4e830986b9a201d9e8620ebf371f60b18afd246c1b9ca449a401e1ffc2949a2c82d1a9dd66dcfb979e8c0718a4e8b12708153e2c1e7e6dbf378958ff808d4c7adb3f6c9bf8110a5528fa377554ef184caf199121bbe41321d5c681d730a7ab703ac1eef1b2f56567bd83e80d2318fbd229549776bdaf957be4ee5ecb15428d97a3b7b7424d67de06b7a844c132e6f97e41b4afadd60e153617847bbb0987babf8e8b9f57fb5786f6141c00f51c9e09b71ffd2bc4cb73b1e8b6a0a7207382d63924cf2d2ec97808c5180e67e674bae19f9297213ed8c1ee1cbe012703d4bcc92f0e603ebbf00ec71a4e97dc5c548f501f49a89cec734da5de75b4c753643d2b60a12594df2dd089843ddbde0dfe640e06779b5d5a9d6a251d6cecf85d3e7215a2f671d55f708c7fd38731a30ab4b26275626b6a5f4cbd6496621742ef54f215aba1fe006814bf55f7099e03c12d6964d0cbb01bede1d057e2f3ba8646bf5997a6cbacda050bf983270881f8deeaafaa8401896cc119409339bc2ef5a9a556603c2ab975a09fc45f62d9f7bd20d54c04eca5e17d2cccd68ceb7969339144916971009c67be1aafebf73df21cabe538af83c90060531871d26a80c50ae7fb4fc8a66487d26957d3d4c9c4d728ec40fce9c409667655b11e198780a677403c446b00ac571ca7d73157fd9f255eed266b073c4709fb4beff33986ab299c3a63e7fdafed5a128c4534eacbadbfb6270c8192fef263508128d1fc966cc7dcc9e4bed913e5bc91b065edfa4998e05083c192c7e2c674029bda5d2ace267a6c28424d95b04153038fee240a14d47884ddb234c460823030c6e76ba5c48e6f1ccb45dd4e4acfc006f1233a5513a8a7eb12c45b050c5fe258fbd9a6024c9e1929a5b124b6f05024e1c6425a7c2db5f554c75348ac90ea1ec6cbf552bda297cdcac6bddbc8228dc7b76a49dd4c7fc0cc5b5bea151d713369e2ac7e3184a7fb0b7dac4adce8c8ffa0813c9561462d34d9a879cb34d96bb9fa310e79799cabb3d539beb3ca4ca688bd5fa3282a24b48e060c1ff103b96ead1874c06cef155cd678929ae07c7315c7301df336b80ee059039e5ff465036ca056887152f8abb3733fbc07d587f7a1eddf5c698c5f01ca04d2b1a0da9e95b9a6a431e8fae0293520a909d8113cf58573125f23d277bcc620ae2c8e81bd394d1fc38a89c20711a0fc8844eef256df541665d1b92b473aa95bff0384f4fa920e399e9ce8e3f183157d4594f03dff2ca58cd10a82264212ec2b256c18c14a15c423d1b1939ddf531e2b8d165157c77aab307f5e21a54165639b5c9a03dce9e2b77a38503ac0d21706d85ba03cf6c1aff74c9b629a268110c689769fe0cf3ae9e5fdc2b7261b3a5efccb4ad726baf17c013d28bbd85057e1ad74f7c33af12be9ff56376ac894a5f89cc0ea8a5c724748527501f4243aed6f9c9f6ab5303365e1a2162a56e698f3ef90a226a249c8ef618505038448ee2ff416376f0b5e5358439d31f4749a28fc98b8ba18204e4d88b38e266d9679341905f25e7ecf591fbd37907a349eae7ac13c9d9fa2fafbe0c60cd6aace1c49f7b598040a7cbdd6214884e20d1cb8b9dea53d326e328e75ab5c44169f81465d0f02b8de8fa50ab5ba52aac292c21a6f1866f7be16d888d877bdbf28d6ea9e4548709f8fb04fadca45c61813e587b75cee77bc82e32bc3d901efa1c5e349f635ca3fad68ac1e8250f279b9eb1e5bd5c3ea584c8c2546ca041e2d8c1fd2f76050ae13853d3a99e00b52238bf86c93c1b248e0bdee71b3d01378d3119e47ae1cc5f1775620cc06340864494fad5ceb31d46508222b8138a875b2b74b753600277325c212623e6019bc7b04c93789b6cb13aa4dbbeddbfc3c2787134a49002120f8944480ad2981cd6a17dbaaaedc632ed60adff18dfbb5098a875fc9d693334c5f69b8980802442870353f4d94f7fcffb2abb7ba595e1a6abee2de4427c9d42581a698a6ebe7493f8d062d054a13ff014ad00c6c995cf2c0030e47690746a0d4bf03bea3370d8c1f82aa80aa6e9ae9e0dea72eb178d8d5f762b10c46ef1542bfacfb1b79e25d53901b5d33ec0825f19c47968e3d51809186e47a91e86fc0d355fc2a3c9374489d6ca6ced49ad1e732e30cacd04e849e3ae64409cbe68df2f7c02b6feb65ebca1319cb8d5d1449d306a16e3aea40299daf89986b59f5d46f1f56a78eb206712983c8654d97a3ca9ffb3f90cc991363d1d0e0dc5481c0535dde22c7f26c001795db5003bf2de51eb7c95c0510bdbebaf19715f6b9640be81f3b2a2f7e0b410a5bfefb63c07f41e270b47551fa662165f2584a409ee4410161846f64990defd75c0b15cbeafd63d743ec74300b4e5fc724430a9124d8696c25061bfddb45ba1b72fbbc9e2aff8eed1676e3646c26fd399100c54b0bdd47b0dae8f2ac8034c91b847161b63da46f38f452c7e2f0a5f26a4ccc45b00b7f7a72417b519a528a3cd79dcf4c3bc3045701778e92029ab3646a34284e920b239a5b9e5e19b51241fb18e1cf14afaa368e8b5f5a9e5c07fdb1155dc32e390c46fdf9f4b3cb5c1b3be341211096fc1b88e3e94407f64564961cf856e055c239dfc98d9806ee40ec71ad2c573647764bdf813177bdfdbac81f682f16559a0669065a3667d9cb5a70a656668bb9f45b41904d6f5fb9b482dc40e83ed58e006e079b42249f765718f4ea1e24a055499427f2f04a9a8d808e93ba54721e57eeb5ff7205ec92741df040160431c5c1e0b200afa3f75ef2a0c5e4b3ff744cd66640abf7c6e1e8c9c40a3e1f6ff4fec8846818e1a404730f17ace731a8453971572507dbe3b2aa26c93b30d0fcc99538575b52e94d0f2b9d80529bbbf100260a031a6896d10f8c2b75ad256197d68760f9a9f287b8c6a7042ebd5489a6651319a0477b89cf3a1d410bb59ae1d10afed8014e9dbac8848a3cf0651068ae093a3a5a86982accdd6da9c18af6b9f00d59b6d59168c4924e205fe9cdf0a421b8cbeea65518c6118ea2128282756d0769ec74b1b442ed21e77e2c7f5ed083da7892aed0f7db9fef94d66241727c2d43ca0823d27e52544eea65ad65ed1ccb4a23156f2ed9fd02dec2529cd2a5e4a7c26b8e978a832d4dd4544c190f780d2b8f409acc1e0c5c297c2d1a6890250afca5b1eb0a1bfa25703e092bca795f80337a4b9032bed3b16c55915c1a34648ae4544d4f1c9f98221cdaa1241bc6f9681c54576867bb67862d98e262054705917462d49741da5327124107e15055e4e3e1393196fe532b38df725ced495f952499c73b29a27e7ab98d9862086a7f76b434925899fb254268765ea7b3bf29ef076e3c5d35f9a1ba0275dd650479eef16610fa87944b13698d0280699b16ee29ab79a54f103b9b351eecb8d5acede6606043b33090e441bcd881cfe044d4871fd727d883aa8edf9a3e6264631c3813007cc9ec2b549e207fdfe3a90c5de57414461325251674df49de73bf54f4a9b0a890ff91c84f6bc8dc4b94a1e6838fa6e29545281145bffab95e9f38ca5ef8e266858130c93941c6b1b85ad0556d9d8103b8279de14acb929820dcf9d63aefe6f1db8ee504e3456e570c30176b01b74bcd3cde19b5d73821510e6c298ea2466eb368b70c2ab2adcf6dc9d827ea517fcb240c886211e11931951c9c541c610486963a270574561a25606edc8b98638ec07e52ffc124531fd8bb1c81e35dba307be54b997e087eb9a9df97567147f330775635b99c63cf0bd5b17fa1d9582bd3f4be72765afd82dd01d43ef46af872c0a3959583a1bb8eba1fa0adae07b942f9347eaf74b949f7755cdb2e91b0a74ffd4150b4ca1978cc9cc1a33152aeb03aeffe097b07e321b393ff356b3176e942d93d50585e7470a5b4ec651b0084bdbcfd883e922c1d32e18227a79b4066ebf3c946a5cee681201897ae70fa747bd74c74f0ebbb366c5f7674d1abe649206629389d5e2ba9b7620881010ef9fb18ed3fb95011501d71dd07a9397d25ac61e107e621d9fe62fb8b49b669cb5abdca7aef9c2f3a46f7f744abc062f6e40883bbf8b4b44920a68bdbf2c1937302b5c6ab4b95b3267a9e2f3ef4c3810f5a794dc92b6270f13a9054f39ee7eeb89513b152cde3188e9e240bc8a30b1965a480cc507efb84ed306a82987638947041b3a250b2b91d99015f3f1af8e30a4889c11454013bc14d422fcfe9f981442b1e4ad8986395f57d7a6dcbc7fae976e6f39a7a9ba86e66f30f3d238f576008d4a8d5db9ca46394b7eb23526ad233b8c352af5d4463da1ab76b1742e8ed75ebdd7c2a3802b1d2924c2e57780f30e3cd38700e93ec302081e3467fe9fae5f6ed2e7884b42d12185e495d23bcf85079b52fc0cc329cae63ac73069b5dd239dd0e8aa6de33fb2882897234fc46fbbf7b6306378278e04363c0dd8a29a70f7ee4bd47e8c4587bf8f59dca39397d519a9597f4537939ef0172afbc48d1543961692616c7822204f89d0006f54e485311626501df9c540dcfe8f68d9bfabced59136bbff20d17e1588fe73355228206a457452bb3b355e29faf8006ffb6c5fcb268cc3abd4d52a57f49a489796537143a988d65f7453ca5339c989226a947e1405551955550a0773cb997c9fe75539dd040c859d96cbdbe52285815c1e414b921d4b4baa6c85b2cced6d8c7dc87462b51cbafc76e6cbbd1587edce4b2e5555ad655a3d450021005ab03143f03c980b3d1f45afee9cd5536f0d663fd43b234a9ed24eb4cc30c1ee1d1abe2165376f201c2e032d0398e89c5efa1f81730ed821ced45082dad7dcbfc90f1cb383d4c6585436deaef3f13c619bc23046e57343528c9308f33cea5a6a8ace865ca00a212d984982d66ee11ddfdc7037ada0d1abf5d2f4491e43a648ce8f9ac55e3c46eee508719066a3a594eed9c2c5ce9de56c536f72009e37f08532cd4859cc83025b44e317ddc5a8ada70ec3dfc86d3d07920ae56d65df4f2fd0b9c36d98f9e32bca61278f90e177f7c56143b9821ce9856c4e0ab3ebc62520253a2456dda3741a9f1e45a6087c8cf4c752fd59c548ee1445f8b4af6b20c19146b1b79822a43f5c1060bd36ee8a90ae44a6434e35f36c1258a0253039236731c215c5c4d16e143a007f6474e098fdcad466db4408d3a9a6e678fd91c9f26630ea09f426038aab801341b081cda616b135c40e633c433808c0806491e6c8ab93164a0908e7e52422df5301e78325a3bca15572b5682ab5c5f180927bd9cb28f6dc223db5d5418457be7c9f51d3c0dc6b5e0478487545d071b0a86a20f243196df212636469ca1ef2c7e480ccd42af1f3378931a592543266f581a2ce2d1858345cc054fa8a8d085249096e122eedb6256cfa9e07a890a3453d71990271359bc724a2ecf94e1b4af36cd61dd015fdfe136edbf7e09f4c6887c68abc8158479ed58ba463f773514ba3ab0fffd78ea506813d3c49ff864055732a4dd0a4d5cf7bbb59c8e52fab6c075d0ab9a4bb9f634c4120157f7503deac7bdc563699585a9527233aa65d207121814b2ddbe3ae89620244054b7a0425776adecb3d9bc1fd389e8c2f2e9123c7dd86ea3b3c6b4e39178a60bc7959d08d031db908ccb2f0b869df3dd272cdcb1982eb3ce5edf0023dbde00709d300b54ec1e1489de83aaa5c997e877f9c1c23042c3d16767da17cc36f8f7d9f46c3be81de4aa3be5084fec03bdfb4ad3d013ff0d8c767666b926a96cfa72bdb23ba76da25f499a4a8123876075bef22b5524194778bc16330f01a9e026c49f99a97fd3fceb0fb37ebd75cc7394be226a28b06f96a34d29e92370e4c3d20e9da341ac331fc6e5d22b5a36d2077efb2ab37061d5af92f276281d667b3c8ce8ed60ae8ab6626a069c70ad85fd845d046d7c076bdb62954692949413cbf3a50f4105d9f0aa63f89cf2201b13a8399814495538b4ed3c1eb52bc9d07fcc9afe3dee2c9fe0ae5d0959abe6d702cbc13e497118e53dfcbbee817bbb482b452cf5737d1d0d9c5c2867f51efb5ca3a8498d34b20982bf912869d8b9e4393f384e04d0fa8d8e2e50b3e5316a16726f49d15db2ef06c42e5bde01fd507ac0c84fbc20047c9e50f5094350c942c9cb8dcceee121e95ce834d050ee947b982939a2fe7562701b0b4cddb649c5dfe5f23c1e6aec529a6fbad2777f309a44ab25674d382ac77221621c8dc190098a982af22f69ebdc052cab7d036dd6bf3bd1cc59d80fd99e084523ffa4f053ee4eea47f5cd8a0f520a1262666089ac1349e14d7a32636a101adb7dd951de04816248ed3d4d99225d4e93686f9e2451602524302ad80adce190710fc94996fd20646c026afb349df8a6e8722ca7673959426e51ee54119f83bb4695ed2c965a718f091b3beaef21bc47e31cefbaf2150d259a1bf62b2d146f607c9f5571b03a87ca82c55c89c39cc3f8bae332ea62d7b184e3b3ded765f9278d808589a415ca276dafa87103be8fc6a01e564173a260f85463ed087b0f87e168b4c0633c0144b5f1d7d9aaea63c61707bb811be3dfbd0adfef8ffd0f485cd90f97b2f64ecdf3a6099a27caf7c44a7212cdf5d302a4f82534eacd115889636376bb6fb1df9ba58ee9c0696da678c9c62aee84247053a7d03cfb6e1622574184153e216766dca6a68ff60b5efadd26129973d70bd662bb17c5481c4a994d47d5ccf4a360201f85afb9d6e24a6c5564acf050ab138832fa685214668f8d4ff4a2bdeb484ea94fb5301ef76","title":"673. 最长递增子序列的个数","link":"https://leetcode-cn.com/problems/number-of-longest-increasing-subsequence/","question_id":673,"issue_number":59},"57":{"day":57,"pres":["数组","动态规划"],"tags":["动态规划"],"whys":null,"difficulty":"- 中等","description":"给定两个字符串  text1 和  text2,返回这两个字符串的最长公共子序列的长度。\n\n一个字符串的   子序列   是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。\n例如,\"ace\" 是 \"abcde\" 的子序列,但 \"aec\" 不是 \"abcde\" 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。\n\n若这两个字符串没有公共子序列,则返回 0。\n\n示例 1:\n\n输入:text1 = \"abcde\", text2 = \"ace\"\n输出:3 \n解释:最长公共子序列是 \"ace\",它的长度为 3。\n示例 2:\n\n输入:text1 = \"abc\", text2 = \"abc\"\n输出:3\n解释:最长公共子序列是 \"abc\",它的长度为 3。\n示例 3:\n\n输入:text1 = \"abc\", text2 = \"def\"\n输出:0\n解释:两个字符串没有公共子序列,返回 0。\n\n提示:\n\n1 <= text1.length <= 1000\n1 <= text2.length <= 1000\n输入的字符串只含有小写英文字符。","content":"096221cf5b628be1e73e8bcfe626c7f3f93f2295102e8bf3736e305578596320559db5276efeff031709804ce6334038d12f1bd385394d9ef220ff2ba4e9f225f573696bd5d7cefe4633d0aa8b91587224ab71899aa6098d20f426c1eaaea3831431da0b72b08a3b2c3f047ac0bb8bfe3e53a1ecb2aa1a478e01357fa28370f13813e69dfd0c26701ffa4df710d664d5431b498c1346263386fb4b21d22259f8a97c2f2768daeb21505b2e98841b44714ce3fe9325327a0f8050b05ddb1988b09dde50830f7d830cc5f62332d7ce9a72a202cf7d692f93a70b76a4ca202070869dafe90b508577737ff3d62121a3f3f9882d713f0c39bfb04d7da467693941d6ce03dea5e9c77ac81b6d1446fe3c117d9a87be6f820cfc3ebd92b51de8e841fb3130aec77cc0bbc845ae4d1639f42553b2c92c199bd367222f16b4f81ed46cff587de2df086c0c74d8d16f5cefc0c78de2d5d1e6a3edb861150cca1336225d9eebcd9b2c81de3dd630055b6b0867e6e62ac4d310a2503830127ab863baaf871f7baf3646757ad8d74051ca5729f87b62927156c9cce269f5ed716f8543042d6f80e9096d177ba666a9ef78679ab09958a6e1d2b8f75ab47e41614cd70f6df3e3b97efccfa843bb2f1e814a097318323c789369ead8d8af82a94e8cfc6e6a709918e33a7236dd803dcacad33e731a5acd87cde73afdb33ce79e3e803ec4a510f6b1223a0722b93aac15f519daf389ca4c66a6a57f9d6061b034298c92897a3d19a57753bbeaa51f07ba8e8d4d7c78237e644f3a1a238e32a18d0f0d751ec20d0544db94327a180c7e3a31101e53d2e9e6b3739a1ccc833023e9d44f618cc340399fd90c07acd0a28cf6ebb02ea1f34e5ee197bdf590bdc2b86b14ba7128707575134d0b95cc2ebed69b571343e550ffe5d951002ee845a66eb94f88d61594f8cc51db5119d813683fb7a7f3e00d582f18fb550da733dcdfa18a19b23ebac757e167899d37063fa02bf3ff1438f36ce7b5a51501765ac85373cbd91344e28c1a87c34ac20a5f2c6edffe083d152119ac1b82a2c272d27d732bb944b53dd24b89d06d4b77a1bd9428ba3a86dea86a811b3d8edbaa7bd75bbdfb6a124b3eb89642e8f528b0b398cf78834dc319e269df1ab88304939231553ddddfc2afa5ce828f20610f6b6939b481e7794c03f2dadd5dd5104d366452e49430af2437b039bd39e96c4a22006346ba25f048c1ffcc9377daeeb6f1154ffc813251ece356d5a623fc4da5a5263d85aa490d01ba84d33b381cd9955b0b828a9661685b773e0d35364069e72c23b7877ffe4592f43f5ca075ccd93e8f1962d5c4fe45107ccd3c7dc047b84639c752ff8068781dd0b6afa4a6a4c497885d20a492cad7a45e338fd736b430b1acb712ee9997f2a73746a6eb2080c84ead106668226c08fc643e9dcc7fa123387c2e4322d9f15fc76c8e163fe737a2f1d8d8479aec6a1cc305927413b3c18273dfd22195f26c7e925ca3c51f386e35f9a06c7394dad91d8664223a1aabd96e9b62581f9ab40d91500687a9831cce5a713e2fcb0e2463d86f26f8c5d31ed080c6fa119b90276f1a19d141d39c405570ae0845d65d78bde4efc6fb375c1efc37ef87f88d8e2118311fc25d0058cde0cb5acd0f92256b2f23cd8a7aead706add78eec98d5db1568af24156cb3ade77aa49106c8ca1560365b3ba4cab13bce9c1f7d90b000a1032f6d6e888b06cc7603fe6ac7b407af68311c6a965ff836fe411cebdd227854b2abd5eebaaf7566b01722a6664cfc9d5c3b39b4defff4d01cf3dce20a29a4e50165fe78936e386f246c8726583bacf305159cc154473619401c16740288fd8a2d8e3041203741a4c15e8a9aeb72148dacb440f898683a23628642a72801d6172a0a4a81bf9407d5c88717d266d45c915ea55e30ddefdaaef1e762009f4c2eb8924eb4fe8449bdca515eb318974c0ac17430cb4df79ed1196cb4357dc4b3c181820ddd55be348c0fac9e0074bb90f9d6ff0649b6c415c274e94ca75c7222f1ac853c1fde37f3a9ca03d4bbd450577498779e7a7ece19312eb2880ce2c6ecad35e23342ddd57a9a1fc54aa18ba12eb6c01c532f560b6ab80d008c9d8df9bd550e663b93994d00c46380b0df884563696feb480bffe3cb1eca5e34cbc7e74b4425da7fe84ad56f0579d61854a94aaa8b4b6be7c80bc9584d9d5097e4f8c4a4314a6eaa20bf17809e56abb76cc68f90bca7beb1cae066fc460c4fbc1adc55e573c56e6b260b376c16f6f4e11e09a8dbdd42f5e7cf66181fe0877295a5e2f238e35aaffd3df95ee6396dbe35593606669cc7d3edb6fe6e6dce94fc3f55db74c8d42b936b4b244749e2cd6b814a1ae152127170ef3982094937428a3edffe329acf527ae6255936b1fde063d641feacf69457a16fe99f4d3065ae5eef3c0f3128d8202db59d62618cfea8d45dc67189cd3e1b74317eea41c9f43d24d7496fbf8a159feb0a0f574d9fb3e23fd6727fa3bdf8640353d6894c761ab36fa43cc1caeba77b08e511da4320adf5037bf259e0e0e3725e5498192eb94253183df55492ae9511060fbe2c13582b43372198cb007ea3d73388c0ff229842cc53bc8939b1e93cbe462ed6a8d9d1ea58d4dccde32a24c6b1ac1fe9b4bc3acfa06610964ff5463e94cf5b6679832914e36da57f796c7002542c4b8460325f73a6a831b6d683aff1923ea19eeae7cfe04e62f6b1df84a433fe000949ee2e2aca781759f9e9be0fc5a171061be6ede46cf393407823d79365121ff368599d754b4d636f7414fdc1f3ee75a97a34d88df8731d76516e2d09e977d7f95935eeaeb9f603de153097a6b4858de49c2f0975d9cf2b4863bcb77db129ee1f64bd4470043bd9d3bdc7c00ec59b37916ccd1fff64ba13fe2f50581e0b9bbfaaccca478a12add87895b532256904e77bd5cd56f5490602cf7e9f4e229d88d3c5682e49c6a2032f189214888eea81a4ed122d6e085c67cdede390fd6e23824bde4a65b7b9b1f05274ffb7dadf9ffc938dcb8c659e2cea54ff0fa2e5167249ccd88fb4eafffc299bc32f3c662086b927cd4a43c534d414f752ab862f99cd4fa9131fdecdd025f9cba7c1332e1c9156fd1d9aa0298b7f9160a6aa3ec29d3380b6d5e7d8a4dbdbe589385d2ee9abe2838bb7139e58dbb6855e8df581461aab5a731701c5775fa84c449fb886b467dc0aebba439d748eeeb0f769eaab698cf0b81039caaa5bc04ae6a3440d70730140e5736e42057baa62898548442e5504cc169a97898bb0e77f0ec9f641f281ad46728d17d694ab35979a4c0f065701f361df60d48d2f088a108c8cd1b709d69b8b88da5c6a5aea3b76e48be2939b98eb51842e1bcf290ce18e9f62f3e503df63524bc089c8d6bfb21718fa1a199b21ff9b8a8877c65b5de4deec9915e29c745f7762f3f9646088da25aa1a5077ccf4fd8dd54f0ac97408d4ab32d88945359e07f51e5d3e3eb1c0344d3e14b447e09963e5c2a0f5dc0925aa6aa0691282e56a45742b5f127ed20c34601b34415137274ecb9f214a98f419809cce655ae05506035160a3ff0c35cbb44afc9e6ed6eb4e638db43091c268026d3b1e8a9a804f1cfc6b8af3d7185fcc32bb313da4d56735393551594f3763741da532376b427e5f0517003e41960753e94781c78125c2d8d1e7201ab67eb28b5a9ce198d4cf77fbe9a926012945f49fac5468d228b900728f84da76e3c58e5fdf57f3625d8d7a449ee1186f25e839049b1c504f91cf3802a760223753907ec64d3ebd7512118b401ac28bf5edbfa7a581a220f318d6451e776bfb3bc749d46e576f773b969885634499aa053f6f70e744c1545efc2c6c44c7e544a7a9d399f1def4d4e727a82f4a5cb02d0fb0df2409bca7c9b98f98cafe44806c4e529e0920f186eea1abd4bfabcd265a4b2bcb064567710b90aa6c12f7918cc90ab630ba430b8547a43f7e833710b4c63c59cf838437a447aa797cc24759e5bdc5a2e345c98235f34b709bdf0c6ad1128b6ec0a83fc9394c3140e2daa3157fa57144aec4de2f780bcdb120cb58154bec2beb1731663edea8ada3bfe154fa65bb0d73b5ee688989346e865ca4b781b24e9097dc92eca09115d3fb15582c0a5b5c5badc53ed1a55a15d11695827febd76392f06c368611547d853db6d753067dec8afe44ac823125ccb4d412cd2bdd33f4a8e34c5b2a4aa71917d86d6c71fe182679adb088ccd43719","title":"1143.最长公共子序列","link":"https://leetcode-cn.com/problems/longest-common-subsequence","question_id":1250,"issue_number":60},"58":{"day":58,"pres":[],"tags":["动态规划"],"whys":null,"difficulty":"- 中等","description":"```\n\n一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。\n\n机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。\n\n问总共有多少条不同的路径?\n\n```\n\n![](https://p.ipic.vip/61uj0k.jpg)\n\n```\n例如,上图是一个7 x 3 的网格。有多少可能的路径?\n\n \n\n示例 1:\n\n输入: m = 3, n = 2\n输出: 3\n解释:\n从左上角开始,总共有 3 条路径可以到达右下角。\n1. 向右 -> 向右 -> 向下\n2. 向右 -> 向下 -> 向右\n3. 向下 -> 向右 -> 向右\n示例 2:\n\n输入: m = 7, n = 3\n输出: 28\n \n\n提示:\n\n1 <= m, n <= 100\n题目数据保证答案小于等于 2 * 10 ^ 9\n\n```","content":"096221cf5b628be1e73e8bcfe626c73473853d84c0a528f07f6231776859580899120eaab71a6acaa2c327b76ceabd51b4230a8a962459d2b221b53ea2e5ff2df533792a8edac8e21c268fb58889556c788e17c5d7e1897bf130c52760534a0aadf3a56330fbdbaaf3dd80a47e56154cf81698693f5a99aa3da4f20db30e9d6da839a8e0fd0c237e1dc24cfb0ff868da5cf9e52ed5e04a4c96a71e3b4208389b1e2b3e4823cf61c2e6c7ebf48a671f7d07a8e1f977022f8d1ddf6cb4db194f2b3dd34ab10e7a970fd3d12f37dd202d18fd21a4374b4bcfbb45ee630ff597f90adcf6c05fd0fb309d9e6e15b6e5feeb9d0f7df1a4d5c9233715248f04312f1da8cc438584869a4592477f5c0dc95c5575cedbb432fa0886f1491a52d6efed703e5b3dc2896ca70b4d46ba60143ad8287cb7ca39309eff44cdaa58e4fb4789568b11528e95261e5c46baae7bedc8ef548fe8fed1d684ec8876d363cfd0503814e4ddafea3bfc8227897b283e140e25bece7fabf973fa6c4977023bc65fedcf8861268a5d077f3a83cb1428ec2c74de091e80330adc98a772b5a77906db6d5f487c5e65ca9383bfe201ae842375c1d5b4eb45a9fff3ab55e801403629ce630ee29de44588a1950bc63375fb4a612e19537958db20f2b38b9bf91adb0913a184c11da7069fffca0919d7540147f5b9cebf41497476ff2b73b65f0ec43eb2514b861908cfaae3a44f80ad06e91bd0d782ce72619ead90e2600ccd3d4fdbaee1e0f64de02d536e52eda5a13c517fcfb9e6e0197c2d433e56cf12cbd8167f150da66a05256132bba8d4cbe05a662167c1770b64d81b1edc1345ae4fb1f09bf6162c1208e9b41e4116722b146f2f3ba86430f9846d0353a59cc9bdbb32ae16a7a73437534b2f2c3f23708abdf6775627d03c8feda30b254ab546c939af26c3c149dddb990ff53eb06bd60b13f3dfc8a963434d61fd1d73987394c7f4d828e953a29733dbe66bd22e40579db826699039db57e79781d280ee9e9571049cf746f84657bfceb65e975779b6b94b510825132b2a93de27050a28d6090c0d12547b8370a413a62c7e2015059a3965a01dd2ae7244b3a64182a09e57ac7aea67114bf94965c40323007b37564ebe7cbd4316f841b4916332ebfe899890d7470d5e02bacecca5f5e69f88060dc8d8fa25eaa32977687af0b6a2555a27aea06ffa174832a46a817a71482e4f260a75a5418d5e4c1b031a91e3ee8f010f8d896efc71e469ca446bd910ec8f4bbc3f75f3880dbe99d1131417df810f5cdad48770655b0b7f565c1e0c29f34351e0967f26ec3d72e09165e0818f02ec94d2175882f88871e20873fc49b26a2b2be35f32184d50b39acbc9b0c58c8fffba87296e29414fcb3c82d13da37a2b7215942f775f0959b2e02039a31e19ce22067ae7c78b7678afe01c5d96ed7f605949caef3e71a84df75ae525e926b8a78bca03c1e36912884a9f7004a4d2c2328f9f6a9ff02431fc9d175cd99cf43fc096b9f6c47770d92107553969c8edc052fa1a7f89cb4492fccf1ffcfc108a064bbde76e476c71810009622a4ab215eed18845a0d792f11624d98466f72868e34d6f59af1844e2514a2871b287b774a5046d693437aac6db9d26bdc7fe74285dc91b8c0df2d6b6f64a5df02e2fdd1f3b03247e450bb5b310bdcdf71b79553ffd9867aaf057121d3875b3af17970b7ff0b0776e9141dbf3dec81d15e05999f938971f22be1ff7afbbe009d771c61b621cc21682113580d581c1ced97216f919b948f0c0feb173390d9f306971d202f3dfe8232783e00c4ae89711dffdd26724a7621605241cad839ce5624909014e233d75329a1e019d4895105f172ff9fdd0693749733ca8afa4761506e3fc892ce05fce770958f8eedbf1c9a0f967faaff4068421c917ef75fb0711a8a4e3c486e312678f23abe3c757fe91be26dcd8093d9b6ecc71609c6d718f5599cafa7414a24221c4f688bbe551f531e13ff654baff4d71c6d9d49d9f1521e8fa50ab5ba5289d272d199af1b6677be04887bb8479c0fc8c70b1e971a505efc405cccfa963438a106a94c2b362eacb1c3ebc0ab710e1205f2ba1634182f7efb8c2e3010d35af9f83e7bd490f6709a8987d18c67483bddd854f656a6fd86505c3c6c414f35d22d1c6e762442ccb72d17ed7541370ea0155b560a9bd5266c5f607c6644bb95f96d8eec28a2d497a8b21993b8a9c44266da1506439741459212e33ef25b8c5a9689049b96f8018a4c0beddbdf9c34f713bad9b011d3d8a585609cf901ff7b87fb980e2d73aee77a4f41fe55e098fed3ce8dd34117021065e2879346262cb7856a093560094ed48d56afac8d8f3e3cc5c8e453ee06b347346e08d57b3346e07ce71db4cae3dac5943c00f636fe8a4d2e24a8eb12d080eb913b56e53911206e158d3abc4bb9d17f0bd6c64e9b73611266e9b7eba08109092acf9f1318b5b3fc4a13aa3e554759e712c9cdd89c6767e22f334f8842a7a23dac0a020f16a7703d467bf3cc793b8b06a07fc51c70943eefb5532a256aeb7ea6f175e964e7eb20e373a9463e1567a7d9a9efc71be9c9cb1eff0ba0c0ed8a3396aac4f6a71e530ce0ad6204fbb7a7da50b89c9127d6b3b62a258654836a2a61b354df06a005bfe5f00b380438b2ba4a9241c9e9eb54ce7ea870024ecb7abfba380a1b168e69099cb2967ad0cbae68da88f76a79eead6c1ea4c3dd48a93c4a963ac54500fba2e698639440af99af14390f5380f1aaec7ae6cbadd046f2499816e535faa2d67dc2a030f62261b58bbcdf3a36fa9337a8c81f83d077618693f00880180f91d7babc993eb1ede774bdda6b9c19c84867e7264a4cf21482dbcf132e329911f2df344224575dac6cec3b408a5cc378c6c894f842dba58b16c2d601b4796f6f5b1980dc444c2d06999b57f2c732ee77bd5cd56f5490602cf7e9f49239c889c8a726f5880e31f3d5ad515d0e4affc91ae750e44085c67cdede390fd6e23824bde4a65f387beec5b13aee59588e2fc8e8d8ff726d160ea59ff1edf9e443d5ae1a3cdc9d5cec266cabe192f717fc2e45c953764ef25a96fbd2fa7866b9bf352813a1bde84ab7984cf8dd04e5552915bfd0cb5cf3d9e6df54aedeea86c70b57d3e3a1e2e11731e6c73cd98b879abc5c30d40c607bf65304db2181b23f0cf61c0bbe44ae47f69821611b3fdcbdd70f6cd62208a63ae1f6a517e9a0f2ba05e5c6be770eaec459502b5881c5c1f1785b17ce4a0be4c71bd1994bd6b5a4259c130c80c407a042505fecc3321df741219dfb537b3133108f2555fcae9e5c1850fed21b65c65978461e75506513cc5720a755048c0e0ce2afbfa5b16271c364f5af317f1de5ec9d1395c54fe725693029bc0d44b1e1d343f16a8d76db60853bd57572f25986ecb5d8bd6a2901b8ef927240223f5f93079dbdd2ab4515e779ca1a383d74302923149deb43bd58f067ed947d43f919bf25f5d8789a59773c74151ec7204593f49b58627bf77aed8233dc6ceac8bb738480a91d3e2e7f697c2e4aa8d315287de5c25974f0851f9c4689d889394ff053aa0830214f83903dc5817eaad6f68ad597cd5f6e8fe81202f01fece6093081f12cebe28fb1683e9446ea1f982f0cbdf888dc7b1b31af78ceb8de2f3c3b787f6e24f91a714fe622735985d1f2f139de52fb5212fe270255c4162a316586dbaaa1845ea9f6beffc14863cc6c81b4170cd2a65619a07a9679df91edff95b4e97a78675fd9821d4c6ea5778aec107c2085973b263f3793ad3756c5e824458e0e5e5d6b6f7f1d5fb12c678e8055f60688001f57ecb3a1320285cb5a9af634499ca496d3a0fa405821c1bd62c6c19eda101e1a986d7b88fa1919766a14d1954e36843f6d324198ca780f7db94cab05ed2605453c5472dabd6dcbbba96c1bac37513116ec30f715a2503c8e3631cb5d899de02f14dbc740b945d8e6254de2c3af4867c73e5898ea065be39969007ccf5201563645df5c3884d9c12250f269af023ca08e43820cb3aa993c7ce2a28f4723ae87c4ebf86d765be976a74d618d0cbc8b928a283d68f4ed1fc20581169f071ef239a73c5e7877b657426ac981d1344de68c6e6c8d38d991915d3fb147f0406447f59b2cc3ddcaf5a21e81eb99e5189dfe61c6aa9e729d03757e058a1840a2cdae1c73b3e84e88de709dbf472a8229e70c8f74b9f925876c29bcdf2a7d612774b5a51fcef8aa2b22891bcd91ec6c6ca80c9ad2e65275961f32df60525c709fabd2beb866a88f2ee399c278446eef6d887f323dbc5232019767f8f0d6ebed11cfe7601edb3c7f35da263bb2039dbc66423bb8963c6d9474e1ea8a243d3fd6765592c5f02806cd025c8b68fa9bad795e2100b71ba37be40a988ee52943159e1aab53436d23a0c2889526c2d2e474169551e11e0b088afd50b6efb9637b14472d9ac4188833832f1afe49285d5b1553beecfe26703662c89b8f53e42087ab87f8f8cac26bf327dcb4be8a57f6f685c9478c0fe983bffdd4baaebd1bcfabf59f572c73d8553c1028751c4a4ddb1f1afbe733817f60e7b430ca1706702d8ac88eb448404dc36206e03d8953e1f650667f293dd7586f99573a458e1fcfa13472d652de6fa704fc8101168c518ab9b48408f86d4da7adeb141c9fe5acbba2239c6c74b628f15bda636ca04b0d7c3a19d3149683ddae47b94eb76328bcd64b03ddd4d1a5f6f26b9cad10e2c95a698592efe07c4aeeb9674c5d5749c238753b7298ccc7e97086f86f566e0947d24e925e6531ff676e38f5d4bd7bdf97caff2ad52aebd16275a764bb77f03c834f103e93ba59e3285bedbc49b7e9819760e6cc3b4e8716ba8978d20438843ce64666238404f94d0113011e8856b5f260f73e6830990acbb04b5d6d8c686d43ead886ae22b45dba023225106741a0c7e56bd78355e37ebcc5511e1465fcb7ba6c3ab89ff4e57e9c841868d097116a08ba43b745eca4244d2a37f72be7a043e364e5e1c234f319b8a7c90c16256c72e26c5ddd69b82b26a8e9f0d147071d0334b35fb20beb3c8e066c438a4180bc636feb930e69ef35cd6fcdb3b720166857c0578183b2d4658f83143be21da0b21440ba1e5c0925a1f3966769a6f39609ed20ffa9f30dcee225bb23c7431545d1c2403632998e8d011b458c4201c976eceba7acb94d78efe874859fddd8ac65c5d65baaea1b07226deca7e4fff594314c3c108b93ca3146ad88f8e54b7027a21d1498b9e05af5a9ad43937a6a0c0a7f59cfd533443e218b5c5e7c5552146aab5733b906beaf2e98a8c8f96b5d7986c4d3d79018636c5cc0b871917cc8e024a39c9579d858287c47eb3dfab227942c166cf6975e44502fb83fd21d2aaa12ba72e2f8abfe245c2d54773c3d75ea5cc2f5420b3ebc625696b6e240393ea254fda6e04f2047ffff7f47ded69c955a71e4183b3db106b96914db1a6b222a43f0a5523e979bc96d9e010b8430a65fb221253a0343c3a33aab243dc784619f1adf28197f0942d5f706b0095429fb07177135eb07301066ecaf523da6e819f06424edabc09b6cdeb16bc35d5156375432615c0907f91ebc5e29a16112308a3b55f68a228109a8338a3bebe7c3bc05a759cefbb808f7b97cb25f6cd393dffd55f9957ae679f5cde8ad56b561b4d454d168f6cadec771ae04b5e22ad283d1d3dc61eb6979fcab1f2108cfa1d8931a592546023a1d4f0802d5c084f4cbd4fd08ac8441b522377597fe48b1e56ad94066d050e9e9dd318c88cba4e1af26146d9443160fe6c10aa46dc4a6ad6ea76315d3d89f20109160685731f889ffcdf1c8377705ba328d61e57444ad278bafaf45d43dad3bcb6a5919f88f33cbf20b7ab24effad59db253000f2780cb9cbb7655f8d05e3b951dd5e814d3f22fabcdaa2482ef3c33f23650d1fedd802a8bb1d6cbb6dbe3c1ec5804c9b584ff5c520c4453b846bee6c589365f20484ea7248d180a04c738a984d55fcacb8db7178d3eb701eea7479c8858dc5a129a99bde12805cb1bb454d7e25a9de5008f50a566a93a997226deb09dfacdc41bfd11f26cb909d861777039ca6d7bd05c01ca179897ab787941ba988be49ced02b56ab4d8a649ca328321bf79284a1bb3fd1f272fb323eb0042e9c3cba65a678f25cd717c3db2a1381fbb4e759a1fbc8e5591695f9e79adc38c54af97344f39adcb0e0863b3f36c44ec761ec1d2c27037a494bc785329fce598ad32afb2b9075f803402421817f0657b8fae48e642cb15d602a15ba7775bbd4536dcaba3b1d698a112f8cc55d68236dc0dab85c10c03bb328ebea24486714e88357878d9761ba93a13546e1717486bf167247fe399e2858234e74351b20b8558767ab51dc4eaa1f007cc396cf7b3a0c1a1c05f3b918ba96ebfdeb54842e737a75299e2d59332d6f0c5bf416c227926067c5b4c5fea536586aa7d8627942747a4daebb6118d0fd7164e14a5e31e58af95f01164c212e7e3caafac1670dce3fe9f828226962e650150ae03d9cecc235d775e80659b34bd6f9aabed8c62a9ecb77631eb04b45cff5a7fdb82a47e3d507d8cca150799b5be","title":"62. 不同路径","link":"https://leetcode-cn.com/problems/unique-paths/","question_id":62,"issue_number":61},"59":{"day":59,"pres":["动态规划","数组"],"tags":["动态规划"],"whys":null,"difficulty":"- 中等","description":"```\n已知一个 NxN 的国际象棋棋盘,棋盘的行号和列号都是从 0 开始。即最左上角的格子记为 (0, 0),最右下角的记为 (N-1, N-1)。 \n\n现有一个 “马”(也译作 “骑士”)位于 (r, c) ,并打算进行 K 次移动。 \n\n如下图所示,国际象棋的 “马” 每一步先沿水平或垂直方向移动 2 个格子,然后向与之相垂直的方向再移动 1 个格子,共有 8 个可选的位置。\n\n\n现在 “马” 每一步都从可选的位置(包括棋盘外部的)中独立随机地选择一个进行移动,直到移动了 K 次或跳到了棋盘外面。\n\n求移动结束后,“马” 仍留在棋盘上的概率。\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f259c1c3385f76f7230696b5e66115584ac2460e5fd220008b051ee154dd47dc5882972a5cb38d746f23aa4faee7bbf7166609ec0c2fc0d268fa687d35e703aab6d949ba3009b39aa6ac5e9aaab854d6fdf1b6eb79a2c203d0e6bb39cc1b333d54c2c2859f1cf7ff5b6c4198359e336d62768346920316bc42a8719768763e0d30a884e253d5dcfd82079f08ffc3959772a276cc6f6207a7a2ca6851d787a89a9f4f2bfd9ef64973dea7b45f60d119d7bbb48075aa10cc2e82f36cbe4f4e539fd45a19ebe4762cf278d926b2f38cda0f3b906eea04d83f5372ef8bedf85cd020a59d28fd964661a4cc030484a1fe0b771e5df8dfdd42680e4d10dc95c5a76c03506a5386d900adbfba14aaae90896268b4149cf05e8dd1ec36057a97ae1e6e9943b58d5daef2206d12c9158f421815b0c8afc463704cc352b8b1c278550daa8da91b89488d44e9f0cca7da8f430d880d0f776838574f851556a2e566e8b9639a8ae0fdf12135b587fd73c93d8dc1f1ae9142c085a88a66338a1405bb06332d7540f97e6a811e687e9d24332014805bf87477a72328d32d5f71f1995f3d259c5a8cfcfaa4fd702653b2aff7a03e8b7e54da385a88212a7d82ef302750f310d6f914affd3dcac8eb7438ee94566658c18e30d551e5527895f0248cbba96e6cbaad8c236515667e0cb4892509b99769a996f806144b363e014807eebbad1fa1a3cb9cfdae83a57c9b249e3b2ecf2cd9f63fe91ddefe583ac3f5163cda3d4c139d6b9f397d0424a8e873b167f1bf80f31511c18c4f7c4b5b67f055f58805d2f6873f65ec34c2bb827f3d2686c162c1f10f8b5236fc9c9f8d2db8fef20feb16535a8aae4a4bbdfb08d2972951f4a4614d040283aec8038d3b38ee0166ce752dfcad7433c2fd569a464ac4c95f51781edce61ff520eda11763ab4a1c6e3166c2e23c9571d8bf6436fa0883cb11691c17af3823ff95b2761fa2299a2204daf7e8cfc8b794a4b06957f179ee3413ff1ed79bd9f2ae37e173a0682d6565008668511deee83802be6240d18099bea31b5c432d15578b3271650a12ad50399ff79ed7902e5838d82559e6729caad6116d313af3c759634b30e2a9c1ed64fc642d69e9f722eeac3ac441d1f8eb3c3d12d60470a672f2c0b0929dfd9c012373eb5a0de30b5302d555e1bafa75ef2304add0acd48c5e48fd9e7e9d8dc7dc40088f787ee58b892939b4975a2dc14c136805fb1276dbc4fc1ff15b75f2fd8ef4888f091057879cde093e21d6513a4ddcbb2f8d4b39ec4ad29cf9963fe9d63831c34bbb7149793d448e22e3c80fe82d59173f10771e35bbe6701c24efd63f72149d7fded9af2cbc1e0d67449dc85b8a1b21eaf2154d44bfbf7bcd977dd3a94d3ae394680eb068eca559cd7ce13465688fc5a009fd476669e8595a429962a74ba688911af6b67c65b27454b802728e0d06723b82d562e3f18b56273eb5613efd40abe30761c2a643dfebe56735f5e5a1189682b1810456b22d0611754bbca48a5125ba0ffdd238626535245df454f568f12248c98c374bfa0b7952cffdf1c1e7710a6f64d96624f9518622fff0c38bf4a0d7352f1fcaa3bcb2619290046efd2b8e232d09dd5156d6a8541b37d9be1f7a66016a015478f155c7106180608d0de3ae2b2e56621627482ad04fcd416460e5c16afc4b431c2911d7e88bf07b1352e6b638bad30cc4c15f95dfab628b7682c3a6ba256fe0befae9f451abf103a82e28dcff2d46b2bf8059949cedafeb37a39079b306a7ed12bd6dddf2526a4da0167c49a26cafdd2672f8043131e121e93b391cc48442a284014267e3680fd8a238df6202b6d1fb280c02853733c489ac7fe724674dea9e43f8239d23a4b718583cbb187aab009fefb8b0add65fe7f9063be5d3df1efcdb1f3f571098547e9d1a6ff7c56fa09a3be3150c54ca42e52f90361e931a088b94a7dcd6b719acedec0de32bd2ca157ce2bc5f33936f9b5a8b9c64f2d8c8e4cc1138c7fcd1166458f90eb5702b975e4fea528b2d4e92c99820b896aa4e95b5575a267628c155e7a73cd29eca3550ffb41ac4a9e3601b6316571b1154125c2ee170c05949c94eabd411f6b15809b7903c743a2b1ca984675476edb5f04c4ecc427e65e2aeac7e4584b30dc71c27dd66e0770c51b55b547ab987068e2e604e66b4e9f5f94d3dfc8983f497a8b21993b8aad632778bd5f7c307b375521141ae510b9c68054934e996f8107a6c6b3d086d0c278513796a60c2f208b636409d6921edfaf7e9dbbe3e638e44184fe3fc1b24f9faa41dd9c553839eae794bb868e1c5e85237bfbcb557fcffe2ba96ea887e1abb1c52cde6a7dab675818538a6d9b7691fede5cef59be2bf2318fcd5181e6f3497d309410a2262e1b3fb910a36f75b7a1d054d634d4998dcb51dae1266e89e910766f7afac66ddc852f452eb0a507d72617b6f100cebe751bcd776be7cad4b5453065c357a6996b2513b7a09d4467e9b3dd22a870c55a63426cce8164c8019e90323a9fd73bf9492605f79bb208cca170c380bd9b61d65558749988cf70a8b4908cc9f0850e0df9bff0c621901f498b5de84c961419fc680af90aeb92171c1d0a08cd492d0932cee1396327d6007a5a8a021be3df5ddf70a9cebebd5be7b806bdd92cec63dcf3d7c3c4feb1f018f0f7d1df6000817e166d3b5b71f667552c362569b29f3a3d6f4071a93198b2846ca4e257f6d0e35d2e14990301d086d71f2a15d47e46c5eefc0610b8b1c873e9d203f48cf2e5b3e391395c6c29c121501edb8ef8b786f596a7cac614b6b4d35736fcd3d3aa489f5d619de6f9cfddcfc72f4a39989c784810f3fb28e560a15164e66e5a043b9d8396dcf423ceb2728c25c71bff50c163fe7a6471541696e4e0bcdb408a0e95857495ee23296909f526d9cd0de745060fde23930f37dc84ced478631195f2417c06cf5cd8aeaeedd3a77d794808076adfe1e381a06223d946cc4665baeda0fe0c44ffb7dadf9facc6cf87c5269e68a501bd43e7e55d3c44dbeb92b9c3fac368c48a2e346a71caa012d04a20c925e021e92fcc8a6b80f852d43a59de899e60848184c16804369156fd1dc8e57dde699035a5a82893a008bd9cbbd4a8c9dbf6ef9a7dd6fd06c38486b0992db5668ceee31fdea6813555e70f630e35d90a7fc16111c0f4deec57dc0aebba43d43adaeebaf775ade67396c7f70e20c0b4288808a4fd150b61781205f13d3a7b5735be3698901b1b36595fb568c8dec7ccb0b33a569de448f29ec81330c152ade9d048c19b5f2f0c484da5399c7ade8833058b11d0de948837a3b4a0ad95674e09a36133ec82e2989b89e75194240a9b6e17b393d17fedf0578a200610cec681e2e1ba5713fa13229721ef9283935dc65b5de4deec9915a495690d7f23f4e33029c2c738bb114b3e86e8fc8def1152d76e0d8ec8689d814c2e9e4efe15543e659bc0344d3e14b447a6d631e5caaff4da7250e360bd3b1dc1ac231b212b0f1226865e6925184a795f646e148e97285198be128b95ce3e70e05506035160a3ff457b9fb406bdcd3aedad536b90f165c5975a1928754ad2a8ce29118124e5ab830a248632b6312cd9dc676e133551594f3763741da5327e25167e134444545d41cf5762a037fac9b5779a9bc1fe141dcd62cf810de7ab98d9cf6686e9a22610326ff49fac5468d228b900728fcd9c76eb89920cce69a03940d6404498e7182364bb6d769b00502191c93e02eb21712760eb29a63664c07309118a40119eaca58af6c9a1abb35d8852ab491e333b8072ba329e6e5a6f66469f83af634499aa053f2b2093018c0425b551175390e54fbaa997c98a92b587b355887e061de3796ccddf2e5486a9d8ab9a83e0fe44d2291a07cc4720b5d695f5ee8cebbac375134c44e90f381c254ec8fe7e1ca4d8d6c852bf50a12d5bf102e9324ff42c3af4867c73e589d3d80aea6cc4de07dddf20512c311fb986884d9c157040688ab84cac4eea6d6e826bfcd6f1c02c60af3339bc7107ae97d73bac972874995df296c6a56de0dba9ca3e90a8680b1924fc71a123d13c86eea5726b600ccc9b03139160fb45525a14411b3375d5f0dbfbb6c3ecc89e2968f86c079f8f57d9093829c18c2e99e76c3cdf6ed29c52b26e5abdb4f0ecc7fe811e2e3139892529e6468304b23f29c92d5beff8563328f2ea9695d4fb90e56b2acb8bd9538edb860285acede2949656d0b65577cd24e73a27d81af8aa25eab6608cf3be199101ae48c6d9d5acdd20e7e721051b777d830a52a712d16f374590a2ce33ec0b63b21bda46963a24d1cf7fa2a8520e7d95182dfda3486808771278","title":"688. “马”在棋盘上的概率","link":"https://leetcode-cn.com/problems/knight-probability-in-chessboard/","question_id":688,"issue_number":62},"60":{"day":60,"pres":[],"tags":["动态规划"],"whys":null,"difficulty":"- 中等","description":"```\n在 \"100 game\" 这个游戏中,两名玩家轮流选择从 1 到 10 的任意整数,累计整数和,先使得累计整数和达到或超过 100 的玩家,即为胜者。\n\n如果我们将游戏规则改为 “玩家不能重复使用整数” 呢?\n\n例如,两个玩家可以轮流从公共整数池中抽取从 1 到 15 的整数(不放回),直到累计整数和 >= 100。\n\n给定一个整数 maxChoosableInteger (整数池中可选择的最大数)和另一个整数 desiredTotal(累计和),判断先出手的玩家是否能稳赢(假设两位玩家游戏时都表现最佳)?\n\n你可以假设 maxChoosableInteger 不会大于 20, desiredTotal 不会大于 300。\n\n示例:\n\n输入:\nmaxChoosableInteger = 10\ndesiredTotal = 11\n\n输出:\nfalse\n\n解释:\n无论第一个玩家选择哪个整数,他都会失败。\n第一个玩家可以选择从 1 到 10 的整数。\n如果第一个玩家选择 1,那么第二个玩家只能选择从 2 到 10 的整数。\n第二个玩家可以通过选择整数 10(那么累积和为 11 >= desiredTotal),从而取得胜利.\n同样地,第一个玩家选择任意其他整数,第二个玩家都会赢。\n\n```","content":"096221cf5b628be1e73e8bcfe626c7f3f93f2792103385f3677f31437a54532e54a18c2d7fe710b3f0987cab7ab5e61db7220ad3962513d4f02ff460b3e5f06ee02c656797d1cce04620c3abc49410683eea32ecfee24fdeb15ce047074a2b7dbfa53bd80bdfca6069b7ef8e2e0a0435b837cce7e9cd09243ec382cbf515fa2586bd46755d0d117c1cf376f636f762ee54d3088740252d5d0806f47ec880355e7f25771418a1f14ce580bbf294771e493dabc8f479282f63aa322cb0a1fc171f5aa343ff5268cb7dfc905c3982412372aa20c56f7f2db1810959b8cb353a7f8489afeb3f9ffb5e0d10a88130e7e6e6920551db4144612e080a27a80e3e0a20a8d8796b362e5cfec539791451cfd1b7f65edbb425ff2593a837580382e4cf75f92f2fade563cdbef7aa2cba91c37a295aa50cb48e4863c54f449f695ada8479831152af951630524eb0af53d1c2dc6b8cf7e1d1cca1efbe5fd060dcdb6d1414cde6a3f31afeb334856f33fbbe902888c0ba1279b4a0672b330567ba5f87a6ae317894054f5159d8f75e5cea692ac05863ab6757e3f2e849d1ec4c6a876a022d5e8feb10551879a167a6df796992b0a46da7fed6b8c565b56c536f79d70254c12730c52967ef30a66c76b73f437f6c6b1d0af976a88fdecfe58c39e9f6220e4936f6be111558e3f542e6bf8c3e3b427faecce2b870d3d368c9ff4b864099b54f9a997f806144b36dc7118750c0b1d5ff16069bcef2f43b4ed87616dcc991f0baef74b3e6ed908aa2053e7d4cc6a5c509931a75545215e96792e463223e46f6435f4c5253fda99ea1f13a32381076d32f7153f542f64c24bc21f6e14c59a8c06f069ce03b0094ffa0beefea8712a0e557997c11bcc5927a6909a873ac104b492416371849b9a17089bef5544e26f32888f6b8012546b77af6339b1ac2f55dd0f0890ffc0376cd46081cde17413ba6ccf9b491321529dc96f4ddd538cd5295a433dbc765e0084542af70b72ad1a408ae6d774193cfbcdb398fe11c1f90aaa9c97097ae29e65b14293b83c04d513a6340af51e3bba32bcd310f2f1d92ca3db5e524d15c417ca3bf518b0cd50390f241e47a20cb81a5bb54b67908ea4b0e6fb08644e8c465e8f28045bc7f98578b2ae51f9c4f2de1c7a54d0c3682b8dad30043470040232b38083ad0dae71b370db2aacc0eb62407564511a18768f20361d01bf94efac48dc2e4eecaeb7dc4098bc1a6ee7d9a9ea7a24951a0df00fe399760be2f79b056e9fc23ad510cc3e354b7f88a37724ffa05258a475e42cefa9feefa8ad79384e72d8bfbaed427800ddffa2e5ee013412ec31efbbf5f0aa6d6fe2ce77b28dd28f35d479b405f5bcd2844d9d8ea45723200750883fb2e6e3c5dfe51f7153bb06b88bbb49c13fa94505b13ee30998c902ccb52add4eb004d529811ca6cc7e11104b5edcabea1f12b6c990aec5dff2ae023b389969102dfe87a5fdc0983307cafd0c33a909767a5f87e3df4942076cb8eded0ad84cf9cfbc795489be4abe7ec3c04c075325559dea460d24a7835fdf20e8712575066e24679668d32218faec0749bbeb89524f1f3311e6c28abd9499955639c315e25fa3638bc480c4f77f3dcb939e73b17381943cdff559f1a99c4dc702442c01ab131f1e5a5fb6251fb2906dd03320d09564508bb74a324c1d433bddca23ae579c989674e542b26d0ad9f97cf822f7e8186029d042d4967898323ce7e33f34fc0bb11a16b1722ad0b16a73a95c9b52c478a7a7193a8d2ccb9887a699138cd02fd8995a2045f3fd9545b32be3fbf81ecabf323846c5d4c43a96dfcd5462a95751310161aa8b773ac500d5222245f2a3b6d945e65a01bf527156d1fbb8ed41a5f741145a0c2ff425b74deade511b6ff7eaf4160958fcbba8aba9406fde78925c266c37c9063ae9bac7c2a5e1c340b909c4ab76b3b759a25177f4089d25b64a614934506f96b3ce643fd9cca1872b6354dd57564c2f53abd11b357ff03cfc72834f292ab8bf04d15a7867ee413af7acd3843449ebdea6424ba56e0fcaa28b0effe2caab40a925dafed6d92e8e13f54e57450342fd564b480045bd615cb4be0660e34e2067339150c65446ab8cb9e3f9f80c2bc7420683189955a0c2be42a7529fd2a71000ae23745eca8aa2e0f90d42e572ea796a447f03eb959a0e1b809fbdc228c3549ceb66871db49d79d0ff21f383d5347dccb9735a74ef80d0da1a2b06cd38e85e7e0bbaac2e06efe470d59a01a925ae07f8f312b795e75224badb2bd490889f6ae4f1a6744a3b87b8d931fe4839752a801d02c4046f2ca0aaee2876d11a7c9ac09555d277400f2b214fcd87f1996bf120da000d3761775763e43fe4986fe62b2def8980bf95cff762c198f30c265eb64a3764285416226abf2fc229463f2a3e7dc3cc864a792596065c711ad6f9994d752c3e0cbfe202f5f6c371dfa6a1fc18b721e75347ceb5bd3bd586a9906e7764b92661593dd91cc405e22fa36f88e397205d7292a81d84376be09d23fff1ce9c163e7b06be4009eb00930a4e634ec702723e09baa35c1a857c385bb9360e2b8c8901f4e3dee2c571d6d437460d6a23679bedf7dcd9c932e980f8d0bdfc176baea7de10a10c4f68dd2e24f86b9cde32a7098f0a61dfff5a07f80d4384daa03a90925dae4522f3a9d7b17e265ac6d1e2c3b426f0ff303f3f5c4ca6235b1720848396951f85d442c001eae4466a6c39bcba660b44254059d4a7e8f3f520bf92c0ca3c5e534131de6a8ea18f5890166ad0578e894873bf59755e1ff99d1cb9a8c5d056b64b031d9f148393dd381b5f18541238b0f9dfa54f167577e6cb319ded21b2813433f3c43a39c5ff306adfea6191fb5118a26a6d579dcf4c3bc30446f177bfb25209429a92fda4bb116db4e90e49ed6cd3f1f7d0d638b30a74f5ffb532687edf6bd23e3510ad1588eaf9b09f035c9cf6b4d6850eccc8c0743efbba01a9f445966475f61e2a08090f1a26b402b0545a6bc12887ee84f9df1fd6691cc130966dfdbb9c0c499c921ea63be15b30f645d99b79d33675c67563828ed1c6d62307f70a1a113cb190f8769ec06f37be2c12e9bb6c16ecc9a426c178f10042344fbb1a854ed431dbcb7289be243cc2f7bd42c45de092661431872133f290edd30985e810d456931ee72088ae4c51f93e7d9561da840741f0cc7326dcc48549ab19d8a7d33af6373e05cfc6f7e3935906977911d215b98e42a20b23b08f1a3461167780671a2747b5c83a941aa4d61d9b3a29fb31f845b6b0f59327ca6fa557bfc3761394614cc5b85d1689563f525584a061ea5e004945377bf8767e1573444d973166f6d1837fca1870fa5a94a454b015d074d9771ce9d3df391616b179e5c29cc16fc9dde09410c4a5a07d6b852de9037e9471e4530f803fdc8277e4eb33f6d55909ada837b05d5ed134be3068497b06c2d4c3b4592f259fdad4e55e65403f4e102e2fed0d29ca3257cf2f8aed139f02536ec2159637334a6e97dbb3dc9f14749e89bf394dd8ddb0b94eaecf4ee9adddcab841f50a6f15d13a74e1174faea469a9aaf94d20f38a4b90d31d63a1ce1593fcfae6c74ad6949d6e3e6f5be392f1febc85b93070b20c29d37f40ca5e97367a1ffb1fdd6da80abcfb0803af583e3421a3976170b3e875ad6ee0b853d3758e36941502bf4950bf67a1da4220d0b1a6fc4acc364b598f4cb5b5a04c4ae5d877f8cf34a2b55bf436c14e53edd15b7985be78d3d7cdcf7882d96bc5480fc863252feba286059620feb7afa6e17883a404287430e8fa6ebc2b3e0edd3ce5d47ce078ca5b3fd0df67c851ea7e6cfafe6254b30c4813608c38affb47bc408f4ec3f8ccedf45538c070c17047118574723bb75cceaee7797ab7850999b0a0b0f13255d564b8366a1df996c83b81e1209752a15547c7bfad6bee10794bddb9fea0b5edc368ec6d6449d068406c5cc3fe3a41945d22c77b5de1f3baac6ddb362a629ad9053989865471e649b59644fa57d80c8d2ac0203a21ec42ffae847c46f1f0002bbd00fbdcd4cb4e2344360bf7437c35eaf9904170276c02d641a0ea00f6dec8cdcaa6ab611855ff457213197e39cbd412f85d71bdd3f97f2828ca5c993a41665631736722354240342f9177a97c7038d596b618bd07e9cb33c31cc1bcda879f70617ded5b9b5c9b4d159271b410adff9709028904ae9fd7f819d4749cf82f91d0c6f1165525466c9e3afa2b13b95b1dc21c5ead082d29923570f5856dc28db22cb71bb35d432a1e75d255862da5c8b2d847b88a6bf8f5ff78f4d037f327fc05a6dd98d3da0dc8a2b3665f35e8a6ba73b39db42bfe02c50e8432189dbe109d166defe725f55300c78d4a34c89fcaa9de1b6d8c88767214fc24ed166aed2af6c963b73f9b1fa0438d433536bed46692a21467166167a45e6b0aca6c5427dee825eb25576c1f50e85886c72b5bfec80c7d6bf5766d985a33142356fdbf1a66a294b3392b7040410b4378ae00dc00859edbee7e45bad4f1716fd40678e2d5c5c5a02c50aef7dc871c01695058d5381eed8adb4e1ad627e4f904b361003f43e2e538de985bb4c964cce7a272b4e86c7330a62067af9d8833ad8b7f3668452cbfcf013277d247fa7b7701486455c78c51ea3c94b6ae9cd98e96fb5e30084fe0185ef6f7b839516248e6dbde236e318f5d1d7bd94741a376497eb7f9ed5147dce910fa430ca2401456330a9dda14478ccfc826e2eb8528aedbfdf3b8bd57cd12f871dbe2ad723f10e8d9651608e4914b58433a22ac7ee12ea4d549cd013302d9d63790286183bd08fadfc8926beef24a86ef32dbe2f499c1532566f5ea312d19c98af5f3677c1cd670b21ae936e867d9623626a5f0a464cacef8a214df6d7adbbfc681387513962ed1574f2c686d47afdf3209f2b58dbe473591b7b3d570c74499232711564f2f00d78e14d5f852f96e9abd4d56457e99a04d2d85b3f16e4dbdf757453ca017c9ddc7027944e162b594e2e4577077ed5997cf38e26138f4158d0cfd8cbbda76e92940d7d3c3083604b46b46ce8e74407951b9525dda770ff015ab3566372892b6e2ac3f7cf8012ebebf8d9c5e4dba62798a735e244ccf4f1c248025230d3dab8c1f86e9fe5ff0e11af58b530dcee660bb22174180074497c4d2d47debbd801bd7284601af2160a5dd04b675518244ac89c54091154d6cfd055300976ea831873ee8b65ff8cce20569165f872eeaf204e048954ccf8a518a0284bb3039c3265fca73764580a3018479bb3c06fef644b00639d9ce4284db9b50bea2d78136717025008525fd0e6aba4fed96e4e4aed11dce50a36929ec954d345686d0806c64d4701ca90c25fe12c899cae0c526f3504ab335736b27ca7e3482437b5a6ffd8c13346846342d7dac23449019f84e39a999e4a2cb2a210dad8398b987fbee96cb9240ddb7e958836384582f7273e85332d778d12f8e6b4a608a62b07276de40486d3863accbb9e15b5f5b7946413cd1acfd0dc51143d1d7f6569c199c3d7d750cd470ce86c6a1be473c59ee30f5ddc51a42c52e0badf7766cc044265b613f2709fa7a6edfda74f49c438207d3b569bfdccb42bbf55ad08a0d63a22fd0c4034828dc219f8684d35192dbe495aee4e53eab22111d92e9e03fe58eb77097cf0dad587c9b0a74dd2256d8fc765d7f9e433fae2afb7009e075f3568760da34b40b94c9e2a5bf49ba0401167439ad1fba99a78db3e126581aba3ce90e696046974564e3c8f6e210d9cb9d918f8b4ba573efb434916d0b38d7dcc13b065da6152dace613f7f3889c725003f2c4580972c3f441ac33db0faf46b4ff3400647118b463d1644ff4ec6f4b7b3b795a3c5c9357db2126d8773f8e094be6207090389cb8c999affab894653fe0eabb42a8e970fdca0a773c8e8959f5af97ad6fe7b0f8f8993eac8a6ffead1c1572bcf747645fac4bc47539246b8e3c6971c5c1a664cbd398e0e2607fe05a8a6c356ccfb8282388239ba04f2ac83c18d0f835d74c7a2c2922c77a00cdd0dca98339d84679637ca582fd53bfd998da0fe80d0b9fe5e9f0e892dc369abd191b92980f000bf837ef0ac1f1f87ed8f7c1f5f120660ef862badd9b714c969d866ab3f752864eff39ac7d27be62b83cd4ad41a1eecb723820488a9bd6b645d71fd423711eb6644bd43f38963ec1919ee37ecdc06166ef0c48be1ac3e22a2c32db26d84de9626a24c3075ed90a821021260cee8b639e9f3e9518acbea83019bf3577cdc5d8942fc0784749529daba2698d34b77357d663066a77a04c76f3fa058c411e5963d7c21b44752508950811ab10f1f7fd82903f3640f5929100b5d69ea626667e381a586dc3eaa607b7a8039b4c5c6b50bf7ea87dc05d81262eda5a6fcb9cc58229180bb6192f5b66e69e613aa5291ecd88911d4e1c3b95a79ceeea9ba156d3a39c4333f9dea368742c71139dff59224a8599f52c1f9a07372b56685994efcc34fe307742311659a8b151116abc9c4248b2e395309b212d1c88a3c4f3e14e50252e66fe52d1d3f2ee4786c08a784038942b574bca9593749ebd895fd5d7bc6af247b0e3fa12f772d18ab4a6953bc10ac7636cb4d6e667d565d1c9fc47db8feb40d457ef0eb072613a259cdad9bf4531ff905e63e25e7c469fb77300f2c8c1aae9890675f61549316eb26b8fa82e4346a25182604e4efbf41db4a2f97e5981dbf3123bc2a1e16ac331a976ea03ae67d8c88ee7052bd76aaf401b5635fda49ae478d18357b0b4d7df81aeed3797d46c19939a92b19eb6045e9e30ddc27c3f946be6dbf63d515113deb0642d00c63c326fcf71e275ab374ea43e22ace847ac4960977f7f883373404603662e51747124180238fa2a3df80a80f3430d9eae40579713e725dc9f69679025a0cdd36d54ffcb9f1c3b48fe081fbc4e586665919f2b37d47f3ed7efe2a5fff4b0fad1f3e5b09a2352a89934789f56c2e3ae8d77d615ddb06fa5fbe9a27b1fa1081b30e4740734369b1904aae8516744a3f863a0813f32c15e001cbc92c1de4e65fa0f521bfd3783374cab7b4c1b96722896a7f6416427af0298f802b2a82dc119bc237f244d16209e6e5f80c2635c1ba4b791a3c1c13c5fe695c4ff089269a935eaf2be89049e824916feb755f6c8fa6de4eaac18ce39cd0f978dc89f1e331dc8adc9a4a9bbe2c3423ea1a06bf17a3267f01aabeaed46718beb2f5a826c27e2d535fc7e3c0a0f66509ad0db881158c06ee3d1eaa220b07cb136421b38df53cc42d30bb1d96eb9c92df5dbc946bb0850d7c025e82463938bc9e77f19a5a4d0850a9371769c7d7afeba39ab4d11ed1e3ae97bbdedf8423498cf3a33574c332ce882387cb8260367514c792f84428a172c27757f251159097e23091f2e237be5dc66296c6ecbf44bf504f36f3ab351532b7a7bbc42fca237bea2847ff23b4029dca3112b5a61d147999edf93b6c683a7e4a0e30acc0bc26bb9a2dd9c4feb3864d5ce987153a6d714e2848f986e5ac6dc56aed976dae2a0752f1115b9312c23cb140634ddd1ebc69b5221b45c2dad3ca9df5aaa6cc597fc1f5a9744a8cd2fd3f66ccb18309a1acdf4549c472ef4fc1380d978d65d037b0f01ad937bf9fc75b27eee150c517a2ca5f0df80149024c2d65e14a0786281465a4b8bb06d1d762141034ba39a38ed79d7a34ffa0c469682abffc9643148f126934fde1b331e6de82a1e960ed99beed8c10f8443689a0d68f58e95d859a88eada55dc70b7af898464cef4d4b55ed1bfacf5a1e0d60ffe8f09f34d47499dffaa41103f72f1d00e5d280bf39d22236cad7b62e574e7064e6da647e6ed4c860c07bfa2a2a51d6341d4640e8f77e4e4431985a07bad9ae81c63bed4c898087c84f0fca5a3384091192c39aafadefc166fe8386935d362b0f8ec6d225e0fa58b8cfbe44c997d990618e753cbbf5ddf0b5fa12cfc56783b51f183df51b145f8878a3638d85b0b332baf0114bf8bf5325e93c6e1b27e0921d1e4e48f314c5f5544d3d563c50283a86dbda8f25beed4469628fc75f586e070a09dafcab944aa5aa8134b9c0b9d090800c873aa0935228bb28c884eb064577f5fc7a28d3fae78fecca5524916a1eca1dfd1fd2fe1e3ffd8e3962d2db83ea788327eab6c4f1e9bf64139b056bff28e3f960fa5e90ebc4c8e5700800a647907844e32c9e965b49266949336a185d8b7f3a95ba85e3da167949b57e9cbb9ea4b983570194d7b73cc51a0c664bc4ca71c15c6515035352ed9c6aff3b3bfb21fcf55c6ede5c80fdddfed34c0e0ffad733b5b80bbdc6f72ace0bbb0c56ebd71a116c09b77372bed7022826b81145fed23019948aaf36eb5e9be5afb6edf270c3a65db733ef422b6996633cdeaab1baf742dba854f7f29cd008f3e37b0a38b610dff5c51d45ac4d212c61e5c527544207093c3b681c2e4fc562a004c9d0d000065b80abc1fd87ef7fc5ad84eac2a8e6f9aefcd6dddcb1d7dfa8ce3e76f667c99a6675064c1ad24662ee2adcce77ecfc673d1af4c1dd893c0829af9f54071f9218839d26f0d9462490651033bed9c44479be4c9e9852bfa111d5669476017db6004257064053c730a946371890a8f804cdeba2b92a5e41d7314bb8b0d7e77fb7a68b3699e4a08295310a527b3bbfd63e75bbfd5da9c285d10017696a1e3bf13096e9afcb9b35603f0c932aa9350ffdbbf4604ccf2a6d660bd0aef3ecae5a156af1a57fa0d5bb69077b2d247b1f0ab27a0cd8e8354897b7e76600244e94d549ae2791dbe650a1b23ea62511b541b9b1f2b9f5404cfd65c8d9b59e69c31ced16d32e677feb9f267a249e7250dabf46bf107b8d69e5f300f435cde8948956089d24e0d8c2df76960efc7de97a06063cd1b81ca791b5f27591a459a1946e452feff996be9936cd88d9f910658a05841b24780def70c3baa21db0c99da408f43269e4aca22039504db9c8d933e19e6e80cb1e2501c5e96af8dc399d0c1a7ed9a4e14068dd157bee867824f2af1643905b08611918463b8a813fde8bf0f305d9dba3c68abf6b100c1b4048e9b3daa49d7b01f9443622308b11cfb5f36b982a76fc57fd48ec60ead6840b434989d62463e2828263fd23b21c865e2f66a60dd44be55b85a7bde37587a311c3e2847acb52658a49351833aa5a129a0665744155e1aff0ad078dfe8fc34131f1be1dcd448f46dc7dfebd48e388585f273e1c207777bd43004657561783bd7547ee281cba9adc0f1e99ab9cdc6711344e13bd27abf75121dcee52c43539ddf793a0d7fec972664b7ba22f1c614e4798ef90fa0dc6b1287a532d551a9be535a2904b79d7b4a7e0e7e30d97fab6d4ab464e78ab42bdd014e5ac7293cce44dc757380559082c89fb0ddb0328b779dfa65d108c18778e71a18e3ce08e05329987dae9278fea16e211a0d2a0f54fa6ddbac8a698ee5fae7eededd5111496f8d61278f60c1d2463e7c7c1b9e7dbf6792f6f0b6a45530ab9638d7c902cbd4d51b0f8851b9df203a85560c10567c37691cc639723284731a3f068d081636384b5e1c45fdbdf80b8b19afa58350f531cb1f6cd819f072f2722538b9955fa1092a5d532c74c3232794348cf37b97dd5606cd82737d9ead04061e75b0b1529c11f002c359fcf80654b95ad924ac4f432765ace4d7c5473c8ea935f590d69ebe1d1dd5047cc71b2b4a321ef0bace5878ee1d5f16137835df7d12e4716985844bcd2c9438822f72f587e8d0abd31fc36c5d623ea2672b69871ae055d6222a289d8a62ce17c26d104857fa7f2a75610ceb2797e828efd8844b5040d299c51be1a27b2a641361614d8cab019f36764af8b7fb4d71e403001ec196ae701adc2309def3315311f6d22b4a18da986a4b2e9e3b93994de1ed3b5c140daaf577afcfd1c849cb135735132861615f03023e5975b06f0977220c22e3620346d2fba7f21289b07b099ad022b9abda59761c7497a52770fb1c222c2f13d2be3f8448e23a42aca1f162af38234adede3e65bc76b6fbd3e1985c9dc897c65a2b060efa60d636c03bafead6bfca083d39c4754f1ceb1c2d16537ab60021f5f816318fe4c22bf8dcf6cf1a50c7a04ab7744ca73932ede10dab69286e307ae848038ff3054ac40362f8b9d855ec42d12809420b3528fdc454ee8ce1294d23cc1a8f1c6729867afad5be04e8818b686545bc7c7d257c8cd50a06d7e256312150fbeb05a8115259c5953fb14d08a8174a64c451f368228d8272ee473ebbbafa2025f47eded22d7ebb5da3924453d8c8165b78335fab2765f2c57bbb116318d9f19274b5f72aa2b917a89dedfd8cc09497e221c87ae32dd47d8e2204c8cf87bdc4d68d235a6e9ead31ebe2d8add2a26de785ca1307bd357f3e154cdf82e932da7654c98bf72c1f7c93a4561ca0a9250f6113d376ecba754e2966a84f498ecd907f4e80d2e346508e2aa53adbb1d4fdb3b94492bf1d5c2bc8b097d9a06ad93ceb863d3100771e99789946fd486b4d03c1b33befb51248e650cae9eb8a3d55ccc5e54134f85363d64630bdd5edf3a51d76ab69ddf2e4d02c79f00dfb74d75db3fd6880cc1342eb55d487b5e1319f50e58b5041532fd3208ce33bfb3f3d2166b949bbcf401e51543fc590b93e8adaaa9dbc54f0e062cfbf789653d085a22f266f64e613658c0f1e2c9af8259bbaa3f7315d883f321f461f5b383d7096f548537fecc1b679c8c19cd26bacbc796c6d94adcb38583dc0b3e7377da35fc3a729232f38045c71f2ace6e1e0e25c59e326db9e0646aff488177965612f6ab317ac6bbc60a31a80ae5e1588e49538650069f56b210ee37bbc101570fa17566b778a775946eb05f3d307e97513ee6b33bb35d7879f4eafc155c713b644f6a128cb94f49cc6b2bf9114706f06184012e6117c16635c735814a0ab0788dd049f9162c53e31fef4a1bff972a0e2ef725497b42e9fb3fb5990c395a02b6761151698cf23d218d6b5a08957d3cce6fc9fe3df9b7767e09e36267aaa079a2f6b4932ddb95f51dc5eb6b896c925a7c93bb45789550202ca64c686a8f69ee1f5980668a24a9f7290fd0a8fbd65fd1be19206d567e8eb239a12ca6a3c62cadcecf1ee259c7d39873db5283f12207b0af4f37351c0d3eabc2f1683f50839a02f2a80cdc4e7e5e7c2f01fdf834339244683b42a7ae2a419a4accfc081ac86079684f3244d6b4c37ab81df1774bebef6534f178b698d64c250430a235b4431aa0608602e1d64c613abeb23c63315912977995785381fdc8ae892e279de4462511e77309ebc52f8ab2e762a6153bce44ed5369d8f502d37a6076fc68b157a3134c403bb8fe7ddc52043dede651c388b3d9418625ec6a64fa50efee10f159d63ff2ca91f36d60e55baabc80a24195f71e2f4f1922b2fe0daa16c56500c941c5fe62598ff65d5009d376855d543064a64db3ee8ec17bfd5da22bdc8c1ce2de328eb9f3e16070c336ca3299c08abb69082bff6620067a22eedabe51a8c5ddfba54a2fc4ba51594614b3b52cc3d23855d0b218ed3bfeb5976cd19f2ce9fa657fd9a48ac4465a2b447543cd97e067859bbb28387574e17a9ea245fb77c0693ba8af52c1da886267eb0640847872bbc00dd196d37518c17e47549f8b551786065560c78de1544726af27a5a9cd5a4b3b909bbb55c7564f368d6d97216c82af37cde4af4e6c612739b46482b35e5e9eb109d257946ff0d68653918219a330ad06f4374ec8725ff97a649b19b8d0a2d9fbd85540dd622221b90af5450849b46d2ce5062e9b491645e45c19d769afb454b259511637a486b89e622bb0770db1c67243e4830983c67f16dc8c1dc8fa6d1a8f7bbc31850534ec0813513f1aa662629fade52e786cce0932986193ec64ea2d788eb3c0bafc131177bbe4c56c96ec6d82667043455ffa08efb298a17bdf7aabbbf065d77dd968853ad9b8932c845d48e3d46a929324a70073e366ecefeb339bed9aa1e499c3b00ef2a9afe40819e06de0f285302e84da4a6ec2a03ba0a61e1ab5686468fd75f1bc6d728f09b465a993bdef423a100e549941bf21934bde894c49b17bcc5dd4f032925064824c9ea3fc62f379c1fa235478319b4199eef49442ef2d01e28621dadb83a27e399dd9247dd39740a012763f78930afeb1e16ef54632e6cdb482fc14357ab308ceb74c87efcd5d0d7acf062adb6bf384c75b6c051912df35228df95fc20a39334f0f12e9af0f8177d526fe1055a6637e63d4128f52d32cad7994d403c7be0b5db1b8b9624d5c7b602fd533a48b20f21ec10a4cb01f49f6e97cdc529bb03e9051bd09e25a7609e24a9b0c41c55a601d93316b95695cdf077cfcf7deabb3488fa4b6f90a153225ca27da48c3c4ac57feebf12b20aa422bcdc65364e95ba0ada7e38d226639b0509ed1a5fdbb4deb2926d911e0522be9c5cdd8bab0c52c088290dbdd42cff6db768d6e170f9f6d85d2ed6d7e75b432230a0faf2b5580c5d6dae5c611eb6fc1ae63f33cadeb7c39d3a38232fdc5deb3aea627f4a2fcf1b79662074d4319bb284ad3257c02f373fc62c3b819a5ccca152a06079bb4de1e1ab97c35371d24727927204d7a61fe828c908803ff1402802e22cb5fc4433d9d512481fffdfc48a6809c54c48f39cbaaf6d9c0fc6ae4bf90fc90a33ebc2be131ffc755f2c547c124ce4fb7a524d30b825a05fb6aad6c07a33c809804df8276b14b317b6a8c915c666c5ded9aab6b4fea2efe8d52475c9cbf5d842650f269f2ac1777dff4c744ed79f0a35d871bc8fd090e1ff51676c5377dd537dbc000a0ff806d6848fa824d4f567f872cb6f39eaf9839f45b1434e6dc6035ed81740bc9ec0faa87f509b5f88d0f8945e002771a4ef39ca143a5b64fa7fbad60370dd5ac63b973638da661ecabdaf55ff98cb6d0e369bac9e8f38aed085a4b5210e6c3019d236786403fa6908d171ce7ce79d5846f6ed6a85c7567c6b172486658dd4729912772962e5cc163ff69297cb536bddf69715f12745eb391602baacc1d797b9950c3b664863ddc35d92aebeafe2c349e307b81553a0dc8481895e18eb549ba083bccae6a85630f39769ad8361746fd22d92625a6bdb3fa7e266c3cafa285e5d66a4ae9f820e69d1b283cf160249238b08fc132a1db683a3b012701fe615377d9a9d6fd5970f6c06e564e267f81bbde20547e048fc219272800fe206ae5fe6a7f90c32ce7febbf165593802c616d11bf0ad2fce3628dd3eaaf366dc83c5068721c2664a2bb66ce2ab14f2d107a78cf6d1eb3af9c90db2e081435779853f30763b2d8da9365d1f9dd8a2c758c17fabe937f134c500f10e4884045a9035621ba133edac81c7b2f232319de2222f46d2453873a3ef6337cb1dc65b3cae17b7d174587d92a5dae8cd0b6efe7c06100bb6d87de2ddd34803b516cc4e38c9d4bf90a4ffd574cd3e007de480fd3884cc39e862e52c887d87b8484df8b951428f16ba01400c5546a2d0919d9440f2c0bda412754618383ef89e3550864024662302b7eab49688f8233bdb54dad1339dfe1e17ee220072dc15ca4e40ee924b5c72ff8070f626f4ba815dfc1559cdad20b928577183451477b096312353f8bc55790e738b764d7d235567f371b3792e89d494a552733c403b4708a6e05fa3de83f309c3c6e565a44083cff4bd32635ce1223fdfd9b8b1b9752bc6f9d5fe40df23e276756da134a5109cb41d602ba9a1d360d74c9b0b8342fd2d7d684239cf50c5460640b10c2e7a4f25d9bb9c37a6d802a9160d1299c67ebdd79d2de030d0ad53efc14f65a93c31ce3a27e3c84ab5c8e498fc35317dfeb6e338769e845cb121598c80af4acd39a77f7446113f8429d80c04a88495d290582229852516d35c8542f93e0a5ffbbef1d06d48e89dfa74aefdec893eff8c0fc3e4db743cc27d84093ec82216eb52152fcc9a6360f23eaa861518f5d5ce25003aabe573ccf30362acb7fc936c39d9bb6518e349dd554ce464d5bbf4f97c994e14270f027a4c89287c1e28f62cd1f0571d8b0f0f93ba5361b6ebfbc316f0f07a99d87d41910625dc9199121614de2ad8b9e688b79c9a3d84ad9709287969290ff492ea9c47c5a55ed8cb9b01a9356076f9b207596d523ce170f0e1bd82f1136cd3053a50af358f472b18a17c370bdf3e0b3c6a0ad2e328b43eb336f8857d6f89b8f7afdd6efa60f405ad50758bde2ce9fa0ff7ee2f9407360c3ae4f6352bb124a70d38d676795432fae021d84cb31ecf26294374364e7bf771facc9376231a42f32f9a402f88f686c7c48dc3175e67b5aec7291c8877958ff22c04012953a747f2dcdd2d6c32c0c11b5740c9eb440b416ae611563d04efbd8b1d9625003c880d93485bab66afc32cb53b24154e0b2dc066683ad0cf9346a615f3f8476fed210e27116393e3f2b321bab40b1486074939d4b70ec11f7dca794f920de1d26fdde46199ec37e88fc15fd3c1b4204401ed04732761f23c2043cb90e876a1070f7eec67f1e44764653bffca1ecdfd288dfc86243fce2586c7481a6069b49e322dfb9cb83829020d6847795574cf01811309e555c61bad5273236b8d43e587a60a72963aa1f0c15cb0c5e18dfc2371e35aa25fe611246bbbcdcfff43a47ece3bd24b3bb63b87423356554308465556db97b6142051c1fb6deb238d291cf65805ed1427c846b6ea4d622c42e660e4be6cb4e730322b6530bc70e550446b034bd7741da7017496bdecbb382191f4309b2068591912af4667a91ae90e3c311e5a7a300de73409726ae73033946788258398922691cb445a392feba287941efe7a729985d728adfb6d17d8b6f994cd23991c3ee9bce5976728bf51266e691e99d92b6603ba66b13bd89090d76c71b8d5c97601966ea439a33029d25ecce1e6ec3dd878915db93c8c669a8f7e7243b8815b98229e83f2c4b9ddf2d09ac7c8d787bd6e6231900b59bc05059c5ad2a9eae5b3c8662b370826d1b4efc95885c661c904a3ac951154d14e9fb15a538d2683e78c1843adf0ce30909269f56f7d213b206d3922c796286c3fc0f56ebc4f293ed5684bfcd10e4e4b407f23fc5f6f2f65db3ac16d53e7bbfaf50949593102a337273c47c30ff55443d64c97093b4c6da07fb57d7807ce01a7ba4a9c60b37120a3891278f6b1273aea1c54de7327867f3dc8956a5ac09038a2a6306cb5bb0b7cd92647ecfcb665c84778444d50f90a66defa349c17a0bf2acc02eb0d0aa7e41c2948e9225764c086051b066ddedd228ccad0ca890bdc6aafaa1bbd5d0a2f98ff3e9ff1fed8b11fc117e00c727ff7992e7c3ae4c7fe69d4298cbbb19c8334b38fb900c05d208ee1297db4d6531263e273a9d0b3474ca1f5ad07fcdfb979439b2c4a591bdc8751b77aa5cdf2eb43d5a69b84be05b436fba0bbc2e4f2ebc3b703d3d843b7dab48d341ff5d657b921166e4f22eb5878e49a32f27eed069f7f6973a1753751cf4d7eae8f63c9ae8f56d98b990b987e9d72301be5a463dae7a8b6ed3f9c0a77ea62ff77a9192a703770a0f37148b0c97095e72fbcb8ce5d52cdfb9a0ab126d7c745125df673966994e69577875fd96bf780fe3cf84dabdbc6c25d468f25c1901bf228b919ded4b798c3c9acb21c45e7197929d5a92e6b802496ec6ecdd7ac0ea4c3388e08398997f444ba69a50a033642ec53a1dcc278195d0ac0a5a3eb2e0d6f2a9702bad167b185f610243972953ecf3c4056e180687d27d820ef5b42249df6d4d460730db97095140630c72f168d2f2041a18bdb0cba1ea35a6a51060d32b8e7155c1dd94052914ccc1d731a7f85acb32a75282405eef1c16a6a4c52dd28663664282d6c5ef2dacc0d75d6472b21253ff5dc8c7c518a266ad596f30216817fd3a034e6efbcdcf3b8cee514e7dfe2b57f930dfe92e4a3bb2c105b5f259a57f023adeaee33d5ad3561d06c16a7644d6f0e94e3967dd9f030a42434c213da1cfd5cbf3ee8d33c4f8097d6726b6b4f2822a47d933b1b3efd633d69fc17e6630232cbcd7d119bf0b449d3d17506fc80461b49b04d1ecdc8b4034d4177d99aa9244bf47ac6df607c7bc959f0a415ef35e5d549b33006c6146b1396c24e463e4ccac26cef527acae1fad8dec82918f3569c3a8b52c8cab8f6a0d42fcf941c61c748aadd301ef3901d9c1d2888e5ad7cf3d8b80a7357cb42b194ccff672d9e65215513ac8bdff09236a2fde4949b4a631c5f8daf8c1c92869550fa203e162ac8fe98650d07e756109aa9eb044418464d3cc89b33181a76b0b27d0bd4c6cc3d57e61dd43a24161a82d03b9d9739415915f5bcea2bdea3d73201d18404a4d0fb0adcad09385d9f96e36763767dd7412d917e9597fe18d35c8c3256c186e317f143bac4e4064352af37601d276bdf095366a59ae63a09136d7c0b79b3802edab06e62152cfa06a27dcdf58ef3db126d25d0179ee004cb6ca59c935f44c8ea2a34c00882afa063c2703c9b95a4d18de9b6713d6fc1f571de0b9bcb9fc19eef9958af9239e4a7ff3c8f93f796e46cb4e96bc7697a199d9ea8add8320b32bc5fc4f0aa481bf257f143422a19ac1203ccf00ce48c80dd33f34c578ebeb53264fda0efe4a6e265273212202533acc829f7329b53f04db11cef90c857f0352715ef582eb68a40a8700c687460f0e9e72e1e67a49714bbcd91baf4beeac6b70b1056d7f8302fca2dc19960ab607683aa813fe18aabdff4ff2ae890a7ff34101c2eab0c4027b1014986fa16e8861529bce5c7c2962506c0631c3c6fe00666c9ac830d340b1c96244ac90cc415d2c4d5f31a083573eb12799c492d369b9d6190c0fc672ba2301a950f755602f63d0bf040327a1d3f456586eab171941b1c83a05940a560480c94159f9defbcf15a923d6c8098e23dd84ec416c3fda53ec45326bf51c3ce983325dd799458239e87d17f3139d69d0ab06b9d21dd26b053fd9178bddd55d92e8ba2446196a15c8f0929721d04a5603c76a5d9aafe02acf47dc06ea8193c285a4b2137f68661f5c19c3532fb114c52cfac0a64674284f1eae70efb26994de3eacd66667469b3e1a997e8551b75e567d722b3a8e6e4efe6411aae99157cf10cc43e6d9d065a04942500dfe0d71547c8d3feb92debda6c6e170a9d53cd2eed8ad8512775a189c3d2ab03fa402e979eda342198fbd05ec230e8de7b56540cabb5c67223f1e6d385022338e1b5e9aead750cdaa7beef072fd5b4d9ecd973308a1beb3c18dab6ed913e1d10b70657894c9a7b24f2f35ade8bd67667d1ca051d433927621986bc75ac54cea343158ccffaeb0b0e6f577046b2e7d25806cb32b62f42998b931aef54a73ffe6393b7ac7fb46e082421b9f8f7f90acb82e7859ad6411bbf23e383f2c959fedd13f5c18a79243dd322eed0935f641f2c54fa3fc7fa7ec691b21689df2d70ec297290b6fedc24bdffd8fb2ed6999f0e8993d564059b028d66115d0420abd5cb8b524738d1a543caa3a6b7dd46e6b2f66beeebd21d47362b5793ccc17bca3647426bf9a73fa5bac61cee08dc8726172405417787762bb3831f7a4f29b77a468c340f77a4fffdccbcbf6a7b2da7ae8e1fc4f9037ae31b6f0bc8c8edf2067ce51c99931cbf57866279d48ed54c9b7c9fcbc116b9ad40974ef9b1af44c3b2452db8a121d77586ef009147767f35b1567432164bf70ec7ef2ac9670c2f8cafbff529c9e321986357f569eebef45fa2982dfe0c2752641e02d24f7551cd47324ece6c1693a214dd9192b67aed49499ed8465ce0f2caaf4b53aec9ce6a1b51861eaa53c9e74ab5ce9369f61bf0be555f4d1a9ca7c752d367fe6a75e004849b81770954ad0dd5d397e8330bfdd3c6dc16e558e8dbfffdaea918fdaadc44fc37e2386551e7c098ab200b6d0be871ca9f1cde1145bf92d2392b997dbf97252482e09a4f65591a7e2ab4377a300356b781d9b2bd30fc43c809a275c0af298e80a1f1752a1fd504091c148f09629381126118e5d9c6a55a29af6eca43ac18362bd33b337eec35b1d57afeb75122d3a9b4e9462f5a768c445199180b9d53daf8b8b35adc59688ee37b88247719e74b199beff7c02ead7dec398cde4c47a6743cc4fc7445bae06b0872fc8418b10a9d30327d9804e6f8e4f10237172ca01e1c3ccf9239e04b6e836a25a7a714f67cd51191978d21d75ed58a1969ef784908b1cad1c4b3d1fdfc949c56bfc9d629f7162356ba17ee04548fae71a08b1534df362f80caac5706d888534c264e619e60ffc0823cca7e6374429e895b7e690503548754743047df6ac7b62f57b62501508287be91aaa4c98c14441ba92ee86eb23be24870055ba5a93c4c23a52de0d8c95d32a90532500b12b6e50ac1f3f75680d052ff881a9c4ddf6ba653e0cff8dc1f7c3eeaef31aceaa334e36d888dddee387eb0ec4d7c10fdcdf84834df8bc9e5e5c4c251d4fe5901f3f2c3eeb19d904be5443fe562ec19b43196e743ff9906a10bb91c2d183fedcc5a78bd9f27964dc769e66cf75aae36b69419e8badb80efdba42a6e436b53d61c5a3fd8371055baa9ce6b40b60aa4419fe6ccff3a4a49a3c2a36143543a1955af8ccad71bee343aa459f643b53c276cf1eec6e4514fb6ddbcc15d88c6e99eae7fd357dacd064e61394461e20570aee162b5dd8504d6aafef7a3f1a693bf6f0988a9102300c0fcee1ca537af6ccf4b4fcf12c4cdc1d577519d23a31cfbd2e42cf7f325adaae29a4e2a0c81b0ba35155749206e1e6ac8cd9c9b5ab96b1f1fd0e9c6e832a048d2b4d50731d957dab6cff0aec132b51a7e498c55f1f67dbefbc369578d0b517b7aed9fb6dc31a8ab17380d52eebbe9eaf4a91fa14c40e3d7b43e0ff597df4d0b8200dcc469d4faded2f33ed359079b6f25ac06a731d2796186a321a3ede89435b71805adaa5298b716f9de5e5d9b532f61b68140c07591af1a4dcbffcdfe9ef45ab25af2b8dfe934119cfa077620ed105b9f3ce005e1a26ce342c3b313f59e5762ee54447221ec3d1ec9383ce748934c34318aad6e556ebec85316e30884f24f92af32193e50f3902b2c124db99004f4fed59dfc52e82a63219fc8022b988532feb2f70a09a8a6062d5ce9910c0b01efb858589730c958d4aa8832b4405b6fa4e8dd059efacb3ed0abe625d793b7969fa5ba906c08c2e0b3eb07ffcb866d7ad31e616d6ee54b948053f08c8535aa831f2b12715c750ae27455558a80d355f71013dbd618e820640372c67175c8a261127825ae9a268937da804836217668f2659b3fff476a3ed9cb115e27d32eb7ecde51e83e569bfdf114367166cd350250b12eb3cf7578c1443954300cfc64f908a1a691c51ea5100110b680734ebdcfe9c970f8679a2ce6553cd5fab280f0be79a6d27b37d43c7b56ebc4a57325a6f76d71ec3c209b731952468ae2c3f9f1624964b1bbb5307b8c4eeceb2a2dc0d2f635aec935a6cb57ac5d289b8bbd445b50e488aee4d04195bd0c69c890ecb7de48cb8c54340f89acbd8b207d63a2b8fbbb36bdd16b09f645c006b31a354279ef2cbc45b5f0972a1506e7fcfe3ed4f21cf7a7a5ad1899456d9c4ad6299786a978e2ff64b628f873cbfbf1bccf8317d7b03ff2ea40d06ecdbfb8aa3f973692d73688bb7e0253ecc2ac79b3cd6d3457e4057948e4c99f5922e584ce80c6de3048ab34135637801cf1837f5d42de5d019ab05d1c6fb860fe801c57a3df980ebcbf78986bac54f4ad5de1f9d0afee6606cdef1058ac060d8cf8e50801117d60ea10d969a907dc1d8cf6eef04a0273029bc5d4304b814e370896f7d586a0b89a36e88e578261a03ea1216c213c2bfe120abac6ec9dbd7cc1c86658477ca22a3e737fdb0597901ff6969749054c76c0d0e898323706b7b47eb66dcab5c126fe1e1ba2b8d1f0fdfe4c6f20276f342864fe50778919f0ca3ba6c80086663fedd09aa33155b4cdf895b58712f293b7f9fa442140ee45651cba81bc8833f0721363bfa7b4b99fe16a680bfaed596a91629be21045d80851f8e2b9d9b3c5d95d9ad2e6f0c894205f9a12389a7e653b42b49fefc910c6a1f1cb9d6bb4e2c56ddb6079472ae1aa563ce2cfe7f3e1fb4bed3cc7e93950030986f18ce859269c6dbedf008a18c80b87137eda657ede48088d75fbb33390eae4aad256e3e77b7eb6e503e28cffd69d9b0e8f181e9570ef925300a8f79fb6c9983245c69831cdc73e2efc7389b5e80957e7120352e4302146069ff2deb3b7d32ba2c4516eee07da95051604bfa95be3549ef64fc7946f295d6f5a7c362c4344bf1502ab54b57366120018eab9d6ba57911381572855362d8157ac85efd79616fcf8125b9f9084e9ea8ca01a8496ef1fdde098e4f75513cb19ef4fff6502d3b6a2b782551c8848cc53c8bdcb8ebccdf6456279adc6fcf64d2708ef132aa2f24a79035ee3bffde132729db753505b2449c3bd6b2c8491a293fec0a352da20d1be9fa258dc03c41941c86df6bc27c13700667cbd49cf5091c8c1b44b69cadbad134a520b2c6d42f7482db3c630a1026fa3aacd20c34389716b5703ac9124ee6f0603b2e5c171d1362b9aa059e87983a97ac294a34452493548dd0bdacc8cb9a7d9cef7c3c7b0128c3eac4ccb16fff9e511672dbfd278159b4da08fa8778e9f1fb3b6f4ae1e4be3c3deaf22babe8ad1bf8ad2ffa0c10f1e197724669951d6f4bb0f9693450fa556e0546917b7c46c2883adefa5863938e338c069ad81848317610c56c609032ff3eadd8832e9989a641f0d3e4397dadfd7f75e5f45c6d5c8e288f33fdc06d1de13f7ee15ba9a8764ea85c1c619349f9e330c77e62e2288754ba317cd62950e4bec35f8d68b206be92a5ebb963a06b12cd00f6f813556c2853d2c0f6dd690ec7f8d0c5941c058467bffb8af37325d16dae6d58105714009c182953b6d9ab016f2677891f266077c35842fbaac43232d404bb1067965459dc8cf56ddcfc3bf8877eb9e8e3dc40a29232ba4d600aab467ec1f5e66fe61ac1916b680d5a71b0081d90e92c7076645c9c6b64af23f6b51119177e7ca83a0f73f37804bf74d982239684107d79a0e55571a5e9d3e4278893eb45cdaa2174302c05c81684ad7498533398f37d06487b0db001d214aab78c3f0e145f46a74717973017bb078ce5555bbac045f9109a3833c1f2891bf1a4c13b5c1494f1f657059bc5d2d8e5c9419d771d825b832d000fcc1575a1f37cb726511a91dfab48d50d095a2fc880c8308f5d361be31e1daa5816c07c6c866bd90573cfb82df2275b8beb7dcea70493c458127fa5a91577c0b61e831e7417c5c891159bb6190681a8223ca914d5bcdf8f9dde0181ea20662800caec778e7ebc3088b69e63b59fba5455005259db3c9e7f713b5dfffe92c89b19f43534a4efa4edf007175ab85f6a392c13106b0d1f0a999ac2515722d625ceb8f8c7182e701db17efc6c9b6f9288bdb42961eb7c7b2ee1c3dac1b1d895ecdbdebcff2ea8917d05e5bd3d818e2cef004742ca92e544ef44646721fe31a040cf03c63e540568c86e2af53e0370e85735806ac48873b9ea327d79d36986ee0712fb6afd64925cc41847b0b97746b044d9a63e28884390952ee0af9bbc8b29c6ac74cf071c845823e638c4ca9cc9cc70a77babc39ff4d847b6e4c78bf8e2cca1ed20b5eccb9d75a723e2c25caedc3e1472ae6f94249f1fa6b4480758d7bb41d95b8ae550d25c2ef1018d291089719699f97670e4d907c9d349d7e3c9ad0fcf1ed24ef020e30479d5b98dc8f4bf907dfdcc458f17a34ec6daf889566e1f244275328e0bdcaddee98f8e63967696c23f408a453d3d438c7abcc6177c68c51f7ff4b542255fd368220cf443ee55d083b316a25fcd7cda5d37d47556d4d86876636e4ee9cfcdab7e6817b9f7d43e25a74ca9bb5d681b001da3529545f4d4531a09d9896d455a635b3aeba53624805944e0ff77fb6cacfdb5162aaf555a1e13e1fbefeadd4c2e131e494c4a1dd4faf0b1650e95165bf27a6dd45d373148439801a0c43cb62c6c110f36d715dde49efc81c48403a841b746bbc7ed9facd196153d244c00e67dbb503687e10a90451e1e52cc67c912f3f4a82c3c8984b4c201ecfb6b997da764085713f5c736d9484e45c2bbb9ac1fda3df20dce0f568b33384143e5d3a5494623a9c5dff512346ab7159fdf016ec996d5b9e31742c1c940f86997ad80ce64f4ad307354ff72ad2580663cc77164edddf032f54bfc29e9a730a0840a0da49655b9850c019cc9a8e6b0c74ef473864607f941717b7437cb9747514fa03e8ee9b4015c79c137dadad1abded259c81f08094446f6ccb76986e7619cf9f016d8433d71dc99d48e12573f0ee3c115913547c3c25b560cbc00474e9c4561b22ff2cc6d21d5424ceab3b13f56c088b0b2b67d53e4c7b459a75222f4c8559c49cf16586d3383d2444cd06be8a3e373fe3748c1cfc7e11a1e037f745cda4c9cbd39","title":"464. 我能赢么","link":"https://leetcode-cn.com/problems/can-i-win/","question_id":464,"issue_number":63},"61":{"day":61,"pres":null,"tags":["动态规划","DFS"],"whys":null,"difficulty":"- 中等","description":"给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。\n\n```\n给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。\n\n注意:\n\n每个数组中的元素不会超过 100\n数组的大小不会超过 200\n示例 1:\n\n输入: [1, 5, 11, 5]\n\n输出: true\n\n解释: 数组可以分割成 [1, 5, 5] 和 [11].\n \n\n示例 2:\n\n输入: [1, 2, 3, 5]\n\n输出: false\n\n解释: 数组不能分割成两个元素和相等的子集.\n\n```","content":"096221cf5b628be1e73e8bcfe626c7347186258a04f82d930a676b276a35031e3cfda9522af59c9092e660af7dffba08f46803c2903e14deb929b72dbea4fe2efd717a7794d6cdf604308db5888f497623ed7288d9a41d8b35b568ddf2a1bf884d6fdc1c6cfaf1446a7247fa4f14415d9751b4cfbcbe22aa14b6fccbfb0af6259ab644407f0e337812e055fc14f064c675146db11364043386f44217f5eaa41a12102e4a04dd61c2e6c7ebfb88781f4b1744645bbf58152ff13f8d3c76974e1b2f3ddf3baca07ee0405ae8ad8e5e2e70a33d20d9deebcfbb4229a3a687bdb4091ba2f32197dc79e195044aafb14c6b92137634e5f3a573024679826a590741c1d50ef197ebd27dca3673177ed93c275f97a2926fb132fc378d9c9b26eeed6ff82c2eaefa4ac08ee8449d7f1413f6247994c82e159ec655cf9e76e9f07c894fa813629597162c507e95ae46ecc4fb6187f3c9d0e193ed8e61d176ced7681017d5f7a3e815ffa21984513e3c3b102892fc7db8f173ea744c573cd656bb682031622598500e773187c3150cee2d43ff0909bb3222da98aa56bb9c7d04f6675a5264f1913a1d596de614838c2478c1d5b407d7ef8dcdeb30dc4b213c6ab75a6daeb89811a1edee3f926c439a3f654f665e2309fc55a88fc0c3deba34c4e328154dd340d7532a0198d7338a96cc612f0d2a85bab39b10bcc6048bfe2de96ddfc464f2c65e186469a669c93a68f490e6c5947a0a1c2d7f9f7165b12a0185bbb5bfe7fe24eddebae88edaa0580b5a89fde28e7d42513701368337a948b6aaaaa8a87c08254032b485ffcbfa796c2d772fc544206e8b11ce2c49af4353629afc16c15e0c9eef10c41d684c3ebab19b61c1fbe3991600756d1776780db9b816a1f0d69a181c3b438293ae114761b595c9625ec0e9d86913f07007d766f411a1a47d97ba934c8c3f16bd7f5f68daa75f5db7d1e9b15e92a27ef694ddc810cd6687700adda1cd897f5b076dfb0c9c8510ee71cc08f08c6148551b4ac1ce4854d5ea4749ac0706fa2ee5f85435f6946a0fb8eec34192795e20c7ae3f4b5c1efe6c9db6d433d0727577a7bb5c9a3dd504b0f370d67810f18388ab569b632fcfac8ca87911b300779124744123e76dfb068952a225fff3ab041b4cc2bab044135ed316734a3267cca66a512abd91dc79482cf3ccee5ddc394f295150e5a831ad2b368004b203deabf3ed8cbae8b311ed49d4d0c3a741dbd4aff3146ffc8108965db939eb2020e17ca48b23f80721a49c5de299935812638c88a289784743fef49dd4f08cd69689ef11afc55f51e2638d0f0dbba72d9996c64bed1c3786f481cda07cc43171dc53b25e17c448f28e614c10fba8ae989ea7e19185672aa9a5c4d69376fa0f2ebc70b1bd90b9fd4afcfad5cb6f72f18d27c3a66df388d86c0c4fe4836f61e5da1136b5e5deaf4323d2f242cd649c1bad31da3278550ce4056885df07a41ce7eb4b520bce075dba181087b43e35facc7e5b6957a287f29afcff9c5b950b6b0464f7eb23dd421472a6c75191136d90ffde0b8936505f7bef46795c863611622a43bbd2b3c8f0038d9c207b1b3ae5887ee1277ec0427b7aa10158e8626929589b86bb7363f98ae1531cc195dcc553a58682797e1fe24dd7278dadb3a90a649b761bb4670341675231568fdb778cb3b33f11092fa5e766fb8a607656062c135e68f0051687b2151003b9392d4a4b88ba13c14f1df25bfab40498680e07628675ff0ef5ad83781b90113283c048a5c6ab361baf74ba20a4d096ef705767b8643a6bac71fcb7853a7ae7dd580af6f670ef83ab7e56e47978611a63c0bdeba27c235220285c102865a67b668e30f81f156f3faa82e8005e53024898cbfe4b4b71cb9b098eee5fce7a2164fbfaf3fdd5affb7dc2ade632853efd15f84df12b13aa90e4c8b6f71a53af21b2c5c65eda9fba03d3d8073da240c048629c6b5c8042b6cbff681e965c2dc3c287a0e952e72be23df3579ee08ef9b889fed6ca0f49b1f915c87ee75cb85f7e003f3eeb4d1376f8879aa37bd8d142e0dbb848e04acdb946d6a2fe4e0de912e294eb78edb7990357ef0ecb4be26b3e1ee8077cd691ea0f2e863a7959a4d6ecc9d62f132a49b0f61132aa07a5cd95830e3f69058b605287f1aecf27d59cbcbfd730142f8f30da2bb2506610df7b0d81e74514d3afbaee619a713419ae0630780204818fcf27f802a64302294b5af034534f3d1234530961a73adb9eb13cef53d331a682322c7b163563c27861369ea902073e82436104c5b41cf0847cba8fe0f529ec69bdfd36ddb279a4ab44c19f5b2d33c6e397a5838f136a862572f9e47774cbfa29bc45a9adf0a7becc2dd6657d92765e177e64e410b3fce8b404cf2d31fd63e1220fcc1d2972f8a8af3dda2278541346fb2ae90041d8c1df28a002abc4ab5bc43935eec62de82c706d59ed0f8e6a489ef51155f01dba5818eb6988c9bd6019ff7d6ac0d6da857d3356e493706ce2ee99b7a4ac4472deb3d039a96ce95b55786cd88968c4189eb009308ecb3be246e0fd2b1c74cd497d36a7bf109463e1567a5a9791ca708eb89d84ccf3ba1d0cd0ab36589a4c484fe724ca08cb1c4da17f7cb82481da237d54276cad786a7028a2983df08c58682478fd7403b88547893ca6a80c3a9c9f9447e0d665ab68b3acc1beb2e9e28c0aa687cfb62b1ffe2a3c0a55401fa564175e3d4a36a9e26e0f140b67f678b0ddee6fc28079bdb8ef3e591dc0590db5ddcb717319aa11428582f25e6e84ddbe5caea20dbbc6ebafc7f2d0655bf3bd20e475261b2d5ababff595bec3cc16a4565edef25b457e51ba1aefeb193e33433f0a4096bcb0495eedf0ec732bd174a677dae03a83ff8afe10330f2911bc3264f036c84fc02be922be3aa6a7e4e4a85923177762fd4e980b10d8367d8b94acab51be5b6e905dffcea26aba07a2a9613e0b4b86a08d6226cbded22cec1e5d1238442ba7b2d7cdd8d8054d535562cdec1ee718f6c5724c536bb5e1103960173c6154045c48fd00ea43f439b30b22acd6cb3f06036f047a1d85436be6bb88a50451d341fac8039900a73aac6426c9e39cce4bd193664f14ac24050a6c3924db18c139855622c77aeb65f4224ed62e7dce07076b8ea2177b1a80e7b90a189b1e58056b4a97559c397441d7413645adcf2393ad9ad508b08423d9977f30575cb26ab0c19003947af02a673c27f9af689fd6a35d6985b77dd808bae6075435731748be20fe88d6fd73d1186595d68ac9c304e6c4de8499e2b3fece0721d5411f2eebb710a4133d06fd477ec6fbe0c3b62ce326905d6aa38449f355287534cd5c0a5265a4033144f061f774182a06284c42d414dec85cfdfa325b7d62acbf10df6fc2c1541f1c3f3f13b3de60b8cd258d28290d55dd6194c1489db9cbd13c49e3c2ccee1400a1810c019336c6ea9a0a5d70a7c75f1cde314fc8ac68d9c71f26d01bb346583e31da9273086a18b404b5cb6acfc2e67f08abeb5d98a0280ac5bd3e54732b0512a467baa885e660100a366e0a8ed97d1ccbb05ecedb896a38ca5506035132e6ab596785b40cbdd23dda874e6b1c41ee007baa616d361e9b2206f0c74283cfffc25863c366b62c2cc9d067a69ca197e1e1f1caead80da2f0e6f6b8deadd39a988e4efbe03f8e3f3642718d8dd09d5b53b673772aa1220321f3cf6686e9a226d59dd931021f91c17fee0c90b4273212d646014bf25fb416e8c17a98db2524bdeaec488bc106ae500bd79c304cf22d717f03bf76e971319475021188540f99b4e6c3a4daa481f008da52a0490f3a3bdc2eba76d83d5221330bcc8faf3705cbed406b6370a411935455fc3d6533ada5048d831622711a6c4e22a86cc3c5f374b585766ab49d353a01192c50734f817d9fde9f61828f0319095928254b7e58f0db8ed70aa894da92d80149ead920751031a07ad727afb30a47cb6a46de523aba8f7073202c1836b8676c8adec16550205b36290ef5053d8f1eddd494dd0566fc008176c144a875fc13121cbafa09bcc07eb8f93a4f5386712ac3b11fdb59094129e87d172c45fa0b2dad9ba4ec73c466971fb074446ab592f29f3352bea944de68cbcbeddcb88ff09f753f4a5c717948013e9bad65dec11f3e914abcfed332178e373cd4f74ab01724b557d5d222584d69004e27d6a9b241e6727fb708c917a12d61a07f12bfac0bdcfb666d7845d4fbd3a628604f5935c6702b0ac8574313050028a5bbd2edb801bf32d4a814ff3f0c9d687bb4cbc9af38db2b8cc024024f1249be494ae7f4fce6e75690831d0bbe290966bdbe95728274e77e891bb041bcac7c47974d64c895ac09e36ad1ab2d16542b5b5ed4b3459292efdba8b3998ebd452501cf1d8623e8858521d76310e3bbe1022bd87f5043ef4169764e146b3b753411b9e5a5e38b0b7cfe8b2af2012596c50ecc947d2fe0e0bc80c1dfa31332a6c8f03d42663a96fda57a61135acf64afa69165e30c29f74aeff46e6c3b249b79c5febe3ba1b619e7aecde4aeac5fbd74c82aea1695088e1589fedfacfbe5ba216b55aa4b6a4c03b76b7c5393e9cbee488342c37c2a6c04d3ce77141b4f28bc9ca530d8a3ed32ae148ab0a3563c57247ffa9d7014d400087fd204f6932f6a8f8cd4ee6bcda445d0fe1c98f26f6b83c94a48c13fbdac72ec05fdcdc3be803d127229c5e17b92b65132cf9703b507cc181d6c2a77afdaf34f73dde4914472e4788aedbfdf7fcd86749f7aca4eb22983a72cd00e74c4a671b5822d2ff4348e2b4db726f0eb096fd1b4f51a8d273ce441308ce1b599df01ce8011cc39d550ef0223ef3d78134e3ef5348ffb9fc105281f9dc3195316eacb66e8019488f084a3891b51c4b7a96729c198e18eba1b1cc1390eca047d49610f2178bc5542e404a79c467bb4ed93bed391c8a28c039bbf9589477ed29724e3cc0fbc2206025e13daea2f32b51643d7f7895c1f43cfb1ef42968967409feb5380e0b683dfe7fde1c0f17251f26146a1901ea4aeafb787c5db23a4631799eb3c7ed62d184670f466213d0fed5a954bb897c628baaf23abc4af1987603cc8f7cc861ed6d9f8dac7e7f1952ab689da67d80baae2832e1b285cce90eff99813b3888e065fc06633f6745fa2903ee4fbd383afb3ea9ba7c52d7819b2299e7caf9f778a086dcc4a7a72182764cab343031a6ad4cde954361576c7b61951da8b67d485fb2c55b45af56bc3a32953048b68cce6ae17b212478f0d9c3265fdac2a684e3930334b948ee760fd5e4a28699aa4dceea55838d32dafa7e7f5c1cf59297b5cf4e0a686cb16fa3ccc1f9e211289c7710e09e30bc0c5fbf8ea01d11054c13dc26be0239ea36c80f36d381ca90b7b37b777a6d97b2d1e9a484d8659d3c655bac62d1c4ec0be8b65e385980e7c1b0bc5de04928016e0ea40287fb558e160d026cfac476556d4a83656d737600f9d6282ddd4fb2bf3440a5532de63eac4f34dd1ddc41a0f1afebf1b6cc56abdf6b736175645482328e3feb8edb32cda299a4a2c791efa3257473d89a72cc568abc10e5e1a99b447db8cf442f8618d412d3c5e384e95ce27c5af87e5931e045c45f0bc5f33882810d6c66ca3aba4633bd513759da2a28ec03e9d9e6bb3d42a7cf6964d8419eb319651cededc2a510836043058d13ca1a83768b1615522f513263f6e9353b6929fd8b8af61a6fa1d8931f7d7006734bb81e48f614b1d2f76c054a7a0c844485a442a5f55f79e137c889e1eb3aba3586e2490010a62e6f26192a5dd1d5418a764de5cdc15bff71373c5f7a29f4168c6cf9196811c5ea39ffe8c27c7734656edba12d7e5e3a31efc4c1649ff864007367e4ac7be80db74f759d8b30def3c213e77c2e783cb70515d2018396f4590ab77c11d73c2431e996e366faf015b2855e1710dc0d499cf7b03491647661e2c1906cd8333e4a6a43e5b58cbab67f3470a4166dd96adb4c04ec30bc4f9b011c02c54339c5637107aa744c231c75247c50420cc0e84917d783616d88e64896dd76c37f56371a068da5687c242d000185b6470727b607be859b631e901e86e783c7cdd7c6cca4a0ac400858fe1220115f386ed8bcfe21ebd23edddaa07d1019224ad3f6f602dadedd9d4c374e3389c9d12914774bce277dd45c4f0f82f274e69b80e200fa43a4bbe57ed8e28f25303e12aea9e4f0303a3cbc9a0bd3022a5d020f92588d6c5617cdd8eb32a3546b9b189a722bfedb44959e97b4f4d4801f9743f84b656ba0d870cd203a367a53749a04a7f83f8e2edb1d7db5ca09e25daf9648650e8000be5b44ed30760638d18961bb35c0e70c6700de6686c1a2746424920f22e3e62fdc7a7ccdc30e00123fa4bda3b357670f3367f4b329110e1ee00562a2f0b09c7d8017656dd6b0422abea20e769c5315e1c00833b4b4b75faed555e663dffd1d6d520b9f77260fd5b879b1d70671b39bbd505b90a9aebc0274bcbd70a5ea02a03880297bed60b00e61487f483471c0ee974b6b9969729e4560805b0a3d0db5a835cfa52ec151b3509d6786904a6862887469e75a2af5b0940ebd3a7fd4543017a88ae94de6efdd2e583da004519e724e2062498335a113c662969a2b5228585ed1f2421e1835c027ec948abf0bf822b2fb270f15851c8a33ec63943045dcc3cd7e58e00375cd97e9d432cd64c30a87a5d4342338708818ac3163d07354771da7a7139f5441849c93a67c254ca49de0bd3b762a425ae1e329064a23507f722f45cfe653e2c76531f870b8fb65e1327d6fb5c9f4169d42f00d842db435e90d8e72b866ea789265a47e9550dc84d0fd5436c791f1c6ab365d742f418cda263c69c2375d3d58c32120779196ce905411f706fa60d61c7e0d6cd3879b628690eb978632b7366d9f4b650037d1ad734d24cdd8df0d59780ee81fbf6e186537819c5a17258d4ed66c3254bf44a33ae1e2f590b9a3b2a88b14487ce6f2a2ce0f175a7812a97b361d5d122efab07d3fa0b052943271a99dac40d49706c2d44ac644325937200b45bdd88babb2312d36e65de3e1ad53243f1b7b4c1b9643c8b5c47671f5ab7766ad7b642559fb75383a97bd405a35e48a4feb376087c5b758e3900575c098c8349ea8d2a11f35e7ad940de657fbf74f97fe506add5a3462723936f5c1e6946275d8f160f0311b63962b59d13cff9adfea028600ad598c47f4a44f48ce6984d57cc8985ef05a004083701d68fa8b494032acd53a5e241ae53a30c7deb15679d1ed0001b036f6785c42825b924aee49bb8df4d8e9779bd831660eeeec8272e5bc68329b88af5c7a836f32e4302ebbfdcf4cbe69c9674d7bbc084161a82968ade51236476418856ecd64cab8aeb7a57182cb5f4e810758100a25d34a85ca9733178f5d0f0924da63c9a47f5bbc52a8f4cf4c7f1090ec3e67db0a7abcf2ff76061fa2251d66ab1c7e9e85a6eb1fa6b09e9e3e9f301656f396b49261ea1feb225b7b2e43a026e72e4174d83cd1b7a107023446173066ed031d50a9ba707279d0964d61d54af11d821b26c718913f929a27cb2812ebff9bb9684a9c78d494b7cc1f69b4f4983c5ff3e7ccc88a90fa79bd56b49c56ce740c206c9584ff017d322625ea303dfe1e51452c266e47f76c1c30a54fc4f2e2728777eae370109b9ecb025ed816e8cc72049328d21e3434ba483d6b7297e58b0eec5cfeaed1e24d7687173b3cfe16df2b4e3a783da005fc2facf6aed1c788bf8afb71b945de7c6af928040b73c84f32852e0181e564bc8d0a5a9ffb0f84ffd1b01e30186b39f142866c1b1dc7b7741b69e4e1c49709b84a90e1a3cc026a407c66d4814ebbacc41b1fa3c645a4580b8bef0405a03a030f72766b8aa2f236036c8f8795e2a78d7ff03b0f5e537f9e014e0fda25a676803dcfc02d5e0d3798d025428f5fc1b1de49a8af0d93b17893590d01bd05d10d536e4fb53c776aab6b1be29250da931aa04123aa0b736aecfaee32dd5c62b782881996c433532546a2fe396ad8e2f185c484cda9b34c51f83ce16f4a8ff12b9d802873ae760f596e93fa880e3acde10aa1ae95a24d41093080e07d036ce472f3281a4a5db19cd247d55986d344b9f0fb0631227818782597512052f7da27b25425d270c8be26dd46340e4f4239fcbc04d76d7dc348b417f67c901d4416ad77966bc6147ce580002075ce4a60c5aea344cb01546f02a6d3b250e4c851af3fb39c25222c72e711d2fe445b4bfc9da9ad162b04f51b93d4caa1c6e03fbd8f3968f4108487d5e49cfd03389562718169f6f5d29d84d280e6699d9d3186841b8ce7c570b6e7bff60f8099d3f7ae5c1f46a958fea27ce5650a06252cd0ef8bd79bea038903ae71ceec6e38f509bde7af53401bafd4d024e9057ada6703cc7898c289c23f6a8096a2ccd8c15909739ab4307fd943b6f19b593eaf54b33d8a7c1a6bc15e786ec599683c7e519c23d971ffa6d9f36984faf39d75bc9ef9428c0d7026bb0b4e9fd697e2e99f226022384f924a2b678ad82b2339cc6e4245fdffa06573f6813181c40b47f834e876e3b4cc6250c52dcdd96697a97874926986475fb3aa88447430a2187279c8ed19d63063c6526f01df055cb99caa246206592afe4493246fcce597eb041deaf290dd6455a56425cc917ef14756fdd50b2ffec900f5f10034a1f7c032ac4a262a5e6b5bd59d77021f1367bc81b260786aab194fa9a67aa90369202a0b212e3011a9b3ea1b6925bb7c7755c6b0fe1087d4b31f84de3e466a7b8e02cb09e0614b67994caeafab501ee510b54de338f2bd17e04cf1fbb6f0cf70e9c68801497e3a864fae3a42ef62ea67d6ee3f262a28367291e9fd39ea687d11ecc19a402751a72c17e8c201dc5c7de97a06063894bfa8330565f78242f40b31912aa16fecd935dd79d7bbcd8d2c27d11dd2541ee1b809aa77772d75a9171b38a09cc08269617ce4c479d4ad2b68dd76e62afe31dcc991a615e8bafc993e299bcdca4e7a1dbdf0b4de4bfda7980443ff054020aa4b711b3bc6d908812ffc37bfa9edc7d1cb7c91633e61892dd1ad2c100c317e0d46f9e00effbc56ff139b1a27d1768ab9b41811239937fd4cb5ac7cbc0301c7bf59ea0f84abbe903ac7118b6e7148826943a5c55c2daf6ea1b367e6807e6e60c0ee5c151c07bebd168f27b5810125e00ff55917dc1f2ed21191b5db19dd956fc7ac2dff1bdcd38c2c0e87aa8bd4a7766d47e5128266f2a7e93013da789c3e8ee83fde9d4ecd08632451fa574c37cf231441693e629694394c4533a0d36aa972e37e2f722f4c606ed79d5d30fa0dc390596a435c91fddaa47535041acb77b4a230e3b7c8a3aab3660b464e78ae77ec0481011d1387f9c0e91283eef5dded6c8b5b0ddf37dc524c9fa2181088ec24de01a17baa60ffe4f21ba19fbdf2bf7af23604a0622c3fc5ab676074fc5384d13136a377bd8dfaae531b2e3598b4b0aafb3ebc48d56837ac53f2267796ac0d92b7add1924ca4f1837d59f2c970554c9b0277c4a5f047c3f2559926b7e66cc21442444854b4162245f500443e2bde244d65db4b5c371be788b6e6cdb1af0b51cb498d1652be177ceabd40775214383b352ae5ef37b94de13495922c6f94c762e65d8d41966f3389d40b206902a33e59e3fbe10a830f88a81f0633170ce8aa44f47ae55544f7035d7b019d5a654afe982a18e253e68d7d444d4bbf4adf5fa1eade862a9840b1fdc428810f519f19e492e2e650316fc3cd284d3fc02ed9e8c7ca160f93b988ee03728a56c8e4ed88d878503f6e2a0eedd4cff3f78ff75404097abf222497bf90c67a3ccadd6a8df985e17d118f8d6a6656511ff9f35b9baa0047c41cee8219dff2b2c81fd11a5972260de624a84f9835bc6590aa32765959d81ec4b65924b04313bc036e3d0a9b2edcb9ce2ddd3b7bcc35f9d9d9ad9d8a467cd036dc7f9b9d1109d8b753aabd3369aa8d5587718609a88197fed3f2d1b2c1bf4b63e8d73e33d5aad9ae36c8c10276de732a234db52d87d31415da95555434fafe686cd16a56d8f63da492f73081ea88ba2198bced60ba4abe8c9c670bcfa42328599445e32af3a3db3c85f09c7268276e19a6c80d73724479022a4a6f42afb226c839f62459760619ef9c11aa564af403e3373044eafdf1e53472997c223cc1a873a6fbd69b83cb3a74474621db59fd269a9bb5a49e095026cbae8126c201191e263f52a2835ccc263900954bd5e0664a223cf1a498af326f8395fb7deaa0643a944463d734df2399ad41e60be46aadfa5f3ca5d826be7e07a8d17a790533475b6f1fc52e7fd96486360006f94110b8a7efed77ff321fc7edec3a3c0d323693b29b59ef67a2eb4b3b0f7c4bdab1782bc141e15b9365f349eb61d1509fe60dce00e0261e887980747b7a200160f61f4ee3bbf3a44fda6cce0499e8d4a1554a394fbcbdb38504bb011b71867554f137fc4057081b4bf2e5c2c6132a33cc15562e6dcfa939928e1994fd7485d4303dfb138fd981f71fd94562b26749bd7596d2cc751b77716a54a58ffd6998b9d7729bdf81c32635686e01c9b18fc35a52831b50a3ce5a75dee85d0fde92581539cc71e1c0362db3eb5e167f93f39676ea401f4de484555472c85f5ddf62507395d6b926c17817831fd51bf176c53a783e1ad1cc8ed609b8ad55269fe747b1f17b7903efbe4d0cdbfc5e08be0132eab97ec6685e9f16b4e4840f54326d6e083236034dbd1a571767ba7b45fda0623aee6f9fa95ae8c793c11671615dff759e0764debdd1c6163fe7372a7c1ba3b9a1bad16f44d822d2ba9d41e2004b99a8fbc74a6b7c604ed2ee96d15718c85ad9f60fcb682a315f9cd13fc1650a13560a77e9584bf4cb78c54c30d0781ff7e9a66502c767826455593de3b465d0f03ccf3e3afe3abae9c844c2acb0251981857ce77fbd2452f1b556a90432b27add97042a1302276c835ca87eb01a1d99ad24620b54a9a5e68594c9954157c01cabdd69bfadd5a5893adbf6dbd58bac712dd663999dc58966d512422eb6e568335995ad9c3ab53974946416b5653170ae1ad1fa343b7204bcd0334a547b26067ee50fb492de27b9a1fb3b2ab3fd5e3db2abd16b8e91af51fd7d0b598befa39608c9548730f2ff4e71312cee423f1f6111541025c0a080d821574ca4d36343626ac860b30d823431c3d0f637907206e28b58491c6fd366e5181b1117576baed9c6a843b9337c2b6d5adaeaefe42db8183b1d4a82b99437fe00ad86cef949666c763bdda7e1b2c4b28f302f88ffb88b1903f74cd4337ee88a88aac7b65c749ff7c4383e7bd4186ab5429d3d59ef24c827d24581e65cbc05034edf7da0af13ed7ff9540408027f06826b2b40b9819e37bc3be37ab8b080101b7a61355b742493905a4b93d2e32b69994f275968c34c00453a07a8a5b8fe711e433724adb25d26027f204554728bf5b1d1eae3cda28349c2d24e392cb66af3ece030710494822829fbd16d2784404f839e41b22de6548c363ee5ef7d0f1943eec23845911660c610a21ecaa4dda4d457a46c3730a8734cf6ce8d7041f799dbda6da7391bf83d758420eece424d175f0904a54092d8981685ca6bf7eaebdc74ea60611c503808df5488a7bb2fd7073f2dda5c3c3cfd8357949366ac0736cd9def6743dcf7f22f0ffac13f32c18b59f52fd3bec05c74ef7d453fa65e2c8e6d1685d6ed670d5f1b31187c8ca13045cb77353b12a07742b0ba93b0f0f8d2c36458ba558391f92b802b7d4e6edbc49974a6dd70a7b97d6617232c19be3061b826d83064ba265c8adcb9782690448bbeb3aca4f240846281ee56e4a870cf0bfb090cd655b7f642085a8bacf3529ef9e4510dae6b8061ec6472d0a1770a962f271c35be6940059d68b7e744b6f39fc495d84fb7a36adb3f6fe9a312e5c10a92fda324e2e7fe11e1629fad2fa79e6dfbc4cbf56bdfb3520d13a7738755f4b312592e81cf1232a2bcbff16a8aee22eabfd59b4982dfcc66d5fa006d40963b42f6be70600b0961efa54f257f5dd605225fba74a4d9a37d9d2c02eb86fa375db6446823be99ce55fe312c4ee5d0236210a4023c9e83bc50d339d03af3559b5fa397ff8f415ece9368c28490f28c4f32847b0a8b8e07b87617c497b2e297f41f6c0cf4d5ff81a080d058c515c917e0af4002862b018b98dcd87a8be72c57edfe0342b238e833e9a4c8c596381ad9b489ff64ad7409e6997902a0204428e4b5b1b6fc77bf2af31cc40b0fcd807465431db100eaf004e967702df0fbc393b36ea1d52b00be7ad25bdfa45d4badd60c33b8c81e11b76d3d91a059d0a7a2ff0c859da52bfed31a13e4b03a21a76ed351bae5f73f1a6534bd1f1b22a906846c6b859b6072ab517dd2dae77b645712995cb58dd0f986bf1c602d2b373195fe9b9f0ad93788b1f3d3abb8471dca0a9c9803405bdade9a0ce54e673ef4f241cd25457e35688cf9e356477834078022b5b1a756c9b706b0c901f9781641294466b07c22d555112b338e59feb576f4803fb1b71762b52d7dd39faf0ae48d809a2ecde4bf7a5087db40143fea06079189922252d607b0b565ad0ea4bf1e20e6346d36161d64647c91f6b18a873baa3e4be168c2e1075fdb79e820d67ca352dc2c5e19b25d31b9418c33e4fe3466cf57251efd775e49f92add8d6821434fbfe107128ff4ee37b3d0354d7a0098d438b21444c04c46ae8edfe08eb35d4d1a1b3e5d7eeabeccca9a4976e45200e54255a3edb7a43d6f110217b169d82478d7e729989d1b4f7f04069606363d6527c1dfcd8cb67e06ccd8206e9bbcc2e9c488b1a2c86a5afc7129a2f0a6bad416cad7672051358b4f94936e85ee2b0c5f1ef8eebd3d0b726a1573909fb1cb8f3dbadbf58ff4ed84aa9fd5cb0b440670fb51d4507eaa3879bb6a08f0aa1d2a5b19f1a4eebca9770d79da09c17d1a05ab9298f6914d38f5333d31828cfeb8babea1074c0d4e009dcf1c8e4a549f9861bd0aaa20f6fa5868777840f169d22b9ef077c784774968d192d280423c98814d7f6e5dcbcc24db803fb5614b8dbcf8e8d5a5e853b9ce991b24f1a489dfd1dd221cbec6c6720c13bf16d5774933cc3e5638ea999e1fbf6a1dba4e6f303d15534e4b922a921095387944c0b78fca4cae11c2867d567427effd97aa4e5341b40e716bd7c996e8a955b598013d645322cd1309b488d259fa39c7d1cb129f9e36b7d0e07993419003a805cb8817afe8ec8e46a5689617d1c2907500ab2e617e69b2b88d599037caaec5ae98efbd7d74f5d35581ea207ab2204eaca77512fd593978574e72616c8839d593540601e12ed84425c890e4f08bb1b1fd8e53a713631e747db5547d0e5c10aa596d113f6f442298a4c2a6295c0cce60454a6e1d8e789aaa9b081a99c33ba4154fa79ac5582ed46cfe3561aa97c9bd328dffd0a53b031befb506bce562437a6d0b0f1c324dcb0458b9051aa05cfa3173e00f480fbac9906c8b3fa8b1fc2c2bba94212284c78560e530a5265f4b3b7ee4c40f40fa727e320ef1e29a98ab862e206473bfc76852cf72bab3841e550e0c791b7f347b03159d358659359b0f1f7f81ebe9f965f6061b3ca5852adcfb31d3a8a0d34b6bc9c619ff9627d708f1e3e28f65285b4388acace3eaa06d8f562e4ff80aec5c7e136b63ea1e6218192423f156a8c6ca43b970dc127ef7ad3e8fd8e3a89fe9a821aaf41b51753bdf45ff4387d2fc4844e23270fd9566ed3c6a7d58aff3b2c3f4ebe1b7e2cf8a53837833084a347b9671f801459ef8fd92cb90a9b3280744eca106fe6edaee212990ec1831517d9f23a2787c02c844fcfa41a00e37a042a9afe34a8e0f90c9e254e48a978c1a2a5cb06b45da9e1acef2dd1c118353c755757924291e7563e0b572a5f427053584e35cd85189c4ce3690986e382733ce1abf242e3cf7a456ebaa6e89263de951f8e8d5d72f2a5cf22522a0dcc64b411735c329b04fc22b57e15faf58425a3534d2328bebf78c84e553a1d4e570fae5dd5e8ff78755d4cff7bc0a384607aa3db8ed1701f7c75d498ebd162ab912c2e4de2fea09e56c022906068e80fd2551242525874e8a84e09f4bfa3a4a18df34bd6020eb30b84b21a597eaa17cbce9c1e97cc738965c974b271b00033edc5871db50869662a472c2eced064","title":"416. 分割等和子集","link":"https://leetcode-cn.com/problems/partition-equal-subset-sum/","question_id":416,"issue_number":64},"62":{"day":62,"pres":["背包","数学"],"tags":null,"whys":null,"difficulty":null,"description":"给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,target。现在你有两个符号  +  和  -。对于数组中的任意一个整数,你都可以从  +  或  -中选择一个符号添加在前面。\n\n返回可以使最终数组和为目标数 target 的所有添加符号的方法数。\n\n```\n示例:\n\n输入:nums: [1, 1, 1, 1, 1], target: 3\n输出:5\n解释:\n\n-1+1+1+1+1 = 3\n+1-1+1+1+1 = 3\n+1+1-1+1+1 = 3\n+1+1+1-1+1 = 3\n+1+1+1+1-1 = 3\n\n一共有5种方法让最终目标和为3。\n```","content":"0961351fcdd44c9dd275f1df845ed5904fbd308704f820b0066e5027573a011801120ef3ed4eff2b140a9073ec2b60db79df883c5bafc93938cf15a16c0679fc30b6b59d1f083b77d0cb4d7976f7373c74a4f4446c26f750b145f54b1a432351b176965d2ff51cd5e7b7c7982f232432a23f2e43335ee7d06dbdfdc47fec1fb4755cc6a8f08ac7f8982da03cd80ee230a296827ed9b4c2a44f27d0b03b777894f099b08caeafc950227f65fba77010591944649124247a298d5bb45435ab017a20a91aaf7700b85eacec7b6bf274772e9d74965f92fa07238efc220fa399b9061b2a3f9550a2458bfe3322f4b9ec86ee060971cc8fd47b6d1e4d5ceea4cac139b36be3db83cf3bb00b234c4b8f47343fc69be830b26fb604d8f49782cfcdc6dc14a1aef86005c3e78dc55a7346df7522b7a2702ac8b45eacc14aa19f60e822a14e0c81fc4a30342287e10de9998672d8a0f9b8b891a8d975882be59c3401579cdcc45351b8135fc1f45b5319900fa05d7e9be47dc774495c1738e45becf8916232a7502f5a3388f8143ee42d50fd090cb33e2fd39d87775703215df73226560597a340415533bd3ed5f71f1b99ddd074ffa7d3d9a847df007d3d28c9440de680e760a9677ccb50ec9d6afa0a530731186f9259c5d1d39c839a718edf676b448b1bc1337128c48f17fbc8fd3574274d22203a60f651bb24d49f108536c3bbfc74c97b3366418a65f5220c8b1b265752a5b40a074455fedb79b29a4f0e3405705ab434013a177e0505e8e606978abf842311774582b9832f8d810010751ed4e3b2efca9d62344a056ff5b8bdc5eb4ec3efe33cc853988a21ef427097ec2f2cd1875160b6d507636d05723228b74e75e8927c1a68601371691cb5b4059e86edbbc189998d3404a5110e33f3fac98c0ee7afb45f7f56d9d4a5719e4cb3f8148bcbc047c0510cd8115606b5acd1e0267a2c16fe562f99e592cfc63af637d6272ef4404ea390352e30a21cf0d81534e44008121fd2455332956d107355d53efed97a8680c579ccd19fab80f96b531c5eaf2a17a8a3cd56e87047017dced05bc5f1648c4d14169cd100b969b331d08e568d030689d3afe828a72676c6c8efaa3c64af6a189b7828404f81709a4dbee86158e55d46b5f3c522395cec9999af120837352f7d2866561e711792234a669ee78415f35905233322f9e36e914e40b448c30e663c07300a720d23fc9311e399aea11b87e4ecb93f0f8d896fca5be544db4a5cf7d72f7eca7cc3f9356206b89bd02b2d14de8bcaeb791913e1b2c0c8bac0eff1ecf575c9e02627d325fd1fb52950f61e488811e67943949ec4f1fc01da790ce8ed239bd146ab0b86414b10debfaca2a4a6c5a1887727a8b8c5d6a75ffb0b37b26690b1acb712c88395d7a63957afe82187c440a4d5f309465689fc6d0d9cce7b6eac987c2e8fb83a7ba90bf75bfa2ea264f6ae9d8206cce47e1ac114927417b9d2d527c6d609fbb32e2cf7c7742293c9b1fa681a321c1b1c0e9d778bedbba03b0ebe1eb6d6de3d290fb56f07b0b48115ca5a631f2fc9182e5af380814c0419fe4661257cdb7258a5dba3e43d008004e8a31bd689af329af727aa8ab8ab7b495ea771f7dba8b6aaa4fffc9c0fbdc6ec612441c61ba23df1f793fb4a75f9181edc321a043e65abb9047ab2e2b1ec64266975808606c8ec154e125b2682cb8532c2a7217d939f02ab2c2e784e89861a23c2b43604f3d1769c2d792f2adf499453ccfaf05051e51474dbf1fba9dabd3909907e9420a2d782e04278a201f4366c8f70d2ba841748e6e4670ad8d27df6acaa4270e341778f95d708d0f5ce1905117d183477213bfc6f2fea159a4005394290cfb1070d2c0c28003b76ba9be6226f668e32f16f790153f9dee3fceb80fb55e9ade1288500ec17e073f0031daba6c12b1e874a76c675bfb9b95a7146228fddd8383da675c777629e7c778f759fc4c55f179b5220fbe188a6d553fe0cec11e6559bda4c50d2dbc3b6973329ebe870ab6a882ab2012c039df29b6f78c77c80a5a37bdbfb8c719ae553ba0ad5f405cef3a85b52862c647a70d624cb905734cc4da84d9f283972b90d1588bc8ba5a583326a5483fae1e9da2f3d2748a8f21210a5089ffa96a0203d5c1143ba860f2802df33cbd9b59fd231293c8c2ac428be576b16e97009860bd99c1934fcaf43fd0014b5b8173a3d0747d2dc973a20bf108abe642778bb515c2b7a29642d2a21e826afca9c559049b16cb826a6c990da87c12ccaf8f00d0600292d8a5f6ce64fdc41c6d33b80ed91df67877ce3a73923359a75a266c929aac9b415014124593a8cd02bff807d56b8ff1712f639e0214e2d296700a96c9aee65aad4f4dc07b84ab37f27588605d063e973f8515f81786836b6bde6638259cce8fddb30d823a996533d4fb953fc28196552973752cbd42d2f969de6805d9560818b23572b6413af129d973426c80629859103cce00e171219dcb8bf21c03713afbd997e030082db132335a964ea68dd96a6b14f22ac5f8e5943ebf50b28a714e0fcae131f4ed00a6fb75415441dae1fd7b6d956246db70613582b433773dd9f1462bed73e93faff229842cc1afa8931fdb16ff60b55a6b88dd6f74d91f7c4aa622485f9e245b1bce333eea07719eb4fb3096cc6f50f7a65cd7b45b600ca77346c7b51106836b3603a0c26eba83ab6c48dafb69e6ae1d0e5b59cb52327fea0d3cda7678e7d1804a40437ca36520ef9a0f05bbef2240d54bfedbf11a1f7402a62999070611e82680a9d6f507640755e14fd87bcbc75a1337a8c8db1730076413c6b4088109eb70178acddf5ae50992303c6a6f08e9790ac050975d9cf2b4863faf82fb121a75130bd0e70193bced68b95bd3f8ff82a8c22dc02d756f363e53e672e5902bcbfbbb1ca4c8a0387d87895b57675124e9a7bc8cd12a5324c7fcf759f4b3cb5c2cec825214483b0363569ef4bf2dfa3fcdfa73d61105d0e29cda9b3ebae3b6eff50f4174ff7bcbd893d1e8ce39290d1ef93ee84c82051b0507ed54fe2a5462b27dfef879ac2b5f266ca9636347166d8c35c844a4e8160ef6ffb66e9c21f88e441913c268b8da775dd91859276625a9d56b34885b671de799e32a0a139e1dd7ede9cbdcbe798c192aacd7d92b25381c897cbea509d5dbcfd874a93f588355ee75b660c09ce232e821c11ddf4cff77dbf4cebee43d13ac8f4d6b827adee3ad893f75d7485e47ad05ce0b45b5825174205ed203a104c35b962c0c044103056048d68e2dec7ccb0b33a569da018f2c7873d62f017dc94a361c1d40f4a402f1da5249c349bdf3305943f82efd1ee59cfe5e4d08e4d6409a36133aacdb098d289ae1fd23919d5211bf58b9478e5a302d7680f50d4f0818cfaba1e18f11a089721efd4ccc15d8c5b14aadebed85be3962e0b732bf3f8297af38e58bb0c502fc0e8ed9c8810789d650687e2689d814c2e9e4efe15543e21cbbb7e303e1fa947a4c918afc2ebbac05c60b05fbd1425a8f86a546f2b1512629d493470112e531b3415199fea0211d8fe38a1ffbd3e13af1143197b4ae3bf4c7f989e1cbdcc6ed9e4002fadb03a82964738387b69dabed3521cfc799ae5c05e6dc97cb639628c913467136e7b594f742c3a4ef132643e0f7e420559557312dc056de46fb9c8f42d9ed495f55253ab6db2db27ecabdad5cf768ff28826107e2aa09ff85475d27bec4d7284848e37b182960b8131a0271490504ccae11d6f37e13956de48051ddfcf28198d60222703f637d67720887b495d894e10c29ba599f6b5a19a995d8811e4074d673bc422ba2f9e0f083d271f97d7af684488a30b79263cab4cd15d45d62c6c5dbd9e54daa9ce99e0c5ded4e761ba574a54f36241e38b241a96e88fb9c1cd87ad4dd2723007cc4720f399c7f5e6c0aeeec33c130c6e971438552550d5fe3007a491db810bbf168b690b8547a462108e57738986776ee5cdde8969ea61c4907ac6f52015636400dfc38842f346700f2dcef634c84eae3d15d616e7fcea945420e73a5dc27b446b0e7aed0a35a4ee0398342b0052d6e1d8a9e0fa0b2c685f5670bd3da1e70fe9114b0efcb1b4ca2600dba12db467a31c03536e547a699bfb16492c06496b59bde83cf48d593ac7f323357b4268b85b4df8bd0bb85d5c8b3d89c758024ae8a8f6fd587c7028973f39f349d71fa12938eb7914bbb947197ed8fe9787b994c7ef35711c527d9119534e98c4e0df8de5bc237e315b44f12ee1062ec70b3b7e955268a8c9debd23da7fc5c271441c4f08b7240fb3e5e2a0ba0cc1e43715bd679a8267755682ec0b60a32ada4c803918f3cd58acaa531cb24df229551182d3bbc4d0c1616cd02570564626510f4276bdaeaf42d5399a274203e54ac5d6097170f8f652e493c73b9ce9c7edd3d7cd9bacbc2c174a270ea1e61644ec66bbf22767c87956ffe011766e38403546d3fb70433084858fcb135213afc7a3b722d94d0b54ff31f5579445e1b47a73426f996ddbfeb248babb1ef4a2d6a6b4c50aef7dc835855095128759d7ef96adf9eca82d771bef06651c03a07f7c14c8bd8ca12fd04c8f39642b509b8e314f391c7df194b920c1a5b67ca5529fbda25462292d7fa2b762149b585c3b9a4aa4de513fddc2d4aa009fe30084fe0185ef3b7b9e951e319472b5e263e705fc839df3877040612dc3af3ec9b95c20abc24ee67c8f4d4f116227ec92a13403cd88984e2eb01ecfa3b7916ec68675d124870cb72991a92c97342081e832b2916363b12dd30146b73ee2bc7e4591f4b530a7e3a40dd4ec065a672964b76a4f9c4af14ae926a58f2985b1948a9b7a83507105358bfaf41e63fc9786661dd359ec282336380a4f89d0002b11a2c3380d685e73e5c602cbedae69f0dec9ca86983fb3fb6eca660bd2e478590a726e3b0c3a06c632355337fab14e3be1465fcb62dcb8e2a9ae2e2ae98704968820766b9f91d2640979ca5339c9892269943a447e1c642e45774e38d5d07cfe8e6846905777cf9087b6dbf83fc1c13d577860f829363dfe11ebec9caf6c8e69c71806c678efb1259d81b004fad4e5013e4453fc74563d547d214615b0745ea527980b2b0e70e5bae9e057035a4c7f947b09605b7d893f1b861877d9ce1daeb0d7dae7a8a6ca8db15d7562d709dd0186e317a06202f4221f7a6978729bda5b494566b37e55d0eee1e02b0c9d863f1cac59301dc0c65cba73a440408acec057b74c6b7e9e4bd4c127fc1fd6923537e8f58df4f99ca9126604e31cc795b0c55e3c46eee50811dc34bf9cd7e1cfc7d3bdb9d72208661655d3648bcc4fd7261c8a8344530def179e90fad2f45b8ed6d2473d07db4ce52935a40652abe0f86ddaf9ef36d42d2691e3e55fc1861543b9821ce9856c4e0ab3ebc62520253a241f9ba3205bcd5900f24c31eabef97cbf5b9600a34a3f83fdd21030bc914db1a6b222a43f5c1060bd36bccfc4fb16e8435f1ff36c1258a025303a23a3a969dc78464bb4f9a7d39da0ff49757d6b11e84282b0606c395ee23655533c84f5239d75819c4f1d16dab65cf9b2f543fc35cf0e2d690e6b7389fd6d91edc8ed9b5f4a0208b2b95f2bf77a6fc9d675a3f5f1606e8540408192f8aab87bd9cb28f6dc226ff08114d619be3a9741dfc0cc62380b764f1a","title":"494. 目标和","link":"https://leetcode-cn.com/problems/target-sum/","question_id":494,"issue_number":65},"63":{"day":63,"pres":null,"tags":["动态规划"],"whys":null,"difficulty":"- 中等","description":"给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回  -1。\n\n你可以认为每种硬币的数量是无限的。\n\n```\n示例 1:\n\n输入:coins = [1, 2, 5], amount = 11\n输出:3\n解释:11 = 5 + 5 + 1\n示例 2:\n\n输入:coins = [2], amount = 3\n输出:-1\n示例 3:\n\n输入:coins = [1], amount = 0\n输出:0\n示例 4:\n\n输入:coins = [1], amount = 1\n输出:1\n示例 5:\n\n输入:coins = [1], amount = 2\n输出:2\n \n\n提示:\n\n1 <= coins.length <= 12\n1 <= coins[i] <= 231 - 1\n0 <= amount <= 104\n```","content":"09613214cbd44c93d26dfeedb25ec28da33ab1ae2e3e8635064c41275c12031000fd9942eb5d288bb6cce140bf665b833ec2fe4178e85ebbd724ee3aa0f9a76ebf326f608fd7cef70c6ec1abc79e527278f46f8996ad099327f626c1eeade18e5123c10e64faf1446a7247f96a364f70a0bc2e647bcf1908f8075303b40d9f488439a8eefec9404c45a777b5a276a0722a4b42ea5b49a9dc0b618474ea9af22054751c2066f9dbc2cf037084cd51620211c38be613540225fe1d91334b974c3211d24a9ac8854283240aeb68f548742d997f9279154b90ea685fe78d1097f647543e3fcd93c755e0a61d479698a2d9f54c577baeeefc2d171227b52a3e0305aafe7c84b3a29b65894640600de14b5b5bc5d68b19f12a8744b4fbc93e8d8a779a521dcb8f5cb4e6dd24c17b5d46c84d22b586702ac8b065aac0548e9e64f020a8540c99fa4a330f2282de0fc4ad8740e5a8e498b99489d74db12bfabb38394f9fdcce951b88de1dda3d3a4a661250efcc16cbf600a26631f77c7c71eaebc0b98f94e50800085a90a74a11ac6668b1543fd8783d96d98a12fca52c5ae230274c068dbc4d7d7f31982ed5fc3f15bbc5d17bcba3e8df47df3384a58d28f6500ff88cc35528a8b430288110a049084c26382d7517aa255917075b308a585fe1bce71cc9069bb7df1006d1005a48b8b796fe22c2e49373dce66fd2e19d0431d8821ff9ab2a1c19f51eaa749857de5d755852d5a5172d92dd640eeb198b51c1b9c2567028ebe0b8f7afd099418f8140772923a4de90edea9f4be94307f2f4ee8273c98bc81308c0fafc94b16213b0c9c19a6d7e36af72589a4eac5e795a42728fc37f1395ed0187433b2847723228df7503f5992c5c36384c2e7801a8a43c7c134f757718471a9f199ed697a9244e48488288f6abe49322ee72a753b64599db915737469a498ab003c7b0a272561269f393bda44f92a6293ecfdca1b72cb80ab715dd84c939910228f72a5dabddbad6a37891fdb757426c24138efc170bd5e54b32ae760aef12829dc9e51151d095b0c44d9e6defbc9022fa02dabf5bd45cb7b6ce13d06d4b7ca3acbe13b110b00b369a0bf7f612495c6adc44bda26a13563ce8c62bbdb036a1b38fc569990cb84d9f6b8244fd933d4a0c8f908b6d005e09abcec3e8a7b3c2f6ce8f661d4cafe4897b2f02b25a9f8b933337d4ec62baa1d8d135ed48d4fd8ff0d8e3ecc27fe4028ac2a3ee48bc9e8cac48739cd10bfd3a8c53be3b6ab155d9fc3799521fdbe254a6f88a32755cdee68df61f7108a5eedeb0d0feb19adca62fc5bd6c3ab864e85734f1da3afec2ff028c2c79dce4ed908f2483181bae54c71f2b9729e5ed127b74b2bbe6c4afc08cb7dc0137eefdd498d96292420ad8b67f3165558360ffc0d9c5467cf18d16c3a073f0aad16e0649e7ab4f6bc5fe111ab0e4db804333effd78fa65b831a333ee33474203fa1d68b8ce07b11de4ce619f9ab64c7ee6743fe2df145191d313287a33e7a2765393c1f6118e44293e0da7de4d9b62611395bb029344068692823ac75b77332cd60d2968de6f35ffc7f315d394d1f009b09c234c1a02f38e5ff32878df4d4c52a02273e16f672a5697859353a73148693c1ca2c1d39e3fb5c8d463ead0827eb37d98cef7a640198516478f345e6b3e1a1102d3cc3dec87d9643c4177a28304d7eb16421858038307377eaaa6a792f68665d90e481754c5dd0da617009207eefd76bc3c783103de41885fded3ff5f50eb3f45dae2f2a4e4b93436a577b42caec8bdec576b67b0683d68b973c09a842665230594cd89fa04a8bcc4274096254d3f86c9cbb5fba37c2d5e370d52300963867766bf2ff6343a6c149183ef37524b2a439cc7fc525274e6bd23e076ffaa173339baedac95f8e7a45b69250ffa32f5309c01be345f25d92a04514f5fa8cf1ee53e552b13ddfff42a92bf0c52c24f982d6ee40f6ec63090a4bb6e6101347defb2ccbf820dc25483088429a49d0c72b8a3f0dccc254882ce14f653e472ac507719f389b03a03ec37e980ca19eeb1ce48dbb867e267e8b761f4acea5f0be1020c256bbc6dd0cd32305fa20cd459ae5f2da26151b21566e19fc355483cf9eea6a9d7486133340c3794fc4001bbd92261d4b189e450305ee40e72ec58b2f63b553ff4efe40cf2b871abdf89f60af4db6c9b2e2f8dfa3d248a1fcfc157a9533e374e4af0c79374a247bf064cb8989e38d593c3fdfbfee4c0e774b9554f52ac1a871ea967a84b793619272a40e0f3b0414f8ae1ae50c2cd823054964548e721686a19ef78d3607ecd0e20843470e76549f3c1a05a0e1f676607f2fa5da3d62c5ff1b05357ec13ca610e3f267203ba08caab3cccb7b7dc4ef657fd6d156bc235c131b336e2675dcc46673b9ef4e262836ce5e8b88e6cf63483f537694fed12cf3d0e7002c4623ea8986127d284a4d41c8b7a99c56a57307f28a609b79772699a4271b7cf2accb35b4a0929f6f6ea6c937876fdbd91374d5482980f3f36a975f72bdc8aa5f96c08f775a4590aadf5037bf259a6affc7e5653d6502ebc0700101fb311dcf9d0160e71aa0652156416797583cb083bfbde2ed3faff229842cc53bc8939f5b93ca30205d6f1a497b80ab9e299e26a69ddbeea1cfcc7bb47c8a06619e04ff75917ddb0562f74cc321bd023fb5d346c7b02452536ae3d185f73a6a86c9cbaccfdf1db6cad84bfe7c0ae4d7785e19ecbbc7da17d185de9046b87374217ade9b50fd4a16e4059a5edb46cfe8d3b6b2fd6816e4e73e4424ab73e0b1c405f2e4da989bca066a9197b9cc837efa75c7b672b49d855b4ba1874ac80b9985192221f94e9f78dd3dbcc404a21d0d5014863bcb739f46fee5c2bf40a134c7ad3c48386ee30c3a03b8c2fc606ca7eb61ebf7362761a5f9fa591b1ca4c8a0387d878d1e53238697fa6369a9818a1490d02de039f056cc6c9838a702145c5f24456149250d8f5a3fcdfe33f5f54755c7acdfdc990fd6e23824bde4a23f8aefdea17279bb7889ed1bbd685da8065df61a501b15ba9f41f68279ca3c6c991b5812986c3627d786790e91fcb0300c56ce76ffe60eec838d39c06d46855dec0d03484c28dc1332e1c911fbb1d81e563c32d9c2faeaa77c2dd73c09cff84a8d4dbb8aacd7d92b25381c8c3cbb300b5418cf5d41f93efcf3d11b7746e23428b3354f9551c9ebb86b900fd1be29043d43adaeefcb827ffab6e8dc1b95d7994e461d308f1b66e197872174bb95d3a0d5135ac2f92955e443f52048e428d929489b0f76a2ddca907a794d33b58cd5796be8156b1af0f38064158a5eb008eb1f573018407c2c2fbb0159f9c9dd0fd02285cf7287ca282b9b2cbdca51d9b2842b1665efdc79878b9ed14d572483a869bcfcbbfb2485db24e47c53da6dcd78d5bc61812ad90bf9515ed9d725f3e66f2f82a7d81c77e9101503ecce8e08d815c17de3149d5fe21d3d5522eda1ef654197130d59434463e05b847a1d42cb08cb2b19f0036c924f4695882f86a542b7b6e021fcf116035584a535f646e148e972817d7ec1283dc806a70a9551b03407ba3b60c29d6b40bb1d13bd1f9556b90fa63ccd31c416df39f102225f701b86fb4bafe0a7a8676e64a6d9493322047485153401d63741da532376b4225750517003e41d25728a03afa8dba6a8dd89df60e07f975b2d968aee598c3cf25c9a0ec7519186ff49fac5468d228b900728fdff076e3c5d35f9a1ba0275dd650449ee1182663e8314d9b00500cde86760ba7236d3d57a279ee736fc07a0011039cf10f66085f4b256d212f980cd56fd3b0fbbd21b71d8359d4fea9c6dd560112494499aa053f6f70e744c1545efc2c6c19a9b53feed4d384f193bd9aef63a57e0321bc2d4be0a46d549ba78af6c6d6b7fe4fd238131ce64720b5d695f5ee8cebbac3754e3b6ec30f381c254ec8a3541ca4d8d68c02bf4df32c5fd015ea62108e577bb9c9293db1f48eef3dea2d899152938b2b04637b5df8d28805d902202629d7ec33c81a977644826bfcd6eaa5237b8d3a37a85b64a48012af1a51dcd640c71a486e4aa0556289c014ba6cf38f194afcb539b950da5d2b1e9ae1ac86402e8ed62ce83c8ede838c8ec7b492196a491e2a6fec89d3663db638075b17cd1fa9a3b2236ee71047a8e130d03672e15bbf843b3b3568403b11b1ed91c9e65b71b4ce34c03edba626a9f62945a9dcef5e654a6ffabe9b8868200e4e39da6637179107436f4952ef6f60552a6d966fd6465cf974a59752b294fee795a73ada7ecada784b36","title":"322. 零钱兑换","link":"https://leetcode-cn.com/problems/coin-change/","question_id":322,"issue_number":66},"64":{"day":64,"pres":null,"tags":["动态规划"],"whys":null,"difficulty":"- 中等","description":"给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。\n\n示例 1:\n\n```\n输入: amount = 5, coins = [1, 2, 5]\n输出: 4\n解释: 有四种方式可以凑成总金额:\n5=5\n5=2+2+1\n5=2+1+1+1\n5=1+1+1+1+1\n示例 2:\n\n输入: amount = 3, coins = [2]\n输出: 0\n解释: 只用面额2的硬币不能凑成总金额3。\n示例 3:\n\n输入: amount = 10, coins = [10]\n输出: 1\n \n\n注意:\n\n你可以假设:\n\n0 <= amount (总金额) <= 5000\n1 <= coin (硬币面额) <= 5000\n硬币种类不超过 500 种\n结果符合 32 位符号整数\n```","content":"09613417c1d44c93d26dfeedb25ec28da33ab1846d54af1fcccdf92542190f0c39ff944424faabb392dd26fbef1761d77fee86056dadec1f3ad61ea9633178c907b7a89d1c2f0f70e9c1467d691588a8b20587006f75895be93ed5286f646f05bace4ae5843261caacdefff86d3ca2d73d9504a0f9b2743bb0624e5bf614fae823029ae3fd00326012d07cf62ded6bdf6cd3a644dfcaa9be5c36d4ee722d3ad79ff6e7cce1220ee5a68ae57e4792d796db210c1afad0eca874d065bafc70c3f2d3509736818f02e0405ae8ad8e6608728235cc5c7c2394b3e5c4e994145239b0dff3dc5ce0cb3e9ab862008de6dce592094334f3e8a4590e4679a86b6e0742cdeb02e6ade4dd43cf2345146df03e3a619bb8b16e8d38fc3f98938e03eac37afb3b2eafd149c086d646ae4a1723cb25419cc534229fc961cf845ee9c07b8b7d9e107a8d953b385746bdae6afbc5ce598ee0cad0e4acef977bdc53c8da722715e2e3add23ffd801c8748343d18102499e07e9be377c77fa5dd5978e63fb6cb1bb4a40bbfc08db535ab4f27a14d696fcce453b8c71f0a27c87d3ce5c200b8d4a693383184a1c1fb20b31f4baaa128bd8872aac7d2676de1590c622426d560d166e19d7cfcdc934d85061e886308750c321e40907ee9d2e3b68098418ff37a674cad15f92aadb4485491641b55b7bc95e419206f3da4706dab5f509f04ec4210dd4f0af48bb2ef1e80ae1cd81ac8de4d40c48f2ccfcbea3b6ff0a88b02436a2d320ee068536e5e2a5c4ab2829d09247a58aba3c13709208e0f9452a7aa904ae94a5145718c73faf484b94a21746569946b59e0f663fc4e00bc21cbd14e7491ce790b9fd60a02a4c2a0b4e9e68f15adfc448aaeb1db47c5fee2d8361f16a797d69a181c3b43808cae11527eaf85ad1c965a6a00deb5ea338e2bb8608a1861a9096e75e3810903bd7157b4720675c426f7c362c11a71a7594b454ed42bf753a28b33d8c866f43b4b79a15dabddbad67be63e251293c0bfcb1e95b5519e756382ee0ec284525acfce81ab5041dd8588ff851cc32a5845a428b8c05238d8b305d1a81e9520530e36f41425bd10b90626c96e7939cd82888e5584442dfb948fa4541c970978b51bb3d99a30d79844a9c8ac05ea3b3f929c8004552aef104d07b60a1f082f6a0a676104bda8c9794533112f02d85ab68b90f551e98332b815d832837b44cce48ec3e2eec3d17cf43f6576082ad3dae1b7f1154f1233a5513bb87bb0014d52fd62388dfb370dabb0460e1dd3100717dc86c8e44c1827c0751b312f343f493723ce297b270de527d80f72c99767f6a947c44a7a60909fc5daff2ceb782fc32bdf6a4aa65f96cb60e79275fdd0a5f0faede2fd6f49d4aabeb1befb19483ecd318ed7f7b141a69af1809e7234beb57cb09511bfbbb1331801be81ca8e1d02afe84d591c798ba16a70aa39ea1fbd16d9258be0d3c503c8d661228b099f2015a4dcde20b99b5eac9d00b91d02f9ee579fb0aa1e537148212610a9210a753c64f7ec23ff5314719e0389529f8c4c400cf34f5b77332df5262476e16c1ed8cfd51d156c214ec44a12b8d6dfe120088d0c9bbe27f9ce2efe0035875703476337034cb52df9a4e5e1806d9ac5fc518ea48160481cff4ddc18964119f9794ffb282d14e7cbb0eba2fad9687476bfa1b83818092c87ea56db4f968ae9d7bb027046b3040af0b8fa8145d7056d155ad2dc1d8116218c04fcfa77bd3d7b3009df76b452c7eefe7765ea3c51d8e5d2a9ca8434328774a43aa8ec98ec504467bc423744bb71c1be8a366de4c65f0bfacb7ee590ab7a76ef7d6f8fac9d586e1016dc9c96fcd8e0fbccaa31d7e47ef6798897a9c7710e3af3eca1cbf12a413aead276f0bae42487d5457b157ffac6c8fffaacfa6dc8a7d2183dfa25981bb5fb071107598f9d982ca5bf29cf5e26559d3e1833ec5a3fd1e220fa48ab8e099ed30ab979512ed0a245bcb0083201495fbc7b91249207d6465bc7bb3f50285658dac86107dc6d976ca351d6be98357d60abb37cb1007041ed6e7424a34c74b76e83340cc8556973fb8707e4d294e87bed710e929275cc5fd747aee0a65ca6db13370d684b15dc9c9d345a386651e9aeaf8e0c5dd5aa459e5c652f389df9d78069ffc2486d029c7298da35517ebe8ce206b725ac5fb2e6be06f1df258e204c93fc7661d976cf8819fd537d780704938fd27caa50b70602a5ade36ad792cdf6a0e3e889e86df6414c49f95fd306a026a861793619276306e0fbf30e06c4b2ae4d968bcc2c18c45814f86e626b03da61a03611834974cc346dfa6559f39dfc5a4f52283349a6fa05eead752bdbbb4e57a843b1280e60636519a10899c06d9be09df64ef61eb3396e16c223d465fb64e2224e9c74247e989f856d96629bc2d9fd7de860ed9ad2f5f5c738ee2f1c7b08bd3a39b3d46e67d79aef915ddb358ade70146f3676e11295d63f26cf4875c0df1483e715091b0387dcea6cd07177fce9993a53009fdb21242ae836f92ec18ca6a23e08e01ac01e5ee5ef033abf16b5aefa7e551a890473fc095b5910b05082ebcb750e6df356684856432a2189d06b30f09161dad0dd6edd16cc10f3c077f5f67aa3051ae4f68a9ea551fea3cdaa6462dba2e250e0f9a63a8da06a19a800fa477794f95b332a833a18e27fae232f6c32094e2c36f54a325f73a6a831f2c0b7b48cdb35f5d0aee5f5e7092afee39ccda74eee2a1840f40477e0781704d3e9be5d80f524121ab4a9fe17fb900f7f2ccda93b3053e44257dd3e617609052e149e8eb7abba35c01ef2cdb8335e26010d2845c95fcdf9277ab386eda251907710f7f6ecc7d0d0c51f2375d9cf2b012de8b73ef968a05821b50d3e503bdcce89dbf32183e661c92fdd00d631f350aa202b231744dff1e8b8ca17a00387d87895b532253f41a42f9a9f4abc07521ccf3acf072d83c79b8b716f1acef24467149d5fd8b1f38796da752481afeda1655d2a374ca7a13f4b974aa20d583a38b3ab651f1c6906390f220c36c1588c71924a9f6b42b9580d9ca3c6c991b5816dd6b872003e35c2f847844541c5e006e079b42242f65671b25caccd7e0448bed087d992336d5dc2133b88632df26be878fa2159e8c2dd73c09cff84a8d49df7f8cd75dbfc0787c88084be1ece12f1b6865690f5881f55e70f275e4e8b775fa81c11ddf4cff77df60aebba43927588eef4f169f9ee73d88ef71e3bccaa339541b5fa085874700d50a3742110053ee66bf7c010103f59049f42c8dec7cceb993a569de448f2da8746728d17d694ab35858f7412340500a560cc4fd2df3e41870bdbdcacf352de8b9eabc7307f09ac6b33291f515d32242eec50aef807a1e4590050ba2875f6963bc3df6c1c3f30331ab7dd7fb9ce39a42b0a2855e0439ed940195c3fd30448eff8cee23f10646085846af24f5c3e096e424b3fb69605c8cf274bad13228bb51989659891bac15c70928b9e8f7de05150e1588be6b081232de324f4695882f86a546f2b483862cf0c6025436053024e6e148e97285198be40cec19b6c3ee0115678102decaa4261b6af4afc9e6e9fad4e6bf3f168c5d34e61302d34dba7c0780bf6fa4b0645b78643a830f4847f1ad9de193f7b738bace73adb1dbd74240b300cc2ada4f8f4429e8f0f36fac03a9d5099d8f80e1de259989727211c0e1078f2436d0fe0ad90aa6e19b6546cbd20f40a3c8680f07be3025ac553ac34e2d97b96f93c2482e93fe83d6b9351594bbb","title":"518. 零钱兑换 II","link":"https://leetcode-cn.com/problems/coin-change-ii/","question_id":518,"issue_number":67},"65":{"day":65,"pres":[],"tags":["贪心"],"whys":null,"difficulty":"- 简单","description":"```\n假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 sj 。如果 sj >= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。\n\n注意:\n\n你可以假设胃口值为正。\n一个小朋友最多只能拥有一块饼干。\n\n示例 1:\n\n输入: [1,2,3], [1,1]\n\n输出: 1\n\n解释:\n\n你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。\n虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。\n所以你应该输出1。\n\n示例 2:\n\n输入: [1,2], [1,2,3]\n\n输出: 2\n\n解释:\n\n你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。\n你拥有的饼干数量和尺寸都足以让所有孩子满足。\n所以你应该输出2.\n```","content":"096221cf5b628be1e73e8bcfe626c7347182268a04f82d930a6148296200033502310ec8ab1a6ec9ebd627f465eaac46b8280bc2d829199fbe23f761a0f8f223fc3b6776d4d5d2e00024cce88a9252743ee16ec9fecb4fdd743cc00b6e43450aa9c448fdb0dff17f67718fab6054175efb3381a0cc827a0286604945198359e336d5024a3a4417dcf16fedfb1cd668ed4df9e52ed5e04a4c96a71e3b4208389b1d3d134a03d361c2e6c7ebf48a671f7d07a8e1f977022f8d1ddf6cb4dbf62a1455994cff5546cb72e59d730d83791d70a713cc70612cb1870a60b8c618087896b7add20a98e156e0a11246ada1a1fbf14d4278aec4d12f390e25900f32173fa8e0648899b19a679e4047730fd45d5b43d1d0b004fe27954685d1c50fa488408e521dcb8f48bfe4c80ace594c44cb5522b5ac7322efba4094c04bbe9b7aee23b54c0caafc4a301e2392e20ed1bd408e48a0f9b8b5afb5d66abc2ad2b334025890e4c9961cbbdd1ddd161dbce69022bcfc729cd072df5247540334f272eded92603391511b413384e21902f7204fd6090a9d3028f597a249b8b07b05f9535b5460fdbc2b1f406de52e8b842367c7ec8005f7d48ef2c230ce732c2273b75359666d211aa5cbe1299f6d64973e5549676f3b0ac47fa998dc07157a13c990410c2e9a7ebd290b9e0e0384501348e2fe656fc796d6e61ecab83bc29e21a13dc48413cea72d1f1a209720a01dde1bcfe74d18de60aea19cfc530dee0b4ece87e0f5cc5aa9759ce1fee280bc3f5444ccb4f3e6346e2f632d56d51fcbe0377c2103a65f0b217b34b7a2dbc9c45a6e06562ddd4e224abe1cc814449f6b9bd3172aa7871200c9b92d6ec9f6dcd2c7bfe103cbb9433da89cf0a88fcab78004718f224562031525124ebab0708999f55c7026cc1181df810b1976b361c0dc194c96e914bcd1c755f3bd9abc4b4d6bdd989bbd231848039a1c29cb55f2aacb9373d70ac99c6d85c020963c21ddfb0a97a30876ae768dfeae79485f35967d159cdc6f3de4c377a89b29f84a14200281c96d501f594c8542ef82982ec61ae2bf7ed0ec59eeca4197f8cb9915de0a8a65b5290c36a255b2aa4d546d239278f8e67b726116314ab26917b0a6b3dda00a1fd840cd45c18473d745b3dbca3e395edfb99a8d3c0b0f2c2d6b3c677c3fbf85d97a4d14feffed51f5004d0a6758f588e6f11378dd03f244ebdc8fd9e7eee7d67cf30e8afc97ec7bb59e81bf4971b7d634ebee2ce47b9f27d8754bf334a05014f5e354a4f1aa37794bc1eab2f91f4e28a8f0c7b0e6ddb9a8e0ae07f8bf793bbb78f3542ef1d818fbc1d7178f3160d3fbd990823b5b7028cb29ea5a46ae6497ea402f56fcf2c9a2f2cecae2ed5b49d9b56cd6a675f6001fb17a82b8ab9a1ff6a993e8a1d435908e7e9d8912aa90b0313606adbe283aea97733b21e1f6a6a196adb060863db94eebb075dcca105bf45d08ad45c172832c4496999008d3de31dda45756925ca3c51f386ee06508567394dad91d8664f78c8aabdc6a99467b1e8f870e855c0792b28003ff597f3b2ef62b247bfe6f3be7c9cc2dd0b1e3fa119b4a7c435567e2c806d25030e0200649c55f53a43b65702f9fe6c654e86c67238d8c7f9edffabcd19dc4164b5f8c61b67f8ecffabb511ba62045a133526c0d1a333fd0e428e18be46a1e507aacb107f6ca1a541b581fb3cb8114cf89047db28a038a092147548ebb0b2316139605cdf775952d793119d256be5ec2d8f34f4430b3d75f2c084a5713f3aefa18a54bf6c2fd9749342db6ded8f915cdb38ec86e7e80864a7a8ac10c103327b6b870b2cfaa899e4141113e9e8fd5f7c594f3ebe629ceb7379525908fbf8b720231f4d4a4f2c90f2975a690bd267870f063ad60ebc6b5730d2077097033863b2d0be614ad3c945dd1399b78c28686ad9386676729cf2d7c0110d4daf6208d51bef50a19b07407fe6bd344f5f0a7e3185f85dae85cbec3b08d3cd9bb0e914093c6fb393be9914539963501e4c368a879ae2bb0102216bff1b15c79ed5087be8c7dd4d68f71a6e4548709f8fb04d8eda8767e8e0a6c776de728e89c5708c14d92649f3e067f860914839089bc92840a7c559cc7eff4fa21383c4b81d41027b101bbd997bc073e7c0e844a7b8ed0875ae91954ec90b6572f6ee734b269963219128f3918e840dfc67d0dbad343985712d15ef0b8d784c10320158041c73ac6c7615325843619042a6e4a574c37977cbc92db62d51b813af31ecdbf9fb9e3f88324674bcba36c7435cc175b5fadbb7980bb38e4bb8a971b8f18a1b246c4c40588cd3cf4fb303d5e9ce3fbef96ce6261ef7b469393732096d36bd470c5c7ecf9e3cc47825724e052157e59d2338721fcfeab0afe24f716b969928c09a0a6a97e3467bb45e40e587716f74ea2201a90d98c4db084459bbfec51ffcd2e489705bcd9a811cd60fc702bf8c699ba822fd71027722e9ac39360df04cc6bf3fcd7ab573271c256ae966a1509bb87874a44fbbef905a959da56594480680868c2119ebe253d97f137c643260ec398b90bcbb259ceb8bd994cf0567a549b96e771aab49199ebf8bd340dce9f344fa4415549e701d009fc364ca94871b31682cd0d7e55166a967865651aa18e2b354ae16a1170fe5c0bb3814b8b2b83a919399ea28745c6d068ba5dbfbbd9b49ee9e1ae03a69aefb60c17f41e290a50731fa6431472154a3683ee7b3c161d7b3325bfb5caf4c2974fbd87e431660bcc65035b6a57b7ed6bc92914f4a4a53b4d0a3003ffadb235b8e5eeafeff1d15b6c3b7aff6ce597f2a7fb701db2caa4ac892926b431dbb8375b192daa51b1e77c69253ff6ea4999a51f98996a4400ccc771c170ba572bf36e5a2e51ee83a5c1f93095cc1dcc2cc905d707b514f4142d29546bc6fee9f0874cd14dd2953ad0e749583404a051d5c756951947508e339f54229bc58c8077146c93e31e56149850b8a7e6a88af521241f46092a8fa8b1cdd76e298d619d052be4a8fde55e2091d49591cbb9ddd9a8c42cd268b811b10fbfe5502743dff78f86dfb5896e8ac331743e73e8e95cc34a53c562a73cf27df38e6388ba06966155c3ded07584cf8d833a35369156ae1dd5e52ed07e9032b3ec65a9d1738295ff99b6d49ab8a7cd3f9ba97981c88f8ea3508941f1e8c90fc5a68e3a552fac849be108b2a41e3611ddb88aa37da540eba743c421dae1f3b8ee2872ff410132cdee406bb0bf08b5aa500c356f0756ed3d3a00571fed628a88595c7a590cd80bc8c2c78bbeff7f18dab000f2dc814621c717ca94f83b8d9a411c1d4d14a57fb6349bdf334ecb44570f623adc420a57428e1e2e09bd7c332421415d340ae7169b6b9e2cf091616b18b37128ce08fd9dd8064c12445919dbb772d5943be754064525cd00c0dc2c487f5eaf0016abd6baa60d6bd1b94d5eb37c86cbfb6660262126c3e0354f0687e268d4c74c26cd35ad5f293e7b86c07336795dc94ee0c249e5c2e6ba8e096aaa2fff727282f86a546f2b465869c4174a254360535f643c51dd9c234ab2be128b95933e35ac0643030a4aa3ff0c35cbb445f39eab021e87ee4534f157d340016d2a1e53442397ae7f3f88e283cc9310fd2a9de55c40a2f781f1c9f48794feb28624faa1f88addfcc0b883f1dd7e9e9400f27c2c3a885d1d11309ce91259b29a27e7ab988a856d8df2882610326fa9b5ac5435f828b95237dbd18838e397960c8131fd3c77961004b4cb722e73a93967d4581555bbe57842e72a632542c174f7772793757c5e8a54168380eb96ad8da881b35dd807e90557703bc93cee32d827142b0509d1d7ea2d10fae24c732b22a20ac91d10a8571119aae944eee787e28cdea7dde77cdf054a5cb02d0fb0df6d1ac2a79bfcdc98d7fe54c9031a07cc4720b5d69594bcdeaae3907b405e3c97077f153e64c8fe7e1ca4d8d68c63ed1fe030588b14eb3000d67f33efac7c73e5898ef220ea258a8a0794df3d1573685dbfc3951fc95d5a5d689aa366864eea3a26cb27b9d6bfc67e7ca73d79a43400e9de9f2bb191613e85419cdec8a023a595d7823790f3420b1924fc71a1239773d4eead72633404c1e0576e8167e60f013d5e52093364f4fbd2d1b6c3ecc89e2968f86c079f8f578b4c6b708fc40492fa6c788f159be129f81341979ef0ec8ef58a0504316bcc717cb4088356f76c32e32d5befb200126ef2aad6d5fed193e6682a0e0f74c8333c0fcb46690c025220a181d5e0f94deb28fbab26b83f4ab72e2efa889de677952b848e714f1c1b49af6841fc92b9b2e705c5ce1d16be675c2bb39ac737c621a43b8113ac28ffa07c09c2006dc8daf75df77bdcab745349653c78d4a34c89e5c586cbb5d9c6c43a0b71ba1df765ac9b60bd6d493af1bef51429c655554ee2417f6d175b27330b7d5ea4b0b3c9c65e6de78f69e72b378def0e85886c7bf3fbbcc4e6d6be4f39bdd1c0790b792b89b4eb623e4d33c630d7909e7ef9517bbe42adf47c6f2b789a7e94e4fc6febf14bf3e299b384ef0aef7dc871c016bf41c81581aa9efebcf3a173235dfd45745544bd70265a81e9c2b5409e0887306d3050b1c7774f314f28bc9ca43adea2b72fa0108ebbb95d2f74287ff4b9355ac24d55239b4adc9b056a8f8cd4ba2ab5e30084fe0185ef6f32cdc116258d7afbf836b746ee83bcf3d33112266897a67788e25c61cd8708b27c925d54110c77ec8fa14f78ddf5b2442eb8528aedbfdf72c5817c9260d253ea29caf665976120c8a632e0d02d24a36dce4d08bf68a78412118df4f23ef4aafe0c8c9e16211a394afb3209d97cf119e775ecd56c8dfed2f29b3383193f0567caef995b6ba8978d660cda43c628231c380a4f89d0002b11a285775f21527bebf345d5e9a67ac8cac595fd8736b8b574e22272dbe473591b7b74110c3a06c6691f5337fab14e3be1465fcb268cc3abd4d52718bcd450d9d3403f3ce4dbdf757453ca5339c9892269943a4439502168117c0c65d5b37cf38e2613dd040c859d96cbdbe622c1826b127a64886b50469e6cebe781af28de128e180bc66b90fc76e6cbbd1587a99e4b33556b9a271317547d214615e2310af075d60b6f5e0be8f8d8de1c462c6d24fe3b234a9ed20ffa9f6df6ee660bb221744a450a1c2e032d0398e8d043f10c917214d87f819034d6c1d7f6bfc90f1cf5cc86c63b547f90aefc9a2f3df48a3e0fd5736922d5c740bc72ea3925ce8bda39d84a2b6d815ea8c763ee09c9d44a78eaf594eebad2e7793443a6488acadcc5187508aa86473fc423a4b7f7e8c5c3d2e792d6641e2a7013df64ccd64fbb2b0a98f84b15109e1bdd96b2adcb47908bb3247353a645e5242ba44f1cffb3946d93f9f22bd461638ce5f845de81140bd6d459bbd629537ee1be832c0a253a2456dda3741ad81016e91e78ffecff7fa8769610f32447d6b8db3a30bc914db1a6b222e376501033f436f38a80a244b6694e35f36c1258a025737576edfd69c1785633f1adf281d3a0ef630835225dad42c5f960703912f53d094167cab42bd13cd2de4f101a96b047a39eaf0c9b35c40e633c433808c0806491af8eabc06d194075a3ab4268e55357d3fe2289f8f12e3bc8133bc8eff180927bd9cb28b5937773e1d54a9957af569f51d3c0dc6b124b360f30168471ada87428aa404822ad7f26373dc61eb6979fcab1af3acbb31d822ca5837e3266f581a2ce2d180a71089506b48a8b0b4e415d000215e4e15476421aa16e3c019dbaf718faacb9580c3ed5dcf98a80cef322d6d9488f3b4b83a94053292ad3ad1d40a0968c1cd152093f68e64ff7f7901e4d9a1e183c42ad3ba3ad8d652884c8ecedab1d341a3bf315b858328820a0d0d1cc42734b1be3b485e9ebebf9c973388730d4e917d3d712a9ffbc2695c13833f2151c94b9fd8004400a8587b3999bc9851a26bb0c4932a8ddc71e52e92eb482a6bc570003352c8a44d7257a78f04bc3afb80af9b2f3b168d72cd45bfecb0783ee1ae50162803d145f80c96451d85a6c48fd7362e7629a2f","title":"455. 分发饼干","link":"https://leetcode-cn.com/problems/assign-cookies/","question_id":455,"issue_number":68},"66":{"day":66,"pres":null,"tags":["贪心"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。\n\n注意:\n\n可以认为区间的终点总是大于它的起点。\n区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。\n示例 1:\n\n输入: [ [1,2], [2,3], [3,4], [1,3] ]\n\n输出: 1\n\n解释: 移除 [1,3] 后,剩下的区间没有重叠。\n示例 2:\n\n输入: [ [1,2], [1,2], [1,2] ]\n\n输出: 2\n\n解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。\n示例 3:\n\n输入: [ [1,2], [2,3] ]\n\n输出: 0\n\n解释: 你不需要移除任何区间,因为它们已经是无重叠的了。\n\n```","content":"09613515ccd44c9cde7bfef88e5ec8bca03ba94db3a9af1fcccdf929652401171efd987226f39a5624643ce83ca1e9d44ce7862078aff81138c020a7473e72fd1954006d8fc0d1e0536c8da98c98497c38e078cb97af429d3bb46adef5acae815c2fdc466fba95632627026da6d0d8ad77d843643244e7c56cf1b38760a670ca35108228584c405672a55d954fe83c58c4c2c12d1e74093397c14307cceaaa20130b254614f88e7263074b9f08174c4c4cf1ed91053976258f58977a3890167512a31aa56b01814cafe9436fe759752da17385551659a7e4747ae688045517b6d4f7dd5dc8ca32a2a76e1f82e6fcd291134a34c4e3a964034459a66c562f41d6f00dcc98e8db79c90d711464c6323d599b829f6fa30bfe1b9d949c2eebe57cfa0f2daeda5dc086fd449e7e151bf925479ec53427583e90222fd12f5813ce5efd6e44e3fc21600b7635418b1c4d6a00d3d6a09ac6c8b0b0128d648fbf6a5365cc80d0f77a83be78f15c5267035644be951293a008c7150956597be73291e4de0924e822140a4fbba56d34a17843b37935d7503d9ec28b11e0b62c6bca3300510594b64d6d4433ba13d7d31215a5d8d36eefa3e8df47dfb5576d614bddd0e14ce28e5afdfcad428c2f1ca6600845393e065b935fc8d0dfaf8192688ff37a68539319ff107304f38c0aedc9f2017f1278cfa8e3e316d95665e2c147996d5f7ac7521398806656a3aa128a4ecd2b758ae87a6d989e92ec520dce2a4fd9bce7d8c09c4ef09bfad4e8bfb8345062cda4dce52b5f2d433e54f030cad215731d2fab6618217b3459f8df94ba6002bdc9f177c32c6c821cfd0c9b309f530b9be02e7bd6962163b7d7717e666f61233cd9687e82886102046d7f5052d43607d31317e6b0c1a8a24ea28a7db6b929e01764d35ffeee11b5a8e663bc62338324cafd7eddd7810dd13c77c2720802e8dee8b2604f6862ee3b7ea45b94c0e4d316d5bcca806d87d308558e99dd155aa9d45559eefc224312a99cfc8c2dcdb52249d9ea3645bf7017e341b2d2e1816f99532667491f1ade38312025e13b0132134e7659ede16aab4919359ed113a269a928d2ae5d802632413c0123807ee92cd78a8fa16611a82574b21774762ee57bc50ab376ad0cd83b3d8792ab2f5535c7d3feb79c09063f2c7827a2dd895137952143669eea58980b9cf382f9851428f54e99fe0bf37bfc4c4680fdf0e3e3efa35c9d6576c3ae50dafc832e8f0da5996cc952e94ad74462d910e6a044841374f8bc0db982d332271af2bbc0d2761b3ce1b1c3efbac1d5f0d7e576fee9240ed025fd1f73ca9f6bf8a98222ca7942be9cdef0f914e8959e27ad37f0a902ed5f8f5d401ff8a4402b3a6181b3c70210c21057121fd1fa3708b16db4541a16d7a4a2dd8f8e57d9132db906c97cbfd6d50a4a4986fe48167378d7a2332290a43674fdbbd06865ba1daf39e333457003fa1d6a94f4059139e6ea4b520bdbc8d8e6783eeee4139e37b1603b3156ffd3cbcd9ffdf813955f293c0eaae8639b62791dada70fb14c0ba8af8c2dd25a75182ef62f2861e46f04c8c7f315dab4ddf036b79e355f1a0be6855bf4274dfe8ec42ddd02358565004070fef7973bd90e1a1c3244f5fdbbc01cd0acde19574e8d67bb7da8cbf6b9661888244aa3375f53021a0f29d3cc3de09cd1662d6276a08c06c4e21642325a2e99c89127c3b3197f859e028a3b2f6c788bac3fc0672ef17bf278bbcb0d1eab6b956dfe10fead9e591ab93138b6e58cf8d6d74a0afa1d9245dcd8fc9043bcd9108fe3f807cb771a39b9ed303cc8cd3741b579466f9face34177601648ceadd6ac500d5220285f2a3b6f964d699919f7323ea9963e82e40f5371184b8dc2fd737cb2acb5af60bc53ab27043991dca08edae48665697a813ee164fd5c9061985f25e7efec9bfdf84108b9412e6c0110e1f9f715bbbc1951ce4aa62c42d50361e031a088b87c4bc347719bc1ea075655db330eb8870bad923e6dbbb1ded4fe1948abe316d36ae744b55c710ef0a488bf7ad55f86848d7bd8ee815d8be776830afbc207e8db2d3e7ce5f00d0e46b250f3cb3e08bc3f9b10e00a5e2a816356b87f8bbeb785226055aacdefd2fe2e12044190f1100f970bb7e494800f3d5e0a8767484267cb21cc5c04ffc5fe68450bfa72f553d46f0c73e2039b270ecfa7150fd3ae6bed0b13953ae9d9bfbc8a550f75ff759371f78d294b63f12f5842182d377d1b6c8c23ddb58936c87fd332924ac1d53c13e2ca8f246358c8ba647b1bd2187768aca564818c3ee7abb999019918ae8546c4c409aec23fcdeef9973ffaed9ab78a8d3e57842e47faee5474cbfd25ae48a6b4c9aaa4ee2cdf6274bb595818568a6eb37ba6c9d25adb588c2cf014adce548aefef797c0f9f13a00f272f22b514966d47b0a0e840da28ce93adf752fce9276ca2e9224d6c4cd701b94a4e91c0fcc59d6b883651d1cc59a683cc1bcf6667e6d8d5b9783f68d457a3b96a1216ba98854567ebb0d019a94fe7566b6b63dc8c68c52891a128309ae934ec702523c9918634c38a63c2adbe56f69d3b6b14c7a5ab0ba6daedb4848d855c53c4f6704be7286210a0268741e379139630118ba94c960d1ad99dafc24b1a083af5e22c7f24f2317463bb031ad3dc41f47aaec35b2cf7e7a83abec53cec58f8f1e9cccad2aaf50ec23855598c6db7145672413454a72d7c707c393acf8b5767760321a662c7bad932ac9c02d8b29e624179ad5c69eefb9c354168c20818da85ad0578e9b88d3bf1bf58eeda94f7f99bb84b056b74b131d0fd650f3fc9b9b0ed87a2bc17c53e4b91b74116345bdb44d88e75117032125004bdcdef7f0c8beaa60e1bb9298327a2e674f3fecdb925475e2378c523218d28aa31c04bb116d94aafe9b9facd2e307f296a8812894274e25c02a6e6c9a622c0550bdb718c88bc06c73acbf464475269e3c7a00a78c1baac1d9964556b7a7e61c4bb4e0299d763245e123ad48747d77e8fe21c3a4a35ded941bdd01a2d5099870e25c85791689345ab657ea5b4b02365715f580215238c0bfdc6f6a96e2fd33082d066e609cd9705a6fd16c1fe52803806c4cfdf648a8bdd8870204ad806f20a9cf434c839d12ab7a364c2f7bb60303830391041166551c7b8985e8101417330eb40ce60570ea57a6039ba9c5bafefd8ef4cf09f4ba5951a4e6b32d16cc35c2e8c48961f557c7eaa292886785647f374d7a17cc05afbe6d2e291fbf593288083d9f09525e47c05b1aafbc1a45bda42165a40751f8c953d4662ffda4ec4ca4aac5850339807678093cfa4db348658ac1e19b3dd0de42057534d9642630670228bdc8666cebc2819675f201120dc7ba4c437a3e57d015cb22b45e65ea08a9e747e44247e7ca89537a78953ba795a0532986cdb997c742b14bc617cb19cdf899787672a8803be38c6d09fe6c2a0cdc15a0bb7264ac6b13b9df20362cb1ab75a1a244f9bc0344d7a51f247a5cb22b68789eccb5b61a2749d270cc7aa3c1523781d4127834a6c250a2e071a363855c2c43251f4f741dfeea27723b42e4f4d051ddef60c38d5b403b2ca74b5ad4e6bd9f168c5d35d4b703652dea9881b4fa87a9dfdc246778f18b6312cd9dc676e137c175901377e691db5283739072a0a5759002e6bd25728a03afa8dfc618fd888b72042cb73b89a69cdab98d9cf6686e9a2675e616fe99fbd7e68d228b900728f849338b7808109db57f3290e99021096aa5d3638a47849d958114fd0d53843dc705f7a29c137bb3674c0750f11804e10ca86a5dfb8a7fac0fd1acd5ae70c503b72ce26ff60c82f163c6f4f85a9af634499aa053f6f70e744c11211ae2c2619a4ab44f5e89ddeb4d6bdd4ea27e4094a51a1210fbdce2d4ebca7c9b98f98cafe44d2291a07cc4720b59fd3f5a7c2bfff9123525d3db84645673533c8e0631ced9682c950e90ced3a70cf3adf7329c4063af4867c73e5898ef220ea6cc4de07dddf201563200d8e8af51fc4463d1c3092e736fd0797616ec63b879cca8f7560b6735de8714eae8ad72bb7976174855d9c8dc6ec66ebd2c1987bd1e3680819e348e065b939b56c616b978cf3a9015e82b344fc50c9e5d0dd9894f5916c3e487e717948c49eecd378aa8a1b4af856cda3fe4176a45444d152a5159be129f8134197ccb5b892accf1e603166cc3c3dec00c706fe4672a36d71c5f201dcf1756c6b773b4b1523c08cc8b1c49f3953699503aff2d29b9f723f18303fee49be1a67942d8515f22660faf69df47e9101898eb6c686d2fe71a6ce4a7e0410229f430181acba085465e7b4ed1dc522a4f31599349d5c8a560ac1036d0e280fc135a6b881ee89a3b7b7e11d21f44127571d5d5c5d1e4ed7efac02891eef777d689b73ab97323826e2b60ad3d3a735d499c5a3baccaed995d765042d491ecd8f0a0ead59c49f3f29b55803bde6761250aaaff599687c371c1cf4edbaab407462dee0087a98b7110612af0e4f76bec13b58ef82ce26df2c40332cfe5d678f3846505c1728b04bbb7dd907b8328268b7ab809dfdbfa02abaf4923aea1c3a43b47e7e0aa7aac9fa56834cfc76287e04d28839551b4f28bc9cb330caf6f339e0159fb49f554b145777f4f23c528a453d308026bfc85111c6c280c7239fee1e84b74fd1f5457b83951662c13fbde836b7568efebcf3d33112266897a67889e45c618dc20be635c14d2e0b0c77ec8fa14f78ddf598442eb81b8af0bf9d72d8903f8521c554ed6c94b201db0e669cae76ecd0682dde2587014db72febc1544591f4fc76a7aaa45584db5369147d10ad5d4f8d60f14ae926a58f2985f7dbd89b33c762767867d7b4f6716ba8978d660cda43c62823367d4606cfd04e6445a2c177103a1437d78513e4acfc33b585c2ec86d47afdf3209f2b58dbe473591b7b7455027b5696777b173fbfb8643be1465fcb268cc3f991813105a79a489796537b1fcedbdf7574178f15398cdb633ad155123b4e286f151e492a90cb2ab2c2751b8e4140c391968295b2679387661b6f2a830c0215e01787aed2fb53975cda6576cf36b7e276af85e90fada99e4b33552ed674183d497d6d035bea7844a430845d2e1258e181949b5a1227663fd472654ad0d212e79f20c6ee344ee67426044530362e032d0398e8d011f516972047d82de4c57a82dad7dcbfc94652a189d49050182c9efdeee2262e958f2752b3180e10c8d208b226ea1b119ab3c939f20a6b2dd10782847dea0ecf867737e8a0cda7a6d9b1153a0fe30689dbd2aa18502f9ded413fc423b8b5d5ecdf86bcf597d8466765369057c94d71ed12f8df092ba49dfa531dd7ef82a0a7c8744901daa9c25fe1239497619cd464350469fcf1bc679b262dd6ef81078c1295c35a35882c01c188b7112e5ca3efb9802039d5ed7d1eb53446a54cea5e377fb8580eef9d71e9dc224e1b92887915c7763d1de701a7988ac672aa428a5435c16ee4ddf169c2d7c608e0b480ea2111a07fe580a558687c22141a4ba6c2ecae9c5881221260aab6ea75f5a3c2f66a33e914f9301f8799a11d4fadabb9b216ca23d61d753243fc906d49c33c23672b56adf4cfbe0470d2d867a5a75d0fbe676063e9816cd587682a750754ce490c9378a12a75e18111d74db173d31496949f24560e384c7e19c73ee3fc6232fe440267f91e6a6e308551f8c3da99e5a2299de312d963ead018772ba68eef8f7551156111cd1aafc78a014902466c4f1beb855333d1db5ee4c0f308693f9a5f5a3eaaf57a9ba49c035e47a039944e8447b4b0543dd4fecab58ac036021130448c862030791be90fbafaec6b70f840067e1b885fd195c03a17f593dab4da3d604634957db6346f9d4bf9ccbcb1510003249bc5a58798e7ae824252fd3687b621b89605c8a09f74c8ccbe9955c895664e7509898bbedccb81c0e8c5e05a13f7775e67f5c0ac4670a142a2e5c98d105e345840aa0e8314050ac901a8b1cb54ceee83b90c8c06a203ca844680af5af2571d9499bced3504fc39b96dc1e25abfe80cb65ab25047881eb4e886e6999e515765f65963974b9262cd521610e64a3856afca0dd66f1307a4eeba7c1f5c240856df33b76f487ce75dc973ae61c0e6d5b46b405c4018f762d75c11cf6fc6a36a6bac3a0ba8858b3feea5bb71cfcd980bab8e5fa0687d85718af78c54af97349fa03c0f510a27f4f5363ec33fcb785f06b5a36f237bf99ba436171f7ff62e255c86cd7cbdf2c880e415ef966025a749c832c35fd842d04dddcd64b4ba145769104bf9a857a1980885e32fc04fee040de2894fdb4b6a638f5b9a03ee0c573f953548f767495468084f4230e4743c76e0c4e282cb74ea0405fa54cd3337297fe430605d278a1bdda40e5f3620450994de157542ab71187d90b32df3739a7b1c491cc844461939afca5b3c6f70f1b2f1d52cbdec3c63f8578a4faaf64d","title":"435. 无重叠区间","link":"https://leetcode-cn.com/problems/non-overlapping-intervals/","question_id":435,"issue_number":69},"67":{"day":67,"pres":["贪心"],"tags":["贪心"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个非负整数数组,你最初位于数组的第一个位置。\n\n数组中的每个元素代表你在该位置可以跳跃的最大长度。\n\n判断你是否能够到达最后一个位置。\n\n示例 1:\n\n输入: [2,3,1,1,4]\n输出: true\n解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。\n示例 2:\n\n输入: [3,2,1,0,4]\n输出: false\n解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。\n\n```","content":"096221cf5b628be1e73e8bcfe626c73470823d84ccaa16fd586d3f787f5a6e0399120eaab71a6acaa2c327b76ceabd51b4230a8a962459d2b221b53ea2e5ff2df533792a91c1cce34424c3a88cd2371574a73d037164857edd3ed52860577de733738149e44777abc0dc8e8268563259fb3a9ea0cc9e771893624267fc35f628a9aa4455720c26701ee65bf710fc6af5431b5ba7137f2031b2c6432cf3e78b301913114835df8e6c620165abcf63730135c58ace12580f0bf025883d738b4e0d36171b815603974caec0546bff6b742db47c875af9c10820cf28aea86a1a292031667151c4ed32b89981a833226688ef160a6bed634be6a2467985687b24ae6e73cb889e9598458245487e03d66bb7d11e5f6c82ff33834793e1c41a8d8955b45d1cd58258bae7d214c04f4145e57c21b6a87903f4b75888c36e8c9d72f122a7780ebffd481d042184cf0ce6a9874bc4abfdb4b894a2d44bb829d79d333a70726dace623ff8319856c103c15342bafff7e9be371c27e48631e38e778e0e1936123a1503c453d90e61509c92f71fb090a913309d496b046b5be4a05f9535b5460fda803136568e53b95881f7e285fd369eba6fef0a968f3025d282ac24c03c5bae45186a2801aca3546f8466d2c13597557f421f49d809aebf76cc790410cc1361bff0d7300f6ab045f14628f7f195ccdafff3ab6006eac5d579f22e85315ab74c97b33664395b069cc108b135f85d55d6ca1ad4f593862c47610cfcb8af7b8c165b0f6d59abd8c05eacc0884bcb5bf151a7051530ee66f93c6a7aaba47c659507c4596b7a2f6c9e370a9acd4eb9a4d723781779d2f2cf47ffdb41741fb9b54964b7173539f727514b4a2ad61ccee3107f3d7c5cdc7cad6d83014d22c07382d7d451508e6a9163bd4b77a147de374c7780be49322ee72a753b690051ac1146c04d84587bc6cabe766eca49a813cc7e9e213dee446dc99e8e7d911dd8c0dc240c3852dcf5a2359f912a0a80c50af7ba2feb249496c2495692591c64b3fdfcb7a97b32bcb55d28fab82eb69513f43429d50e9bba829fb1e001a3c90eb30b7fc2dd053757583b651bd27d83b85fe4ee7770dde828aa954bb66ea7a0f84a055d4c70510ee27360817a011cf5bcc7dd75ac1504481d4c4210d5fef80968b28083e052d5622665633bf85d77b6d0efcf2cc5bd03ea2b9b5d7290edf3688f2dd27d646fbe28fdcc6eecbd39376804f949fa3168cf8031e8cca38dc0ddd3a8f6e5da6e9781ed9a4449a3b9a6e270181a9de1032f9482fc8f7441b1de75f5675bac2c1fce6cb994378e095b943f85822f235889a8bde49d0103d87eb81ff9770d71273fa63b8462fc468fd8f635b1edd8bae9abba4e6a8895c0aa9adeed4b441fc113ab15f8bbaa8bb12ee8098cea23b63a4eb1589c475aad5f1114772b2f377379dcb7c6eac9d91893f7aeb9c3cfa2cd71ced67e14c27626184380f28994c8a55a1d82e342ab55167e64b03e2f33d5285f91f237c33c5b3baf2d59bf265e55561630fe08571da324549d2ab5ada6c66dba6e849d212090f67ac225d03d9376ee78f811288e0ee894a8dfc7a7b6261cfe305d05432dc260b77d55f558a39516e2fabf5c544ecaaceac5919fb99e7ec965b5509839b9337ddd900bb6b21f151723f742ba567004766472c55adfb759f90ba0d380525a9e76bfd4fc3da999ef846406ec643798d7dbb9e0a8d2421716b8ba326ce6c11fe56c5b719986a282968866c3b845cae8444dee5297fdaf0fd606e10351db5759006adf7aee0534061b056d8ded00dfbdccf2f29bcf80d6cff9b3bd5fcd46c2a986e113d2610a9a69cce444428134f2116f162ae5d65b12e704f0b324180ecbd222f2c0d02c3cb9b2c7725afa49061b66ea907013b89ceada1eee7a44bacc7f66bea0cb95ec43ea92e78f09985a899877652c66191baa945b9c8ad48afdf5244aa158c6c09e3633edd77fd9ec81f4da6357ccab2eeb7810ef158853f863da69d3163b985cbd7c8044a97e515c875e678845d4419f38fba3909ec3ad080cb26feb3dc68dabc79e851ccb860f8a1c35d0bc71c0e1658be45f5c8241fbd17b613c2245c22a3634da6f9f4aac1f0140d19b89eb3c13b2f1b3f4997f91c1f9e0bbdf3523580e8866fee6c07e7e2c13cd0b2b6bcabcf313023337fe367d46a00cb42fcc5799d3c1fd2a0382197149aca17be1c3077465edf9ccb2dfc1aa25717faecaf7dd388c9fcecb7ebcbe56ffb1b4f5caa009645a668ca28377d50692455efbca14b4380eba0009bc40bdfbc1edda772a393e1c82ce44180f30ddbb164a4a960c3916c2435fbfc9baa8b8e1c5e841371fbcc5c77faff238f66a48aeaa6a8c02de9457fbc63581947894ab577a1ced25ada52910c1c862109ccca8cfc2c0121ea74bb796f3048c33b0583d21da1c17dd733da9983f751d7ec2762bdea0b676d7df002a8614ca3d9f3dca46a962252daf95298bf0b65f30a12fb9f96841b4c4eab07bcfc3308b3540003821fdbf5bf29cedd429ec32325e8c024ff48ed856b59a261f233a1b6ef2d1d48d1547af964161b509619c4a3dc2f5739ff495d4b01695d60ce8a1273a29e7edcd0b66ddc07d67996c979b5f36f89495fa792d99da56a84e29feb2924cfbeb715eef9a041b9fd7757be02e0236c9eb03b7d72d72e07e32abb357b233747046b6b8460385059f0e963b6d38db39b8e73b8d0f7b5c8fb4764aae99ccae93bbb555513fd0471e0781715bcbdbe4284f9715d54a4f6ae63b5dd8889ff5c509fd29b6fadbf0db9f1f8acc0ced366653776de6ffa93f2a7f8735b3903276345cd589eb05428ffc3a2eb57de6b4b93f3f4d692d5c34b4e2191d42b0168b7be7dea03ee1f64bd0d360433d0c29e8ea175c6ef37de29dd1ad663ba58bf727e664f0b99b0bb7457ff4faa2a10e72c71aa85af8962b276509e60d9c29a62bb379fa352240b758ba6ac4c25f6e8dc07c01c6d0e397737abbee2225c67cdedaed1a56e3e82269f1e2db9b1bcfb1f2080fa89a4d6819386cbc5699e61ab0cf61488e5162f27b6a3c69bd4e1d47bc8c32f3c6628dcf45cca1f03962be52af368f3ce6bc4b617cf4208c5ea9074c4e8a7a238251cf219b958d2cf579e6d9f23ecef47ab913293cffff7e7988eece3823392e979d19d8187be13d422f1f5c91f9ce9ce7955a44e69341bc6270cd4595289bb9deb34b85ef5bc439a6f97bdf5b87c87ee3ad893f75d7485ad66c108fbfb5b0d786e4c56a47a7f18452ec762ddc010103f5904d60c9cde8cd1a0a810569de448f2da874634c245dedde561c196124b524c01eb3fd53f90d61941c4449292d1f35985e5ced08e4d6409a36133ec82e2d1dd81ae4f996203b1665efdc7d136eded579a3b0659ceda81debfee4b4abf1a4ed66dbcd798b95dc65b5de4deec9915a4d32602552bbdad642988c725bb01503ec3e7e04522979a0af6c32f72ae2121899e308a66b590a6ef5f5d998aa39a9e47e09963e5c2e6ba8e092de36db261139ce524597e224e3862cf0c60254360535f646e148e972851cafb46dec7803e24b20043187b60a3ff0c35cbb44afc9e6e9ff0646bd9f168c5d3134b6d361e9be88f52c567910a3630cf8d2bf62b9ceb4452afcd8efdc6ca888dc7b2a105faa8d785c4fbc18aadf9dc5c7d28a03afa8dfc25dfd895b75b18b66eb2d766bfa3d3d5cf2f8da7f76b4349268996b77e68d228b900728f84875ce3c5d35f9a1ba0270f930411ccaf182425f62404d5114154bbcf3802a73d082e18c177fb765eea1f4e47870121858be08cdc8de8c1f317c904ea635d7f7ad321ba41d1220f3b2f09d183f4494499aa056f3a32ab0d82541cb363205cacab44e4e89df3a493a4dcae69a17e375cfe7842e3d6240fbca7c9b98f98cafe449b674e07825a6ee09bc6fba2c9a5fd973d083b6ec30f381c254ec8b73048a493cb9c19954da1690b8547a46212917e32bdc82873ac949ee969f622df970cd6d60a1563645df5c3881f826c705d689aa366864eea6d6e8222badefe913569fc5077e8714eae8ad72bb7976174855d9c8d94a932be80cdca78d1e43b4e020efc71a1239773d4eead3b253451ac9b1e13817bfb0f5246142f003c30de33714c7e547f0d36b9ae44ccc22f219341a9fce30e1bb33f3df1f6a5159be129f81341979ef0ecc7b7c716652f76827c6dbd53a956f76c32e32d5beff80b1975d8aad6d5ac94c7b33a640e5b26c076626998036945445228e6fa9c9df90ec17b80e15bb13f119d2e2efa8892e97751b02a4becfcd9b2e421fee72025377a44980d598ed104c39a974e78588b019b00ff1cbe369f718a7c09c2006dc888b209a22992e0260b1a1357069cad01c8e0e790edf5d08da0452552b154e923f3f4af21d76310b1feb50a53967f1602a3122c6d36513f330d7a11a1b0f6fe964522badd00fd01378db22491ec783bf598d8f0dccdb85432e085c07e067075f1dbe52a287829c637cac2fd73e10e2eed05d2bb667f3c659a629287b23bf5f70fe5ad99abefa160ba3098799353d907c415cfffd3ada6a082682401c10278447efd3e234d8dabcaf449ca668f39642b509bc7774d334dee1c213fe203330fd06aca61fef2110d7d247fa7b77014863a116bd84aeb9b15408f8cd4ba2a9fe300fbb244cbef727bcfd0586a8f6af0ff3f8056f58396f3d331126027c5a677c6ff1232d38300a13987320354687afd86bb6578ddf598442eb8528aedbfdf72cdd5039c6edf1da2299efc54974b20c8a632e0d02d24f42587014db77dae950117dff4d371ebb0e163849716271c3919b7774f8d608e07a87ea59229c8b683d0e47ec2413305299ff9e02022d597866645d369c6282336380a4f89d0002b11a185b3c7c3ddce2e409d206878a4707e5c003059bf527ce623829d746bb5ee9bb4e8bdc8a7a0009d8597ad7e76f49f27f1c90e8635051e4413c9d92d06be175dc6f8aa4f1c7dec5e53ca5339c9892269943a447e55222e3a3a4626d58761f3f16a56930401858c8ce1dbe622c1d127573c3083604b46b46cebb5c4fb7d8c5c8e6c59937390fc76e6cbbd1587a9cc0e67007c987429701525215808e24e46b53bd6066f4f21a8ebd4b170182d19fa5096e5f73c17957c5a987a28d8bbcd2b7e606f2d1ce8b4bbca2f7c1595199e79829f42ba0159c086b5dfb2b6cd2511f50b0f5cd8e3eb552a0c76cf841b50f88063e3473d848201f716c09fee0d0b4e853785f2eb5c834438866bc72f13859c6033756869303bdfb68b39e609142303f68d815b5cc0f930a9764f52083d492a1c112ffa84d8a89c70f94f50f513faf9081ba29dfb66d0616e6d1619c94e6b0bcd9fc160d820ad8f6388e56d3a0ba8164e3abc5ba4cc502f308f445b8390240cda4134abf4aeb38783607446756013dd6af6a25799c662d79f322409e6719e8d01ba004699f2dd5779e8d918f3a8f16de9301d4a2cae2ff99388bb5cb3554179b629461bef61753ae0030b691bc3c8dc58003716416774cc5f6e7c7ae811d6f1326cfceb36b0a1a4440f71e250b21753d6b3df757acd304863b322f35786a594f2ffb26445c11d22541c56b9ddcaa80970f5d36481935f29b8665271ed9b63d6a34e2b6c0057ce7a0fb05d1bac8a7346f44cc807b922e6144150a298c3f38ba4d524d387a95c1ca2030176ec063c38329610ffc7d689bff973dcf504c721e8874d3c2ca5c6abe4","title":"55. 跳跃游戏","link":"https://leetcode-cn.com/problems/jump-game/","question_id":55,"issue_number":70},"68":{"day":68,"pres":["二叉搜索树","分治"],"tags":["分治"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?\n\n示例:\n\n输入: 3\n输出: 5\n解释:\n给定 n = 3, 一共有 5 种不同结构的二叉搜索树:\n\n 1 3 3 2 1\n \\ / / / \\ \\\n 3 2 1 1 3 2\n / / \\ \\\n 2 1 2 3\n\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d84c0a729f060673f505b5b522e56b895245bc1fc25180a945be00f4bd74bcf881c76aece1138c41ca862317adb14b89fb51d390f74d2d0445b6df7373c74a4fb467326c1405ed3688e624b4a0b8bf9a56322f6dba7d3ef82a56cbba2f03e529ce4bc871aaa14a4f1cbfa2be2278d9d47516d0c345614fe452a9e52adb6767e0a9d7a273952ccf82878c78bf32b6674270d68e6fa27796dc117408b8c96da744159f3d8faf374d068b1fc70c5bdde589f3498944288261ca6fe48b1fefc68ee4ffe91a245629db7235ce8d6e549536625cb1522a4281081813321afc3ed4f747fade6ce233d12cb22efb6cdaeaaeb728492979b66ac477f5b0dfc6f5b4ece1f6267a404fc13bf9f9b07cfcddc3e9aaf65a84c4bc3e7449e601929f22b44b4cb2d3b9edb75cfbf76e8c276894993137a99941a2a5266aead77f5c8c47d8dffd4d3fba1e78c693fc48d976a5e4cf35d40797ba6ab78e47187fbbcba25bee37fa4f3ae67c8a53f197fb55c827a31622598500e77f55163cc9477e4ecb15405db520397e28ed568292e45ee330545058880434163319e05d4f11b1898d9d36ec6a6f8c1aa61f1026516f558e0cb662730d53967288a02abd83ee9cde9a3f7b1dc54e56c1744075430f14953e1aefa36dc7b97b7e25d49844e0e48a5b887ef080a7a2fb67b7ca04e5b812e855f01d65e01e5fc89e40faa699851de56754d52cca506075559efca75b28b430e34787c5af375537d522a1f17d1ccce09397523b9deebff98934ba80e48a7bac6826ec998e2db96733f5b0e7efea9bdd8eb21c3e4f231cb58898130e442708aec3c06da965a71a9c40c726614722f28a4647ef9996d11796d1150525ce8f43c9e8effb0152b2541b88773ae96fb6f76c9629b47ae8b627c45d907d24af41e87a752a95405c98c3f16be44568458145c2663786561fd0a9d29fb51a6dc8f7fd03a2709f78be83d9d120cdd3292f0de0e39f16008351217004756fa639f735bd6f88edb08cf9b429750535a0aca7be798a226209e16a494c571ce7d510a7cc3c852ecc8ae172c5f1afabb2739ad106b92a81fef05b84c47d4b73bca54684025483ff912a11178bd3399e642bf6e997b8b26f33e9d650be9c0a347350280aafad12b514511602324040801e0dbfd023834b4a8f83cb91e30544e19aa84571fa1379717bf1bc8aafdf386abf375f75c42d3f0cd8162d7c0a5f12046fc822d51ee2df6398c2ce76ea7bb1afa2d14a4a152e28295580847839a9f8b727841c9c59ee2f98ad9a788f137a0d86b50d745863017bbb7139b9fcb49d2133d9cd08cd8a471ef2971cf4bb27208c576c549bce71dc7966a63f4c1ebeeef444bf892b4a69218b1355ee97bf7d286df4ffa3a3148c64c5f394cbac0a576ffb3e86c196ae4935063e3f6d4c3435656c33118ac816a8b04bd6bd106a87a5b1d68c65d3d9c9846865180f423353cb64d4be74b192a1db8518fdadafdf43efe9fb9f6f698f46be879636f22d78853db3e487cdf846edb5e43d0a7e948dd1d0b2b43aa1a4c03f90664d4ac812eacece99848a7c97e635067c7e705cd7b31fa39067de95e658f3159532290d3c766cd6c5228531cc19bd7e9528e8c817f6a13f67dd73e95a3939d05678e7a1d8d642e6767721256bafb7db8a8b43d240a0796e75dc5885c7a573303d69dac7bb28b8df63fff55be4c737f00c0b26d937eba27c191c815ce1a2a6e0da316a73a9ac3872c45ae7562aba9f3de7d01330e9d9b2249cedbfeb57f3a1f953c7d60da2ac13068a6e1e4f57b0be4e27df59bab7a665bf0cfeb86d20804246b1b3b327e3d0b752a0e10daa0e825814c01254d9feab10e312f2e2cc6e7b82f6722aca2876bba53aa301738a7e8afb6e1e7a461adf0c464f833b64bf032b50272f18686a9858b4e43c54ca9b78079b5cdb64b8dd05d589118965ae454c73cc66cfc98d3165ea5347dfcb2cf9e8a0ad7578c2387088c92276ebbbfc8dbde174888d716d559e75a895f481bf6948c3909f135eda0ca29f2b0d66dd89a68e175ef71a09af8c13d78c4776a272dd47eb5901555cf2cc96fd5aef9758104fb1e3f858787840b609d5e5aecffea2f16208e455dd8aa10cee3edd8fe35690936efff0beaeec605da98fe7ac6ee654a13c7b739ed1cf5eab68e2c1beb78ff2fd0afb9c072985404d05de1b8e5b5cb0f2317a373c727e9028de3268a3adce8b36f48404e32937faabeda42cc178e11f92ff2bc9996e4c3a4cad1ed0ec361246bc3610b64d4dc41c9d11490ec8bc06eb771e5b93b8ecf42f3d75ea2d4475b7df28afda2f6fb0afa0fbe1080ff1e15c09870bf0fd3a2a8c6b19275f5caf52722053d1afb66d9099dabb355b50c8269ad08e4a27cc0b5c3201a25e5508377503c48c122ea3370dbdcdf2a890aaaf1a29e38e3bb417607055f561013e648f35e0af8eb92b98101d51c1972279ac19b681af87a6bfbc6daaf7f3351f85ca295691528ba988c4a54f5b2e009ab6fc355797f6fcfb365ff3c9c971f36a3d9d873247b2db9debb579886855e495813b24b5d7e799092d79d2c53186b136e75d0840f1ab39b6fdb83d551d70e9907f5c677ef933ca34655e9fd9f97eb5f99d79fef21779ca3a714eab0f274dea03e57bf46b3047294f9157b2da97b55ad2ae077346c3244456b36b27d324e698ca831b690ccfdf1db3ee8d0eae7cbfa5c75b0a0c2aee933f5001840f404788f2b1744f9f9940fc5a1714054b4ede823e8dd092a2bd7d4725b40b82d1f8c724b126a7e5e05f4dbd9ee75a97a34d88df8731d7651752e5a880783f90770b395b7a54b93031998e3ea8dd5998b05187cd9c52b1b26f0f173ff7ca36b36f801230c759d8ec6c7b45f8fe6378c6c894f847fff4aab6c6323064ec595fbf18a66a0c71f72b12837f59fcdc07cf8124df731d5bcca59db59b8fa01146200bcf9d75c628bc0bd54d07033397e1a00f5ebd8a499dc4d2b6e143bc69246d05282c514344412d3f34a706e579fb4d2de83c124ce2c2ce97acb3e5dd3debb533f6a0d0a3646a9270be5dcfab0692fea1d8ed546e229ce78833d45cb6b9c2cd76b551b6543fd304c4a63aae69b129043ade2cf70dee877c62176f62e4ec6ea91ff43246f1e152b08ed2675d40ee2cecb3fde5ecd6e530cb3686f2187907abd0d744d8877c0199fd65d55e5ddb579872332e3128e55285019e831544a81c7bf123a96e828f678c5cc3f286c690a4aa3333a730371a878f7ea50507f295dcb0a8790ed8ffcf269059d9707be8fd30f3dc30dfc94ab35c1894608005158e1248134df967015cc4db8b8d1f359de8b8b968e033144d73376a9d1eacbdec5a15dd225429b2f10a9ced13bf3ed1ed46f1c73ceda818cfaba1e18b85c08d921a6dc83c0188a1d53b297bfd041e1973c757f2bbdad642988c725bb01506c89bcb5dfcf0a01d8294089b421cec8186bda40b95000362b92ea344d3e14b447e0992aa3c2a8ba92142df23ede695882f86a546f2b151262cf5e257116321d5f7544148e97285198be12d9d09d3e6de0452c035160a3ff0c35cbf205ae9e279fe4006b8bb02682961b5a6136509bec804308e615cfab830a248632b6312cd9dc352b40355a444f6426385bab7c6226362c1a4044087741df5739a93af08daf60939e9bf90e1ec221f7df74efe598d4cf2f8fc3a22610326ff49fac072d9e6eb7563bdccd8e33a7be9d229a06a07518857a449ee1186f25e83956de48051ddfcf6a47f44a623343c11dd84604c0164055831b68e08fe5d6b5f7f8abf011c901f8496d7c77d526f37dd06e014566469f83f92607cde55723263eb35ac10217af65385ca9fe6ea7a9d399b890a0d4a377fd4c0408b06306b0840e5496a7c9b98f98cab702d2214c4e9f0e74f092eebb9385ebe88621464320c359714f6c1a8dba0552d9c3fc8c02bf4da1690b850eea36549f6269f49b7c63fea38ef220ea6cc4de079b9072156b2d13a1c3c11fc446604668d3a37a8600f16d658922f5d6f6c12d60ac6777ac2146e783d721b7d3317ccb5d918d8fec6bebc38ad11490a8680b1924fc71f366c32686a0ad6d6c6745d2de5a68cf06fb1252075a7c1b193fdefbd28c9c93b98ad2602be246079f8f5790476c7bca8a63e6a8293ddc1dd2af7df85d4897c5daecc7fe811e2e316b9a382ffd5cc612f92d61b0641ca1f045197ed8bbdad5eed888cc682a0e0f7495337915d1502011011653f6879c80f942f05180e15bb13f119d2e7cbfdcc8b439956fd4863f46073149e5634aba92e4a9cd45858e373cb46d99af43767a9503bb22fe29b537bc4faa7623e80d6d0e3f24c015bd572f8bd0a7dcd3c8526cd0337c777b24643b43709aafaf45db2ca5e8b060bd7ba6bf373b31e1b036cdd39f11d4bbfca18eeda0e7bb11847f744f53b0af6d4bae3ba1ac4a55aa0a71aeb202263704285f4db9b969036589cd356bb4f9cb147a0174b872854b5eaa64f8e97b810c329788adb653e314177b9b4732d6122c234c686fa229ea59b45a9050f36415d7e3cdb7e8e5aa21b0ef1e8eb297c66491e7f0102f3d3405be831395a190d05d4af38991d4ef063830fc163f08e86bd6663a4db1e2e7a2bb3f2d7010e94d32238460dc98066a48374c7f8f0c2a823c39ba0bc5457683ee0f77cf6af3e567ff13f8c1dfbd92634b2b3bd2e76c85fe5166d3870bb571c60432196e23b8dff25577d2b2d11066ed1084aef09234ca8f30c2369004a63ccff3689807658df271af94682bb669c84342fa6eb89511179ea4e77fe5afe104d7980f32126c57fe261ac86db303a767f7d624d6b29a8ad87b8e4d6d402299b9fa1265e5d3844c261cf852eda78cf188f7415783eebe2d41ecdaa09aec653f8c5f0451e90f72d8aac3912e9ebc64da2b91595cbbde98bfefa2c9a0b509ae8f1b63aee11d21ee49188272c496e9da962b1ae6db5e9ecb42280ffccec760625c86167c9dca6d2dd13a87debe64e9fef9c2d7785ceb6149bdbcdd171cee9dc59f9ab4220464a1949c92a94a8ee327aa786f440aa41a8e39dda451f31047b04f4878bf076c34cbfcc98213dedcf8fec6e6f29d24a9af36cc46ccd4cacc51365321fedaa8ebf75c9bebd52617a14557b75f27e4b37481c982d2afd3b2afe89a0e2c48a572e46de5de5ff5696abf39441f5b3c0693b033652d00bbfeb939056705cbe2434ab6c0599cebd94916bf3bab6595f626074bab34bfc3e879904b06976cfa38fe","title":"96. 不同的二叉搜索树","link":"https://leetcode-cn.com/problems/unique-binary-search-trees/","question_id":96,"issue_number":71},"69":{"day":69,"pres":["链表","归并排序"],"tags":["分治"],"whys":null,"difficulty":"- 中等","description":"```\n\n合并  k  个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。\n\n示例:\n\n输入:\n[\n  1->4->5,\n  1->3->4,\n  2->6\n]\n输出: 1->1->2->3->4->4->5->6\n\n```","content":"096221c37c5f85fac03c87f9e42ff6164f9a3341b49540ac59ceb2e023044c6a2c91e1784c888f097f578c3c92372d8d7aa2cb0010e4c1585ef17ef24a6521cd79dca9e146144934e0a61c520142a4f9cf2bf86e7227de45b060cd413b5c257e87aa0ec1e5685baaf5cb83a6425e144214bc076a7bcc3327f92a6ce119a45a259eb5447f66e3a3f5d8622489169937f4c4f9c22d12780e3185cbae976b213552580b743420a3f77820794bf29477cad5876e8be61758263137f42c3069b94d1d2fd2489401759302ebd12431eece9afd6def5aa0c9e4046f8aab7a4ce2d3f20758257fda1f2af87768e4c07c642b125ac58aa32c0c6ca0afd1ae5afbb3c989213998154f2275d40f80e71849f13c267598b08360a73810a85d1b40a807887d965138fd4a2e856a8500063e4909964254e8961956ebed0d898d1db0f412d352ff6e74e0e3266d0d70dadb659bb7e401e6dda08ed3c59b8e1e946689b352525dcf82c2f57586a878f3585b54005872b09734b4af27d21a35535b78d13d95c2de3f38e23522e7dfd8e74b50fa43f65fe66d804457f4db3dff06030b4243e690f6d4353291d6fa15a0a10246a1cf0f6b02cd4582c87d7ff86dd2cfdac5ba5478a380bbcf3976259413a6c62cf7d3faaee9a5c24af16109510a5826db6313a1eec136df78977237f08e19c0c9f7207f0849222077207fc8e268cfd3a423f99a9c649b9873460d56ca30c6b268dd557588f75260a99f7f73f3cabc0a148aa98952715a27cccdb8c8ac3508fb046b97f1f4ac93d3eb3a1a248302ac628db9b982a869252a4c1959159391c737080e1169e52e5f7cf761d74c319821cae68aa73cc2421c9fe62902a2c0a38edde89200adcd6751ec99b6f1aebfd78b6f3386b4c1b9f584c1c7c2600973aa9df6497da38e2ae7a3ab50f92dca65ab45ad4284e91b9ac6cb69eb9775ca7a0937d9d2f68b60755860c91e7f847594c9f7d70cd3ed151cf90e08f112d98ea470c06322d4f12ab470794baf85b8ca0491e64357dabf021df75e44e110809f93ea1f1dde8cb5f79d15c63f0d05a123fd9cd6f6103392322dec55e69cf26c42d16baf40fe59749501f3eb4e5f0821df46bbad2f021873ab8044e8bd6beee18dd32e9a1bcac17cc35bfa52428ef926460b2c838bd2d30a67463d6c212e3b0b3fe1d8f5343f3f814568897e9c400c4c5ec8973cb73335a22abd34f6aae5ed84bdf7b307f84bf7d3c29a4ddbdaa1fb1365f1bb2b985e9330cf0322cd47a6a029fe3712abb870e0af9c5b184580a1b18a427342e5d89dc8dd80ea988ae606aef05c5cdc7e83283aba853d99a4c04af01a3eafc882fbb473d10c72d949b47a212bc44d47dd2f47ccf3cbb2fee3f1eef16747e79bb8a1b414aa1b963ff7f6e6bade72c3fdc4c8cc625ff08c39cfad65f2b8cc6e2d44eb87406cdff3111198e7cf924f24eef062c860b20ea33dd632785203ff1769b0db088b2ae7ec4f5035e00b66ad1420a4b9101ff2ea765b6d45a3a2f391c3e4937592076f1e69d5df2fc57c16428d43825c84865ffcff2a8a32725251ee41416463806ef3808f3c91eed98449acd47d745066f4c404e34b32fd1e0176ca52639e37645f23b5f8c447ed6c6723dc987553321dc452454983af881e985bb57539617f949ef80827dc3c20021a49463abdb20ea8c7dc01786824ffac7dabef6f120511728ab2fb01a3c32f21fa996ade1445176ffcdf32851607b304f3e575951e79030bdc678b52c4c0f16452e62751d9d1c9a3ddb2da6bb913ce32d788a7a80b5a1dd6565b31a51ebe83d46d4f91845e628be81da5b4d22d708c2548254245b2d0f6da1b2f067d063877213bfc6f2f6e4880205f3012f8e9c6650d447136a4afa1491b11e3fc8b02663ccf1da4d6f8e3fefdd390fa69d8acd52e880cfe14cf7ef22638aa96ebc5acef1157892084f7c661ea7c198e6e6987f647955aac8b548cf41aba6a563894dc46b9b60828330f0dc22fc177884c9c5055cda3375d614519d9826a1b9b3dc634e243d1ac8b1f1ee16317b958c7febb25b2c9cd22b8aacc6f993421924f6b62a1861cf186f2a935e32b46dbda20864c9817a1cbb937b7c60a295c3715405d543415702a6c7b2c0b3c47b8d312089806a0f6948630d3eca7433a6aeeab900758959cbf9ecc31153d8e19c5288b5aabfb0fe6d668cd3c4a8ffb7642e95fcc88dd66d0baf8a62eb94b49b922821689b663254f9996b6cbe5e981a7dbe070eddb9eb1f9248a43e173cc7275367a57132cca91b25847b7f1fc048f99cc06579e00db279b010f10e16b977f118c435ecc3e6d9a291af3dcac0a521e6d761de5b505fbd67512c6a24057a05284261327227017bb0598f277b2b7b7d664f614b3427c05bf71fc74fc71e92241cc7c663db1f0eb2dba6be2bce0a47d8105a9d51d211bb942fd75533e17d2292ca29b696a9897e79952966783c97212762c36e257cfd03764d10b72838d0389ea56165b5088a5e528d66d7afdf4c92a4a4fccd46a7672836ffd67b985bee4265ce510c05947e8a7443e860eaf8ce72d0a4990483ff907510255fc03b8e2d01c4123e452131c7e0e7a78f08e0074f0ca2ed38dce0898428016e8897aa0eb6ee60801ada5d9d3f04799faa5ef25608fdae258a3b3f276d5ba7708eb42ad097f94bd452f22a97b55a225e03b26767b10452828ae7432526da6be1bb6909bb5b8977be8d8a6a48eaf143afeee86c8a533f306180ce6042bd7651717aca5f206c5fa5b4054b4ede72abad50c3b6ccf956c1a12ff240593280a106375053efdc1f3ee75a939618adfbd3d49781f62335d88119eb5452effdcb6ebd874dd8e4d097e3f385f119eccdf590a83d8a42704bb0f9527acfa75c5f82e3b9d83c68ebd36dab465c922dd4f992df94bac6c686d0005d8fae3e5d14c850c871fff0e7098adae9f54bd6b719f46d7ce8347b925abaa622f07778d4511cee34d7c14de41d8e8a3b0cea921611c5c4767c2e2e3577af5e628c31bdaca7046596ab5ed112f50162c625b0c434bdf3aea46f336bd0acf16720d9cfec68cdde6c429dde9627d3e28c2e91fd1181c806bfd61f36affd26bd4b64ac6737fdec0d03484c2ce94617c59df02fd00c8a6288c7f9a2eb3ea23ad8527dbb6ff84a8d4dbb8e6df7d8fb21f93c68d8eaf04d522f1f5c91f838c813508cd25275e07cd770cce0d11c0e9d2f733a346a7b3438f10daeefcb864f8bc689ddda3533ac0bc7c9515b5aa07431f3d4258ed6576430935b648ddc010107c0c56cd07868ac982f5eb6e5680e404e3c1ad4672d03dd694f970958a5d15494148e869c55cde9e774f8a01cac6cad904f4c0c4daa44d6e09c72475a5ccabccd2c6a95194240a9b3517b3809d6fe0a11ed470431dce96c8dfaeb43418fb1a4ec26facc6cadc13c63714b78a82d651e1db701e3322bdf64e2982c725bb01506a84a1b383d74b1e9d7806d1a32486ab4c249e4efe15546a2dd2933a037b4ce047fd992db08eaaa1a40927e379de69528dd2655e6501151862af5c2177022d5304082747daf96715ddc56fd695827723b4062c035b60c3ad49619ee604fcc502d6fe1a0596b52d98f91341621c48dab5801f44ae788ac0ef4377d261b62c2c9f89292d477c1e174f3f2f3d4ef1613e6b19545f05180f3e8469c9ed0f98322d5fea436295ff0f07e620a89528bde3cd98812ac7a7ac7c587b27a191ef1b25dd78b61663989dcc66f1d4f95f9a52e627559a1917cab2162360a67e50d31c4d528ccf280ba732672756b979bb78218c39143bc6010b8ccfaddabff4fcd2bd11cd1cec1d5633269d6fba23976e082a3213cdcdaf2f0dcafe56447f0dfc6ec15417ba2c6455a4b610f4a79fdcbf99a09ce73ae8184a4eb92d549adf245496f58ceddaca84fe09977b5d42b8106fd99fc6a1bd84a7f39021406a7ebe0338506c1d9cad050dd9d1cda602bf108b430b8504eb2c078a2c77bdc27c6ee5c5c7a174b962889b499a8b68157d7a5de4d8a21fd9053f133bcea32a974ef76d15ff70d6d6b7c93132a7723bad254ee78aca2ba78c613d85419cc08fa87deb9b88c13790f3420b1924fc3db058de0ed4f3ad776c6758d5e0576e9a51fb0f0f6c3e2f00707090a886d1fad1ecd59e5215e346079fc9188b093037c18b2edbfa7178c25cdfed29b2135c978eebec8efe9d1e627838982272f84dcd11a32429e36450e4f40b537ed3a3d68ed4d193e668661c743ee8336443d44a3a111729619be1b69df90ec15180e109f46b44cf602eb7cdcfa132e17ccbe2381c484841a82618a0fdd2deae56919d155aaf6e502ba3f59570834ac872d247a20ab3b27500d92a30d3a2f249e203b8db7f4252315841d4c003cdfd20475bdfb3c6ae5038589e55db64c2ddaf45922559ffb7e11e36d87f504df1127f242a53273f527858a4fbada7964766f89224d70237cea34f9f953817fce1a6eecaddb50156f085a33142352b9eb7a51517413edb2bfaf3df63e8033bb205f9fd30006b2cd52c88adb23bf5f718e5a7dfe6f8ae46ef60c829ea159541c81581aa9efebcf3ab6d315bf40e6e4403e93e401cc3acaf91469c0ddc6a64581fd79223067e0132969cf7758cb2fa3aae1f8eaeb7564c116d2cf3e47847c3091a268006bfc85139958cb8f379cb986ccdad55eba02b3efe9c166fdf3fd1e565fe38bac7d3e9f93112266897a63ec6f85c2f818e0ba874c3041c45757ec6a5a14f78ddf598442ebb52c8acec96788b963d826ad437be29d7e67e974b2081e032ac956370bc259a1c4da735eb931111c4a6fb30c9acea0cae9716271c3919b77706cb60bd0fa772ed8f3498f7cac29b61c64d6a5729caf8fa083ffbec9d1b26da43c6282336380a06cfd04c6e5ff6cd7742751461b68850dcf8b57cfbd68b83ca9274b0b672d86e2c8cab1f10482f271940735592614e434af6b10272b2120cb037f1ca81fed56457e99a04d2d8583f52ad8d963131538b1d7dc9ca6d27c56f163b1c2d684539482ad5db3da0c765139e455fc0cebccbdbe622c1d127577179c7605646fa6ce4e881bd02de128e180bc636baae33b29eef5b87fadb07755b6393261178202a6e2a5cb16559f8269347295046adf9d3de317e6e356b87336f03cd865c81857d95aa1b02be21270f09661263467f44dd83bc58e70c972816916f9a9601cf9393c6f1b40615dfe6acc611547fd4ebe7b03f638c8d3b3ba8162f1bdfc75bfb6faf162c86ce8c02e80a07648253eccb6bea569a982b2da6cc89f4a1f2b217714aa645d08ff68c0d6828a1a14d6bba66eae394a08c8f96e792cb6c506f501c8030e5830b926a49c5a9025b44e317ddc5a8eeb602c39cda613d44c84cf82979b50a52e7bbb26dc1bca101d46163dfebab0a8c825410dfc71caa946c0158b3a8d43f0a253a2456dda3741a9f1e45a6056af7fdab29ac6a8155ad420fa9fdd21030bc914db1a6b222a43f5c1060f470eec981a012e70f4e29f32f0056f6647c2009a3a969dc784619f1adf281d3a0ef635f7d6b11e80191be2e29610ab06e016a2799a10bda78c49f0c1d148cb445a2e7a616b135c40e633c433808c0806491e6c8ab9316091808beb51c79ac6655c2d712a3f8f12e3bc8133bc8eff180927bd9cb6dba8f67279fd5418457be7c9f51d3c0dc6b124b360f30168471eebb292fef130122a1554a7e6e9270f9d3dac2f2bd34dabb51801ba592543266f581a2ce2d1858345cc054fa8ac844581d09374216b6c51039dfca26a881a3582071dd520a7fe6bc34dff6d30d084aee6c950ede5bb8a64744dbf7e09f4c6887c68abc811c52a9d6b0df319b697056a3ef5f849ef3de17fc173c49ff864016602451d0a8d49d28bb498c8227ef3c7c1477c2b5c69f250313205c7f7e1f9bbf71b81173911653956e653ae20d5b7d10a91e4af1feb3892e4d0a420e29502c5d409e8b7df2f8f97c1e50d6e8318141552a2f939aadf0891d804a96bdc2548d6d1d3fc213350e028444991bc7520e83047ad9139288413d2912c2ce2ad1289e4667b57f078a4fe375c4e05fd037473c0f797c3b3e36a573e574a809916e0b7330da6d71d056449f7e8788ed6f6a41b6c1eda1cfe257976ab6d98d0bde36dd69a133732774d9aa96e4d627f322c7b21a905768b6eb739e0b85e0f8536e4161d6023118ae2409f902fbf726be164da67ea29723117af7a586e4aa753eb5c32af173c096962e33b6c7ff77026cbff99ea332f195fa4951c37b4f4d4812f76e7b8fe313a801815a9b02e115bb5008e9047f8ef8acb8fc84a01fbc8a58deb82dd155ea0d59bdc64993587f6ccd11d515e10844399b7413f4711e4e275b424c7da167702ab0d5a6d2c23cfb1e4abf5bb1727b7a70b77f2c0873c35493ee01442661500493d71d7708b866142882e63da47e8c31171c0c8a53465532a49f5c6f262095fbfc9965fca3312fb91e875df1be2e365aa611cb5e8c4a4e1af2ab5718b4b23581cb07b7532470564095db1b5846e28aca2683377a1641ef01c8ce846b1f381dd028d575fd23cba9d0957abcf4a2603ea713b45ce947759ec5a86c2a0b769a9d550eaabc94a06eeef1b9d65fc2bb9c6ebb24b1b251e88787eca5a090457ab84e0521f0a4dd030593faeb69af2a28670ac598198509ca832e21e94de1fe90d400f2440c23c3ccd4f3549e402cb23c3029bbde8d9dcffe7617380e9cd9db6c2b1ea07ae5c42ed7fd910cf4ab61a47da576ba172cee629d219ce56fa10fef8c3c815ff355a3c7f5e2bde841df622985b0e9775ffd03f3ac6abec830e302dceb36574ded39e2631e8d8ef36cc6a16988a06384d6ddd9a9fa76d919c93fb3004280540eebb3727c54ab998bd6b3a418a28bb2f1b10989a92e4b1f3491bc308aafb005becb9ab7fd55320af9cbb6f741fe2af23a6b35463e0b0561791c2317a984971b43e6e51d638f33b0872bf29f1796fab09969ee801114821659a79be75264c24b0e9e5235c3125dae2b33a7152ba0c086f5e1af091f4af9a5dedee8f824a3cfa905aff425943e476a5eb7ca0cd1ef0fe1ad78f7ec472c2b0c67c0d50db2df88a9d8b57e4bd5914c54989c59b7a378d63d6cfce648453e773366928b1a3819575c0ca1837cda84033b308bd654b942ec9041f06cd709a31cd6b150282c886f4f2168602a5faa15093e1877ffc7f99b5995f06d4c00edd69ad4acf37c6356fbb6d19a465f230c3e28c41cdaafda8238612a226389c831d97d43c872912beea626ed9bc93d83de8c96e0b16848e5ed72ea51602f5f42bb394bdc0858a3dad1d202cdc6d92e6ba17043facce4bd2c8ccbec0e2d2c36030c6a1f953e3b2b4215025c246e5f9be0e6fcbf01a71d56ae330e169ed0e994301044fec72fc60d2d52bd2312ec0a5c3d8ae6ed2baf51de5c95dbf57ace6e9dadf86f53f89dc96c23792eac1ee8ea0ed5cd318f0aa6eaa53641dfa9586653342c860b052d23021c336fe6d4c278acc87cc5958bb0e82b4361684a382f1b687b09fcd6a8992d997087f35231c773668e4b49f048c64bfa762316e97fe05cff4e302eb0e4b6848ba3f396a5f1c3078eaa243bbaba8f1011a9b6c856bbca825721984a8339f97d75a7cb19ee51fbd658bf29d0e1d71466d0a119c875f4d3004de7421111254745af173ac163212cd7acdb6af8b01c289a58ac39a3ed507993f1a1b0b33d436ccfe8e11e2ef5615546331421f23d02290169931d1753204bef17c1bf693f26148445fa5b151f3753fd57bd593d6b49e50f59d0bf6a17d8b6b4f8e12b832a568b2cec151fc7dbfc574c30293e8912184b097b9de4a4e868316fa22ad862cbc8a647e0ef69b40c20b8a2a6b515455f6198d603a41d32c6a4365985207f1dc9ca5e5e265dd7fc2e731c4e36f9ec16c8edaf4c59692bf1fd32c6e0e87c802f4129d0d1dcc82901473d48bf44f031f777aa6ebab758ca076cba79bc0a697754e4a3d20ba24beddaca793f8f1b153d25ba1554c7","title":"23. 合并 K 个排序链表","link":"https://leetcode-cn.com/problems/merge-k-sorted-lists/","question_id":23,"issue_number":72},"70":{"day":70,"pres":["分治"],"tags":["分治"],"whys":null,"difficulty":"- 中等","description":"```\n对于某些固定的 N,如果数组 A 是整数 1, 2, ..., N 组成的排列,使得:\n\n对于每个 i < j,都不存在 k 满足 i < k < j 使得 A[k] * 2 = A[i] + A[j]。\n\n那么数组 A 是漂亮数组。\n\n \n\n给定 N,返回任意漂亮数组 A(保证存在一个)。\n\n \n\n示例 1:\n\n输入:4\n输出:[2,1,4,3]\n\n\n示例 2:\n\n输入:5\n输出:[3,1,2,5,4]\n\n \n\n提示:\n\n1 <= N <= 1000\n\n \n```","content":"096221c37c5f85fac03c87f9e42ff6164f9a33409c9d41ad4507437e220640680895e1724c89803d7d648e3dbb342ab259aef3271decf65565cc7dcc696d1ff876cbbae05612460cccab0d430a7dbf155da73ec61261eb19f9674fa4aae32965bfa41dd20bdfd86d69b8fda12f0b0ed7149b04ade387740d978dd8c830a993628ed439633875193366c2e52a9b4ea372284f6de94c6e454398a51f1961081fd38ee7e3dcb46944a4a081bf7e479b9dcbca204015f0d0b0f765d06eb8b47ed8bcdf52936e9c8f4b9f2654aaff15a5e9ba139109f0d322899b0855a0c902387f958b415bd91027dde2b53246aa8fa0fee54c554aaef2fb2e2c3826b20b140deaa2ec67849a8f9940b04552410cd25f7f7b3ffdac6e8027fc37899db512cfcddc3294b3674ac20b2f6b8068185144cb482085bc7125fcb56bbac07a9b9746e022a74a0fbbe441342ecc35ae44c5c9da698ee0cad0e486ca909f15f24a593f067e91e4f7972b95dd30f93121734d10a620962182a122f43f0fbe9ee07cb0287c1bef5ca1511d523081d433140593a708ccaf1ee5924c5e46ae3454e9c94396e6a2bdfb8c26f0fa3e8222d7d2171ab7e5d15acb60299fed33cb4b233b4db65045a092b112a2c3eb2aa081f2dc7ae7c3646c080ada5f8e972ac8da9c39d6e7241555d847e05113319bd5268a94c66302172893ae98a0d7b4e0088ac433e676fec45be6c45908677caf6ef1128d42ffb6edf0f48fe4877f73394eef7615e80e34b7e0e0ca5f9be3e1efba803450741d13b2bd0a1b4c65580ff1d31c44b6b6ae8e7db4b2c8f151f7a59f90d5febb72445177c32c6c821cfd0c4eac5e465a42728fc37d0c95ed01bf1f7e771860233da87003d3b38f915347c4d5c8db2c2ed92837d69ac182949b2567b40d0e33f1c0f358bc6d8891e4f9aa30eb48f5308ac0c87fdfe3860ef61278f770e7847f179a8e001b7b3f78b8b400f694cae8d519efbc2709f785f701932b03dd15913467565cd62eb5b738f84a440f9674259cd5623ff1ed7a8ea12af25915353283f14a5a3e4240af51eda48f22fa02c29f7cd1d15bc5f1a31ce91412a9d021a9a00dacd3b37e820b284b4d10ec32a1c3c0afb4cbfa7450c42a12ec020f040c8113c25cc17cdc51c5478b249e831b5400e9d6d1ba725608a50a66c5a2d29331d2c1133900a6abda35b5113056491f69c6757e8b34830fb317f56caae30a265875f25c914f16e9a9d3d7c6b6f1117e38fb2830846b8b7786e46ad77c3bec46decd632cc9454c5ce3b7d945e9a7fe1d552ca2d5f9b2cbdeb2aee269d212309e9575e3579071e5bf67d1be8315d07b598c9ef1c6f528e67a0fe72bfa5e45a95f9bd2512277fafef184f3facd272cbcc61c3ab8a3b0d152f6dc09f7f6e690df4feafec8d2c67b54ff9b2ac9907af2bff36f1a6ee6a36a60c1c81100a6e4e3944e11f9f155cd60b20e4188aa59661d41f15e318a9b5b875495c62c0e34bb5d6ae56d1eeee43c50a5fc13224a3ffd82b5fef195dc75e674496000e8897ed7354e76d39a75db6e4dd987c947cd240a2d4ea9084001c93e6ee7838a11b7025b388df1f83f134b2a6f500cc35a32dc260854da5c49b7395e48ea5640c544ecaa19303e44f7d3b9ed06d29be01f7c76837f9c7cadc3f6ae6bde5eb2478c2e5c7106190e3cd1ec12e09cf665085db262220bf2f41a5b3e9efd4b0d36bd48044a029bfc7d914d797508d1b76cac467ead6c91d627cc35266d31b81da1189adea62f45867e5dbda9edf6b9887dae74b1cc14f188a2850b710bd46e5cf405b6bca0e66d54b787715d83ce156d796f2674ba276031406c98d6f9c9f68c967e281c7a25223ac56fb237f50e386f3a8281c1305070128c616bfc5b7eb20939e60c803ac7344844b24c63fdd68ef971c5adcb058802e716f47c3e917ad78e869d968b4f41c550beb89a71beca9f46b7f85061a215984dce38c73cfb5938607d167a96364bd9b3db90832bfe55bf3f870b9a9d1851ba84e1d5e5194ab6e513cd740bc6c0007446adbeea6114b97ffffaaf1cb2dcf92e84ac04a16ca6e0639cd1f23e54cf745024e815edb6b43654e92acb4dd4682e26e63d75dca3e0eca6c3565135fbc289aaf5536813270c33d5a501dc27b1cab24558506cf66fc28ddfae9c1c98917a6d7efb8cb94873ef67d4700470ff24528d6f452fc3afb7f77a956824de47f7b4c183c2003a16a27fc70bdfc4517c2a81121f2a1182d821280ee8378acba8669149916da4186117361627710625495f0e68c4bfae23d0dfcca2a27e838819e5b1ab9614bb1ab79f4bcbff04baec3debee363a669cf2d7eca9ef655ae37774bf92421895ff5dd751edcbc2e9efea488e4c1ae269047e69d1338435fdf68cc21f9e23aef11686cc50adedf56b731abd11b915211334b514886f7f9aa1db6512bf6f999ee351c1fa277c9dea335c6177d502ad564e9fc1fdcaa968a83951eecb5e9caf0a6ac70b35ff958eaf196f7ca90398f01a225ce485c41a41401878a46f996781c32c10c1ce30fd4ac3846b4093bc69fd247911b7fea0509b8933a79ad8c8745883e215f0b6ab1a84d5f09b8692a95168c9f4684deb0d771397088576f77a159b3123b265f3c56a237d5405a8120d486efc8f524d679d0435358e4c66d79e23db3b097e9475cb89f226ed9d329128f698aad09e838bb36bcda19adc296daf0155646d35439e2c486073120ccdbd706666142ea851c3b8e2de2eef62c2d1f0542f16be013afd4a5e714c09a43443899ffd5c4ea6de966568799d714b4e6ab0ecb8fdaff3e375c77526d84a42d7dbeaf3e3f1874eb90e3ecf9137513223905fb0c56a631e1f5a2403c193d3d3c5e4d4cf7939c378904bdbfc1782d8b5ff060f03172bb31d67f130c541c105ea34a93b99b7e5e98e5923177868cf4e9a2f1ddd0370bc9bacab68bf4e489141c1c3b263b81f98ab742c0873bca9827b25f0f9dc1cd11f7b143f7f05aa81d2cdd2d9087d725645e1e62aed18d8fe7860516687c81c0054161d445b0a6f4aed1feb76dd3a9f0d218cd4c2000f0f7e1f7c0391407feeb5aaa00671f141e5f606850ba61d9d621bd90e0ca213f3fd196249fc23484a65a5e8a41e56931dd5f87dcfe243cc2169e92e6ae50533704313401d162f05e22677e83fc8b8da8a936eaadbdfca1cde6324a69c5381e0fcd7a15d0982d9b954337b7fbb439a2e37c5118540284034e10d69f24c1bfd57b10043ee2098b5ed159d94ab84b07d20271089b04aa468501a1a1554045acd511770427931829e025f80737642eed44590555b37990477a993ce86d93dbe54b33f19bbc003ff0a57615f9e646b0b60228ae9a06ad6bd25005ab2968923ca4daec83fa3f145017cb4c7c754993bc2c24d1d012dd09013183995855fa94f54371c9b6afa9278649cc041ec9c684cb0b711ce1459475b89d1729fa26082a1dbc02078ed3c52cfad268e812f61da0be43f7e7e25db906d19765bfa6dcada2fa491b5bafd4661b670bd261698d26a546f2b515724cf4e256416341a19312275dcc5690890ed57c7d3c23e1efa554f4d0569a3f21235a7fd19a8e527d1f93371f3f168c5d3134b6d367ed7b5d52d42bd7c87ee8b646bc877bf1b2cd9dc676e1335511d0a7163304dad7c3e71687e5f0517003e41d25728a03ab3cbfc6bdfc588b74a499c73b29a27e7ab98d9cf6686e9a22610323db1cbf90626d253a87d588f84da76e3c5d35f9a1ba0271c98034483e163120fe839049b1c504f91cf3802a763220812e779c636b058f8ca9461c7f75a092a2233063e4706cd4dd61158d89b8d44ea1af41ef9706f66469f83af634499aa053f293fb544805417b22c2849e5ab44aaa99d99fed1f4c6ee3ddf054a5cb02d0fb0df245496a7c9b98f988bb017d2220707b70620bfd687f5e38cfac7e97513116ec30f381c254ec8fe3853f6d8948c4bf14de53903cb47ab6d54cc2520de867c73e5898ef220ea6cc4de07dddf20542d375dfede88649b467a5d7ae78966864eea6d6e826bfcd6b78f2c25f32f25a6710fe0d9fd01b7976174855d9c8d94a932be80cdca7ac0a00602330ebc31e109bd10a49ead586a70499cb13453c13bb85f026c576341606cde889d9de397a587d02933d23c52ddc31e9a13127b84df2ec4bf2f2cc04787a867ac0d41d5dbb1b993b7c74b6250399e3025bc41cd02f7223be37671eff80b1975d8aad69cb8d19ba86837130f659c332b06cc563b0b440939bbe1b69df953eb7b80e15be77a52c9617ce6c1d3b2699579c1dd6a651c1b49e5634ae7b8f8e7b34ac5825850ea060e79eeadc7758360f16fc855a44e9ef22e489b08658683a300ad3b9bb00c161a7e1652d4a34cc8edbb94e1a7d0c1a6440953981d892aaa9bee74832a56e4b2d4052bd7261e4cac0025764e146b665f3411eab0aeacc40b27ea937eb20737d5ef14cc8a7d3de1d3a0d28cb3f01b7cf385a33142356fdbf1f72f3b0620c72ccdf39571ee0475ac0ff9f4272a7925ce0688adb23bf5f74ba0add6baaee74bba298777c04e955bc847c8edd6aaddf2bc285d55ba4b361003f43e2e538de9d7fe56de1cda6a2c5412da843c47234570b587dd5f8cf6bf7cae52cbfca25673287631a7e535479d6f5c2a804aabb15871a5cc94fa00b58973849d4ec1aa7551a9d556228b6c97ef79e405a183d4b69264466f2ec2ea5f94e41d6b81df4ea029c10e1b586939ec87ef467886df984462fd068aaced8d3b96d507ac34ad1dbe6885b470c71e7380ae23e9cb0724f472cf4801f22fe38006179fb8f07ee0b7ec499897582e1c6233b7774f8d2cb41ee972e8df2998f7a0a5801983193f052185e6b35328e7d9de320c9343896e23776a58468999462b19eb857d5f7a147eac990285b1e060bcd68c8bd6da2aa8a068976258d1e46159167b6518171006c632351578a8b14678ae080c9f26c5c3e492d52505bb93049b9e5b375fe4d1df67744fd75377c0897624c434142b4f2c260c770d7ec79067d98e2613dd455ed79d8bcb8fab72dafb2757611aa9604b14f138beb5cfaf698c40953256dd1cfabc36cce1d754d1e89e287c116bcc5e7c7d143d6b0743a31b49bc3485586f2d44a4fec0d2155c273d15d43b234af3935fe6f67e88ab214ee02d74030b7467531d2d4edda59f11a9588a650dd8548f9632ef9b87d4b6d2251cf5cc8696441633d9eda1f93c72a5b77e0dba181606c5d55dbf5db8082bd3c6895da60a2524d15ca8842faf5a9ad43937ebe58de8fbcca8073c52aa4880cacdc517721295985360cd6ff1c994a08c8f96b5d7983e083b69079d64cf9c47996b42e683025b44be3dddc5a8adf75c8a89893978079202b15248a44202a3e0f03993b7fb2b8f4b63dfebab0a8cd51c10d58214a4c0210104f4ae922d6e2c3a254bdded2156d31745fd662cf7beba29ed24c555ee5015d1b8864562f29100f4ebfd2ce37a08182eb42dc48a90ae44a6434e35ae461258a025303a23a3e02788033b19a3e8a181cea0a126087d225fbc39cccd7b46395eb07301066ecabc2bc13cc897520c0ac1df09abcda616b135c4482c6e4330418ed464c9e6d2abd746420146a3be5f79ab281f9a9131aaf8aa043bc8133bc8eff180927bd9cb7ab38f5974bede3c844abe6e9f5bd398dc66125a2d2530168471ada82761f7615522bc5526373dc658f9c59fc2f8e16e8ca21d9331e1c25c7c66fa81b0c72418031e5cc054fa8ac8441b0f092a4207e19825358c9571a89ca34a207bdd0a1155e6bc34dff6d34e1b17d96cd61dd015fdfe13239ebaaf911c3dd3cec4b0814e52b696edf5728a735a56a3ef5fd6dba78b45b2176e0cac9d6a55732a1fc8daddb775fb4ab7822de5f9f8b9b17f170305a3c6bb869ac18c47d4d410568af791585351f6fffc579d9ca3f833eecf1e64354a8eef20680329969bcb89291fb83546318ff9cd186ee31db8436f27ddd6e2b7c71484609bbd05dd17a4aae955d2d983950c81039d08ceb4876b20d247ccda43723c1998c44ebeb56fffe36f91e8248155b866468a12b7d991e0b7aabed2e931c223fd41d305daf0f5dc3dff9617dde148914b756297a3d05441011c4a2dcb57eb7a342ae336b462d02bed98a5b52a38571e57d32db4584f956d8bc37633fe1bbe0c634dfc87b01f9253759b29a08272ba685aa579a2dca605673df49e80200e613726f7ce362ddc3df85fe79e6c33a3dee06d1063f5f49eb635a5fbbf4401937508041c0dea653983ac14a544c208d80fac50ed3940ac452b81e7f8f9be99f350b9990c9fb66ec257ee0c09ed875fdb4f29e5269210e4699bb1cf11d1bd7994e4300d83e8b6a008a5b78d14513b6348e51a8ecd2bc334fdbfe1f5ccba899bb550dc5503fc6a6b295f5097c54e340aea6d142495a964e131d47f5b5f5ec71e1e443aa4ca44216534f9beae966c333f9de726a741dd323af7eb9e27ab589349c2dba47a599985180cf3355dc21fc3e2d8baad2f7fdef2ce242a6bb777f868317565df155e1cdcdae98c09901bb35baf4f045d52c0183107e8f704c934ae19d0b50749778bada59a1a4186d00e2a512ff775566d45a1273642c156981a74c2310148140d6356c8ef16c4dbca714907a8f9796630c136f3c7f5ed2642c9659c297ba8d2388e5c655404f36588ffee5b37384cd159fc8777878ea7706a4671246b99d0f3cf6b4e0182e5841cbf3236b215201aa3151a964dae01e973a0a228ca2ce6600e3dcd42e3960bce75b6486a0904796e388b1798b65a0b2ff0e5db57b9fc28bfc751a45688ab0d1548ae67a66c50d7d0e9758a92719db87692d9919cecae35961bc36d70a8a9cec7b52c76c6d181270b054d00a462b7efb2b0fe48d0a2a2f799ac1b1ef50e28758b280f030838fabdce624e3f1b816cea01b5be849c84e28596b29dcbf72347498bb71f28fb911ace6039c80f56bd5a704366ff0d68d58402c2ec095f3684aa57d6c80de7fd5cab98139cf42699bf00484371756ca9bd608e4a7b4d2e6bac666a25937617b569e7828cac2237dc6f55f23f2df83870ebb4abdbb9402e8a467d643b77b64376d4977a56bb875ba5a176e700ae7e6caad786742a4f93bb0d341f425c11be8e71d384032df17d48db6ffc6663af7ee154ea09b3d48354291c9f6557206874235c9a39000b09b5257671499e1676cfa38265101fa4dffc3609599efde2e53b64a1e39bbf76867a623765400c6e544dced231c8691d932fcc3ab9927eec8c933b99948ccbf5be6d17e1a136f959240a","title":"932. 漂亮数组","link":"https://leetcode-cn.com/problems/beautiful-array/","question_id":968,"issue_number":73},"71":{"day":71,"pres":["位运算","数组","哈希表"],"tags":["位运算"],"whys":null,"difficulty":"- 中等","description":"```java\n给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。\n\n示例 :\n\n输入: [1,2,1,3,2,5]\n输出: [3,5]\n注意:\n\n结果输出的顺序并不重要,对于上面的例子, [5, 3] 也是正确答案。\n你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?\n```","content":"09613310c9d44c9fc671f2f8b95cc9aca10f934288bc428f6b084c70221171acf9514dc8c94d3999714e903c92212cae6ba2f2271af6ff83eb7cb46e350537a417e4ed8b4b5019138fef03227379db8ae761b071d48825b7bb65cca48dabb899493195462eb99e2b3d32087baf9ccbb330d54b24745ae1cf7cebb78660a609a97854cea8f087dcbb9927bf3ec115e47dc4f9cc2ed6260351cfef1a97422f355f471e7b101ea1c55fcfeee83e081662584cf4c87c9590bf63af12eb795819a1b09e17179e4d0fad63ade94d6af3759a9f28b50a374e46c3bc7f29a0b868282dcca7e7b721dfa36fa3f20b27f9a3de84eb230c51c949a573024566a5694e0243d6e40def99e5ff5dc90c581556e433024b99919b6d8732fd03bd9cbf07e5c26bfb260daef556c2a0c78047aa9883965f4be9910a50c4df00a78316b4f81dcb4bfc6d45e0dd30612d43daf17f9bb9c808d4c3ad8bc5c58fbc11af4a8f89445d66d082c5fb77a39d7aeb6258550455438b97268aad2cfd19176c5d5cde3e93e0dd283ae6190c096dbfaa7027a1787db3742ada6f3295c6ad11e084215df330135f07828841654a319c2ddac9071bb9fbd95dc3a5e7fba871c5024d1629d2510cfd94e54f9fa2ad17c70c58f75b7e2c1c6d764ef421f1ba8c98f6f77ffe9a63162ca752b40b1b9e9be70c86a3f86033002a869cbda717bee6158ac325e75ac2c66af5c6592b6044ad6cd136875adfb3e5e31a3e8ac1edd63a52d57613c9c98feebafa41b0fdd695b696c0617809bdb1b3a1011d4b5dbdb948ab0e8125027d39e00f374d1309e315714e3ebee3fc8eaa772e7f4bf457e24d199020cbfa4c59a8c06f069cc42b0397d684943c7a65f7abe2555cc887bdf58fbcd98c6d318b7231557448064c1eafcc11b2d4a760154cc253e0f0d660292ee861a47ab24599cd17bde8cc54f05119d8107107b7b2fce1325d2c19f557109931ffffa08832b11a8cc757e14d65fc024650a55798ed555bf1218ca8d64a2d3612d1060ffd91777b8fd13bcf9e65966a715b3fc5926d3788c4428444ee85a1ed7c92e25d27e7b338f57ba36cf8dda13307982aac02a0034bf38c200b84e08a359278fae67f7261fa6a5cc7081fe52009e6a0e74cec05ba5ea300ea3826b49cb626591bddd5c4ba73571461704b4505635bfdbc92235c66b4f68602de5810393c2aebe34f914f6cb34bf631a9f0e481c35d5179b94ff0addccfb06cd5e3a6f2024aff982696729430f62427d8754bff10bd500ac7e04793f1852b7849f1e780cb1f7b10a7c9f2b2e5d0b094cbaf04ffb25401ba67e85608dfda38d9c7e72f8e2378d2fbd9938a328e2411a370e81d37892bc7d11b5248b2b3f0c880f58ca3e00132c3ffe797da6cb64818ca309ceeff87684a7a100829d4f03a2e7fafa111aa9eb2140706ad9dca8e5452103c9deac9b44c32dd1ef74265a73cac39cbdcedd800f43068b0f309881a0a7ce89690b66a74e56f070056700b84b242153d78dddfd3d698c6df11bf662a1d34a7c6489840761da38b0fae7e0787978d0fc75a70122fcf382e5ae5630ae5c5e717d1b0d1fc2c9a9e0d4b1839cb844ee72552df417d42a30250ef7f4d23769b85a551aa0b72693226a9c5df9137b8000f95b915d671d911aaae9baecd887efed651a35f5338df9093d2ce16eda6ff67254976a2a805d8df174a03580e9ccb811dcfb4237fb28e039020264d6b85942cc15739f367c5b407916b3d036aa07dfd21caa2817c1ba6103ba2ce8dfafbd64821f82b974acbcbf5b460383fb6324a7bd23fe1d3f53f24a7ec0270ee9723ebfdd76de84fe99ee0df8a011196f770450e154f1734741a921e22964b9427590926146db105012e3832c5ca83214d15a3b6a663b564aa17393b87e2ac90e3e7a445a0c9fd6bcf1bb66af03eae2f75e2af89a2a9886a4aca449db09d79b7eabf4697c351578514936e0bce403efd7dfc9fd0184eba376bebbcf4a38320e254b83d852e859e0a4db9b0ff173f819c244517e44ce85b905d6e2ff3898c3a25fa3dd395ca18d9b1ed7ddbbd7fe170e5b94ec1a0f06409fd380d1678bf77d7cb0e30b320b9df02e1c9bfe61c75d59fcbed90c89a0002869eb1e5b36f0f6a0ab6987410c84c9fb3f2a347627565df530ae8c1c604df5e24f5c4f2784833e870cb71d6490873e22458af75aa954c67dcf505ff5c4dbe6795c0fdc0b01b4b4f972d9d07888c5bea209834f6a07a2e44212c01e60491c7bb549157ba6da502a5e196ddbfc806b8b4a10ec17e166ad544054ac4de7ac2dc2fa9010f10e16b8d756fcb063ae6246da22a0bf38cfc474f43283349a6ea41e6996e56cbb04e57fc39db615622312647e85bcaab27e69db7cd4eae51e1397e16df71801b6aaf13e79a5dc991e02d3a3be84b9177670746e328e8137bd9f1cb298a242d15659f0fc1bd5178eb98001b34780589670b319a90a0ccff11ae5b3edfad029c30e6f516ccf614081241dcebea2e936676fdbdd87e03c6195a88e0eb6df573ae3e412e34ce22ed5fd61658adb40366f249e0e0ae7e5e1a9804ea6da9d5b7d634c219274cfdc8c501c28bc23b697761d8e16bf46968eb1841139a178a43c7731595303f9e65f8e969205d533d8012165d6ddfbc51404e910e3f36a36c65e8bc2ec1090934dbe25be9a502bfcf0be57cdbfcccd7cacaa0ff2cd8fad0e76307bb702c6539695ffa705a2c001e6baebd390e43407193338c998f68a8ef6feed3c24f201d920319fe84cc302b22ed7541ecefc434118893c94be0178d7e131338754f14e0c1e2eebd36c3f2650c37efb1b3fea8ae973fc9185b90ad541b3e68d84dc284411c93af91994395af75979a661b63782ff077804ed9d81482c594fe012100260bbd1a71f131e94cd133e8128e388bbd230cc40a13e3b10fd32fc60962bc0d18f6bdf304f7b44961934ec9c29a55b92497a97e24097f81ab894a27d5f6d227c011563e3b4521a98aedccc6c102714f5746f6e61ff81ad0cb7e5e7e678fea112f501a3076562a514bcb0ee870f23b9702239af3ca2607007c017d1e924e42ce7d6667902afc266043c5ec13c079b13840c257729e74accd54c08834437829c171674891926587c8f47d19977ba47a49aa7553bc5c303b1c32d4cab86f5dec5629d049494b0368e90a90753151951b011bf2fb77cbbffe8807f6c338b8d768640a4bf53e856e7ede79fd47603b0283adac738c9333c5d940548456a817cc1858fda2fbc36db7ff80ddf042ed195b95d6bfc0c232cc00417e082839fece07e459f21d3de272cf5e82946fa86c19b2de8c95bb608a23fd2c51fac37c813a341974da1a57541416c9a09129a4be5c4b5516520b5f9e4ec79d16d6974a4918b4552aed3efe88e30a43284a4235d1844bdd932ee46128470bfd02c3d7226b7c5e8e001cbaf3b7a4386bd1b94f5c817eaedaf87041241521ceca17a3b31727cf0746e2be5ad65ed3d8bfaa076cf1e8a8d02ff1262cf32c617b7f2993ea4db430f1dc4474eb97cf893f1f620793d9e3c3f796cff5a689025185d35c26884e2a54f8cc6c92bca797c93d3aabaf0e1bc03939f45803deaf4151ae4952d5fefdf1a43f2e37dcc87e870b3125c5b82af50da5ea7759a2feb5fdcee08bafe9b2a835f5accf84d7ffc3aba9fbe47190bc203aa2c2ae25174d0271e6d673ed055f8f776c227d0af6172f1aa9d7bfdb321e0497c87002b400b6171e1cc07a014dc05c8a02efda559fd83227a4e3ec6a81c0068397fb190882a661d8adb79e45f3269bb27cd5c9a64fc4e550080b06f6b6a84609f94ccf068e83bdf820d090189d6d5aabfdc558030e496e5d3186f8efd121f04e92f25de3f0a387a412e6a5a3c0a596bb9aeb4d8609292cc00725da9e721596c486fdca5756446ef8695a47860676f4fcd6b9afdfb8bab03a5f443a8a40761c7e64c8fe7e1cf48d94c04bfc4de8275ffe3aa4311d906b76b1e8293ea7ccdcfa69a438bfa307938a6d466a6406dfe9881fd946705d689aea28d24eb2223c8276fcc6aca57e60a77a77e8714ee8c5852bbfde2f2085149c97c6a233a6818ae03e90a8680b1924fc71a123972b9bbcad453834459db13413817bfb0f524614664e673f93ba819ab6deecd9850368f86c079f8f57d95e7032c89a2e9af22139dc5e9be729a05c139e9eedf1c7ee88342e316bcc717cb4088356f76c7fa27e10efe4170475c9b1fcfffed193e6682a0e0f3ddb67023e98512c16444f28a8bfcb9db01dbf00929c409b3f119d2e2efa889da038c72b8cc73f1b1c5249ff6304b2f5eabbe75eefe41d16be675c2beeb0c737c621ed7d811bf94bffa67c44835326c188af14a2399b8126161a7e1652d4a34c89b8efdbe1f599d4ab431311b71dea37e897b40bd76310b1feb55779967f1602e65e7f284e146b665f3411eab0e8e3960b2fabc62aaf4464f6fe73ccb8257bfca9d8808599f01b7cf385fe1b42356fdbf1a56a685a35c62ad7c2d762e81c669405a1f42a774271ff6cc8ed981185ae1fe8a4d7e8cda04eaab254cbea3cd5018845d880ddb2fdf3bd21041af61e62594cba2404538de985ff40964cdc702a6c1cdea92202730a7ab4cfb239cafabf32fb1f98e6f07f6e2e7004eef924698f4551348026bfc85111c6c280c730b5e30084fe0185ef6f23ccc7167fc17ebdb136e856e88386d9d33112266897a63e94ff1b7ad5bd0caf288f504f000c77ec8fa14f78ddf5d40160ff06c2eda2df77ce9b749f7aca4eb703d7e67e974b20c8a674af822d6df46cc90103e262b8db7e4591f4b530a7e3a4498497167f536b19c96a4fc44af14ae926a58f2985a09391d776834b76422f9ecbf1123fa8918d3e438843db35232622204f89d0002b11a285775f681421e5cf4acdd3a267e1d6c4da9bd46bd7f3209f2b58dbe4731f542974580c7348c67c601e64e09b4e3be1465fcb268cc3abd4d52d11e9c84d95900f4054ad8fdf73741ad07939c9892269943a447e1c642e4577077e949902ee8e6f39dd040c859d96cbdbe622c1d1621b6f75994a4b46b46cebe781af28de128e180bc636f8fc08fbcbf43f87a99e4b33552ed6261369012f6f466ea33d0ab208fc4b2f1e21c2c1e79b395d632325fe11630ade985cd0c9718eee3542fc66380f2b75516c467f0385e89644fa1b906915963cc68b2fcf89dedce4e30f1cb989d2c6531d2bddeff2fb723bdeda6565d5594314c3c108fb70af0e6ac4ce8f55f2443e60820e82df05af5a9ad47b7ef2ed81f4be9c834e340dbd62ce8fc7ef743c46acac5c3cd135a1e392bd8c82d4fc83d52d1e24277ff9648b8f0099310dccd1470f44fe17a6d5a4adb773d8f5e26d3d41941ee52179e15252e5a9f12b93b7a76687686384c1ab0a8cd5551f938a14a7856a4e48fabf8b64736e33244bc0a364139f4c00f2373c8abec434ed6ade7fee501583b89e4375bcc308e5dda35fa44141102ea61cee8acd846ea6431c70a7394016a077756e3889f472f6380659db8791f1a3a08c2c1b38713bc202c2f0233c6974f33f40553dca862ad969d5de00421a81df59fe8fea5ff22fee0e633c436e4d83d42bc3fa81e5c7084a5a41edf2132dcc7d5dd8c66aabaeb46d6f87412781a1a59e947b979e65a5d522669fd5418457be7c9f519a8e886b400e620f2d16946a87a82761aa4b5522bc1369653dce57f8c39f84b1b53ac2af50da388f92543266f581a2ce2d1858340e8500faf4d5445514232a4255a4cb5e7c87d742fc81e7117671c0521b64ccbc34dff6d34e1b4aa4249f519515f5f657278df7e69f1e2dd3cf8aa19c1c07ecb5f6df728a735a56a3ef5f849eb79741fc0b2054ff975b7f732a1f95f0809d35f244c9a866ef217c047bc2f7c6822513080a5c7f3c4ddefe3a92573cc3165bdc20313aac0d413812af1603d2d4b3892e4d0a420e29502c5d40d7cd7db9afbe645b0e82a625ab0247002f939aadf0891d804a96bdc254cc6d636090186f6f28ae44991bc7520e8304289c028b894a177b5791c0649470ca6c27f53f2da02c9347c4fd0d943c463c25393c7b7d66f559f47dbd0f9020786a39cc6d77cd040d8a00c981e5352b57aec0eda1cfe257a609b896c96eda339743c6752263316879744e22d662eb491bfb65c5b849851c5c855a236485237c317cd5ff9b11b461dac4174bef09828822d3642aed9db32504551aeb1a7e9e8b6ad3490e130cedd0634b37dad9d11b744164b97605fe2659d2724b67","title":"260. 只出现一次的数字 III","link":"https://leetcode-cn.com/problems/single-number-iii/","question_id":260,"issue_number":74},"72":{"day":72,"pres":["位运算","回溯"],"tags":["回溯","位运算"],"whys":null,"difficulty":"- 中等","description":"```\n给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。\n\n解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。\n\n \n\n示例 1:\n\n输入:nums = [1,2,3]\n输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]\n示例 2:\n\n输入:nums = [0]\n输出:[[],[0]]\n \n\n提示:\n\n1 <= nums.length <= 10\n-10 <= nums[i] <= 10\nnums 中的所有元素 互不相同\n```","content":"0961361ed7da89d7d9328cf909b1643f65529601cd9d2cf27f683e5476b6ecbd9e38e25a6b8bbe107d7e843ead282c9c6da1e6341df5f0587fc873d662630fc974e48cea47384528e3a6066c0c4d8cf9cf2bf95e7425d454b064c84638532b43aea715fde64153a7ebc9849f48914d66a45e8ae7beb81f4696163a45a16dc349ffb42e24404b4e4c7fab4fb041fd1eb54445098d77252d5dcffe0d79f082fd0e4d7a303069d2c32b4566c1170bdcd80009c989db21b795aa375a974a37a90499901716a6650e927aadd75c876de7b3b5f0019436496d2109c2eeea9720503aa33141729a50ae759ffd100cf59df684e828006dc35e79e5a2476cb8664d2b4bf1d9e16b54790bae5f99e8de870cbec9b8115b69a57be634c152160fd27f028f72d1ec38459f506334c552a9dea97aefe52dc534279fc84bceaa7de4c74a66cc7a958a0f941511507b9faf53fcc9d84d8edaf1d2c99ceea546d275eef170d48715146a9c2f94de08d133065f6b0860e7ea1ec6cc17a0490ff75a66ce3fb0cddc1e26e4252ccd36bfc1190bd02d57cb042a9b3127c199bc71bb804904ff5e58474ff08f191d6a53e52ca382047acde9be04f6c281c6cb3aef6d26074d58e003e1a4e86e9f67ec12af637ba3fa0845063201449d42c1d2c0aa818a558cde516750ba1fdb357303dd8c2bc1cad320712b4608cee1bb70dfd369cfc14bb4565fc949eac45e3e6b638c63d23e817ef45f67b05e8f2cc0d1c33a54deb29a8c929f5256927ec696d8d7e583bfb599835a396723c2cfe7ed9b803682c6d6147f1d18a1552299a0eb7f444a737285bbc0d4904ce5f68f3da24bf48d4bf55f63f7e04714d685277dc0d500606a070f520263e0e43d07c6116ba29ec05236602aa57128797f4c38c6d3685ab40c1348f0adc98008f4afb6547676caba198b3ff1151caf329c88e363511fc8114934bd8be50c8ccce9b84f92f956bb02612855f830c24504eb5e4db245b68ee62f922b7a90b23eab71435baf8dec8350d0a5731680b518497b938b28e96b14350b83ed6450074d42945e2adf905fa220655202ccb32ddc4be357a9fb993c1594fc09bd6b8bb81efb3b70cee13a059f032d77c7c7d48c3e5ab686bd2a7908724cba5875e907e16b5bf15b4790eb26a85805fed9ffa67f4c3a62646a483a6e54c7819b077f6694e08603f55b3c1b3327d5e361b78437a330bd1be9aaf5e68687feb203f842d3f0cda67cdbc492fc0e65fc81089773a130c73023ec55a4ab1cfb3d1aa6ba7ae19ebb5926608391b38b576642c4f09ceecc89c88885d215aadb415de05a821718bb8e009a89f744f1183fa0fc83c7a171f4147de555b27f15c460e181425f1ec993afaeb1a5d1878a4022a49bc7d78f64fc112c5eddf4f19fdf4feafff5ebc46a73ff9213c29452f097d86c2858e49b416bc5fe120aafe4feb2431ccff062ef65b933a43ec33f425b01de3068aefd07b72ee4ce4b5035e2046e8ad5d92eb8201efbc34a506856acb8ff9ccccc9e4c810b483766d3e8ee4d84bcded39b47d8794dd798d841d330090e55ab127000f1256df4a9812eacece89d48b3e27c435567e2f10ae44638c62c0b67d65347813b69492c9cccc659eb63640a5932c19af6c25faea68b4c4919ea7fd90fb6ac97a80b5190761bb4670341646a1156bafe7498adb83b390a3597e569fb89727b5d021adaafbe7993ac4b108efe5e9d4c717c02cb936ebd587eae6192ea3b08eff5ffaddc64be5edde3f16c44e11d5fd7f3f1a6fd87392c87759001acf69e53ddf0b01ce78f3b891abdb2f36f7aaf846b4288c93caa87c4244490254d05424182d1c1c218191c7e072f751833fd6d04e916944d2a014ba2fd5e8a5164024986c939f9d2a26b292361b66eab240d34bcceaeb0d4ea8767a6f4e2b34db271c1543ea40a79f6a98880bc8a7047ca5e88b09d797147339f156b943d9a41cc704d91467132e4450275157e853668dfbee1888039d698e732e15b9fe24273e9d8c7a2941201e8d141a879ae289f1d221d8efcaf537be15f898aa27ae9c88776b324dc27c06063bf1b6460fbdf4d77721a2ece7db6b43656ef24c748e16b3320e71341d7a2e1e19cda92d99df8e08dabe644693200c3c1796f915fe1dff8fd0f600330f73878eca8a73fb50c1cbf82f531292e810cd128a15d672ec777318fe7450fd7df0c72c956cf8011ec536164074d9386d43ab64bf0010bece2fe3886dc4d090c3440266f8004d2ba923ee05bd025b0822879f2848aa5be6ffbe20ec04b0669e4460954cbdd47f6d1128c2b7619e665ddeb801b8dec62fbf156adf2765a67e989ec94f7d10b3ed924d62c561e20c293779002e086aaefaa56a1460e268a2012031af6791ea213441cc8b90e8a678e3a3800c60feedb6d70149310b83e20340dbb189a61589eace97eda21ea9586d55eeec0cbfe2e2c961033579a4694e6a1faccb8b8b90ed42918b4c53b064b8d89160332f72a4b5794b9a460f04e49a3d7ea54296ac38d01761be62bb272b9e9abea2542ed09cf7349e1b45028f22aafacfb2a1755d60475df2d1d105cfc08c7a09c164d6ddb4f400c372f7e72ccd7287ea49269cd82cb3c98119911efcc6da6b175ed122ed0b897c2e859dda396804e2494f0e258acbcf2568df323058706e05d70fdfe0f6a70c6294bb32ab232676c66020b6061ae0c7b1138e3ec5dffc398e1efd337f3fac0b58eae0927fea0d3cda767f5534c01a6502ad7780755f9acf04bc5bc715154a8f1ae22ef9013242edc9a674e46e4423d9d7e4b5c6a755e14bb8ea1ee7de03460d8deb13453764c27385dc95ecae25466b694f7eb02de320599bdb9d6d5dec80e027cd994016263bcb77db129ee1f64bd44706872ced7dae7f321caa172de728903cd7eee1ee33e6366030bfaf6f5fa8f08e64ad48c648bbd3b3e432ee77bd5cd56f5490602cf7e9f49239c88c68c6b3b1187e3507c04895091f5bffc91f222774a4419298ab9ab8bfd27288942f44a65b7fcfda3176ed5b7dadf9ffc938d82ca659624e245ff13bee55f7b0d9aa39580d6fb882987de626d3702c2e95c844a4ec525a96fbd2fa7866bc9b606d468199793843ac586c9c97d7b51c22db460c1fe57f42ddf60e7e46de8dd73c09cffd6ed87d5f9ee8975defb00d5c1d8e1f750ce08f1f5c91f838cab3555e70f275e4e8b2541d6494393f49db22eed20ebba43d467f0b3d6f867edc410a8caa3153bcbe44bda4cf0fc3f72757d0255b474725f021fae2e9c9343104c1648ca16819189d69ab33a569da00db4dad41330de5282c7a36684934957494b48e877952eb1df3341c4449292d1f15bdce5ced08e4d6409a36129b8dbb2dd9bc7b21c817158f72f0da9bc9878b9907d9a3b0659ceda818ce0e84a41a15f12974da6c1d7e8318f08099f97a2cd68d9f9265f7f2bbdad64298ac5279101503ecce8e08d815817ce6906c2ac2c9d9c4c55e342fe045422799b8c7103365ae10ab39049e5c2e6ba8e092de362bb3b58d1b12d1a6f625b12308e4227604b251d1b6d743e8e97285198be128b95ce3e70b30044501434a3e20c4eb69e4afc9e6e9fad4e6bd9f168c5955c196d7f1ed2a9800040b2788aa3cf4f6a8e7ce37c7fd0d57d44133551594f3763741da532376b427e5f4c51003649c35734bc3ab384fc23df8bdcf0155ab672af9a37fd8198d9cf6686e9a22610326ff49fac5468d228b90021dac68933b7cb920fca5eee6355980509cd9a51122cc239049b1c504f91cf3802a760703650e576eb66318e3107429343118f9bacbcf6a7a881b35d8852f90c4a6669ce72e877cd441a2f266cb5e0df1344fae5417a755acd0481141dac7c465aa1a417f4a9a0d6bd8ba09da869f55e600ce56f43f99c3e7e96a7c9b9d9dd89aa0b80354c428f136fe7cadcbbba92f5ba902051422b975c304a600d9cb12c00ed96829204bf03f424588c47ff4854de2c3af4867c73acc7daf26eea71c49052908c2e462a3e18fdca9335d946705d689aa366d00ba93921d077b598e3917e34bc5077e8714eae8ad72be1d22220ca0f80db83af32a4809f8370c4b6760b4b61af6a8b239773d4eead3b257243d49b165acf2ffb46525b143f1b3376dee7d2d9a7c3f0d49e6761e36c0c94c65ed952127b84df2e92fa6c788f159be17df6500dd2dfa2e4cee5ab1e2e316bcc717cb4088356f72a7db12d53a6b65f193fd8b7d6c5e5d1d9e6742a4014749e38334a98584345445228e6fa9c9df953eb7b80e15bb176579d2667fa8e9dee669537988e3b46151b12cf634ae7b8b9b2e705c5ce1d16be675c2beeb0c737922ff46ed25b8e40bee337018c55209bf3f874ab32b8ab26161a7e1652d4a34c89b8efdbe1f5c4acee106801ca1d942ae8deaf218a4910b1feb55779967f1602a3127e28371a3b330c7c6ea8f1aba89e5f26b0ec2afd01378def0ecc9b127bb5b2f2808599f04939a7d0f17f42672a88ea8f6a680870cf55d897fd70ed0f57946fd2f449652c69cf06a2edf27bbfa461f6aacbe8fdba48bc389c22c00b95079d5bc2fed7b1f2a0e66f2218e942364b29f43e6d1cc3bad1bb449e1f8f2464502d80ed774f720066efc8f73b8cebbf32fb1f98f2bc56693a7037bc9d7014c00a0e2a8806b3cf0527cedf9fba379ff31b84b340d6a46f678384167edd3ff3b736a15db8c2c5b8da31490c6897a63e85f91261d5c21ae6618f36320a0c77ec8fa109378ff590086bec52c3eda2df2b90d535d1338753a529dced379e4b7be2a632e0d02d24bd63870900f67ca0c1524599e5b52cbbe3ed408d974d0d1c3919b7774f8d60a544b973f6c721cba2968be07afe10242f67cab4b35b6bf5bd8d660cda1eec282336384b01dade507e42ea8d2356733e73acd52899acb26be1838a88869534aee80ac230729ba4337331717ed48897c07b90f0c9b13f19e8fd5ff655c10ca6073050d50a572d029e146dcbf88d40126aeab1c94c7913c489e4de02f3f3ead9e08383caa5bb4f1fb36f34227cd56a0697e3f8c2dfcc08ccd1e0dea6f934f48ec219aa56454435ae118e341c64ce58b3f8b97a677ba927602bd4f6d89e1fcff0f9cce7e7f38126a98036c046ccf4fac25d345b07f6d6bfcbf77498ebf32f1a904e5a8b6229fdb8749fc889e58236","title":"78. 子集","link":"https://leetcode-cn.com/problems/subsets/","question_id":78,"issue_number":75},"73":{"day":73,"pres":["树","Trie"],"tags":["前缀树"],"whys":null,"difficulty":"- 中等","description":"实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。\n\n示例:\n\nTrie trie = new Trie();\n\ntrie.insert(\"apple\");\ntrie.search(\"apple\"); // 返回 true\ntrie.search(\"app\"); // 返回 false\ntrie.startsWith(\"app\"); // 返回 true1\ntrie.insert(\"app\");\ntrie.search(\"app\"); // 返回 true\n说明:\n\n你可以假设所有的输入都是由小写字母 a-z 构成的。\n保证所有输入均为非空字符串。","content":"09613316c1d44c9fe745f0f1b39b136e2cd2338cc19428f2536e3f605695ec86933b242746cbf339110b985dee1b7838d176418710e7d15564ec7fe05c6233f374e783e141324e2fe5aa20660d44b5fae735f86c5c27e575b24bfd4a3f43285593a73fcee25579abd9df8e8268563259f714bca0d897761ba4607960f615d2269fb8445f650c205b1cfe4df508ed6ac84a166680104f333290c8410eee7c1fb1d9b0b3492ec18c657beec130081a716b4ef2ee903f2c958d349c2c3d4bad4e291b3df836c8029547add442876de7b3b5f039b2346865ce9f5f2b93af620b1fcf95d5b637c067837573ee8238e4cfec92146f37ebf868c188cab55cffa5978b623c8e04486e10ba498ea49fc50ab4d0f40e4d63ea74ed77d112124dd26108807bdaf5661e9e4c646ad054bf97ca08e1b27f49f3b57270c608cc50949f61c220957a02bac3a4825168a1ac65ccc9d8678cf7ef14085e6155d61d2be3be3706729ec7db5a7ca4b478ed51584b2490a46e03ff513db8678ecab6ccbf34f728a5a909be72c1c19fa14c1498c02ce824ea7561865e56c9d4e166d0ed747e80573fc2eaffa81e1e4e5c3a8b393fed9547754293262548606dbb3693e5d3bd3b8fc36f3c0bff6d3561cf0ce2966dbf9fbdabf5f09f04a929154d1c6c64a30016effdae5d8e38dfbf9c1c19d4024b4aacac87e0070ab2bf02bec71e4e0fdc7bbc7555841744ebd3e6a55de92190409f06254f5bc5a509085591617eb00935434864342f1fca21013417244c51ba9e9a5a4e3377f1d6e9bec7c349a11548a8b5ba4af17d5d596596276d0e4b6fd4fdef91ae53a0aaa1748b0c818371b4037283f7165288df1f7fe8814d20255c7a2d69f4347cf0826d1e766dcae5ccd9130a16e0dfa9f5fa4a0712e3b11a0b3919244d638d39c8ae8a4b7c4bd709ec68f523a5a76eb1b9b26d810903bd734867d18a999e291a5d35970218c650e8aae9a770f83b0d45fa194d65eb38455f8f558dc3535cc9cce6a7af1a025158f96173e5f11d66f88c1a8ec352f40b4a0662f8ef0a1c382b08b719a69dce75f47b6837937e759e70a40aba2e4c3df8a911f12fb6863c3bd9823e096b4a105bc04aacc0400c483c3f74bc6427a59699090ea712d155c25ae45be97b4692f0c90c3c5eddb6969b240a1b0c2d570e6d523fbca1f67a7e0ffff5e45efd1f4d345352ed833d9201378f1fbe2beeaae1c886a8fab217cc4af5f8c3a66edcc785fc1070fc8122987d9830fa0f21c87fa89b2ff20b1ca49358e0adb856226a81b78587586642f6e79ceed087f9a084e73aafd35251e46f801e0bbab1329b9ce749d234f86e0a0d13f528e6791cd629ec564798519ad94c2270fefcc992f2d4cce2e8514bfa8cbba2b115ae3152ee51fde29cd377c1f2f0e9c6704dfca004c38268f0bee56f1a6ee6a36aa42d009de430e7c6954e39f7fb66ee65bd1eae07ea33527403f81d6b81c104a638e5f37d5327e50b65b7143387ba0536f8ec5c5a5c5ca3a4cc9ff4ec9f68a906633464f6e823f856177caec552b81047a5fef0088000615156c74754438d32068e98ec779092b68f29f2f7371f4427aafa7d977f509f005a2dda3138bf550d6278f3d9aa33ff0617332549caf1b9f027dd94d01478508c75ae7093e1f6a95c1bb10c44ba335c7106dfebd24335b2e1b6d0a3cd94e6726d8d658b4a5e570722d6a49078acbd4a029bf559bd4f524501e39e6e9b6872a96690cf34087d031309131e923e9ad7ba2f648679669cabc8c1b8a0778415b20b8cafd7b9ef4c5d883a306977d236dadcf624278fe00b51f638f83b7aa07e4050b881edc997223f332a8ac096dbc7dff7ab801097e06ec771dedb83c7720627f3979fe4c5456b62c3f8b26b3923d074b62ad1c1b878463b76017727eb43684ea24df3249218b2779bc93f6305093d4f8ee529e52e7f01d5715633dd5a34c0f817d046ae9959b3ab00b0564d3995d903ebcf5c7b4e0718bc5191249243c35519c8ba3d1e395c19cd8d640f83288475e477ccb8cb7b732ea8f02eb6463954945e7448ea1f20cc27cd142388100a22bf8b49fe87faad7bf0715cdddd219325fd5aae9bb621a6d1137903770448db86c93f1329727bf9b5afc70c41d5fd4e9c637b1e7dcebe92e24bf6d9482409977b98c750297ef48cab48b777ed11f5a3b603f2912583204198a13c208a108bda5cb3282a3755409dcc9a7bb763e3474be5e3ee38919d8dcea8eff989e775f5580b37f954d317a93c8261793619276306e0fbbd414281bced05968188375d943e43f4736f2b13e96a8f4d6f8b007dcc396dfd245e8e9de15a01177f333df4b304d0997813d3b9487dc613ca610e6d632656e846cabb69a9d9f2dc53f650fc7d2b188139d87dea64e96c719b407b2bebf6e76c8443e5e0fa877d862fae9e1a1454c712ae6f5c315b976c78e1d42d61d990edda0d9470afc46b196f7432b4389d9772699a0621cc827de6ae5b5a1203dcf6ea22dc7a7ca1fed62b4d5489d05b5c78a96ff735b9e9ebaa6508fc0acc1543eef54134bd15a5a1e07e0d5fd9566dbd0f6e440eb516d5e287105c29be0648720143372198cb4130f0a37cc195bb6ddc07cc1df3cd7cf5a43cf1091af9a3f3bda50ad4a3cdaa6424d2bfb058a4f5bc6ec4e97704eb5fa8092594ac5b7878d13f5be16fae306024730b5e257fa56b3b5f288c8231b690ccfdf1db3ee8d0eab5c7e8092fb0ef97c1e770bd495404a64164b12f580bbde7fd4784f310145cfde4ae61bada012d1f99c93d1a40aa245b94544b5c6a755e14fdc1f3ee75a97a34d88daa36492303696b4fc940cdbc4f1fd5d3b9eb1ede774bdda6b9859cd7c9414c75c4cf650727f9b93ef960a25b36f80a0b5374cfc7c8cdf534dd87638425804f892dbd5ff9433609540b96bfbbb1ca4cd729add87895b532256904b53e819804bb49484d8b3b914c239bc69ac53b6f01d5c94d7c14920df2dfa3fcdfa73f7106441524cdafacdfb12b62cc4b8d1e24e5a8aed45e3a9dbfa98bcdb5ddcacbdc37db6aa30cf60ff9cf3c720d9ca3c6c991b5f57bcf860c327a6dc2a713c00f4ed825fb20f27bbcac41c9b606d46855dec0967bd6c285887d7a1cd856e01dd8fe7d972dc360b7b628ae942bced0bacaef8093b0a3d67ddbb95888c898e1dd50ce08f1f5c91fdea6813555ae49275600c433418c5f5994b88ba538b871bbe806927382e0bff066ff8f6ed0dafe5d7985e3699275b5fb08587b680e49e40a3a104c35ed62ddc010103f59049f42c88c8298e5e17456dba504a19f9c6c728d17d694ab35c1df0f5b494b52e1619c299b917c05814ad1da98bf1d8c8a80abde1f214fea393dafcaa3cafaddef18db6b559b611ffabaca1ceded579a3b0659ce87aba6faba1e18f11a089773aac6d6c113c61512a09be2c947e1b0690a317fbdb3643993ed25bb015063e6c2e08d810a02cf2c50c6b62d9dc2006fcd1dfe61067720f58f70083e4f9e6de09963e5c2e6ba8e4063b724b7260dccac71546024dd93ea0888fae1d8e59bd0e1ab902a5f82f35f1c8b4d2b6af8d85092bca795f83138b6910f2cc03a2bfeb5ad4e6bd9f168c5d35a0539364ec9a2e31d54b26bd4ab8c05ec07ba71b5b61d47e2a69cb094ddebffc9d6da07abf1d5e6b8f7b5d0ba9a847bfaef3c9a3d3758e0526f512fc9940cd77602ad211e08f3cf6686e9a22610321ba6d6e93a27966dc27d72cccc933aa797961181318a275dd650449ee1181b77a17c6ad458154798cf63288d60227303eb37bb3674c0750f528e480e8e9de0d8f6baa8cff60a8826f9005b5d74c437c1208813414566469f83af634499aa053f6f33a8118f005ee12c7c02c7e544a7a9d399f1def4d4e727a5570f3fff7841e4df395486bce3b98f98cafe44d229472dcc4720b58bbfa8c4ccabfae95f63483a8b40761c46018cbb64368ec6d6449d068406c5cd2df6a4211c97607ea6c33273223d06359a4ea94969c27847ef89cfa1e6750710851feec199f03766e20c8b5cd1a80ee9fc86eedb362fe97abe4fdd89142ed764e5d3aee8291ed4df0970ca2c660b02ab076ed58edcaf50b538b258ef782b29bce0ba9a433491d71afe3cbbda465b7d443f7c96a9d2170b46294620eec6686c44d7c61b9d5b7d35aef56ed2ba3c21db5dd4af03bb5f00c4cdf09895b7c47061752ed65b7cb4088312b22a329c5212a1b15f660ad0f99399b8d889cc682a0e0f7495337910dd4f2f4b071d7da8ae9c80f943c17b80e15bb13f119d7d6bb6ce93b625d048cbdb3f1b1c0649f5494ae7b8b9b2e705c59d585af8691f63a7fc8365836fa4268148ac28d5e3304891536dbcdafb4cb803b8ab26161a3a5314d4dc33c0f6a68f9e8a91d5ab5c2e08d037942ae8deaf21d76312b3fc9f5779967f1602a31245232d402227137d4bafb0b1acc3592fef877ebc0164d9bd5b8f926d29f0b2bac5d7dcfe317cf385a33142356fd9f3a740680870927f858cd763e8033bb057eebb7e2a752ca17ec1e8dc74b1b243a9c1b3e8aeef0aab388e718958c6049a4189f9dbb2faacee763807fe422c3a03f43e2e538de985b907d2668f39642b509bc777267f1c6deec8a475cdf6e833fc16cbb5be47687d7037e2b72446cf005200804af69b056a8f8cceee73cfa600d3b153c1f56f28d7c73c62c13fbdac36aa56efd1c2aa837408263ed8ef7aecb65c3281c24ee67c8d4f4d3b2677ec8fa14f78ddbbd7006bb84f8abefa937d8587339e7bad1dbe29d7e67e974b6687f432a3982d6dba25d04e1ff335c1c1544591f4b530a7e3a44984de50275f7119f9381b8d29bf4aa769e1ca27c6bf9294df61c657252f67cab4b35b6ba8978d660cda43c6282378774e0a879348625de6d7321113573bd1881f99d8b267f0b89782c3dc73d7f3209f2b58dbe473591b7b745f437e43c62f351d78bef44078a90f138f74c98dd0979d197de99a04d2d85b3f16e4dbdf753a1c8e163799db670adb6f0a2a1c6f3345662d7ed5997cf38e2613934b48c093d5848ea876c1da3a572d1aa9604b46b428aea181fc6d9f40cd50039573f6ba7ae69cf247c3a0846133552ed674563d547f23443fe2310af075d60b6f2c4ebcfec6d509126e203f8073664ac99d5dbe9f798fee2f45b2753c0f45744e6746232998e8d011b458c420408c659e807ad5958598a5c95c48a7e686c611547f90aea1aa2072879a3b55ff1b0c1dc0b908f33cea5a6a8acec211f0206b2dd10782842faf14d5907c37bba093e2b9daf3017b0cf262ce8f9ac55e3c46eea347239025a2e3ddee8cd8d9e79382464d6f3c55d3648bcc4fd7625985c502180ce3599291a8e4e90e8d908c2833449305a96d67e1484881a9be6d93f9f22bd46163dfebab0a8cd54e1cc7d74ea7850a0f46e0aeec2520253a2456dda3741a9f1e0be90869f7a3ba67a260805bad185ccfb980557ec7d205cc8cb222a43f5c1060bd64abdec5fc0aa60d0171b6625117f56b643a3da3b943f6784619f1e9b7c7d3f3bb220d293866a116cab833297518bc7351542b8cbc3d9c26ab974f0c1adaf509abcfa4149b35c40e633c433808b2c530c4b486f8935f0c095cebf00d2da261439ac276faf8a661698c137286efa5c8d77b8d9961b3dc7675f48141d703ff2ecb02d397953f5a4b62477516c338fbed6961fa191064f50d281d3dc61eb6979fcab1b56ed5aa588961f7d7127b3eef81f19a7f3258345cc054fa8ac85e495b507a074fa4891133cbb40ca881a3582071dd50087dccbc34dff6d34e1b4abd239258d008fdad56229df9b2d0033cadc68abc811c17e59fb090208a301256eaa15fd4ccb6985ea40d1649ff864055732a1f95f0809d7cfd0adee027a17328143e8cb588d061461d63143670098cbb74883b73911653956e653ae20d5b385cfa5b5089bbe7dc7c030a244f65036977409e8b7db1ebf7325b0882e862ce4602003293d4e2b4cc13c302dff18606c823663ed82b5e4528ae44991bc7525cc6507dce09c79440793e59c19221f73f9f2273f5212db006d34584a93afe015d756a7d79b4e1dcdf73e678a91091442e7d2e8f4d6ad65d44d954918fea7a7f5cbc95c7a9c6e20cd123e5d9ab0dc97d8526a322217d31f6a0c2a2c26f8d5bc0d459e9030cf9c678c74e96b8ab3f661262f71f315ded6a1fbf02f49563be421fef3bacbd4f5229c39b88f2ae3876abd13aab2a87ddcb2430b8dcf75d1f66b9d189a722bfedb4490a95340609156fbf2d38e09749a044890cc90fbc5ab42358ac0a36c0abe9eaa884bd1fb3991695ad69804dab490eee944f974672078118990bb55c4b3f933c0da73412526e154c5f29ee726b1db094ed83de79ab091ef155cf72387a3ff17f7b4721875d93f0671763610b4d81965c3a4be96c140b959b29a472d875106752f711564b27bcdc2274267dbfb5b3dd20fcbe3161f65ac226e6827c505abb4cb51fc5480c40f9e0461fcad67181d607e30171351040c8c0317249e880e072c87e445e0bf416dec9843f597949876d9422a871cdb2b3c67af5baa23476e241a55af55035b48de72d0e55798d844c15dbefc0f227fd9cb4834ac1a09b5e912eb1d203c19a81ea85ef8f423ff74f0532f9bc9c6f46cf84cc33b02a656317d8d03a9803cea86f36e906adbbd89854a1560a6480c3b7bc1a9e487bfd6e746cfd90ca95c3ad3f44620398da81676c58fd73b7da5082af9943c8de058b29c125ee176fee2ddb218de56fe50ea699428131f348eacdbcb9e8f500c86e0883c5e96c0dd657b8fe35a58e1faf4c99f8725746ed28a52c55c89ce76cd3c42dcddb20f9cdf7d9a9a75cf35f863ff65c5e9c4e0eecfc2b394af9caa798eba46bbf99b2b7f85cc7b94d1f044591b33a8085b00fbeb9dfe3a8077c59f982bcbe46e23cdb36167c083e070e6a3e0e1812a2e8970617e1a5142a8835aab962dbdb568eb3b0997bc7ba4219d54e0de29bfa6728d92647c8177bc3420feb6d7aff1b5c8aca8695b1ee5b5e07a4d48d8abab16ae492a907b8e5368f286d261de4fe0defab27a8c978acae083e4d143da4c867f2ffad89a622b3a31d7cbcde5655c84655fb66de32b79e361b49f8d0b85b218ebbc8b4d9e54a09a85c43cfd371a29747fb48ee9042fe65ce23fa54586bc4b3d453fec28cf5f7889a76dc94a2aa30df81e6801e9df926202abe87df555e33b0c69e1834695dfd984f263b29f14b86e4ec84172f6f7d7592cf37d23908c86c902facf12ea5cf9d239f80c699baf8724ff4ea07ea63360a1e18aa0052cb4305e297968a0dd5d1c93f33c4691ddfcee8b244a9e5dd2d790a2b4819227afd323e26524a4a6e696f5b9af4a385be07b0275cae7b4f1fe691b0ca2816019dae36ef0debfb3492d1106518ba511a24805fd015a8140571a93dcb720277abc83f1532a8e6b0db1dec3f6bb44502ad23cc0d5a60567daafa5c0a2c3c5f1ca7c0a0a5b3dec7e2072e42a50405fe6e19684064d9a54304cef0fb9befb6e6734f6e14a95fcc2e7180d600c78c1d8cb33fd2299776b7a3c00bfc72e57ae69ce94b0832407b383d21495972c1325ec8d1375912ae9b466a5f99017a48bea000b16fd62ef39f4d5ae74abc76629b1fff441306bfad2e239d7fe1282991d37aa0d6cba2a48328969509edbee56f2817c22039efd8d375a535adcb1f6499a43a324fb490ae0b200689e105fa9cae3e403de73c5d280e24d5635f066245d80ac5f5206c6a5cb752e34300072245f249b7533d281ba1041c441fbc45564854720cc34eb4df66b743150c8d9ad60418717b3146ad9ee1e78af273743cadfef931fc35e3640e2c882a2a986f8fb364364741dcfff1ab175ac738aaa1267ab1f966ab86e35d37d5c8d88f5b18e9b0ebaaa12563d20e476af9faadb35a3abc0574328c26ffbca96d6c4b49b8c89ffac26fcb19bb555dab15c7bf109e1573bb63bb446c2d52b4ab8b05a34def9199362abc0f07336fea525dedceb146118ec9f9a8370e2bc0b5e49f2f0d1d170b988e4ede2883a86dbda8f212a8d402d37bfc61b0ca956ff9c2a082ec15ee6ca0056c911caf5349128928800f282b888c97dc20f53c2a7f42c7ecc868ae0cacd7a5685300aae4dc96aeb805e1e3ffd8e3962d2df178f7db7a33f333101394fa05308a4792fe8428b855cda54bd502da1247c5054e720795473bc9f565a0da2b949204aaa3d3e3afe515d00b78ba4d949b57e99693c04bca702443153f73d855b8c073d81fa75553c60518703679c6dda8b8bfa8b29135dd563f0e0cc43253258205774342da969e176b54bb91651357373ca43de655852876ffc5bb799fd2ec62814f75ed2301994baab22d82bb3f9e1de61ff8c9ad861ec79361f97605f39820500fdd1ae4e83732cc82d7e708ce6b63ffa3ca7b49ed5503d21287c26c945f1f197d146933d886f28d8bebeb156a5422d855001d65f90ab11fdf3ff0ae36d80fef698e7187ef89288e82067ebef0ade3233425fbef2b141f88e36023769fa4ccb53b9b9373dafb5f0edac0e3d8fcaab06a71f9218839d26f0d9432491b181536bf9a420687e9f1eb8e2bb6497d50430a214fb8284b6a23786d703663da3734ce4f8fdf328be86592f5e9033a47ccc45f3a6cd17a6bb3a14cf4e491fdd500a0701275d8019222051f0688bd929b8411781d3c81c1f8040a3e4aff90253db93676d6603b32b8ba98c6aedf33ac8d32c6ca726e9435cf8c32c4a12642d1253aa09bb7e271e5838ed306cc3d372e6e024ee63511ceb72b11f14c075723fb09034f076cd24b639707509d9f5485c909fad93ec9893673f31abbb1e36ba204a67d1ab1f261cc09bedfdb3c2e5b1b1bc99407ca7bb2db54278c2df76960a9888c97a821369954818b30475f390b114c874106aa0984b6da20acd776f28d9f910658e91615b20ece9ab2543bb7219a0c948a0e8d0f78f0448b66479d4ad2b68d933e19afae0cb9e3001140d5e7c48fddab88e9aadfd3e6964b358b2c019c08d7cc77afc7860809d43711ab2d2ad765457b9596c2010bfa90172d62d94158e93d4dca2a94050bb12e86ef94cd218d33fcf65b1725ab5fd91b126a947788d05dc4989d62463efc9e8afb49b8b463b03c73cfe406815cea30931ef8b09ec793d9a4ae820413e0e614995ba910613aada0611180c38b8b61ed5788397833c997eeb7741820c43daf0f473850779c473023bf616ec4d7d9fe1a0965b3d6eef260c0bb662c0d140f056b6f5525274a9ae3c43eaf804ba0730142c2c42d785a99d379ffa8e9280a9fa20417e66c7ad07ce38efd60a89230531050c2b15cdd2b8f85cab32358ffe7b8b3dcf543f964f1f072d8474f09844beba8d424f8f604aa57a8a403e1774f7904744005f722da5a66c51e943f04a1368ee1756fc036c9db26922a3fbe4303abbb9ccab2503aee089abbe6038b8185dc97a9cf3a48481df1664ed367a588567b367e7ac447e00788a7a8b8cf0b3af5f20ca2a4368683fd4870bc06caf76c9a231304d5dbcbf0e59a0fd091a355a691afebc68ef0d7a285b091ed353d21b4459929733feabc754895e41f825d7dc7432a22b7974caa0b1f7994bbd4c12301971eaf1eeb301bf8b3c3ad63708b9ceba8620685da2e8d7c8700a110e6876c74c93cc17df355285f77cbbce27a463485ab16da9cc0a2bf0312d7275fc52214453008f1bdfa594cd5134500115e1fd55101e9477d84987cce0caf34870971cd94e1f9afd310d56f6d543fa161276b8e19cc52d72020268fb66af0272ef2441f619f06331c1d048a59adbe47c49ad84b3c3de3f3ba17b7da6055202237387de4d70fde5b532e9bb78439538e70247faca8d92a18987e3f9fb51339890f50cbc21bf2866b7c0c9f0f999a6cd3e409751724a8f442a4cee4c147d22a5e05252a61755109243d7b7cba5c2a753c0e20d56a0171ce3e562e967374e0f14b41ec1ba8da5c771964998c1e7dd82d2c222a10f1b3309674e1377ead82cd62831d254cc53b8801d847d5bbc9a8e364de9099983a1d685df305b417ae6e9c832d5c4ef6dfa52f90dddb5f1e11105375bb032efef6251380c0d728d0f53204f2c27fe712891ee176b8eb2567c81c6b0368307bd44910a1fe1543c206631516649aa95d984d3c14723468aefa3996879a416c7b8833dd436bdb07b242d6aa3d2d4b44eb9ab3f94c2fab8328de0917d7d46e322949fbf014aa32525bfd833c8c6008933d8f8a39dd1edf219cab7ffc4f3295b8f63e29f468e3d0297fbe66aa91424bd0f02c5b7d1e529b0f64eefc77bc086318d73459af3608dc2e7fe72c4a226b47029394f623e858ef29dd7ebf1e0bc1e286b4e8d79c275b46b4a728daeac9a8d09d57e790f01e37933451011757d880cf28d87b50cda2c3e28df6","title":"实现 Trie (前缀树","link":"https://leetcode-cn.com/problems/implement-trie-prefix-tree","question_id":208,"issue_number":76},"74":{"day":74,"pres":["哈希表","Trie","DFS"],"tags":["前缀树"],"whys":null,"difficulty":"- 中等","description":"实现一个 MapSum 类里的两个方法,insert 和 sum。\n\n对于方法 insert,你将得到一对(字符串,整数)的键值对。字符串表示键,整数表示值。如果键已经存在,那么原来的键值对将被替代成新的键值对。\n\n对于方法 sum,你将得到一个表示前缀的字符串,你需要返回所有以该前缀开头的键的值的总和。\n\n示例 1:\n\n输入: insert(\"apple\", 3), 输出: Null\n输入: sum(\"ap\"), 输出: 3\n输入: insert(\"app\", 2), 输出: Null\n输入: sum(\"ap\"), 输出: 5","content":"096221c37c5f85fac03c87f9e42ff6164f863d84cd9d3ffd50693f586f594225578280276ec8fe003803b457ee1471d664e68a0352afd90738fb28a96b0579fd0ab8838e1d261976e0ce4579691b9d8eb33e9b09484d857cf73dfc2660576408b0cf48d581335bdfacdec8fb7114407abd53a2fabf911344a70f344ba46ee044ff913a2a46474c4759ad718c4cc707b76a5a09856724187acdf2157bd5a7f22771740f24f04c61ebe6c42dbdaf185558a34443567a341260ab3fea744019a1b09e171b815603974c4073e6ad837c3d72b41220d9d0e80bea4d56e9b423520b9aded6d1914670e0293a6236bee4c6dd93304f34fbed68c188cab55cffa5978b623c8e04486e10ba498ea49fc50ab4d0f40e4d63ea74ed77d1121641d2201e987399f12a039e560b4d8305fa1801e82b5da3ca193090ec55222f17a2e61de276fe4d6ae1cb04a8f9a74f189e110d8756d3a6c2b8bbb68cd44e912ad299362c4b9ed4df9c2f9451f312b1cfafaf555f8c50e9562477c77fa5dd5b73e53fb2cedd1327e70635cdbc513094c6302770d908389e3202f79bb962b8817906db57586759f7b02c1f5d40e72d958f274ecde9ba07daf48ec8fd3aef6d221d4bbb7e45a387bd10b6feeb2aa06e55893d416f676f2307d56dab93decef2be3ed5ff271b7fda69eb5f36169acd1e8baed46617252a8ea8bc9e0ab2c82e8bcc1ce962f0c45be6c459086c78a363cb1b8647feb0e3ed181883c0effd377efb772bdfcbaae1b9ca46bdd1f6949180c1604f08a189bc952919515b5e27c56daed462352341ce6bb2c81e19eafbc1a0b848307b4b5e5dbab1bffe45f44d1cb021c3d64f728bc372069ee91b0094f8ae95fae8ac3ea1d7545ef1b1bed7a6bff5ab6f389070156e7f4c2e4c1ba5c008b1dbb541187cfc53fcd4d767192ccc68a66db6428ae417b1d3cf55e9522cd813493ab5adfbef12532e1ef657179f31ebcba2b02db224a1c757e1678992181933a13937768ad6412ebc8bd77708ea9e198fe61c0a81f04908ef5b4aaa51c3d28fa24951050b112b229ac42a755fa12a92000b0a91d3186a61f042a4d9b17e469630ac106488851ce324a241543ae70cb02c4fef154b75b78744fee422bef29cda22db5fd10dee6b56c74e4489c11682fecf0b5c74dd287d47006dfc8cf19bde731f1ceff2aa376f8a06c3592f09ef977c0edf3688f2dd27d646fbe28fdcc6eecbd39376804f99b881168bf7e1b507e33519dc03b665dc7a8c801ea44b118e3e9775d08f0cbc9bde1f35f96f2c0c4dda1827dcbdccfa5565bfb6f4ae08e7b36c01b859e1573bddda0feac0de328c0656dde1d999a6188f2f25a155f8120d8828f7f8197c54b0b4d4c699f18dbfc90317ebfccb88da42864e36d6dd18b8868211f38f94d0a3316f83e738becb6db9d6c229456ab4f2433991dd40649fa994a43775deba3fe23fd414eb67ff5222787883020be7c36dcf3a9192701958d4481587477f8ad07f30abb34a0e3155eadee7dc9afec911895eedeee13c09a71eaa1d46bbc56498125ab4fdf80b8a346b5154de4459498c1a2d8dafc6799484bea9371d72b5db1a2df68559f1e0be14d78bb8329a3a9167037f5ff8dcaf34fd191a091946d5d2b6ec18d0a0d8156f438e45ab7180e5fa99601bbb1f4b92055c70141a210fdae81e6c452febf08ce23ae74dc1884c74571b07d6bd957eaaa6a7b53fff4a884c737fc71e4ee409160caf07c5c77e9401742d0cdc489950e4e4f04140e7156dd9c5e8a6c1b93435ba769335aec280ed414b659c72366c8772e38087024ce4dd640af6f670d9b5a85848e54149623c7dce84fbae6e2d5924245210326c926664b501f929376c2a9883ec005e4a1b45b4e5fd717f77fba8e41ba336ce0c4a669b85c99b64093fc26a688a39ce64f1717ed1f0003eaaaae1c780c01363a22ab2c5718c251e7cc1dae738924b8649c1e41987b919ac6c4a329efb49bca40f284e6a04c608c4698869b9005b84f33a5b29132ff6c463088412a929bf41d4ac8b2f1e2effbf7cf24f390fed31380ee45220d127963d5bc155646dbf8b0fb081f0bb3ebf2506c1d739ce03d711ebc2ba21f0905f36560f044092c89d3f5a293c3ea5e8a1c3771690f37cce3a750479ccd3ecaa43ffc20c28449c21cdd172503bb8caa748e725a857bcfbbf509e912dcd6f05ddaf7f2b8c0981dc19e0536d520704938fd23ae502f10050eca8a6619695c4b3fbb7a8cfa76da33e021df954d317a93c826179365061634da5a2fd5d5285e0fa1e8884982d108a1751fd68732c4a8b2bdd2c3b834974cc346dfa6559f39dfc190007666749ade741ed937010d5fd281ca94ab74b0e6d632656e846cae962b2c8e5924eb551e6773a3c8231d11b8476ec62408d596845a6f9ee7e8522dca9e3fd28c62ff2f537694fed12c32e0c2d28c33e31af93212fff9afc911a8367d28b73166b641385129d977239cf446d859c57a1ef0b29474ed4ffea37b91439afbd997e03008296012678b46fb92dc4c383eb3640c11ede4514a5fc1851f259e0e0f354741a98042ea5525f5c15bf58c4ad991b0e24f955560a7f4b4475ca820f77f09c6bd1dcd56bd616cc05fdc530f5e216894655adb8d997a50a99e29da43471c0f8a91df5b0f26c85ec7e02c14fb3096cc99a712f37837b05f868ac3e776c324c112565fb2d3a2c27f4e17ff1909cafb49d77b0d9eaeea4840927fea0d384e933bc4e4c40b74b7f842c1744f9f9a525efa1714054b4edae6cfc92122a6aea80725340b8685cd827515c27340e1ab684aa9d30fd723dd1a7f8731d7651276b09880c9ef91d73f798fcb2108d230a8ff2eaf2d5cdce0d59279c8962106ab59d7db129ee1f64bd4470043b9d83c68ebd36c0b379d86c82528460fb4ef07968775c40d3e6b2aae0668a0387d87895b532772c50b2299bcd15ba1c4856d4549f0f6cced5e4980f2f518ec967761e57d475331e5e1a3de9e1ecae9ad97de7e9bad7632345c24483d22339790ed1d37772405950602989a4840b972825c853ca0773d2ea809ccdc60f293a45b12b0ac5d0fbac6f2ee6204a05807ca9a8078b631ee10f0396fe4258de0667a24d751904b783da2cf438874e2ae164eb70d22241e82e65fcc4f3f795a1d01424060bec3077e12d0e706633cd72ce497acd70d6c8813f5594062391d227b2a114d88950f4a1f7bb4e852c01cd1193772a6422e1206c3a93d6ae5db33f40ec0d8273538597a99131052b98b5d5e5982afe7d09a58ffac3825ce26af4edcfb3b3ffff3023d4521c07f758a714d597abf36162c7ccc62f37638c2df00053f4da4383091f1953fa16767f1f12e1ac961aa5ab6682b1cdd68921e74badcb2ea0e6720178a82b44f75c87af9d555f81d4a2e21edc6980cd3e8c280e2354e7629ed05319601fd13c41e9c3d3e21f2ea0b02002b52ac7f3ad094070491bac52e9374fc2eaad3812859a108671b89ba2df5e4d838ab29270df725cca48057a1a87c6b14fed56ea9c1b50acfcdeef8e9ea767aaa69bf3a4cbffa0f6bf482fa7942838d7241a06bfdc2fc9bc297b6da33a83ac0f2ee4fcd720cce81c3fd937de5c1580fea2aab252530e97a160f9772b469a804ead0ff5b67219c3f1134103100a37a7eda2609db8afd9fb97a6abc4a5da1dcb8465817a4964bf19702473c0df71c9169a49a8efddd907cc242e00bfd69ade30042092cb41ee19aeb6162c12f87d005de55f8b31e1fd7894dd362996f1e06683c73bbe7a42910ab79b63fa8c7350be7abbf0c259b39ca4099dee02501c526c0c6d11229507d76fd39af4a03972ce60d72b5aa9dbc35a2911acd8356caca1aad877826df39b7296a9b04022d8076e693d3645471177b933acea993fb4ca2a6b2420c4ee8cb948226efe2a9d6d5fc850ebe70e42535b6b4a411005dcb3d7d26aca90bae0e1613bdb946d7b4b45a312880fcfcf1de76dc3f91ab4973116edb66b254a688b2ef662119b711681b2a6cccd337b07d66dc8b7e7cc5e38c843c173a8f436a35674702de7a900d6b247c788063b13b03b50dbd040fd0048567da3445d4751bb5432cec8b986d65ba220947310752efca595c31a21343945e078c8d2e7d29b8ff5937f344e6bc69ab880d167a764c06dded916f323783bc4956fc4bb463bc354c8b229955211e4cbbdec9cd4ab1e2e316bb82335f166cc12b26c60ac620ff4d2211975d8aa8680bc9ddaa568474f5f07c07e714a9858436f445228e6fa9c9df901a434d4e146b17154ca2e5aa8c1d88838d16e8c876a651c1b49e53e60cdb8b9b2e755908c515ffd670a64a7f4c77e8872e169d51b8256ade9324ec24b289184b240ec7d92fd675a137e4d78fea34c89b8efdbe1f5edd4a755064e8e58947ead93ff21ca6342feb1e14c53967f1602a3122c6d225b3966577d5fbeb0a1e38b0b3fb0c663fd1d37c6aa57c28a7d35f2e6ba888c82f05277f88ca36a681f6fdbf1a56a680870927f858c9e76ad4729fb48f1fa69622160917ecde3c970b0ae45e3a3d8bacfbb02a674c87cc011d446b5159cb79eb0e9eca2285d55ba4b361003f43e2e538de985bb05d018ca74342513d38e3b0b630a66c7d7b22c82b5f73dfc339ff4b91a27702478e6b00d149b45126fd74a82c94c2fe1c390ff2296f82aaefe0185ef6f7b83951662c13fe9e97bfa56e883c2b69e611c6520deea7a94f31249ca8717e83fc70c1d70727fa586a14278dab49f393592788aedbfdf3b8bd57c8c05871dbe29d7e67e971f6585f63ca39f786aa0259a011bf663f0eb544591f4e81a8de3a44984c7436550705ab73e01d960a21fa42ed6db7bccb99cd8cb61c65f765d6ecaef99716ba8978d660cda43b27a6a7356450bccd0546e5cf2856a5f3a5b3cf89328b3ace02eb5d6d8c6869235aff328d6650cdbad73441b6b6f11453a1ac662671671b3e94077a408189f6e84cab0d49c6f5ce09a5ff8f25b3f16e4dbdf757453ca533980cf2261c07f092e1227660c3b432c90d707a3dc6355945c02c6d5d799bab22a88d8275a3c37c2673646a971eba9d4e364d7388e180bc636bafc76e6cbbd1587a99e4b61107a8326183d44660b6c15e2310af075d60b6f5e0be8ffd1d60a123a666b91767344dd9a46b6db6299a01d5be06432031d2e5f66427f62cce09918b455c4271bdf41d5ef7a82dad7dcbfc90f41dfe686c611547f90aea1e237728b98304fbb1f105ad8d645a335f1706a8acec04ed8206b2dd107d2d16de313d9d47079f2a084e1a69489017d06c8078aca9a8b117803e7e5535bba66eae394a08c8f96fc99cc6c1e3a7155ce649bd765fd6259cc83025b44e3519297a8a5d35c8a9aa6227942db18e53335ea4916eea7fd25dab5b679912f6af5ebab0a8cd51c5993821ce98525080abbbfc6243d2574711a91aa5e1a9f1e45a64c2cf7beba29ed24c555ee0340cefdd90d30f8d71eb9f2bb398e155c1060bd36ee8a90fc01f2161c7bf33f4715a02e30746ce7ec679f371357a5b6d881d3a0ef3e75576b11e842d2e2293a780af573424a2f99a665e16ec8d221435e9ff55281e7a616b135c40e633c0a765cc0c32bc4a89cb0931945c1892b72dbf266b395520cbd667c55e6916ad49951294f2454d3690c925218baaf714ddb41fe13bb03f1147a78af8ac1f0baa03c8471ada82761aa4b2170f5104878798365cb97dc82f8e37edebf53921b8f92543266f581a2ce594a1171328f10bf82c1444025232a4255a4cb5e7c879e0ca881e017753f8952177ff6a71edff6d34e1b4af36cd61dd015beb65a229fa5a5d14c758788cfeb816845acda989036cf084840def475849ef3de17fc173c14d5864055737735c8dac0dd75912097a2e26b91baa9d5072f405a8da5d59eec753667f4f33a5598e958a1c750eac8fc5faf9ea2da35c7ea1e5111418eeec2cc9cedc9855d34ccc238b12e739f9db5202db607c7efa6e92d2a87da841d46fd007475c048e9b0bb2df4b1dfae61d823dd68e0cb2681ee2fea0347b3fbc3d8565afb52d04da9a358f99002e909830b1fbcc7271016e38a91bfe0da33e506fd54f504cdddf9da1aff80101c2bcc19a981ea6422113c476f64606d9360a6223d458c1df011c15cb2bacef72d641e132cb305e8067ffe06ada03d359052a2642a4496efb8977fefec923888837f87695f9e7bb9c262e52752dffe29f09e84a029c6db341fd23ed96d5c21b2ae401a77eba7a915071d4ac62d25658ff144b4d3e181e420e29267e35faf52879404f92f924dbcb855c3eb0c3e1f1538191cd069609d527ee541956eeed6655d8e56c99ce50ead1ad248762fb848c0c41d988e859f80fa82a13a9fb5902a50377449d5158fe111c121d6bfe1f370ff8dcced7891172c8899f5a4a4a60f36f7f4991c027b3096a66ae56ad61b165050d9424b263db1b45d39262695d1fc9965fcd76366fc70c819e0ff353515ef0ab535c5064304ecbb4d00e6db35ec8a57c4066978026acef1315846e28aca72c27e645410f5448d9aca334879699d61d11ba867ccbaf38e50bcf4a260638d6bf108bc156bcbcfa1642d056e908c4515c9f2c7e53ce7d39ad74fc7bc9874da61e8be51cd8080b89dae980970e3296a73b7e1b66f4cc0aecc33b02a057c01d284218917ceed7c65fe08b0ac8bb263a1105f2ac397fef31dd0142cfd707416bc9285cc86fe6705640899ffce797652a131f2d8739985f50c9ade0dc8668f76fc587eee6ad46f8eaa74a11aa6d2738178f354a3c0f9e8e7f70ac26c2788b0e9775fda08e6a57bfee274e31fdce3585746ed28eb6311c4dafa64c9ce24d8ae20cc9f919dfbbf38a214c334bd4b438f526ff6bb267544bd99c597a8d976bf99b2adff45ceab4d421f6fbbbc308aafb005becb9ab7fd55664fb49bf4fd5ae335cd21537b207503193d7d11161287bcd6011eb5e0512d9d609efc7f8fdd528db3979f73d0805e5dc70f50b1b1842f6dd9610e9e5235c3125dae7f76ea457697c0d2b0acff075c02edc39a8cadb65fe88af059a9e8319411132e5eed9e52aaf833fdfa63ddc6477101517cea954df2f5a2a3dd7ffab34368afc5471aca5e4994688d66f6cc62483eb184f05b68cbb0cdf4d9fe5608b25c569fd571a98e11b407f59152bb68d36ce258677986e1901cfc8ac0b5f7889a3093c6a2a273cde59fd41edef969662aee81df5e4765ef87893229690bbc9d120c3328bf04c2a197c73e63227f3e8fc912d36b0a893dc33ee58e6bbee59d6dd0c4deb38df83c00b0ff29eb5264631e51b97e52985401e4818cb24ccdd6d9725bba664fbbc9a8b92bda8fad065343640c5c3850d7727e1243535f2a65675fc9f3e6bcbc4ee84941a5711b5fe691b09a7d544dd4ed6a8a5febf37da8d7596976e8154f3f8a559840e41b3b3ab10c95164523e3c074417dadedf2816af84705af6f02ad23cc02556093d517769da1e1c4ac7bf7cee3ed8ec0caf52c2f7dab4955ea2d187a654adfe9024b8fb1a8d9a7eab173527314e70a80623ee58400cfcd48d8fc3fd46a8d76f4eb8947ea3eb16cb4cfe9154654262b6c6f3a635972c13203e28c783675d4d8172b588f4c5e14b4ad49a601d439f4b2474bfb5ed53e23c97edf1e134ad1ef6a61d678ce7c4cc5c8508a869ee0e89741a6bf09edbee560221d900c23f3ded434bd39bade1174858627604ff5dbef5f361f8bba10ef85fc614065b94418260e2e876375066245ac08d9f2642c2907d41cb74353526f4d814faa55276f06f1181c5556901e1f561017488646bdc44cb743615e99f5924b5c347b6a09eace88b4d9e56e6f3bb695d366b367a7644762dc23659e27c2fa7e300e4dd2e2fbb4265a8e38b6f73961b0bf66bddbea4a2d9acfc4d51b4daef9b7eefa6131f87f6d6af9faadb35a3abc71267b800eb0f0b8282b4b47e68084f9c969957dea050fee538ee71edd1b7dbb02e70d70701db9ea9644f37fbdc88d363fc3434b3a45ea525dedceb14611c787ada87e406f85bfa1d67a1e531a1b84e563c50283a86dbda8f212a8d402873ef877b0df946bb191b3c4e611e35bad196d9a3f82080c04cd6ecd0429269e968a9a2db9645a7f5886a5f0248478fe9ee0061c44efb1ffa784b805e1e3ffd8e3c46879a42ae9db3376ee6e001393e60720ea24dcbac1709864cda54bd5028a400e9319303707d60b7a9aa66584857c98af3ca1b497b898cf41825e3da167949b1ea79fb9a9049f3e70571f3a7c62916452a50c883c99dd49d495b192e6232d2b1a6f3d0c7cbd75b2b0f1a854f888a4149fb8e5c51d0a3ed093bf3045ef86a7e644e775ee06d17a3fb1cbf57ad0d6e9279a3e5fed2301994baab259a4a033b53ced1ec6b4a7955693df77e47c1ff3980a500fdd1ae4e83770c582c9a241c13e7ee3d4c4330da1307b961b879946945f1f6d2f5d2c5d97c2b785cba5e43f091a669d0d000065b80abc1fd83db8e0528c0ff2699e6aadef89288e824f38bef8acb32e692efaea2302218fad396660a7facc932c86834fdbbf5c348485dbd8fcaab06a71f9218839d26f0d942b1a7157177fa1c40a098ae1d9e7db45f311004b690a214fb8284b6a75640b702b63ca2c1ece4fdd9a66deba2bcf8fe41d7314e6a1505437bb3a41","title":"677. 键值映射","link":"https://leetcode-cn.com/problems/map-sum-pairs","question_id":677,"issue_number":77},"75":{"day":75,"pres":["字符串匹配","Trie"],"tags":["前缀树"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个较长字符串 big 和一个包含较短字符串的数组 smalls,设计一个方法,根据 smalls 中的每一个较短字符串,对 big 进行搜索。输出 smalls 中的字符串在 big 里出现的所有位置 positions,其中 positions[i]为 smalls[i]出现的所有位置。\n\n示例:\n\n输入:\nbig = \"mississippi\"\nsmalls = [\"is\",\"ppi\",\"hi\",\"sis\",\"i\",\"ssippi\"]\n输出: [[1,4],[8],[],[3],[1,4,7,10],[5]]\n提示:\n\n0 <= len(big) <= 1000\n0 <= len(smalls[i]) <= 1000\nsmalls 的总字符数不会超过 100000。\n你可以认为 smalls 中没有重复字符串。\n所有出现的字符均为英文小写字母。\n```","content":"0961e8bb5b12c3efa0798f5f328c692d7297f600befb09b4097e4527731eec86933b242b61f6fd223609946bec12491a32dacd4f5adf9e13456cab79febbaa6175fa90e357154703f5a41667c0f7377723f06d95ceee439231bc31cde8a7a9c05a2c810a6eb8d43e3b3e0573afdcdbf273c3483d3207e0c57ff5b1833ee519a37f39a8eefec94f767ca560ada276a0722b7a62ea4a404576b948aebe6b22fc2144762909844c46e8215c66fa8576f2ec8a6d4e9f3d25781cb959835b39ac1b99b757927be2019673afd75169df44742db37394501a5e94e64259e9832b532f981b2938de50a2458bfe3322f4b9ec84f92d0a41e081ff48653d6ccd22414a08ebb453d3db97fb38b913204a6f49a8d0ba12537f67a404f20c83938e03e9d56dfa0c2badfc55c3b2d24f9a561703c92a4ba30ce5d2193f895b0516b4d51df642fc5a65e1cb2e6c0c6cd7f5689bb2cd02c5d8a298fac8b0821989428f9c699a9011006a9b2c83d03ced322d4768046fe3f018cbf707a27a15f7cdb13db764331b6126ac523a693092d41618e22c74e7091996f7d01819271cda852c65d9303378078288427370319c08d7d6121b9ffb16912033012924ba3d972a3b43b76f5da2bfacd569287bc356e29770a9b6a0de33295554b62156084b154bb8349646342cb24cbc2d1358f4e942f2a78c381a407286c9da829c51bb24d49f108536c3bbfc74c97b3366418a65f522689c1f324d4fdea74b4e060ab79926fbdb134727522f17a1391f2e52371f7ef9859d0b357873e997e9f395db02aa024af4f3e98062cbd1e0d794206c125e2eb7abc0f223c35a2155ab16c433814b9f427c9e91307dc2eb560ac6c877611b18093e24b06869f5887d6c7516170705366e1ba67309667f4c38a2ac3509a80c137fa59eeb0adf006311d2a4ea61d172e6199a057dcf18324d8741c4fd399a81fd095e222fa6c1f4a44382a713dc0222255cfa2496cabe5385ed3890113430b314f1d20038f34be6a4a81a1b5556cf66b54848c5e85b597caba4c59752525904ca9556106a6001c446b01b59a027f484c6b990ee10b6f322d155787a98bb51bd0dd521a1f155c27a20d384b08db8c5404aacb3e2f95e4ec60220ed061709079710d345c15fcc5ac1674985caca34375fd7bf9bb30f0b0f122e6921616e31515d1dffda89386c425dd9314f0e7b50d6a13dba2dd832837b44ebdb8fefc5e2dce77cf01486f9a603de132f7b7dcae3121aab5139804bbf1b6b52fda7872dfb0f15a59e59e38c82563a718295ab886c4742fdda9ee5ee89cebb8bd227afd56653c577803a0eb2831899a8cf49d2343d97e880cea872c91f73f36f771825b3ee99f3492272cef2ed82f1f2fce8d16f4bf997b88a8619bd0359e85efde29cdf4fcdfff1f2cb6154fcaa00ce8342f1a8db68226c0811282bdc9b5619f8bdefc01336ac975f841a9d6ac313ab6d6c1e69dd5d35b09746a8559af224093cb56a63e74a3becd50b52a5ee1c375b3ddfbebaeeca98fa6de772446017f9844ae63d6665d1937ed45c60dba1df4be02d083070ab2c7a01f30e6ee5948f099ae0f3be4885f4704b6f64c1e807c54638c6280675df5f6cb6387d632f8cc0c764f96c771d581be198d0e95fb5a1836a441cfc7ad904b8afabb308729a77339f652e64647b3e5b9ad97db8a8b839130b0ab5e469c7896775543a09db82907bb19b4b15bdfc6da14c7377bb4767a375da75aa6d9ed21d08d9eee2e81a1e813299cea02c46af7965bfabcfcdb98d4c698b39cd1cfa8a82a70a7f02d6615932a019bdbefd636e8e8e58618afc3ca9a3c42451a5277d14424284d0f8d118191c7d203d740f1af54b1a04a73d885c021bfadcd4640e4373179aadb9581d2ed41323a42bffa60a113992c3a6a5f4e5966ba0ddd167e226b779f43d88327ad78e858c848b4d5dca4483baaf73b5ce9346b4d6526f9115a26b0bf157f93da771477d1449873f79f0bed791810ecf548528870b8a9f1c58b89ec8d4ea2d45a3d115f063ee70a850753bf3b4b93917cd36d4b5ca02fcbde947da8e6ae142cfb559dfa2d85408ed0f003145b471ddc82d17b234a41fc5175f2eab6064bcf9e89acccf3f0e25b09f99e9be64166a3284994f0401ba753c173844614b65df530ad7d5ca12e25d02cdc5d6454830c47ff97fd56c0a7ec5205697696f718fe63a6806c7554e994c94c7dcc08d094665ae20861a89bf4e2679be536c0d7c345e201016e52985c4a5769253a661aa28a7eea7d6bbcfc3645635b3a401282888416509ca9712e68973b781ecdb19e44180ff1be9b054bea44ffa9c5c183ae6ef9b9dac8e1c5e843366f8ce4975c3c62aab45a480cea59ada20dc4174bb4a580c5c887b9a7bb6ebd145dc578737f03f97cf6380e1cc78713397d643b12c2928b514966d4797a0cd55dd32c398acfd51d4f7244dbbeb0e796d4fc70ebb424fa3c8fccbb16cb23fbd72699706e7797091681193d5bfcc404c2cc639f8900f7b25d7c4ba261df5d9be0dd03fe73e0a4837a39f379a24d9cf0565030fa010a5e06ae6d3d504a8e94196d98af23aed3d2474e0c6e21ac3acc2edffbbe5006188856f12b40e1976bf5ecd789b222afe4a34f33fea93220d1e1c1acc6c2c0932eeec1b5d2dc4007969a00208c7de51eb7589dd5219fbe9a12bb3f51aed5ad3f3e5e1cbf2b1f11ec6fad1e962309b7e0f70386174fa727e2d010667bcb83b0f564172a93380a9874ea0ed43e2deee6d2e04ab0601d384cc2e2934ca7c6bd9eefc061190b4c742ead134e08ef4fab0d18d385b4728c006bc90674577dedbdff1e2e4904d962a3eee913b4b122d9e79b8d77160113458020ac0a6fa1d54ae8ddf34b713fe6dab1fa025c9b6b2ab5801784a25d54b7ebd8c05ed4f41bc04d85eb9ee83f621bc7d1d03ca8b3e8b416dd753118dede6a922e04f0bd644632c0fcfbb19ada8533dce866d2a5285e388cd965dcc67dfa3fcd2a7aabfdecfd7cc08687e5465ceea00fc19fef471495265b3d11d387719215855257b4bdf3a2c9e06b64a6145b4580d9caec60030184487200ad7e2fb87472dc4098ce765e315c67a950343e679729e46a7c972097193416a1d06bfa8d921fe3aa76c2ae172ea64f4214ae82e77d9080968412f7f1f200105fc1a74c41a0d694b32f85ecd7e6c0c856a60349a9343b0efd1e34ccda04587a21b4a733ec650ce7337867aa115725070a10c28a9505553f2bb1948ee3db9717d999d89b58ba440e594b688ad4da6454ad48bba9fbb2f86507e02410774b6d0597cd23a4f1083f526d25b236cb94718b5ff8facbd639835f1166ff7d9568225041e6ff51b7346190fd7a1930ca89241474c3e531640965ac09c03eb975c60149e7d29cd3cfdb9e90a420b49770ada8063de903ae4622a462fd502c1f3e4aabed0506b4f8a96dda87934ccec1856e3298095a16920662c4691d55afe8b4e43c5582feaea04e83189f8fbde1b04acd73e60e60ea599a77d4f232318cfbf62e248c09c197da2dbeaee98a2a6579ea4bdd960030d21285dd697efeb3c78a724536a81b86ff8c5a3f34a893daa87bfe603b99ea6182e8bcd4a37de5c1592e3471c1d98e744c9823bbf6e81a9cda80af62e91eb5e71a1d88af3c2ec898fec7469f77b726b85c4fbcd9083fbe741919e39fc693833b973101a3292d10ebb3d0ee05e365c4369a21f56649e9ff7e2435820d2ac4aba7caceb462177bf544b1add22d43c8b985be7831267dcf7b72d959d52b9fd8b0870fd9c0fa5aceac553847d95e705dd9f11ad6c32055309534d276e0c379a04de6fd3b2f4bc2db40cab58fdefa9dec99fe8c213445f1c9cf9fcc528d86d92f64de8f7bc2571d0620e495f4c5b304a5ce271828fd226ebb035169cf1593b657c33100f4eea15b29707a72a50b5120d46270e537d58c6d5acd106bf96d9a1c90d70e8d90b571217877af61fa194228220f69263a9ff6420b4fc60400c4ae75ee4c4b56aaddfe6a3faa2ce400b0f9c1ce0e399f03a6ac72b8176c1a83ecb3966194be6c060fdda2ec7d7681962ed0f18a7ce11983636034ddc2d4136099e328242061950ae38e409bd3394aee77a737526c5d75f40d27b88401e1340664f7d3f85d1f8d1b6c3ec98cc603eb938429fe1189d4c3829cb907a92e76c36ca429b8f66bc56499e85dac6c7fe811e7e642980383fb441cd028c11499e2d16bab45f50069deb8496b6d9e0b23a63404874d77a3e4f98703d170d1c6f9d879cceb412a737d3e85bea153b9d2e2efa889de677dc65d08e3f4f011b1aa82206abebb7fea24b829a550d94675c2beeb0c737c62eab3b44bb4cc7780bb9a574c7f67b4e0cb56b92348126161a7e1652d4a320c0ebbbc788bbcdc3a9553a1fb1609478ad8daf3cd72d55e6fed91e2ac204587fb8382c6d64146b665f3457a5e2e0aad85f2fe2c637fd113796ef47ccda3835b5a9f2c98e92f9317cf385a33142356fdbf1a56a3a4d23e936f88cca30e30a2abe64f3a66b730465867894b3ba32eedd4ba0eb99e8aeef0ae072c8b45b8c53c1793f81aa9efebca0ee21311ae8437f5e57f4772e4e8df985a005994c9339376611d78b24417d0a66fbc8bf6e8cbfb477a778cbfcf013277d247fa7b77014cf0b0f6fd21efec8482bc3c087c163e2ef00cdf71aafc56f7b83951662c13ffbe364a21fbbd796bad32c1236688ca677c6aa5c70c88540aa39c10a1b592e7ef78fe84473d4aeb26e2eb8528aedbfdf3b8bd57cd141c859fb2983ab2e9756209ae97db4cb070ef42587014db72febc1544591b2fa62afaaea1d84dd163a1c7019ac77058d7cf108a061abc36ccbb08f90933a9819750e6cc3ef995b6ba8978d660cda43c6282336380a4f86dfc4b3bc6708cf9ad49cb7370dca162924b62712405cd6863fbbba785891fc1d51dc9fbfc4bc9ea11006c632355337fab14e3be1465fcb268c8aeddc812907e7d94c9b941f6d53aaa09d3c335d891b789be87661de3344731c636f420a0763c89932a6c26a1af7040c859d96cbdbe622c1d127573c3083604b46b42eb9a2c0e433f4388e180bc636bafc76e6cbbd1587a99e4b67187ed6695669192d2f055dab7d4ea23098702d174ce6e8dcda0873736e75dd3b2e4a99930887841af6ee660bb221744a45201c2e032d0398e89957bc0c897054916fb98a28c6d3fddcbfc90f1cf5cc86c611547f90aea1b07226deca2c0aac22171fdc9d41b741e41b2ecec6891ae9206b2dd10782842faf5a9ad4396a8ca0c0a7f59cfd53341e8c48ce8f9ac55e3c46e1ea08b90fd22f582a641623512e435ed9dda8a7f1f9648bcc4fd76259ccca4c0f3f9e6ca0c5fae8f30ededf86286a079202b1527bd97d2fb083946d93f9f22bd4616399a4f902c59b4859da8201e9956c550afaebda256e2521241fd6a87d41b53445a64c2cf7beba29ed24c555bc1541f8b4af102dbcdf08e6a6fb6cf0440e5533c67f9384c3e71ee34b4748e8463858a025303a23a3a969dc78465fbefffac89df4ef295f606b01e85982fa6070390cf5277a4f13c4b920db7bd5df540c50d1fe0081cda616b135c40e633c433808c0806491b48dffe85f377242deb54268f06d43e1ca45adbfb47a33821a20e2eff180927bd9cb28abf6083db5d5418457be7ccd1487958e251219735b2b3c8471ada87a4b804b5522bc05747e6b874af397c985f8eb3ac5b44ecc63f19a276634bccfe5ce7a570a7050c01db4dec80d5f0652006855a4cb5e7c879e0cc6cee71d202590020a62e6ee7b90a2c864314af36cd61dd015fdb85c3cd3beaecb4c2187db8aac9a1c5ee583f6883dd837541ae6a118d0d6fbd70cfc5e3742f6dd6a7f732a1f95f0809d35bb0a9da86ea934285927ccf68ed66947416512046b028cba34d15932c377079d276c3aef0d5c795b875b4dc6fefddc620103680e29502c5d409e8b7db1ebf7325b0882bc61d10c044866dfdeffb5c766d705c4f9cc17c52c4f1cc45e3d4c28a3449e5ac02f0e9e0466d910c7b440793e5f98db4ebe70ca6c27f53f2da02c9305c4d75dc472401671746c753e2ebc15e26aac14b939376e38817a70de4a25905c9ed3a4342b12b2dcbabae5e257fb23e58de344c759fd69ec76216031adfd8dc5cf7aee22b8910187031bf9fb64c14edfc6f83f271235b84d7509e97445b946a0c026f752568c7ea2974f050389cbc9a0ef363ab1d13df90d86ded3243cdda4b3771f6cb9b1dbe218a5fbbf322cc33807040401ed6279d1c91be901875c9b40e857af3544ac45318eb1ffcfb3d6e404dfcc58d6f920cf03ab0817f5c642da5d03078118d54ee15c0570872c4ff67d051a490906486ea8262b1d9a94abcc8c79a34a51bf069b72383239fb3b7e4d3dc34993e50840630f444082ed462d78bd025170d6e620a43c9731551c11c3423c042ea5c71574603cf3a8b9824ffca3312fb91e875da5ff677a13ff11821fd51d6904bcee0f4caf9835dce107b753242d2137bf9b5b186cc887ca19af0e1c311fe104dadbd237353a518e7bc775946cc5e7aedc35f2f4f94a14a741f108ec4079d2c4ae2d274b6ca4b87a6880f1c1ec3afaa8acc24fcdbad707c576f8fc16848c9dffc7efa75422f14d0708cae1e5220d8ce2eb68f934411945978475cc5a9eed282bf83c8283ed981be4435f37c3d9bba454d70e78c96f7d21b192d6dfcae86c036203acf2f22e093da97ab7817a82afdf60d38d59d40fc122ff5069bc7c9d628ff83dbc07e8873f8150a11ae2d2d0f8baef5392237adb92ca6c5f9303edac7ba58e11b11fd4aa160346a428f66301969cb36c818b3ac5e12fc885d395ecb4318d179d6dfa0300c7005588996f7c44b099c2d6afa476a284c1b7f840cce56711522ef7f03097afe348ff87d6e4861c4f11d3e1fabe12aa79897316355b3e4609753e51040da7a492465bf0a3167e946feafc7f929307d3b3b8e71095ee1119820759aa9bae2f6dd9610e9e0070906914d32b2ea75b33ddc0cfbbb5d4744417bfa5dedee8f824a3cfa957eaa070c670472654abd00be3b127bf9c52f7ec477101517cea954df2f5ff89d270fae6132cee91021a9c1f0ab168c62ba6e662483eb184f05b3c8efd9dfad3ff573d9b5c05dad960e4c31fb00df4b143e331db70e35d5d74c3fab136aacb8caedd889a3093c6a2a23ade9bb58c1ec3f9796a2ab7d58713077093ecc53234695dfdd109263328bf538ae8db826a2e372f2cc6d82cdb3702cc6e843effd327a5c99b6d89c49f99f4b57d4cfca130ec506a745610fe2352903b6ab6c2c4c40d81839c7a28ee3406f58ea8bb28838eef143e6727441d6a31837a266f11070744796e5b85ebadb2a40fa72847e267464dccca9ab07d544dd4ed2cc50debfb34e683592076f5155f24d2179347ce507e63bf40d0580277abc87d5a7de4e6f9886aa33424a47428ad23cc02556093d5173fdba1e990e936fac0e5e994c98efc434b06e00c0ce46e503b372b8be14b428fbca8dee6ed85354f664da941cc3e3ee58400cfcd48d8fc3fd46a8d76f4eb8947b87be539e681e905047e112b222a6237222bc13f03f3f137593884d80a2b0cca010e1af7e500ea45867cbac90c4bee03d35c629b1f8b165a43d1e26a66977fb36766c5c8508a869ee0e8926087a423edbee560221dc24977a68c9a34e97cf7d33517d6f168320bf5c4ef0b7352dbb446aec9b53d407dfb6e053b0e7d9708134a6c09e916cbe4606d630e9d09c96900072245f21bf81c692806a14a59131fc8171f0d633d558608f89c18cc1a1501d0a1811f32717b3e4ca79e88a9d9b721206fadbff966b367a7271230d2246e882f92b33d645d4993b3b7aa711f897ffebf613afce205e5d5a60f63dd9b8cdd1256aeb0bce5f33c40d2556d6af9faadb35a3abc717b51e348b0f8ec6d661b49a5c8cdb5df7e8348d8285db61589fa479e1a72bd18f0506b774efdb0d40dfd7fa6ff903671960f07336fea525ded88fe1411cfcee3fc7e0a6f98edf4992f061d060bcd8a1abe4bfea621f8e6b546e0cf029970be2e9ac2943ff4dce3caa559aa17e94b28d444801f1a39cd4bb80d1c67d1f79dc736be23122b578dab96158478fe9ee0061c44efecd58d84fb50b3edbc94a6d77f25f8638ddb6733a33e0e50dcee635ef10edcbac170c54eb5e01f8050941215800b7f580795473b94df4ff0d735dd9126a7bddea0b2ac0fd62540a120d1cf39ac93ede2389e226d02583523eb44b8d073d845a7473fec515035362e898fecf1b8afb2927bc00267502690601a608c057d4c2194c2e56a2955b18531400f7620a222ee4f9f2e44e1c3ef7a95d2e665cd5111aa77499142d7a907dce976db73a95bbdc9e1994cda9b7af86d51a1b217501ec61aade82b32da8cd1b345dd7039fce6c5261df212588d1bce924d9d5f443357146933d886f28dc2a5bf152353209d05504131ec4fee51d63dbff44eb95be72087719af28978cfd61b7decb6a2f0666b34d2f26f1a6dc8ad7f4c04e2adcce77ecfc62194fb194f9693a6c398efe83e0ab05c8824d2250d9f62581d32453ba1d90a4fcbad8aa2c06ff311004b23012a5492284b6a232547703663da3734934f98d6359bba70b88fe41d7314bb8b0d7e77fb7a6bb3a111de99d9b49945af725275b444d677515755d8b580cf950b73413ac9c9f9651f7859f6c76b72fd667ecc342a28b3b48fdca6c852accd3a9bc30b3ad5679bdf3293e8720ad17172e59bf0ab27a0cdc4834989353b2e34790ee91211dfca307994034b5770af48511b541b9b1f2b9f540486901aca9918fcc83dd29f3130e071e9d0b763e80da66073e3eb65f612bfc895383d134749fa8f40d76991db0f0da62df76960efc7de97a06063cd1b81ca305d5f69591a4f964d74e32faeabda6aacdc76e396b5910658a05841b24780def70c3baa21db0c998a09860368c16e8b66479d4ad2b68d933e19e6e80cb1e20d365e96af8dc399d0c1a7ee9a8bc6b54b67ce7854ce46d7d71cc994c31323d43711ab7f6f8330173595d8d75942e1ea1a332191553ef06c44c42efb777baa6ec7b9d5cde737a73901cad8b903986d93d7f075f74c14ca04340daab8bf7d124567e092c309ad6713a4f207eb269578d5923f1d1134656743533aacf87314f0da22c67bf7e261a85c4516125f09ff0ad87c98bcdd21021d5df6eeea03e2648a93e6c4c438d5af967afbe8073e35804b791e08612a7e845463e2cf8efead89bfbde1ead0ce7e1452ab79c571b56e0c25bdd63e43799ddf793a6136bfc33a0df9ee67b68346fa79cdac5da0c1391996a760fa038fad5f734a57e38165427715541ad97fab6d0cfb36e782fd65d94844119f6d228701d83a39c50e93caaed3e3d3fc77c530c9b27ed14198c925b2137cc9a849ac006cb257aee12cace820661a5d678bb00ba841071c8879600d1250270885a7cfa839e9e315ce054db2bdf1cc8d4e8f3682317f226a249ad76a3f910c7f8b134272879f06970c4fe39a277c0c10567c373b5995107e1bd13c5471019b4b142c3e71600c10b5d2ac038215afb58a7ab5718b35059454a4fc16b1a6833250f10aceb6d45327292cb29952ae03d95194de1c485f229de148707a459c91196be828cf6aae06d47a3da9db71ae0ca97cb08a98bf312d3ecc83ff3e47ae55544f367a85b01199e300e6edd6bcc7717d6880d41a9db8aa9fabc355b9c26ae6830e4590448f1baf4debe61d476a3d0a0d926ca9cdd3f702fce3f736dc60ad579886a97370a5719304d5918ee156bbb1dba7a04ce12278ef755f40d3fbcb397141f86a4dd590ad92f8a4d1236c9b18f5d6ab657a4cc5920cccf3fe5c310a9fa15ce6b55637abfd11a5977f198a2345fabac70394015ebf317395d2d1861e1adf180a7d7e8e71b7c58395eddae1998e86fac18a3093fdf9e498f94da9839c6a774b2eac6275e188515cfe5e66608ca8aed85f24afb864a5e4eaf7866812b07f8c24ddcc763a52bf11d6e0f67ca651fe67930e733d6268a70d1d0c0eb7aac89041a5708f05a1002f7e080fa48ba41d8af2da22a2e1c995db1684e61031c2cd1c562ce77350dc9c5f04c768d73bb2a270afa43468c55dfcace1efc87a8eab39668fc501a6c13f6e2bc434a85c88f9c0e485ca3579d213490eacc8e18832ed4676d806b47cd6ae2d2e7069262a3dd3357d2471bed3213ed7dd7b311176fbf721a133549b090e9736a5c62d561352ae31cd1b7fac34d171394f88dc870942966fa4981a15e070c7eb7929aaf34532507b15a96117d98825a57e3b2c3df11b9e7e7bcd7838f06c091f0a0021c4ced4639377899859b63b4d4afca1f4b7bc9584732354f6f232b9b1fe057b0ea12b2452dbe23e365d00164af080ce1ed85a79c7a7cc2e2f6c92964218baafcbb80952ec3cb3ab14312f23f2561d3c63925b48460d27122419f954f290aca3ac91c7039ec3474d50918cf7aeb30fbf2ab6ec04777f575ec745c93dce18eaa3941259fe8686732fe13297e18bff393c98e7a40f19982243be1b05d7bde38dfa3609fe52989af0bb4b7db67ece11a77ffeb757edaa25f306e0273f3834ad54b97116f288b5b85eee5a678f09b0d8bee7478f2e45bdd6a5a0b750165b66af81fc92fd1feb8925eefe2db5c1","title":"面试题 17.17 多次搜索","link":"https://leetcode-cn.com/problems/multi-search-lcci","question_id":1000024,"issue_number":78},"76":{"day":76,"pres":null,"tags":["并查集"],"whys":null,"difficulty":"- 中等","description":"```\n有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。\n\n省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。\n\n给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。\n\n返回矩阵中 省份 的数量。\n\n示例 1:\n```\n\n![](https://p.ipic.vip/0aybb1.jpg)\n\n```\n\n输入:isConnected = [[1,1,0],[1,1,0],[0,0,1]]\n输出:2\n示例 2:\n```\n\n![](https://p.ipic.vip/94y5lf.jpg)\n\n```\n输入:isConnected = [[1,0,0],[0,1,0],[0,0,1]]\n输出:3\n \n\n提示:\n\n1 <= n <= 200\nn == isConnected.length\nn == isConnected[i].length\nisConnected[i][j] 为 1 或 0\nisConnected[i][i] == 1\nisConnected[i][j] == isConnected[j][i]\n\n```","content":"096221c37c5f85fac03c87f9e42ff6164f9a33419dab438a4a074246202662680898e16664879d34704a893c930b2c884fa0fb0f10fac65745e3ba12fad6b71dba02202514082975c4e747616d1aa8bab20aa6024c428846fe3ce839687f450285ce47e98d3d44d7a0d0f4f668294d6daf50bce60700cf8a42ad8ec1fc35f226bb974769590e3c731ecc76f710ff69ea6416429a197c2a35a8c0ae976b21355d5a147402304c61e5e50172abce605d0f32c8647cbc9ebf6e8d01e96e7719a1be9dd34ab60f4ba4e0405ae8ad8e6608728235cf4f432eb683c7fb3a18a39770b6baafea0496d267ee9d048b1a0b2e1501d89ceb64462daee7d6a247ebb380c7237e880e51220fac43c1ab94861af4d3ae135d69fa35e77c8f4d094fd464038e7bc7ae4160cf0621ae02be3d6a0d964349e59326b5723385482f1490f1da02e6fe4d40e0ec206d0c44d0f76799a8d603d0e2a18cdcc8b2ab1388728c9e745d69c08ff5ed7ca4b478ee7259630f54779b962882af08ce1a346f5663c23888c2de231ce72b3c084ab1a6493664a9ecb1540bdb483c94c685d53f292e79d731336d0783b44c456e38bc0dd7d30b19bddbd359cd600a7da96ddd015a092aea68cb2527e66eada1860fc51040f66573263f5b786dd721f5bf81b8e8f569eb53a0ae2f8472be28195bc5eb840d0e81122341418dcdc1b87ee4c263eef9a4043ee3a012c59ce5461b6bcb32c95fd97a91ced9947020c0afe390495eb31c0e84b5bdb0e3e427cff7b8ed84da9d590352a5fee1877c784e3b0f3e8e18858d022c7e19d80f0a631d2adaf8e096b661177a624f98564a37a97b9b29231ace94eb3328a1861e0efab5234e0c3c664c72612863deda3e26e4d8c1f802332b7fe7fa58f1cea8f59482471a89cc1187d7ab6dd0aa1bf508245f8bfabe358519bf4ef14f1cd2057e19c9811638bf525769fe9b5f6fa619712e972d19c66ef3aad6bc71fb1a0d4ef787d52990232d32a730f0dc043ac563e5838a1a124e51cc6d7df9f4d5b1182af04548aa109b97d8d00c2cb6dfdfee9800ce2ad38b65a13c525123f8be3dd5a53bba2e6a27f9b811fe1b886489881ae41c926b8f8f9b57b8572dd58682846c109921b0ed00120811bdd79879a024de0e905a2eedfbaea8ba5dc38a9a8b1dce936a745ca6e28ed351375cc48dab733b16c82386879ca5992074bc7685a451de749127350a2152280e25fe55a7651c4b69f93993b7874a6cbdd634ebb6739538c2aa3d94357ec93d8ab0185cd828261a8ec0df3e3e035fd6cefa6d0e4b796f43674931437bf7c82632e52cd92aa757d826c5c0d9264aac3786e26e167af46095b51c907f92d755be0c53d2e8887b733a48746f1f6e1dc8967563685d5adf79ddd17ddd183e705bfda8a4e38da67b3ca594f3556f99795e30e8d68b663bfda42229c5ad202e467987c77a38eb4eb36fa010b263e6ecc9b83ab265b6ec04ae08efca5186ba9142f80917189abb3c0ef2ea60b5deeb65066159125d46c921dcfdb68a2141f742fa9b89744c845393814b7e018003d983d0be26a8afc654b7ab01532afe5b663476d9721cc392a2ac23048d18b4bf70cd9d8929d4b262bd91a9ae4c097e8729d7df68041a6d4c7f9e3ea30054faa989299251f67128677b89a576cff85dde9bd6bfdf90b95c27d16b4a32e6fe99f77e598a103498a79283ab13446ede454ac3fd7c6e8055f3a3acbc0466832390fa76eb7c71b208c9dad88730da38955cad965516b532d735aac7cfb9887a6bb237cf38d48b868308611ed54f6c308d3bbca0e66f7983855c4784f81baa99f62d708c2877264240a0dceee515032e7d180a7a2c26ff7b16ea15aa4e0b0b4185d9b31a332e2a16c8f487207208ae91856d8150ac1f2c34a2ffa09ee2e59371adf6f566d50ab657f933b3187bfe9f8f9d98874a76c77d87b88678b7e0aa4986ce51448216994906de4431e841f1a2c71579ac3942f3bfd68d8323eb569e368524969e244ab7bdf2d6ff0649b6c414f049e6588c5b4a201f1ee77909b957e7f1891fbcfada2da5840a9f426015a726abf15706d6090e0667bf75d1c9153fb2339712d5375c0db5607f96fac2bcc2f8210e3eac9f81ffbf711a6b158f9a550bc95084b1caa249597c6edc4804f0dec43bd05f26decbf9774a38fd74d74f3bdf6438fd7202980bfaa41a27d4a75fe6e5a214fd9addd1c28a294b4a9a219a3d87a84e2441a1594026763452210e02e62e85c7877f904faf6c992aa7c98adeb3e1c97c57369ea00d130388716b09cd881dffb0738b89e2f238ed5d8bf30dd9b054ae6dac2c0abac9b91e80ce84f4f2323fe92e108bd61d23e69077940dfa83a4c28b9346e005278b2e020915ee4cdb08a7a8a352b62abf6b9c2ce6926c25246f2c1506e879947570184ae52beb3155176389519867cef1f4f5316672266e89e73c766f76c409a9604299fafefb946b8a375fedf95299860b57fc0332f79da997195e7aaa3a9eff131451d4a1c7204289d5e561ed7ca1326e2e04c322865c8d5a0a696e80bc72f8caca6ae5dddd18a5e84188dbbcfd33c42888a353642ce147dcc487336e75d0840f1ada976ec89a86089748e653b68959b9fa3ce21605b0f49cd2f1499be788a4276a94b9a645b9a8e53a88e1395ef605f25f2dc7f3096667d75155a700e07d34176e1652583668dc999adc0d6d8d1ebaccf7fef114e7dfead5c2ed0964b1e49699ba67b4524c6afb0e20e0781d599d8fcd25c5ab712004f5bfef21ba860e7f2fdb9172617384154a9d13615c60753e46b895a6bc3ba9217a8dc0ba364f2b7b276106a25adfab5473b69dfd88578c340798c8ecc89c8486435c3b9a9b62072dbcbf10b829b53564bd073f4a68c98390c7ee3cdba3738c71892ed67ffb47f0787f6c1903cdbff7f4840bde4b9dd8159bf9776b2e50af7b88c458b3004a4ec76e961446ce888280716f438bb04d6114824bf2f5a3ba90f56f2c084d086784edfe90ed7523cb4bc24a33feafb4f7522adbfb9f91d8a8db96cbc56e9525ea0fd50fa2e5163b4b9cabc79fd8e6c87dc38719344321c2b276844a4ec525a939f47ceed22e8dcd4fa96848ded1cb1e84c28dc1332e58d705f554c1fe57de2ddf60e7e43fad8e78cb87d584a8d4dbe580cd7dcf9853819a869fa2028008a3b09a04f48c813513b241640a07c43904c65a42d5bdc6f726dc0aebba43927588eef4f462f9ee70d88ef74d6f85ae288908d8e8591d7b7a164df620701b473ced39f7c010103f5904d604c8d68eccb1ae2756d7e44ef4da86103bde5e82d1ef4e8ba20f5d4f0570de6de14fd1a23a419f6e9292d1f359decfce86c71e2d5de62548a6ffe2859b98fc7bd26b589b665efdc79570bee51d93202c59ceda818cfae73418f11a08ca0bef92deb900dd711da49ec6b37fe585675f1c64f9e84e03c88765f140067fe6abacccd25952ee2a4ad2b621d2cf4c75b44efe15546e30d98c7d0e3e5dfa13e0df2aab8685f3dc4a61a64aa12450cbb63e2f125068122b9c6f2f6b0d25100b212a1d8ecc025198be128b95ce3e7fef90b9ad94f80139b9a50213e5d69e6e9fad4e6bd9f1218b8713056d2b1ed2b4e31d4fb27a8cffc64e2aca77f8767891c74d6e133551594f37637b126db3bfacc6e49ab69dc4a4fa17e88665a258457eae17560a7eecdd7eec15b027e7ab98d9cf6686abed695c772ebae4d1543e9b7bf05437cb84c776ad80845fd854ef6b18971e3fd09c034525e839049b1c504fd8816c02e42f773d57eb2abb266fea750f11c60142cacfaa993f0605441dfb4efb0b8fa29afc3ad67f8d30abc2cd4c469f83af634499aa43703d78ae0a955417fc316c09f6e50da7b5d3d7eadebddfec2eae2f4a5cb02d0fb0df245b99624f1b4926763bd961ecb3aa09f88e704e37337c0d2d066abd919aa64d90f1abab865759b18008105918c407e367d18441df04a6cc54ea8c6441c6d722352f36bb77a358722ddddf201563645df5cc875c96133e09a01c02a32ccefba2f22eae65407317caa515d6bf77c88a360012941952f9d642e604455952a151764a69a35628cfc397b438e93be600e11c6032f292bac4193cd18f2d51fb0f5246142f003330d13f4b6e73537d0e26a6ad48c0c3072f9065a8fce019189436d06c788f159be129f81341979eb9aacfffd7577d783f893507fd758a0ddd6c32e32d5beff80b1975d8aad6d5fed1d7a03b22475c17da7d3706db572c0148527eafa9d5c9bc17e77bc9e8409b3f119d2e2efa889de677952b848e714f5f541cab3741eca393b2e705c5ce1d16be675c2beeeded37c621a43b8113f15fd5a07c09c2006dc888e04cf67cc0e52655552b5806cf894c89b8ef86cbdf9986ee1038548851dd69e888e068936354f7adbd1e37c2046b79de12653e075b25281a7745aff4e4e3d44460e7836bb37a4a8db9479f8f6c3ef1bef2c9cbcdf05275a8afa33142356fdbf1a52c275a78db31d18c9d30b04f6da505ebf4362a217fb663c6e3f778a1b20faea7dca6e9bb42f47d827acb1fce6bc81581aa9efebca0ee217755f30d3e59509771601dc8aad1fe41ab05f2422e565086da775e31492ebc9da13cdfbfeb39ea298181f9480d7d247fa7b7701486455c2a804af69b056580495218ec215fc7087248405dc3bc0f195ca659b57813986fce57442d6b1baeace9f43b6eb15270e49c4559f822e7038bf79ee3c7404b39efbc457f5ff88f7cc9172a057bf41779ba7b8542931def5741b619dbe4503cf77742e5aa6bec308f852888c1c1544591f4b530a7e3a449849716271c6f50e43e1bc8248a009426b88f7dd7a29ec3b13383193f0567cab4b35b6ba8978d660cd54c018cb5f388a4881257c7b09c643af299c18ab61e24c51520aaea2d5c1d792811e25f349b07e3c76523c9fddec4dad494982cc632355337fab14e3be1465fcb268cc3ef92866c1ebaf94b9c961e7c42a19fd375221a991a6d8ccd2e69de335f541c642e4577077ed5997cf38e7b39dd040c859d96cbdbbb08c1d12757611ade4a0b06f446c197d8fb60915c8e7b4482737560cccce1fd55c7f9c76170196f8527564e1b3174125cad7f10da75d60b6f1a4eaeabd2d21456442f6d97776624cb9f07a9da7c9ae26642e1423b040b655f7a46691998849942e023a869098c47878b2effa7dedcb2d70f55bb989cec11547f90aea1b0720cdeca7e4fff594352c8d64ef378ac0962c3c7da39f20a6b2dd10782842faf5a9a827064eff485e3fbddb9173c0aaf62ce8f9ac55e3c46eee508719020a5b194ea8cc6d8b585d9220a2a3419962a83851cb42d1782c6410f01a76c94b8a1a4bd24c3dfc86d3d07db4ce52935a40652aba9f72b93b3f2659b356396a5ab5cc586550dd6c61ca8cb284e43e088896b6e6079701399d83d67e45438bb513ded94ba29ed24c555ee501583fdd21030bc914db1a6b266e26c545a699736ee8a90ae44a6434e35f36c1258a025303a23a38369dc784619f1adf2d79af3a6371a396b0ce811c7e46865135eb07301066ecaf535c773d7de014f5f89f514abdd8c16b135c40e633c437e4792802d91af86abc157044e4dabf91a26aa6143f9cc76edbdb27a7e8c1a32d2c5f180927bd9cb28f6dc223db59c07841ebe32d005d389926b440265466453c06b87a82761aa4b5522bc5526373dc61eb697db8ce2a77385d01d8931a592543266f581a2ce2d1858340c921bacc386075e5c09215f448ecb5e7c879e0ca881a3582071f7520a7fe6bc34dff6810b4f1fa122d64d825aabb75d2d9ea4cadf0c28adec80b64498ba2322541ae80cb6f2f06551ef8e94d91a8c781772493b1eda92cca3d62d6580f0357cb0396da368f9ecbbb46217ecb52803d597cab68bd91b7a9754acd1548cd55af2df3e8d05153158d056501c77294099d9cfc6a3efed8e98da1844e10bef983a150186c2068201476249e0b087f38a1e808c36000ac3024737b822fab0dd8267f91bdd67efc6148bef0ddc034693fedbf55558c95cef6daa9749f8b922eb29a102358951c2ecd2bd94f9ddd0a04dd660af789f58e8bca0c44a9c905084e80cf47b1c1cb6ee8c6c1e5d270b7eef3e864d4e43e65dc746ad76d8e7c8806966554d06e263e9621acf79c5a9496a9f39cc5f443eb2a5dda91488cedd62a9cf349f3f1a9236160fe02da250c1efef307e0f1547b2d85747f76fa55b1b5098ce312103b2b2cb7a1179c85ce9bcf9499558f888cde96f95e3ac49249b48c733d35dec49da7cc0629a2e55ceb8ecf2afaef65ea7cc1e9fb764ac4af90215e4a85ed346342dc74d9b0db5154a3ed77160b3341d302746014228f2727061f9c7e298c93da35751de54c93322721db933694634971c9aa50b5e2f2d0314ce8d7e3b05ea6d057084a373a42197214e36118a5204052fb5c759216328fafbe1991e81b81b2fb958c80fa5f72b3f0ebb589f02c5165804f5ee134cc29679c48540e31b3f7042619ed21b036ce28aca728b3836135ef70dc3d3d0335b0254b221942ecd2389b2fa957aeabdf1296ae2058a41c115269e9cf6076e0538dfc50147c5ef9fab7599dbe9831d8ef28e21d471f4bc01d19d9cb082e6cf2a70b803402e9dcbb66f4cc0f9f028b52a6b3b14c2c1208954d2a82f22f80ff6f8cbb249a1105f2ac3d4b1bd07ca406fe76e307dfd8fd094d3e82c177e0297dd873c383da97ab7817a82e9905e9ad6418d328f3cba0a2cfe799d6bdab63dcc09ea8726c665bb53a3c1b7bae0bb14a62b73c0b8e06c5f934aabac73e69d0ce31ec1fe581d46eb2eeb0e6acec9a811e6c11488a66584d78b90fab3229c1bfd27ce010b952a0ea2b36f7c44b099c2d6fef133f7c1bcb3ff5acaaa2d4b0445bbbc308aafb005becb9ae1b4067b5ebc8f81f46faa6489620d1f5b3e4640333e59571dcce8de4817b5ed0c00dc67e3fc3fa593178799e3cd68d0ba444bcc070befc8b50530c24b4ede121fe9d6c62a2b7da7d1ee1007397c28179c1f27a448647a2d7ca3665f06944a025aec7d47e0a07257e83e3af65741c55529ddf7cecdc6eefa45bcfca689df703d6f89e55905c79e31d9b81cad17e03950d84c51b9caf95f16a4fe9efa5f28958059d98224271ecedd1cf448667fbb73f25c0984d88ca70d5513d9335d4a11584121965557006ad22406156edb765fa0c1852a4d10d5a2fb7c6068f784c1945d73cdbe9ee020a3063b3104ca84a987810201e95996c4409c63a2317aeb194758dd78011a0f604298c82f08bb21b5e9b893d079ba9756a4842e62005ca6492228b38854f1ae53470f5da9392269c5f3afd19c9995c312ddf1a5b1b8306eef868d0d3a103751cb3dc68725a2e38264207401f191e56928ab6ec8474d34a8839db8fc3db4ebed2aa65df44299d9cc70dc7c9d84d56d76c19ee560226102ae39f7e917e0c4118809adfeaf0f79de9d586570382ca601050533023c2662f0f7c540aec962cc96858bee3b498edb19783175234461b7d4d8d032d309b9a5081faf0a71c01c649f10f207b048404ce813be5991221b4fcac1d2c589efaba3cb91d375fba3584984d5f12377ceb3860cb49ede6f48c476ff43d3020ca0b86dcc3ab3d21dda23af92e2652bcadc52d715aec16a0cc800402b702c56d14918a6edaf26c08037e88ef9114a098126e04da43530d634c08fce726f29bce59d471883325334e4febc02d4dd8ea8e77de69b9ef845ef17d9fe7c657707f05caf064e40760dd816f871084363ac393c6713c8d28fabfcb2e742de370ce61584b795170a58044830297b02f39e4e057e729191aa08293fda3faf3def6d6fdc0343a243c6b3f5fd98c26d7a321f9b9f5fa06270cdf54545e871576993cf1b0c1718b8d6662733206dc5af7cfeaaf670d0a0b32f54d51e48739144b0a1e547661b44a50d4b174b856c3bc9595df21c022eae5ac9922cd31fc1a1d9d92c60548844cb06735faadd5e90b3f6d454785dedc3b183976541131476186385b4ed47bef2d980a55b57e400b22f6de00d6149b46748ae16eb13e3284650a77e196e7a6ce20cd259e3ed4dd21dc6e501cb638d136c6ae6fade54d810a3ccd797581648841078bdd1b548486ec5efd68e847c9e62247f79c9bce9b672bf277aa1872cf8a2f1132ff3749b7d13266d009c1aafea05d9689b4406ef720e0107f6087f8c3af94afd1f9d8133afa2bdb5f3b741c41773e504ddc914a58ed7bf06ca6d240a4a7b30fe59a3db219e21ae1c4eec515079737a89cca3edb8afb2c57bb00c3b0e42d734527ba6057d002d8e96ce567b5eba8936400f760fb527af5fdf3c6dfecfb343d98ee52ad11c57a47744d447aafb63b2ac2ed273b445bd80e9925b829a289c3951aee744135b9455aae8717bc4898dbf098f651db0a38b6100fc1a59c65ad5dc08c00c64410014742ec586aa84c2fe9515231a669d0d524531ed58f21f8065ddb51cd80fb2438e7187efdb6ddad71d76bef0fcf27c6f28e7f51c0819c1b0242067ace9c4b73f9d836fc0a86217eb9aafd8fcaab0375bd321887f87214ec02b0648181075e896444793a18afbc96fa83b004b690a6809b8200d236d614f283f63c72a29ce0994d422d6e3229ba5bf377314bb8b0d7e25be2e3ee1ef0af4ce91fdd55d857a1875aa148725121f01db8f84da821c731b2afad0d6794b6d13af86382ab3626ce3391261d7bacc94e7953cf801eb160eb9b01cdc3d1a823b2dc2a214e8e42a075c629c06083e2b923ceb7e7b712844e91f118df87e1dea0e464c5aaf480c317e1b9b5964cd540c83934ec28059b59c689bd17673b430d6bfaf2eec43f23575e3f22fa94ffac1f1367e5b065dd48948962cdd8f546d8c30f72060e4c7cf8ca02a63d11becb1792051251c1a4d9a5114aa18a5bdd320f7fd76f28d9f910611e65849df3cc9a38c4646a3218026998a09cc0863da4484694758cc7070332ffa81622c943b26ca86982a06455d001f5d0b2b0a365310fea27ed09157d0fd8a36e394c31323d4625fe26264df2c497bdf9f892b16fac01a3321cc2214ad4604d944d15d2b802e86efc68875d861b2ab325870e50bc2314f71ec729cc525a0e890645b34a9b4e9b40dfd26d5570d73a5e406912fea79d59a2f4e580f5706142847acb5621de2932efc73ebe87ddf5019171e5d08f348df3294b1b0753e1b5df48fbd03b129cbdfaa97cd6bcbc9fa74aba9553235803019652e28623b9e5438add3cbe0ad89bfe9c8f8d3c877504fac68aa3ff23a4458c6ab253a16d19977694425a9973b64f99008f1c614e43dcbbf0fe6957713dba325d717d1ec4f16192eb79d7b4a7e0e7e309039ab3e0ff822e9daf579c806596acb10329d1c91733fef5dde8be29fb0ddb0328b779da9209d4e9d926de00d18b7d300d10071b204ebde3ef0e7276f5e06798fb001a60c461d8076783a0856675f9e8de5a839e9e3159c4019aea9bfc48d46823cc06f7235612d9ae42b4bbb3b628b034b3699f32cd44301addf64280443133071651c8f67372cd83b7e3f44cc4b5d626a0a4f1802fa87e50f8247e0fade05ff719635159e56b6bb1eadaddc1019f806cee5911f617a40d1d716a649d07b94de55060b22ceb540642e7e97864d09a138d55dae549b3569d6916bd344e030f58a90eb63787bc583f75121e85b07066c3f85bd0c99f22aafa382bc8e3525689dd458d4ace19aa38940a0ff69a08438569347d764b564aaa9497c612a5769f24683e790bb43afb0f745932cb145d1c1ae2d02a56c8e049cc5c1cb10f2ff9fc4e91ea26e3d8120124880bec52d3800fa2204b0dee3d7bbf09467769b74bc85bc4b440bd782338df4ee794518b5ac42e6fc1863b1d711a5977f4ade6217e0d39e5bd85910fe3c78f6969fd940738b5d4e74548e71b798a9bfeddab4df8e9bfab4be7d8e8f9a9998e44de7c6cb6a784a28d76820fac80247e555292cf9fd8dc27524afb864a5e4acb8d4681af977977697866b730ca443ddaead39fc5aa406f0597d712726e05955170efda1c3996ba570c643a1497c1d4741eaceb50c9ccde816a4d0fee8dc3cc7b3423f8588485e66ee687af69c5f04c768d73be7a72bbee5396ac55ffaaca1f8e2308781393ba5ef01a6c13f6e2bc434a85c88fec3b9cda93216b8134964ace8810ce00180a835876be0392ccba88e936d7656d37b31a3957b1ae5e55e0c82bee39a3e368d6eafee9f3653bb70878c29d0c1aa6bd21291a3427de832b3b2694f7faecd7c84176accac78b4523496ae5129c3cba0f79304f388464dbf23b1a78053b89372f1fc78fafd16baadeae087d1185f0ba15e9b6efc34ef7391e966684323791129b5eb90333df27630444f5151d2574656959825d8c59ad0e3504672b75bb9b20e0a28a6d3dc1e3ce0df10100f6ca48971fc6f11f9febca034b8a7164954e7c48081a612504bb057bd0634182c5d2bc44f709cf0ff4e161b6133a3368a2e6290fdb3d38228cb5ff84181ead7c65b1cfe403adaeb7bdd14442673c2f91f276e82d56aa89b6997e00031223622afb32af1180641188fe436b152bd63e47b72e7436cb168c154affae8ef6b9e4effde11464a2d9a3accbb1fad766d2e21ea01e9de0e101b0478ccbacedc2d496c10389b6c4cab7831b149c1173f06ea83fcad52c08a3395d890163cbd31215202a1817cfbffc38ee58ca7d0fb786de897e73be1bcbc674e081ba73f6782ecc5703c26dad5e6743525efe757f07345aebd81bfc1fbde373c57261308ce970ee02651939852662d99736fa792ef769a14e44abb67d16432a381677404fdca8fa174c7b5c107f869ec3f2f5a8c97e38725fcf8d6b025f99e46b1165ba12460fa779b92b752beca46825c548ab332b02f1e3c5d4d4b237f8ede6f14084a18e6d9e3afa5b7b5c6c900729f4c03b20557de6cfb9b45331b1b3fdd566a39e89f7e58bd2b6b3fde3ed39cb062a1c59a9c1b6fae41991b2d5666d354087c529ff0cd9bb0dd445883b6bf77f107f6891d8c2f4499c158df322b5f68966e4b8371c92193beab52e1494e0b6b5b53595ff1d464ea3eb73e56cd1364f603fe6d749553b5102dea679908c0b29816dca0f82ae63cb8b430f51f8afa9f98bea87c63918e4a364b77dff5141afdab72f4903b541c422e29780ffc5d3b8482aa8e1c0cecc64b608109695f294e2d2a57127321ae84a3d1ce376e5181b1113133fceddf2bca4b8f4f96ff81e4e1e0f6119ecdc5bd86a32a81422be03e8a15bbefdf28931eb4da2e2f2c0967bc4ee2a5fbd8e4d2733d8e4335e093abcfad35318854a2780599b2a81e8fe21572d39ebdf217a87d24581e6582865060aca59d06e33ed4b9884f56cf3aad6826b2b41e841aaf3dcffa6da2ca080101b7a61355b742493905a4eb787a67b496c6d17a8ea437a34a17a82283268ffa55f27a210ea81a9a375eb779554d28b70f5c4ce9798e283f9c3c7e80c88e6ba225e4030754193332ff9fa016a62a4c6bd213e41b22de65489e49a811a5d0e5be2a88639658750b4363dea94120b5368091a9ce38dccc3284d46fd8d7c084fd9df3a61eeb0b783c5ed7b5c9ecc3245f8154078f9d8bf82e1689accbd027a27b60d46fbc94099d074b48ea4fe13432ecc93569340759611ce79a8defa57c8d991d0b02b0ad25b8a85d7565e665fbe77a0efa24d163de59e7237ab973bd6b432a03edc1cf1385007a6dee087f51daa2b50ffee45d97a5b1b18d6da3950f89433e0bc7ea1f7716967be64585a1907bdd0df788168ad53a10dcd0f75b1d2cc8e4d257d90642e2f61302f0","title":"547. 省份数量","link":"https://leetcode-cn.com/problems/number-of-provinces/","question_id":547,"issue_number":79},"77":{"day":77,"pres":null,"tags":["并查集","DFS"],"whys":null,"difficulty":"- 中等","description":"```\n在节点网络中,只有当 graph[i][j] = 1 时,每个节点 i 能够直接连接到另一个节点 j。\n\n一些节点 initial 最初被恶意软件感染。只要两个节点直接连接,且其中至少一个节点受到恶意软件的感染,那么两个节点都将被恶意软件感染。这种恶意软件的传播将继续,直到没有更多的节点可以被这种方式感染。\n\n假设 M(initial) 是在恶意软件停止传播之后,整个网络中感染恶意软件的最终节点数。\n\n我们可以从初始列表中删除一个节点。如果移除这一节点将最小化 M(initial), 则返回该节点。如果有多个节点满足条件,就返回索引最小的节点。\n\n请注意,如果某个节点已从受感染节点的列表 initial 中删除,它以后可能仍然因恶意软件传播而受到感染。\n\n\n示例 1:\n\n输入:graph = [[1,1,0],[1,1,0],[0,0,1]], initial = [0,1]\n输出:0\n示例 2:\n\n输入:graph = [[1,0,0],[0,1,0],[0,0,1]], initial = [0,2]\n输出:0\n示例 3:\n\n输入:graph = [[1,1,1],[1,1,1],[1,1,1]], initial = [1,2]\n输出:1\n\n\n提示:\n\n1 < graph.length = graph[0].length <= 300\n0 <= graph[i][j] == graph[j][i] <= 1\ngraph[i][i] == 1\n1 <= initial.length < graph.length\n0 <= initial[i] < graph.length\n```","content":"096221c37c5f85fac03c87f9e42ff6164f9a3341b691438d470b7d69202662651280e3596d89ab027c50b434b5032d8f5da1f70810c5ff5565c173cc736e24c977c5bee375114e2ff6a50d500e56a2f9cf2bf87d4428f640bb65c94621422b6f80ab32cbe4786baaf1dc8187655e144214bc076a7bcc3327f92a6ce119a45a25af85445278003250f16fed57ee2f8758edd0cfe46c7e466c8e48aeb068e6ad161d3e1aa5846548e82c4653fab3511d7a19abf3f6700117be258b22f434a3167a3ab8179c67039d7bacf87d6be34b7828b67f91651451afe7536ee8bd20582ba3314139cd0437a43d35a4ce756432021acc8afc28076fa8edcfee58fdb9cfc8283d984e516411b741cabd94c604bad1ac1f4d69a56bf868c75c1f2aa82e4ecdf71619acf142c38ec848996afba910aca607c90a1790d967cfa74bebc56b8b7d861152a89c1204514995ad77f5c8dd74482837552c445359ab6ea43713ed9ac35881ddc57ca4b47bce5b59632558478297189a69fd67152c6a5b78c33c93f4dd0b3be90a3e0b5b9aa67904a1476ab15405da6f1899f48512dfb0e98880573fc2eafcb4241e4a4ce80bb18c1d45023c58883b2909316d33cf64200f52ba4840a086b7139dc8e0178d6f43a83c69566548020cf447a9b8cecfc09135d1d7253661d476d95015079af21088a0cd6d283929a68fb5bc1abfe4148bfe18ea61d2c971cdc47531677caf6ef1128a74f4b2efcb1b0ab1c2fdc9386be3742fecc6b8f7b8c176b2e9d9948ea0c3447f019595b3813a1a7257530bcf6c96c26f101845cc5051414653e399938cf538082b1e4ff221797df542ce4f258f22ecc3494c9ece452f9df61602ade4a0b0dde7b52ba0e56f5ed7b5bdf182bcca916d24b073167b774b0f471a89ce0f85d69b701671c950fbc3d7752d2ff47ba54c9742afc315bae7cd66c6532bfd1e4f25ba88e6e121702f12cb572bac30f5d0a2af05b436af2edd86ec049d121df7529a7e29d9a822a76e311214357f5bec4973f8ce135ce4812284c274c50a73206dc8d309092228378d1ab3b0cf5dc87754397fe1e259e8eb648a58162883d20cb466b413d0896a821f2e87e3bfe70f8c2d71fcc8f1983f68a16b2b8274196e4d824e99769421cb3c73d74786eac8191c5fe89f9a8e330a190b2d4e31674938beb5ea77712bfff7cf5dd81c412a7153f18431ad013ab22cbc23ffafe8c186a0e6b307e04ac8c7c29057dbc490f01769f0b30a965db933e72a22c477a4ab22f83b06634ac16d795fcaf4920926c0d276de42c9cc93eacb8acd8a84e636a1d14152dd7a863017b8990099bafb4bf6173d9ee280ceb07ce01d73c574b14102c978cc8f60661ceeaca59d9ba4d9b685583ba481c3d68853f61123b24b92bba0b410da9e98e2a13951a0ed1aa426fcff9fe26d1146e49f4f6bc5fe112792e4e8b84d03daf062c86bb80eac00f633774a01dc366887e807ad2de6e9585d3ad10570ba160d8eb91023f5f7529fbdb42c4e3518105d9e4cac0b452669d6c525c3561754b4c751981372b1feea01873f505371c34545508c112b8ea1df77b187b9a802f3c32e1f4322a9f34e97405b9f2b792fce0a3a8341035359f4e0a1d6498018280644f3f67f495989ba6efa2844f918ba3dfbf789799f9f6ffa8309a3e0b0b3d3909f0509be5f1570b2b1ddcf3659d3615fdecbefe3ba134473f45e4dccf43f27c56a98e5c0ba67d337ba151dac0ecac8a1226a38316984723b8493f78cc2f4ea234edac9cdafe1aab7fc7ee1408c764c4153ddf0b21ce48ff86ea6770b4ebb9c2f3ad4c15c5ea8104663e2a56ea881ecc79508085910cc8d84c5a2532c026f9d4d6fb23720a25d2d1efad9dfa084242a362a41f1776177cebcec389cb83dfedeb43d5b6942353230d0657933ae36b27dc158ea4997c67c26510d2532a8c303ac6036559c301a3392150085f418ad222350ea025ed33aa4b86cfafb20364aecbcca9d8a0ac1bb0e83438f001cd6b22e56615f15c7ca7909d070d666be45c8a2f9254920b3fa32b51b710fa269745bfa0f0adc27d17d718607253db3b500cdb3f4957bf06c0ed5c034d847ac10d3e0ff5ca6cd0e3f5d0f4312d398d5441354143294aeb2930c4cffbb01d23a751b76c9ad8feb0ff18e0d2345c83a98807a442cb5dce346fb32a356a1eb9c5ab48d30cd264b94fb36298f2786f519e1533a2a4654db819e7fab45e30728aca3a312bcdf89b36e5259413eaf933eca82409d72a460be3aa7d3abd1b6e2c2785b3796ad01223f8b674209d9901cd4b673809fecf01bee758af224e65ee62563faa3d96a5b51d44f1b667a1defbb0dbe1e96f41c12ca9242880cf0aca5c2929f48fc0f13812f3a18f65cf81e76bfccd07ccd55a92af234a80a8541603bb1fcee61d6ea1b4a742ce44e93211aadc58b75b26af7d6f9fa23a5d85b1185895f73071bc16afd5332facfbfbba125da3735b5cb03ce83431ad9766ac3f7d4bb533167d855bf91602135bbb8804643dab2e004a879e9556d5963dc8c69ec049d92273a9fd73ac6592436f496bb2ccd8e4fc2b5b6955bf755587497a4cf70a48a9188def3bd2203c3bb3673914e6f66088b4ccc942736f17b38f90ccc901d331f2b0cce4c030932eee13c4d27df077458980302eede51eb7ba8d85d10e1ea9f25b2f202e57cdbf2c5e5c7edb5fe0fd4fbffc96300977f3763396956f642722d171768bcb7381c73416d8932babc855997ef65f7d8c5552c38ad031fcd86e81d282ad67e45cae2c32d1d80a0cb57cede3ad183f6c8b2fc8d3b746328c909bfb0624264dfd5e9e5e2d0b74dbc153fe89c396f192e8e71b3d37660392259313bc08ede1165898fc1259d5775b144d7fb2d8cefa3fc1528031e2cb33769f125f241ee30e41aa43b968beaf3a45e201c7642e7459f2b1de103738da0a0bf41be51449151dfcfa26dbb2fa7aa6716066491a6b17426e5dadd35ff1b5501d6f5a46c248093dfa04d4cc9ba39f5a045cb7f8cd1383a5102d8f26fdda9100350e3d49fc42ad02089248f03c8a4403327b6c9b5c9f2fac56c495fd857146882a916d760188477a922f461cac7279ef754911b058c85917084df8d8766605fc51fb253c8ed3a8c6c8f28ebe424a6942789ddb38da88ff1b8aa8e32dce107818e829fbf159c08ecf5a84d8ce7d83b13b5406a5609d93654ca1011d5a2c3f734ff0af6a4439d33c1c4fcb861f8a0798cdab81374c3ad66d100e3ef15031f3d4205ed697c104463ed7fc0dd10567e0d4cda10b388bac5b0e810569de448f2dad50326d8459894fd2eebdf0f5b495837a5249c34dd9e67098116e9c4acf344de89879eca452248f72976bef9b4e59292cd51d26b58c9230aa8959f36abac03d27e542298a79aa6faba4332f11a4ec26facc6cadc13c60e13ad91a2914da8d37f567f7097ad6429888e63bb09167782ace8d5880a53807806c1ab26d9891527974ea53f543e659bc0340b7f40fc02b2e23b98c2fbbac84063a72cad6043a8f86a546f763f126292264a2543261c0d646658cbc3281898a3129b8ece7770fc5541511030ebf1407085f31eb4856ed6a64562d9aa42c5d3134b2b794c9befcc1755fc75cfb6831a3f8678b62d2c9e8e263e5b4e4124417b263a5af17a2c6b0875540c175b1441d25728a03ab3cbfc2d988ad4e71328ff0ec9d05aeeabc3f3cf6686e9a22610323abad6e31a609b24b94a7b94aeda76e3c5d35fc731a0275dd60d6e9ee145450fe8394dd5550406d0833651e832767b0baa3bbb747dc068111187014fca8dac8ddc8da881ff18dc52e8064b7d6fd372a732d93c1b3f2e48cdc6eb3607dca20d7e2c33eb4482010cf02c2557a9a01caea9ce87f185ded4e727f5490f08b07f40ff8b244996e180f7cb9083b0009771131ce64720b5d6dcb3ee84eafb80366843218c5b45152515e2fe7e1ca4d8d6cd41fc36f32644d13aa47f54ce3710f4867c73b8a38ef220ea2d879d7c8f906f411e6f56eee9881fd94622183ccff128860fa92e75a86bfc8bbb8f253dae615dc2714ee2cf832be5d23274985dd5c38fb82faa9ef8da438b82680b5561a871e26cc23d80eeb03b285d42c0d2505ad522e025784614664e7a6b97ba9efbb6c3ecc8906429a8640fc98657c417383dcd916a9aac6571a5159be129f6550ec5fbb1af8ff689577a7426c07135fa4cc60efb6c73b17f52efe515192ef2aad6d5fed193af2e2a064e26c73d300ddc46312a025a61b2bfd194f94ef66680a009e3315ddc7d7a93c6d9a32ffa6d8cc7250a511240e53860e7b8b9b2e705c5ce5450be6f1f64bbfe9337db3cb93b8c7abf44b6ee355d9b00319488f146f767c6f85d5f4e3b5b2fd4bd4ccaf7ba95b5fc99ddc4106801ca1d942ae8deaf73923010acfefc1930c236574ed85b6229214c167d753411eab0e8e3960b2fab8565a84f638df20e8f896d35e1e189c9d1dcbd6667d985a33142356fdbf1f840680870927f85d1fd30ad4f7de30cbade002a687e9078ddfffc3ba7b218bbc1c4f384af4aaf57e2019942dd0e8615e2e5dabb733c540b5d15fa0b664929b7726f00dee9f0f54c9f02e9702a6f4ab1c7774f310b6dfa9c880ac5b8f628d12dc3afb55f61743e55a7b7701486455c2ad30fbadd0b2cced89cff789ffe00dfa32b85ef6f7b83951662927af1ea38f91fafc696eed36a4f0c4297a63ec6f21974818407a838871e0a5d607becd7a85552ddf598442eb8528abefa937d85933d8567c24fb07a92b23ad20d619dea66e8882124ac2cad014db72febc15445d8b2b568a7e2b949d7d25a61127f58e33f0adf1ba937f30ca58f2985f7dbd89b3383193f562286f2bd1d2afcdfc83477823ec63523657d46098796496555aad632132e1a35eddc4adcfe9b76c8dff2c686d47afdf3209f791d8fb121171b28315d4a344087667d166581e93311cb465fcb26c886edd4802a1ea6d40c819d17791ae483d3752d5ad07939c9892269943a443844682e032e0763d5ca39bfc82855944a488dc59fc7dbb5678d972911757ec768124f9e6cebe781af28de12c75e0b9573f6ba78b582e75089fadb1f77106897211a695c3b794a15f3380aec75854e231805bbe2cede544162327b917d621fd28607bcc63cdcff6f119821744a45201c2e032d0398e88354f81eca661b8c748b9701c482aadca2c94945dfcc86c611547f90aea1b072268d8f3209f10a0a08c9e84eaa41ea51778a9d855fb40438648b42f9c277d2709ad43937a6a0c0a7b0d0b4153405fe48cf929a8307266ceee508719066eae394a08c8fc5f09bde620b2e681d9636f08a16aa6244ccc55a7144e317ddc5a8ada70ec3dfc83e784b9d42b6606fe17d14f3d4be668ef9a16e98276d8ca2f14ff7934524b9a85fa5c43f1d0ac0a48a70746c756a4cf7a3741a9f5a00e04c61bef0d768a1738407ab2345d1b8935438efd401f7aab265f67e0c587abd5aa7d9c4d528ef101a4eba224625dd2930736deafd209d345c199de4a1d5a8e9a13722746b1cf642cbfe3476135eb07301066ecaf530d33c9c973a425395bb6fe283e21eb81fee0e633c433808c08022deb4c8e2935f04095ae2fb182daa6455d48b7ff1b9a16632c10911c8eff180927bd9cb28f6dc227bfa8741ce57f7329f03928e9b2e1a023a0f7c53ca79eafa6631e2425c38965526373dc61eb6979fcab1af3a8cfa1dc077a5d5067336bdfaebb35652252e76c054fa8ac8441b0f092a4255a4cb5e7c879e0ca8d4e556753f941d4477afb03495fff9641b4af36cd61dd015b4b05a3a92b6ac911f27d59282b5ab1c17e59ff6df728a3e1b0edcbc16dedbffde5eb2537911f386061c73371f85fc809024b70ae6d50def3c7c1477c2b5c6dc6b57133d5c3c730192bb79c6583cdf455dd12b237bb7410f7c15b90f5892b0e780044d0a420e29502c5d06d1d97df8a5be665b41cce865cf4b13496edf8087f0891d804a96bdc2548d6d1d3bd958351578eb0add13921400c54d66d84f8e944669725ebbc0649470ca6c27f53f2da02cd04b90f856dd09500758443c706066e473a638e95ac26e783c3ac06b38d6180d8a54859bea7e6e1dbf9e89a986ac1eaf6aa4c1ea4d8059d769ec76216031adfdd9889f3de1718c9007b8454f82e64be90bdaece9250d1235b84d755da4244bf002a0dd26be160ee930f6de010d6c89cbc9a0ef7576f0826ef963c9d3d02432b180e03e4529c2f792993f97c2fa57518e3a17321b0ce5622de0e31be901875c9b40e815e07a08e9047fc3b9f4c7afcdfa5af5d15883bf2e9c4af10422e78f70d73b54078118d54ee15c0570d7790dba34461a270f0c4923f9266d37f9dae298c538ef3118c22cb1727b7a70b77f2c08218600c6f903172a2f4f419f961d7d05ef6615358ee621b93c9a2055595dd9544b0232a89341356a06af86d6d925bc891b4cc96e873eeabb2260709151df5f8656132effa24e1ffc9840e7e15c9d0561335f25c7c7521612fc8a9a33903b784f44a16ec6dfc722502b018666c06be774ccfbbddd2ea7f4882970f341b247e95b6f858dc77d3b477496861b15aabc94a06ec6bde1ca53daf2917dbb24b1b251dfe4d4b8cbefd40070b8450f21bfa8f83b4c89b3a87af92677330b8c843cc75197c76165ac47fff89098128b105f2ac397fef3549e402cb26c7132b890d1dfd6f8710c490990cac43d6a1eb27a9d817a82afdf0c9ade0dc8668f21ff5e6ba63693718ff975de45e781238920fa53a3a1bcb1e9bb4f8c2b739d92e06c5f9303edac7be6870bad4bdcfe58195ded02eb63118dc1d06c9d8b69a2a06384d68b96e0be768c11cf22fd004280540eebbf6f350ae49988df85a476a284e9c9aa0982a267421f6ff2f2648afff157fb85cedefd48324cb085beb65ba362895916355b3e4640333e101914e6b89f1a52fbb93b2ac167a5b52ccb9b5dd3a8e3e73a95ee1119820759e3dda67f2c8b2440ca3b35c20f5dfe6a61e25b22e0c9acf5e1af091f4aa48f85f4e8f824a3cfa957eaa070c6700e601fb3db16edb72681d739a5a90925682c7cf6951ab7bce5eb860baaa74169a0c56867953505be688d66f6cc62483eb184ab713c8efd9dfa9ab10346e65c4b9f8134e48e5ea50dee8b7deb248166e0487845cafc9b4ceb99c9e089e28130b9c6a2a27390cfb5d41edef969662aeed5cd565e2cf192be62753b18b385635b3323a20495e4de802272147f7194df2bc850339220e96ab7db2ea5cf9d6dd0c48399a7f83c00e7ea35ee56795b4e59a56f1c9f783dabd2c4df0dab839c7a28ee3406f58ea8f26e8386ad5d3a26314208385dda697e4c111a1a442a231ac9a7a3f1ec13df4913ea3e4f44cc91b09a7d540898be69ef0debfb34e683592076f5155f7fa01c985ce4507e63bf40d0580277abc87d0a3cb6a3b7dc11f32c7dea2156c75ecc1f5530d28752718fc8f290c336a7c0a0a5c78c8ea7696106e00c0ce43915727063df9a1b03ddf9e68a8f90cc78526e43ec168b6663b4d4419d88068c9642cf6aa776f4eb8947b87be539e681e9055d7e0c7c29267d2b0d09917351a7c278194599c8112b26ca010e1af7e500ea45867cbac90c0ea213d9232ccf12860d5a69d1e26a66977fb36766c5c850d7ac9ee0e8ca6b8cbf09b094e560221d9f6377a68c9a7da728f7c8567392f9217c5ff58de6217352dbb41d84c9fc7b4075a26e18714667960c57562317e916d8cb61186b1ad45bc94300072245f21bf847432806a14a59131fc8171f0d3a6d09d403f39037fe3e1511d0e0bd565d3f2f451ce6cccde78dcc685d12b6bfd366b367a7644762dc652acc2783b32d645e4580bab5f04613ba23aadd6933f5f92fe5d5a65249dd9b8cdd1256aeb0eea0a734389c552471f9d0adb35a3ae15b267bc948f9b6b86d215e1dd28d84f2c56fd87adf015de21cedbf109e5367c363b30539791db4eac340a057ef9b906134df484f6714a32f46ede4b14611c7da87a87e406fafb0ff82050f515b58cccf3a8a4ed6fc24f2e6f2498284579137fc64aae8943ff4dcaa84f159e75ea72669981393080c31d4648606256f9ab29dc62be278013a1c93eddf23e736aa80fe001c03bdad85c588b853a4a0ab97b18a6463a566a1db2e7dea6a471190ba492fdb0edcbac170c54ee78f4bd502da1247c558111407c001338ea724a09f3b8e8829a0f99eeaa9e56b825e3da167949b57af84ebe20284242405022568aa59f09566c40df7541b95180a703e27928fa5b3fdf298d87bdd02774b0c903b30608c057d4c68da969e17291bb29237485b383ae73ff34fda6b24b1c8a72e97d2e93bc96f16902d52d011efba24ede93cd078a071bdc9a7d61eda9333b63951e8e920500fdd1ae4e837328acd85e7008f3e37f9e583261bfb4a19ed52fae20ce95635197d146933d886f28dc2a5bf15231a669d0d55466bed44f5509676beb91c9206f4438e7187ef89288e824f38bef8f1992e2a66b3a66750649c8724662ee2adcce77ee5c62194fb194f9693f38d99f8f42f23bc65f774933f11dd2c1d0a180c75f5c70a1d8eeec5f08474d911004b690a214fb87b0438772d0e3e7f37937678c00d98dd2f90b2229ea5ad533a40f2ca417032b53e63baa80adee491fdd500af7a1875e30a9277031e01c9b8b1dd961c7e1b17ceccee04566008ffed6a6ffd363f98606f3cb2e8c4dda9ce33b1d86389ca6826d52ed59666daa93e04823828a093f9b027e9c6858a7e897b7e76600244e9443bceb72b53be034b5770af4851521a4f9b4d64d0006a80925fc2d40cee923ec99f7b7be17ef2e5aa2aee7fef0067f8bb248846fa9adb367e5b061b9bdb48cc25db940663f77fb8263481889ad2dd6b68d63181ca305d5f6959540ace190fe314a6e49f63e3853289dfd0de5236ef1c04cf5a9dcffe263baa21db0c998a09cc0863da1fa166479d4ad2b68d933e19e6e80cb1e2504811c2eec1a6df9684e4baf4c4dfda4b6cd37801884890cf6294d18a546b803f43e4627eb92a013e9c8d922b16fac01a3321910814ad4604d944d15d76aa0486ef94900b8d33fcab711725ab16974f12278f7cb2d0428a85a05e67048ad5f2e063b8e949ed2759e5a40f8f22c068dc8f7c00556b2a1c142847acb52658a49317cc68ade867f42f58594b0a4eb6549172daf5fa3c11181de2dccd46b920d0dfe39cc631a485bc7afbe807777b8f1a04657561783bd7547ee281cbe0e394f1bbd5f6c9e17d1c44a528806ab434021188ef2d201dd48b307b4104a5ea2f7fb79022f1c614e4798ef90fa0dc391e95f832de1292be4264514bf8c915053a4b032dc46ea2474ab464e78ab42b8d480d118236189c01913a25c55dde8be29fb0ddb0328b3ed3ae65944ed5876fe62619a7ed49b10038fd03efde1db8e72b624e60658eb947a55c5209cb7f6915366e2732d6d9edfa76a6b77b814108f2e0f1eede03ce7ace3f33672463ce9f623691112bcd0b0e349af06fc36200a7df3b31455e38297a6036c66b3766d121543f44cc4b5d626a0a1d0c67aef8ac038215afb58a7ab5718b3546db1af0b558a9aad67605bc0ad3b69115613145ccf71dea46c2518fde7f060b22ceb509222e2cd8c91976e838d440ae06d42878fddb6cf90dae79a1c3d1a7183106de838e146dae55544f367a85b01199e300afa3df968e3525689dd458d4ffa4d6e5da3ae1ad2ceed04304dc08831bfc5ce6e70c042e650316b86ca9cdd3f702fcb8dd36dc60e411988ee03728a56c8e04d880ce8d5eeffe8fe6ec29a7643dac21310f97be8977344dfa3f09aadda4b8f8a4d1236c9b18f5d6e830284284d6489f90ba043811b5a15ce6b55637abfd11a5977f4ade625ae79ded0ed91c43f62164c1989df243769a5b5e1331ca34ac9883bfeddae1998e86fac1d875c086b09998e44de7c6992f6a05679e6f69e7cf4359df521372f19984d85f24afb864a5e4acb8d4681af931850e97cc6b3a42a4119ce0ea7cf449871cda737d712726e0047f170efda1c3996ba522ca51f452617e5a4af090f672d989935f8481e98eec5687f36815efc91e1f660dcf35b2d9452eed28977bf8a073bc803468c14ffda49bbbae2fdae27675a5b42ba6c13f3c449061fa12d8fec7fbd7a3681adc070969cf8c860cfa17c1993fb07ea85647cfe08797785b6a82457da594694adea6121098a3d7a93e24e927fba7de2a0ff967e4cf29998ffe6b945b96a97534f471e2f7404873f6cc3c9c2959f08530e62b57d9e01f6c809fe5c6fc04fde44650bf6df4f0802697d568f8a952e7fd5fe9cea5aec9d2145946ac1e832bfb6eab20c3df28730a28721829eeb4f63368b4762d44011406d2226611899977bc919a9afe194d63ac57eaae15486ae38edc0c16fddf000b0f25a49571b27411b0f5b7a97da585511b15b78cfbc8db691a36ad0ce35d344b4f137fc4057081f0ef551651612fa378912e289bf6ef95d7578516b70f89a3db8c5207d4403adaeb7b9452442e3a919a506920c7cb14eddf12de9d7b7b5f363fb2b366d2185d6b188fe436b10f9763e47b72e7436cb1218f00d487bdea2a9e4ee291424e4d64cd708cee61d63810350bea01e9de0e101b043e83e89bbf631d6c5e77df2956ab317ff840a256730fead8d6ad529da03395d890163cbd31305803ba8749aeec8bc6ff8bb99dae1d29ad9e9a6dc0a796674e5849ee6926d6f4ef2368678e9ca5747620e0e004b14870b3ebbab3c1ba90644f1e7c1f5b97fd68ca7610c1dd1c3236b33520f59aa638ce14e34bab22982d21a8d3193d45b1c38ffa5ec7e59445b420af3f5a3c84dee49d71b2a399a45bf98346e45055e76d2ebe7fd58db245f29f38824154c4f665b066506826037f7e5dcd913a5a5c314aa996b7d2b8f9ed958c5b459f0218980557de6cfb9b45331b1b3fdd596b3fe8d46244bb586b65863ede87e56daf9edf867326bd0f9a40624218da4f227c529ff0cd9bb0dd445883b6bf27b055fa8141b4336bcbaf11cc6c1f1e26c51d02d934c021c894ab0fcb494e0b6b5b53595facfe64ea3eb73e56cd527af032fb7e728859ae167fdf678d09d3d1d642dcf8f12abd16b8b430f51f8afa9f98bea87c7597941b3d043bcaaf6c5fb3ff09aced3b55014276207854d65d66ae82aa8e1c0cecc64b608109695f714e306f4b006464a996d0cae67e1622c8eb54312ee1ed9e6599389b3fd3ff87e2e1aeb955dbcdd9bd95a82ddd103eca66913fbbefdf28931eb4da73052c0967bc4ee2a5bac6e28d713b89067885daefcff87b78c71aaa314bcdb2f0128ff67126d3c7b4f24c827d24581e65dfac5060aca59d4fa53e81d5c10112c762a46827e6f2508c1ab8288bfe75ab91792b01b7a61355b742493905a4eb393434f9999f852ff0df71ea0453a07a8a5b8fe755f27c3d42e90dc72c3af83d105728fe411518a038c2213fc7162dc992cb66af3ece030754193332ff9fe158f52a0c41bf52b0532c932c06cb2de755e0dcf9da24ab38fc185f2149691b2dece608944556050b907a0a8c34de65afd7041f799dbda6da73c3fad7824c435cade0778311f0c20b1a4e6881d5030ee1fa2aff97d742a60b438058f9def53dec7be9d77073f2dda5c3c3cf91326b320f3aeb78439cdff06f1f857f2ff0b1f95ea01e1fe1e92fec15a5418258ccd412b421e28cb6aa085d63d63e80bce06a9e9d855f5c62ca0f2f936349202b45a03b54258d2c36458ba558391f92b846b7eefed5f20097233fcc0a06979f2f26498fe6f87e5ed638d1484be635b3a0daeafb601e4d91dcff219cb686b1aed527e9962fef72077522616520332165d1ebb3c42221b3c1096d9bb3fc49078913394c503ee536ea14871eebd74e5795c4337b1b3d76be051899e92730acaec3baa46426097dec22937b41277f27a699ef57503dc3684577ae35b15843a6920e8bfbf1d6c28e9eaa56739934bec5c45a41d232002a8d0765df11519a720fefe78a7c82482f35cfc76be4f17967d97d924234918a630ae45850a5e13ffe6e5c09ac00a90cda13ac9ee15d6a281c1edf574e21b09de2a9d2ab8b0c01bd019593599b25f0d72c339ed03c6c8feccf7719d7a393f0304b99b2325a5f689b62f4989ef9ecf104508b794ff1985193cdbea444f1eb59ea9333ba8caa7c9c2e7817045e6509fe4a0b5698eebd3946960a8b36fda71a6774e80330f25840e920543088c4c7a512998a90ff31ff1360bb02802f284ae8f5f5f958b5cb0a85db1fdbc773aa7996b4f227d7d467d5610df0350ede564d25d536c10c0d2f968271ab39cd658cbf835501ee549b3d55f61b9adeef6f898424f3f068caaa262695aa527e47e444faa97519962aabec1da6449c22be15d8b4861a0f930d84748b746ddd5b4ea9dfa211381f465fa9688d89fc74249a566f2d90ef4f179badbfdd06d56eb46bd5e1b57f1d50b7924b0b16d3b9b22de1f8fffbdab7a8a028caae8209d6302ea08a0e463d074cd9a599e84db2066e2cf0cbc9e02399d98ee1e95ff7133342068d5790667474832173c8864a8ba00f6ee18c2cad247d24365de9d7d2176ed1394193a6d864a4c94680fb209ce7cc25b2681d1c70965fd6a4c92d3a5d6fb1940ebcc237707517b97e8052ae5af9c74882f46f587baf9735cef9e9e4d486953b71a8aa266922eb67cc4f2d4a0a98b9209a69ed5a0d4115c86abee09d419635dfd1d6fab8fdaeb8e5bcc6167d94cfe0c3293a567b9c20c3050e87c7a6856d30a83fd2b71439180f5138dfd0a9e1db19ce8d518791c767b6110a38a22e115ae83ce94eefeb11790659a80be78be36ac5f668dfdf055a587061c3f05dce2a431964316479003820db42c7dc8ea218f77b351250f770867bd76661f0771ed6a1af14d5d88b2d241c0e49630df953447264e14d05b6d9f44ce9aff4ce0ee3f43aa265f42019c2835365ae187493ebedd0a31d38e6d4b604bfb8b5cee509b9ac3148260fcad41b4e18d0418b825b9f1628bbd7bcdfdfedc101427c476c8dcd14c2e7d7a1b48a19b179f5665bf7d7a0e1d313d445d357177d7996d3c03a0b8923d38da30b1eeb19f0b8675af343e74a1daf4a5845ee9ffa66a4ae9cbe06ac001d85dd1828212e4d41e4417b0ae6db8ad4775075bc347933aae100d7ce54466faf4eba1ae854e2cb6531d304991d3672b63ced1d865deeaff81413cf6bd7bc1e725658ba6b43117af352ffcb708ffcf1a21959c920776b520d255694b946db2ae6656012f69f6520359b77164004aa90cbf9d11e93a71e0a616b14013b8ee5b0ef29e9416bebe8d865713c726c49fb20c8ddc1534d6fc22270b7cc7d022b47af5e972377bd534707a2a9dd11df3c80c91fa8cea4f3c58545f6d87108ecd181e8ff0826fcdb0eed0274990b9b20efd8cc434c3c58a326dcea7d6d51c237a46ed2fd0203c832453bcd9797b1b928a22cb0838258697ccbc6a6b0c64728597f7ae37e1c3e2289c2c2a7a94811c5e1251d3b0f4b780aa980e847a1e026e663a8219273afe16c6c36db7bcfdefb47c90be52af62b95ea2cc82e0e6b4146a407dcee589dd5eb05a7b4b8c59cf693a409e7ba4650b1a7f96449d4df3ce4b75654f71d1a37bee88d574a70418f58680e964c0a23b76fc8537a8d62346e29180d74b153bc721faa4529848d9ace478330f575c902e37d9508681f7a827e761d55f3279e1ed1e901539933af88dfa0ae166e71425f88bf496c06f5af11f6eeaace5c958bed794c99e51fccbb9ecb718220974019e18cbc539d2d97518c7f424bdfdccc9cc4a2529012a58600459def7374eae032814fc4ef2f02fe724d359aaf71a0f2e307d06c404be625c8a4e4904ea95dbda6ebfd2ddcc119256e447d57d1498fcf1243654a374e1e0812084074d3c05e975dff726a86fecb2d6eb5abb312eddf7a5e74e1a0e5db2ddbc85788931438f9a1cf3b713127cc64be1b755c79980de770ac7e15fa85cd77a80a5f787ab0bf3fc6004d645343084cbd5de0c2a2717b1b05b37398c8c70650bedb86c45f5542208dfbacd72df491726115b787dbd724cf3c4afbc120b166d8e283ddf0df214cae863a4b10444edaf351905d55a829c8f74e596a800acb83ad1ede9e2add5e803afb3eeb7272fba0d253e1753b0a77544521c2df1c9632bcac348c736a9b8f73350c4d618bda9e4daad94739c686e5bc76f2ef23f8b40133d8c49e269a8cce6f4b82c29552724ca9954303ee7d4ea9db324473fffa2e1f0903e8e0c808434a715d82a985e28184c717c9a8688fca0cbd1a1965ecdf39e351b69c57c17665e179771258ef86dd1db9c74c37bf109c66cd9a8529d22d203948e8c295684648960555410e826bba16fdcba81f253af423cdc25bc47f212a2c15c52bd2f852c87d132d1458acc7fe29fa088ea38688f64bb518f2a59eaf1c39cb5f85c97f43a29e740aff560bd47ccbf5daaa888129c6bcc99bd6338df359b37a819f9f07bd78a9c9c8b49ae905457b455705126a55f0ccfca358a9c660e71dd9c948e44e720e4f547fa00b07aa07d84cbd591f515df5a34b584a9eb7f97a5ffa9ab18961a1b427ca9bb9278af9dd1737a1839020d825614b466e2374224cfc47e1e317a51531c8117de5e1fb91b626aa8a98c61f75513e0f09d0dca138e2d8af189b17da786c9426559efc63886d324358f0d34e731e2fb648e9489adff9bcb038fcea9e1de2d591af59677a0eaffaf5a176db64070c8c7d8bbe586b67681ab86c592c4d8e0043d229ae65686a0d789f0c7f992ae2dc75cd4f6f85b867f0b2357350eb13839b333f1b00e16eea5a8159f171524f0b5cf8cebd175cd4de24d0a1d49da36e458c7510fdc55c86a436a453a61ea1f5f23f9dd53b02ae72dd21bbf80653394ce814084e7aa0460867f9aaa257f0d629739a988e4f6cc89500f04ddab53a1fb584ae6d2f6d5d0a85f9717216d43c9730338b3bb895a27b74509792ddde4934d690c0af9b011291599f01dd8abd2710d8518d77f9cdb67490303af224bd657d81eae17c027cfbbd8ea03a4812c31e6d5fed1f790f8978f2317a005d95482ad35b80b24545d8436d0ff7d5a19b90549abc27fa8db78d15e7173d0f61a13ea13017f86f93ae5f6f3784efa29ce41cc74bedbc1df8e0d425a474376f989ec513cce25d0f8b6f398239b824660904a0ae5b2794e165bb41f642d73524a876064388f2cb31fede14a1cee22c138cd5dcd76044285c2516f534dd294fc14e65812433174178182a7372cbc5b8d790a1b050e3e053b0541713b962b861eaba1f3ea8fb3b1aae501d2ae101b8eed37d77c1d940adae43dd81d7efd04055bcf624bdeba958c5b35a9c62150d32f62e2c267f0c41a7d9df449a41d346b0af982f9e071f5a3c3ad07ce5c8f2ee37612d52cc3d7cb15dd84cf63d3105d75623b6f225b596cac87882a60e2ea4195048be8c53641c317a792d59b3594819e6445c0b366a6908a88f37d1808d10bf05d41c657a8d54e629f878c8f2f7037a4118325ad1549f4d0a3cef90deacc825fc9395ed542417361d60b6296d23de0b3b577375ec9fb63144e399fcdbadb43d466d8b12e8a4c235fd081c1d02ccb238b06f756fdf486181887fdb1a213c988ff5472847dc0f76e0334d50055d3182c48a2f16c20bf0c48cef10d56bb415591a2282ddb2723f47215cf4a435d09ce8d682f0c56bf0d8380605dd879ada4d599d4e832b4decb813fa82cccd8b17d20e1c5d2d838605e10974ea82b27b224a67569c2471d9a400d10f98cf4d3b1f95c6e45c1c3efc5e1ad425df22852e9eef4adaae29a4a45dbb86abc6ee090e1369de0e1851ace79806dfe47f98674d018418a230c6a884ed2e17b0204cceb35f2353814873ce89c976efca54f8091fe98ac33e1bed7d75f52b9bdda8374e6a93ec09cacf871282f6b646124ad3f1e84959bba486decce4b2380b4834b2677cec88fc173c29ad6a5c662de88138cf246133519b3a150181a88180e8255714be3fc2b76bacd293e949fae46076b000014235b5b326d7b24c60479108ca72f360dc2f32325a8fb3a834828fde0fe6899f91c672cda2b52aec384a43a843f52d97ac3aa280f0a59d932a67e2bf7a9520df61db8a41bbf940fb157a81aadd1be3fcc47fc0d69c61f45d0a689ff1fd03b69ee281136537fa3013d3d3b9ffa9ba4ac1b92b46e82dc33f6e9fa888d0b85c77eeeefbc9db3aa73faae15f1653ff6c767b06a8b7a04559ad6fd5d0255cd50531a7b4cb7008aeb84d17b4b47f9b14f1e40bd0f5305fb11de6428cc670266530773633107d575a0b80594c023373c4ceec3d45f0d8ba4c95fb588b1eb4cb7049af3650e88f95b5bbfaf9ed25bab6e2bbf67b8fe66383533d58c2fac143e47473b104232161fa8825468e05f2dc3d66a2bf0f91088071b00b89064017974fdf7e1c997efa1be223641eeec512ac35d3c0e1a3353c99a2940c4bf3e61c74c09853f7b3b7b3fc4af0212762bc33984d74e3ef79f794e7f44bda5e6ce44c75503a2c1a1c35cc0e890066c9ce3c1bf6671014783aa55261cf57","title":"924. 尽量减少恶意软件的传播","link":"https://leetcode-cn.com/problems/minimize-malware-spread","question_id":960,"issue_number":80},"78":{"day":78,"pres":null,"tags":["并查集"],"whys":null,"difficulty":"- 中等","description":"```\n用以太网线缆将 n 台计算机连接成一个网络,计算机的编号从 0 到 n-1。线缆用 connections 表示,其中 connections[i] = [a, b] 连接了计算机 a 和 b。\n\n网络中的任何一台计算机都可以通过网络直接或者间接访问同一个网络中其他任意一台计算机。\n\n给你这个计算机网络的初始布线 connections,你可以拔开任意两台直连计算机之间的线缆,并用它连接一对未直连的计算机。请你计算并返回使所有计算机都连通所需的最少操作次数。如果不可能,则返回 -1 。\n\n\n\n示例 1:\n\n\n\n输入:n = 4, connections = [[0,1],[0,2],[1,2]]\n输出:1\n解释:拔下计算机 1 和 2 之间的线缆,并将它插到计算机 1 和 3 上。\n示例 2:\n\n\n\n输入:n = 6, connections = [[0,1],[0,2],[0,3],[1,2],[1,3]]\n输出:2\n示例 3:\n\n输入:n = 6, connections = [[0,1],[0,2],[0,3],[1,2]]\n输出:-1\n解释:线缆数量不足。\n示例 4:\n\n输入:n = 5, connections = [[0,1],[0,2],[3,4],[2,3]]\n输出:0\n\n\n提示:\n\n1 <= n <= 10^5\n1 <= connections.length <= min(n*(n-1)/2, 10^5)\nconnections[i].length == 2\n0 <= connections[i][0], connections[i][1] < n\nconnections[i][0] != connections[i][1]\n没有重复的连接。\n两台计算机不会通过多条线缆连接。\n```","content":"096221c0597d8bd7f7d11d52235efeaaa328b64dbf9baf1fcccdf9295d02033616120eefe38aa2147f4181d103acea1232e5f7406ee4922d6da907ce3f361570a36f332bdb5c1e0d80c33822546cdaa4cb6387621252e11ae945a3022625595dd6fe26630bbd8f3a39225d30e5ddcdb86ad54b2d3e07f0ce30e4bd863cf908af745fc7a0aec6c7a39620a8618513eb7fa1838a7f97b4cab9463189e9272f78da91f6bec1eb321ca7b78fe67e47919683ca3a0b12b0b795a4349fe57649f4303d5bb87df3575627e02a19ab8780503871a23ecf77592c96920874b1c83131729abd6b3f9995c867efb42a45be96a0fdcf40504fade7e42d0a3225900f32150eaaed7a8687919062a04b69500cc74c5b47c4d8960cff348c47b2ccc419834ddd3e5109fb4a820830a420a43d4b1c977040eab83e9f1b3c8b46409178119502b53a1d4bad940a325b7ab3ae6ecac9d84a482c2a5a32496b449f5aa01968b9e7d245471112bf385ac0413c0245693e68e4ca1ccbe735a053383122667cba28a5a909be6356206fdf35a44c25a37350b15428d94d3695c5bc11e09c2d5ae332327808b6ad435467319c3bdae82219adfad25aeaa9e8c7a56ad403781628e9760cddb3e77bbca1803cca0b7df74d592f0d727941cb2cdb9981b7eaf469e99779242c816dbc0c0b5ac5c441eb988c3e01437493ccde8f72e3dc65e1cb46a078988f6198bd7f4303462580ae03fb1acbf585cd67619e8d9dd77f0dfb054dff94e2e5cd9d7bc994c7f6efb7b83e4b65cca1d9e42341ebbcd8dd05ed4d1ceef5f4d1a15534264616b690d4cae57b6f166c2ec1492069aa1ffc2645a86096df1a2b87921209e4b93545cbfcd1d2ceb5ec3dcfb74e0daaabddaa98e5bf800e7b8a1848652617360043abaa7c8eadf54e5527d03682e588080560b77af63eac34c2db76d0f0890ec72076c44c0e0ed0dfd0b16240696cdc13708d4194f6f2d829c353b6ba33ded265fc3c454b965ab9e65772dc209ea2db71103801ee0815e39e7c5882f51fccbc4b957372593bf4977e38667339c652abddbf7da5186a503ff6b023cca53bba2c7e3cf7b509f63cbc69be8f11db0a7dfaf9102283032a4ac8256116d313853674b417b3dd45bc6d75e92ec8a300ea3824ab949038de9a5a104a19b68dcdeba6a3cff687dc354e5da2f0d8407f4e890d90f383f98514288e2487e065f35149f8df8dc4d9e9d8cfa87645c8dfc28e79dcc793f2247dfc81039971a131f93b22c44d612a8df8251c6335c9e0aebd570a478295ab89404140fdd394e9d38aefa289f915acf54053d051803825b59123988af04bf624f80b5881e496b459bf70ff47b47a212b29dbd31979737528a59d8d4b630d670f11d2ffd894d34d89c39669f724723058982e74150b57b7bc777dba1b0cad4c0079baffc2592becb6245eafb13c312b08f0ad6626874ed803a078df12dc284676823f37e7c37b1bb8e7d271510ed8c2c1ec4d0d0056700a8eb37f1a3b66df547c445c4b56d46281a3e8e52c15a310b481da0a03b166c6ce0e4649f55f90dfeae61592edd534a6d0590c5bcc6802b9ab3ef2ff221443186250e997677493236425fa203bbd6102704cf1f59335c4051b343148fbcebcf8343fc7c04a2444e1dd0b77a8d1191405408c7726916c0771ecdf9c930078b2674b32edf88ee6736d8d3e4fcfdae9e5a61f1c40b1711481aa4236be0284fdaccb3609a51aadc71c09c8c174af377337170af311bc9ac4862f5ab87261a54662717d0cedae71b114916b5d2a56d9d6b310e8eff456f9355407e8b56a0e8a9e421efc237c3baaec3cfcd5e8cf97005b5363928c87b18789beb1bb2aa9b527a773c7d4e7c17d133defd9b8cdc57d6575ac9cf53f7123b93bff7d959efc215b697a016d72842a3c07ed03f00a99298024e6b16d690f4f7a0a969b4aaa602c7a9c0c2d22f2156794b6209347a5801c84ad00ba76510699ac71e0985c7a530706d935df61d117da4f15d788376314022da34bbfc016d17fe84ba95d6e2ff28e8a3720c234e1bccc1ed65e8c729be563b705eef006dbd3ab47548d28657a74c124d1b45a0dd24d8b6d9c131a71bb39168f9984baba863c4d5e9ff8032f3ba984858d0f5d130abc06b0fa781248667f63c14705c0c0c702fc5126e4c7e6544b09d170cd49d4493370fc2d549145ab9f7366c8e60ade774eb3609becf9c8983f4b4a97228c3689a242277a90505c1d7c345e231418e722a8c4bd62904fad6f802ba8dabedc8fc5ce4a5934ac9f0c2d108b714809f89a1ceda47eac9be2cd10e44180fe2cc3bc4a95ab52d49d68113af3d19780a38e3b4b86256af8ce5677e9f3299e7aa693dca593c62ffd4474bb4a592a438b68a9758cfad25afb56ac1ff1379ec253b1e0cf5f72158910911c2c2e32bb07ae6f6a8dacea7bd720d199a1ca51d4f724448be93f746e68f403b87c4ca3e63baf861ba59d50c8cd5c8aa00a6ac70f0ef99c83a1197b5aab0e8fff1a2d50d9acc5274d85f8c66cff66ae2b4c2d3bc7cd17c14ac1876554b7b252e3254808b7f9b55fbe8a33b28dd9fb53970e4e16ceaca516b2daf891869f87516ceef55f58ea135512961042a835cf89ff5d0ff403e390342e1f2820c36f050236c8ec0b492bff007a5d8a003eccdc72d975b6e95d0bfde7b000bdc618e940d51e46780145e1ad2da7b2fe598c6caa35574c5c376fb12e7c4b7a12146354313c7ff4b067bd4f56533b9886a03941183675120fa6d1016a7ede9eae0ff59905e5fe23fe0a5a4ebf2244b7714156407554149d91b2bc34e47a6f96d8b53158240c27252388069e990474ad92f4eb459022069fe3ebfee1e2fb5809369681650d20e8fe32ff7ac41f6ebd2422416fc8d1888ee63bdaab75c93ed4658427b534a87f7f23194addfad8fe8402cf40d39d3c95a832633c4aa42f9c8218f541480ecf3dd041228bcb9a8c6a2142c7e3165614925fd7f56b636161c1a144465ca2627d242468a687338379d9a0274d341fb7a65316da919ff1939ccb4ae507eb70cb389304cf167244daa3ce8adefbcf6cc5972b32707bcca519ca0d1a8d25b56ff32faa867ac0b65dfe6855dec08271d097df8f33230d8a7cfd1d95cf7dde22d0602f6aec2f53c4083d4b4d086e1e100c04da3d7dcf2d0e7f6b32c061ce42580d8262600db493529fe2cedf4dcf8b478cb715557b3edd4ccf431c8a7395135d627e892829807c557bdcb23074029508f9a34158737c164da8723a0d4c54bf309c991e566d16499719c8928282f7e7724c9daa48afd6874e2481179f9dab28dfdf4652522f1da568d9609b9c7c148a10928fd1bd42f4cfce96c11f6401e02e7da2c7a1ccd2c6a9519d2d58d82910b3829262a4a219c9320602e4da818cfaef5051be5400992fe1d1ccdd13831809ad91a2900e8ed326025501bdad366cdc9277f501137199a6b48d8c0a43864f2c87e22ec8cf0f7ad701b01512772bdfc862443e4f9e47e09963ac84e6b2c84879ab61a6120efff86b49722b431b62942660254360535f222f40c6d27a2acec312969588773ea45d40420528e6ad7763b6bd51d69e6e9fad1341d9f168c581561f3864509ba1c10649b96db4fdfe110e8632eb1b06d9dc213b5d7605100079632153ec7d79631a725f5c1e00656bd25728a073bc8df4639696d1bf035ab672af8727a1e2d69dc73f8fe0a27d3a326ff49fac542b9d7df7547f829ff076e3c5d35f9a5de1731593023fd8a8562b2db030799b015009d8817c0afe69395903eb37bb3674cf7a0fd967b58b6a75603e506e0f2e75e818970ce6daab9baa72ba329e33706f661bb5deb44904d9ea2f151f29b30c8e1a5e9f63285cf7cf6ee7e993c9a8f4b798a674a6053913fc785bf9906a4ebca7c9b98fdc8fb8449f685142af086efb93d6a1abc8e3e98639551d6e8d1538556b1ac4fe3d53ea9693cf56f602ef3a11852bed3100a54073a7d2073aabddf38f29ea61dade4e938b3a3f63645df5c3881fd9143f123c9abe66fd07ea2b21d06bb5d6fec17e32e63430ad7900a7f7fd01b7976174855d9c8d82a920eb94ca847a98f861113324fc71a1239773d4eead3b256344cfd75b13d17bfa1252145b6054486fa3e1f8d1b6c3ecc89e2968f86c079f8f57d9096a34cb8b55c2876c658f47d4ae7d83410ed8ca8bbcba83ab1e2e316bcc717cb4088356f76c32e32d0befe50b4b3a97fead8583fbb9e6682a0e0f749533794398033b0010077aa8faccb7d353eb7b80e15bb13f55d8682eafc6d4a9399d7b888e2046063149e5634ae7b8b9b2e705c5ce4f59f133276da7fe833f9628d93b9c13b74bb1e47458cb2a47c888b209a22992ab6e574c3b164fd4b36689b8efdbe1f59986a85f3a018952da64ad9daf68996353feb0fb123ac236594cf008066d64146b665f3411eab0e8e3d7072fe9c637fd4278c3a14b8fec387bb5b2f2808599f01b7cf3cce531047c219ff9e46368096d9239ccc29338ef46679405a1f42a2a682cd52c88adb23bf5f74bf5a5d0a7e0e74be37d8a78ea169541c81581aa9efebca0ee643b06ff511c1003f43e2e538de985bb05d04c8f39646311cd8277442c4f3996b6f7758cf6bf7cae528fb5b655582f6b30f3b76d14d50008228960f69b056a8f8cd4ba6cd0b100cdfe48cbef3d3acdd2536a8f36a78636aa56f58396f3d331122668d3ef7880c90e7dce9640a738cb4509586833e4c6a84652f7f598442eb8528aeded9a6fde8732d163c253b66d9ea038e8196f87f23be0dd2d35f46cc10105f679aec14a5891b8f07eafa7ed0fc2e84468536d10b77a4f9c60b406ba63a58238afdd9b98db19a9737e5326cad7fc1f2eb2bda7264c9a09877e621c7b460eda8300585eeed02316275a73f7a20299ace07ee094948fc5d433b3a720d26a139e873c17553e3745497e0e8f7c615379f6b10775b53d22b05b8c80e49a9b2114bdd34b9c8b523f4dcedbdf757453ca533980cf2261da3a497e0d6430453448309bdc3fa7c7695d8e0a40c0d3d19f93ef229afb27573c3083604b46b46cebe7d3ea7c8b40c01806d72d90fc76e6cbbd1587a9c36133552ed674563d54086f0f5aac5743be31d65e211744a6cdddd51e123a6671916c233fd09b40b4f97992aa6e45bb3a5e4a45201c2e032d03dea78211bc118a7421a53c8d8a34cc9f9488f686411cefccc5895f1a3ad3fae8ff3c75d7ca2565ff5943528c9308f33cea5a6adf80895cbc6c22639509d7ca66e01492977679e8e583f3bcd3b328243eaa488dc0d48b1b7f12a7aa460a811be3f8bea08c8f96b5d7986c10453c55d3648bcc4fd7301c98d6501544b659948ae6cbee4087d18b236907d64cf4321fa40652abf4944793f9f22b972d228cb8ab7fc29c5317f5cb52ad8537640ab3ebc62520253a74039fef3d599f570bf24c6fb9eaa103ed24c555ee501583ad87527cf5d24df8e8e659d93f0c5132f878bad98b846ea6434e35f36c1258f07072766ae0a91c9231095797e4bcc5dbe9a1375f336211b36882b0606c395eb07301066ecaa12ddc6f8fd401581ac7f547b0e7a616b135c40e633c433808c0d42cd8b5c6fbd2440f475cf0b54268ec6d479aca76f783bf5320e2133bc8eff180927bd9cb28f69a6d6fb5dd08ca03be359f4cd3d0c76b5b4b2a0f7e0d8438a6a32e61f1615522bc5526373dc61eb6979fcab1af3adcbb4fcc7ff1c12f7b1bf59ca287363258345cc054fa8ac8441b0f09776855a4cb5e7c879e0cf5ab89582071dd520a7fe6ec619dba9a0d1b1cbc25921d855bb4b15d6692b9b49f1464878fc4e881451ee5c4dcdf728a735a56a3ef5f849ef39759a8176436adc90f0173371fd3b9ced93de303868227ef3c7c1477c2b5c69f25035a6e087f65328cb175c6116e91501adb2a6d63eb1671385cfa5b50dbfeb3892e4d0a0b482958742212d1c429b1eaea320277d0a763d50b475b05939aadf0891d804a96bdc2548d6d1d7dd318204825b56e991bc7520e8304289c47c7da52177b5791c0649470ca6c27f53f7de17ed64b90d06bcc0d0f596a6d417b6066ac26f477a60ed944783c7c8f39389f1819ee7ed7daa4392b15f3db97f48dae1eb823acc3b744dc3a992de43f6f3431f5f4d9d3b574a771cfde53c30306f9af36dd4dc4e4a03f3a0f35e80c2718ea70188b5addd426e53c4da67ea2974f5829a3cbc9a0ef7576f0d02bad369bd4967c7cdd8eb3771f6cb9b1dbe276eabfa76351c37b4f4d4845bf2737cae34ba853c212cf13934d9d7a15e94236c0bca4e8bdd6e551a19f238e8429d429ab4159a1c60b9e46292d8118870bb509573ed7294ce871084e743d1a707d8b267037b094abcc8c24894a51bf06c65826505af73f6c2259a024e3ab2e582724112eedd6147b46f6787b2382b475e7689744331c4aa0114b4b7cb19541226729fae1d69965fca3676afa4ac80fb9b6292e44bb41de4d8048171fbcc40f4caf987ccf9f07f41c713e5f71bfdb1b5846b2df883e8b3d2c1b75a144909a84761f7937cf289475e72389b28ff372f5baf66070ae6bf108bc153b9e8ded76440538dfc5011580bc94a06eb39da6d115c7bc8b74d839a1a951cdd2d4f6d0ef9d0b7bb1294073b7e1b66f4cc0aeb861f96f6b3345c7c5278914cae33130ff0f80bad1db02a9595631c3bdfef3549e402cb23c3060fddec69ed3e376442b4b9f928f1f2317a97ab7817a82f2f50c9ade0dc8668f76ec5865aa62c86f93e573a94ee89668c83df301eddfbcfbe0914f8c2b73c0b8e06c04b903edac7ba5c85ee31fdce3581e08b928bb2243c8d2ae059d9669cee92dc0de94d0b2d076d95f866db3080bce000ea2fa212844e0d89093e1f01ca299b2a5e347c6aa2d4b046f91bc308aafb005becb9ab7fd557b4cf19bbbec57e42de07317285b6e071276700d3d49cce8de4817b5ed512adc67e3fc39a59317dab3e3cd3a95ee1119825718f8dee07b1689205cdb1c61aa6f5db32b63e64733c494eceee185091f4aa48fdedee8f824a3cfa957eaa033892509721ae9855f80ff72fa8778f7ec477101517cb7bf4df2f5a2a3d270fabb392cee91021a9c1f0594688d66f6cc62483ef8caa45b7ac7b3d9f2d3ff5746af55619f8134e4de1ff748fbf506bb65d323ae1c1138cae19b4be282c0ebd5d8db62d688f6d93aedcfb4c91e97f043662aeed59a13176bb9c6c5326f435dfdd109263328bf04c2a197c76a266f7f7194df2bc84207f420de6ae79a7ce081c9168085d1dce9ac4749cdd267a9342d201e18f72a52cb1140b6c2c4c40d81ca9c6728be7554b0c0fc8927fe9dad777969640c5c3850d7727e66114730442a231ac9a7a3f1ec4ef54941af6a1a168291f9817d7e4dd4ed2cc50debfb69cc83592076f5155f24c352cc5cb7192426b749fa580277abc87d5a7dbfccf9886aa36d2faf6f02ad23cc501034c687593f98eebcdebd2da7eaa0a5c78c8ea769615bca0c0ce46e503b372ba1bc5042a5ffe49fb5becc00002241fd1683603794ae509a8f0491bf25fe6a8d76f4a2c713b836a472a3e2a64b133b4f7f292b322a1726c17c0fe2da69306ccb8a167d4989554148ebac4ebe5b987aba8a4340ec15d5222bd451d81f5a18fbe26a66977fb36766efc8508a869ee0e8ca6483bf09aafbab25705c960c77f2dedf71e77cb6c05b3d82a32d770bdfc4ef0b7352dbb446a1c6fc7b033aec205d655a6795070c062c10e11ac9e2282c3907d35ff258002d2245f21bf81c69284fe7421a5c5186525c59737206d548ee8d16f24b1c109ebded0d187e743e05f49ec1e489f8727326eff3bc68b34da7644762dc652acc27cab330364b5087adb5a4304bdc3880f76933f5f92fe5d58c0f63dd9b8cdd1256dbd6bcb0b56924db4e6d40f9faadb35a3abc7160349b40f9b6b86d2f0659bec884a98d789f7ddf101eff5c88f143900075b326bb0c227954bfe1982ff402bdd590367196542d336fea525dedceb14611c787f8ee701521cca2aa8a6c0353544edc9b008a4cd0d324c0d3e26fa4d4419c35fb62f396dd70ba8f9883d822bb6ae05028fe44d25a49428436c31a4b67ccf7de9264b0647d7f5fc7a28d3fae78acdbb4534e0aefb99383d7f15fa4ebf6d5f28d2d07f178a7db6733a33e2450dcb34929db53c79081308564cdaf41108677d4fa679dfef4c23de1fd77456ffafd1f195af7e5a79726097b8638fafa03fe5321f32d53332cfe5abfb8e0dbaccc6f807d53991984299dd248e69689ace9332b28207c3d0748b87da05d610190a6adf645b2e989ec775023b5ec817212f9fad5c2ff23ef40c24adffb2a277fb34f471ce3458ef925b48e5cd50e77835d2eea52bc35f778722710935e56831efcc87e7692fec9629f2241a9f43d5b4c50944aba9a761e29a4d33cdec90c1be8910adb184710b8a6c533b78ebec285fcb6dabfb63e9dc8b2ac65e10a79b77ebb5f3ed840952ad926b41e794db02044f0bd78513274948ea03f27a1e5f4020d864c23e26a457db77852e41056dff234563c4519360a6e1ef177813d11cfafbe","title":"1319. 连通网络的操作次数","link":"https://leetcode-cn.com/problems/number-of-operations-to-make-network-connected/","question_id":1442,"issue_number":81},"79":{"day":79,"pres":["二叉树","递归"],"tags":["剪枝"],"whys":null,"difficulty":"- 中等","description":"```\n给定二叉树根结点 root ,此外树的每个结点的值要么是 0,要么是 1。\n\n返回移除了所有不包含 1 的子树的原二叉树。\n\n( 节点 X 的子树为 X 本身,以及所有 X 的后代。)\n\n示例1:\n输入: [1,null,0,0,1]\n输出: [1,null,0,null,1]\n\n示例2:\n输入: [1,0,1,0,0,0,1]\n输出: [1,null,1,null,1]\n\n示例3:\n输入: [1,1,0,1,1,0,1,0]\n输出: [1,1,0,1,1,null,1]\n\n说明:\n\n给定的二叉树最多有 100 个节点。\n每个节点的值只会为 0 或 1\n```","content":"096221c0597d8bd7f7d11d52235eceb6a3298eae2e3e8635067467257d1aec869d38e07a6e89b73092e62bf8296a4c9732c7e64065cc90256c46907ffeaa78c83ab8949812343b76d1fb4b46541ba5b0b22ba40f74538943c63fe53f624a660285ce49f581307ef6accfecf850354d6daf50bce6beb10d46a428316b9161fa4cfe8c3b245c7a407463a77da24ee422b46e6200b17a280d7fccff0478f5a0fd0a5b761f3966e8cf206a622e948219667ba3444d55bf543d1ff024a2314da34e0e3dd84e93d0d719caaec34768e84d7635887ea3791555b6ec53470425e5c3e35a48717e961c22b27379e4c6752c250f5bcb80bc641933a4e0cea445fcf9cfcd2331991811790dbb498eb7839e07b2d3bc74352fab3861b83adae08e4482e205a1048b410a8c450ba01bbf3f5f3994764ae8a31f59d8c203889c15b7eb1dee7f3a87856a078e67084ad9e64f9989f601c8dea2aed8caa7bf128d648d88435d70c180d0f776988475c7555962075655af50aaccf518af5b2e330754ba43a7600a661e83bfaa056aaba66a2aa36f77bc7521da6d3497f78713c1802d5aee32314d0588a784cbd0309a05d6c60f1a82c4d17bcba5e6c2a96fdf014a0e29f27b08c6850bff3167e020a06c7aa7fab5e9644d150ad955aa97f5c3deaaf13153271267d446f0582b3299d2018ba1e2631e2729b4a37a58b6bcc6048beb20ea62dcc276fc08cfaa6460956ef73353c47cbdd3e11b00831d5522efc63be7c70f0235746c56f10879b5cc99daa261d6ce7228766dec92a7f3879f05fd4204ababc7a8440e1c781f08d82d4124b6601a787d6e47e99fe33dc954988d20e8437c9ae02d7bf05ec4c27e639668666f632366f12832f588615f2c214e766961829ed13017382e7b9192aced9707d4b6b6fad098599a566601c2a8e661cd72fa2286151cf8d0e0bb0cee0daa78addca2631b4f2ab7d1f8a81cc7fb4ffa40124e3a7ef802cbbc5959678992073a32b128f0dd3438f14ae797bb140d4158ec6170dde21344e249ae1b16ef9757585401e7966f0c614e272a18a5b4ce75ec7062377ef6ef5acac566b775141cb5d208836488361626d982160e41563a6fd243c3c0690c4bf95079c6313eed0336040586fd75ce0426f1329c5228e8dbbda89d9a8eb0ecd02b7ca88febe58c646e2eb38ad295da6ba4d68600fa550a2b3038e6e24dba4c7caf49c73ea0e1cba5e78980ec109b37eb9eab9516bad1ef8a320b98a46ccb59ef6adb4943e21ffe8249a51d79e19f0e9e93d206261bc38ecae0651b3ce1b3e3fab9ece5fcc2e076edfc261be924f5367dfa9c6dc3a88228dc7b76a49eece7fe2fc67903e228ef42479c7198fd552062d1ffdaa5f0e6e4e1fd7b48f5b8ba9fab17a03853d161f7f08ede65ccf2cff1ca7c44fdb416c3a37ff190c46e1c66e7984f6bc5fe1c3e89e6ce8e423ed2fd5dee6b9c25ad0ade327b5400ee126b86f604ac1a2046eb522ad7075f9317379bb32438f5e9635a646ba0a8d09ff4ec9e4fad0b442c66c1e823f857175ebacb4d9e106aa9f3e52b8b04605245e14a606a812d2881bdf7748db0b6a416f3c42414430eaafa43996d73921b772efe1035a546025862f1fd8638f90c172b1f46dde1b8cc14d289de19574e8f6fb37d9de1f580701ba11a46a40b526b001c21313f5e7aab90b8391b081f90e747e4886e715a010fdaac8e7488bc4808b8f559bd4c71710fe5976f89617d8c659ff009ce1533633aab1da33b98f190217e907860adabf2c4b28c5c689700c003ff88a288086409d65c4331b40cbd9af3637e9a86436085d001aa81cb27449d25483a4f79bad0c4d91b3b327028387a081bf24807e9059b470613ae144a7469115d7329a8ae96631a12c8f19a15e350e5793255f9dec9fdd6a9fa41f0afd5118a01e817ee5ff21b0cababc9cea8f513778ce53e7fc94ac59388311535c1b446d0cc73639f7f7649e538cae26414b14e2dc3c28a9fcf5ed133e330dab90d5b4155d3d6cfb098303ce8ee5aab6a88289c382e1abff2ae6678e741889b967bc6d88d7d99e563b409f8f505cdeea854588c3d787642d92ad3975528d14e8f6695322173840e14bda48b99af85054e5890ccece2cb21040d49aec413128e0b97f394800ff9d665df5304f0e2c735f85e32d3cce258491bce72df54d6401a72d21f579048a099716ad0fb06f3594d944d9bd7dac0a60a4a629622b211809e40e326be341a340f6d65624c06b371bea0da5bcd1ab434f92bebbf98b0e3f9a0256b62cba96c7715f31a655ca1827c829837e5b3859726861b8f9e46efe10f94cfd06859350e479fe3e4ecabe36e65d176499b91531b9ccb56da4cd7cbc8cbe0fe59825137e248067253d7309e2afef5a505d308f6149269b58c098299a965046bb258e718627c12d14e89041a92f08a42816be2ecf7db26a8e76f1184a559480411db64f37237fbc0bdba963cd71027b4e92bcf825117d5476bf2d0d4915d3270ca5ca295661f1abb93914773c4b0ce24a977f15458586dc7916ae7019d920033bbf436c05f2828df969813c1877fc1b3b99f5cfab8c814c7a4a52896d6f08d8589915054e6f7787ceb167810ac018474e07a23a43d28bd66e1cf683e7b533da11d037f6ff996534a469c373f35ba6563d7bbc165b00a6c502bd8e8b722517f69b163b0b4cdbdb6cae39a0fafaee519e7fe70790c608da88f76a79e252922c47a0dd4ca92d2a833964f5c053b9890e0525719b9a3ff59848b211516f8a4ed6cce8f056f0cd690651a5ead3d59d80a19192f7d2a46b8849da131ec7a6697c2ac7a1d2d7b0d6b09880cd7bf543dad9cf6bf1ec36a4b93f3f5c995b386050975d9cf2b4831f9e328e367ee5131f1086b2e119d83c68eef3ac0b239c029cf1b8430ba4eac6b63662059d3fab3e38503de0dcb9d3ec1bc290f6904e77b878219a147544b8836cb0f71ced89c906b2a659ca6087446dd1f8cfbf1b598ef3b2d5f227667cdede3c2b83a76d005de182af8a8f3f55622d5aac7df8ffc958bcbde2ad178e418ba49f6e50b6f0dd2f68a8591b38729d48c2d29307a8bae14d04a53d825e73af163a7996b87e34a98684fde929f7bd0d9a79c196e5cd17cd76d91b1359163df03a8a0282741c9eab6bfc4e8848292e9813cc1e153f2878f9ea3198146f9ba8b559be5d53c4fcd0f275e4ecf3242824c4388ba8a832fb34fe3e906987cd6eeaef768f9e720f293f75d7485e428954cf0a0151b7a731644a46e697f0270e52c928455192573049f42c8dec7ccb0b33a569dad0ef294c81272c35892d1b135939a5b0e1b4b1dc365d067def53341c4449292d1f359decfce9ccb0b3009be6170a3ccb6d9d2c7b43e9c2e50d5291ab8c99d73abb95eb03b0659ceda818cfaba1e18f14841d069bb929e931e891509a597a2ca7aea962e11306ff8a33660cf8f71b22b503ecce8e08d810a529d6506cea468d3ce182ed20bb8414e3e2bd48471437251f213e084638b8da8ffa4092de324f4695882f86a546f6253122c805860770a271b0b7e6e5ac1d36d5fcaf755c3c1ce23708e1a48467b60a3ff0c35cbb44afc9e6e9fff0b3f8ca326c59d5c0f283848daab804f1cfc2ecfe4d10a68c374e231638bdc3527547d0573653763741da532376b103b0b50454e3e139d187ca073bc8dbf6a918cd4fe1500d93df79275a8e4ccd0cf23cabae7267e7d21b1b5ec1428f802d37372eccb9e332c596975b05be06717857a4b94eb326f2fe85d41dd551e06c586774ca7266d2103aa37f97f3a812756119253078fcfebd9b2e2a6abb3578814fe075d6772cf3cba46cc2b1f012902da8bf9220895aa497a2924eb44931d19b4786519b6cf44ada9d399f1dea09cae74fb530b10b0300fb88965188bbad4ecc1dc8fb80d9c6c5e07d34730b5cc95a3afc0e290c37f13116ec30f6c546c1dc6b23b5af0d8cb8c0af308e73d16985af12c109b6a73bac33873fa89c0a76ca66cdede4b9899741c496457f5c3881fd91238143b94f12fc106be6d738263ae9ff0c72a7dba6722a6350be8c3996ef3977e74cb08d0c1c6f666b99bc4826a998268011979d671ab2cbd7cdee4873b2f346cd6da4c52cc7ba07b000351414f777a83fb809ef997c6c8942908aa2953cadd19d9524c29c19a40ddbe2925a51591ee03f71c41ec8efca292b2cd123e3d7bc061019e5ec204f73c60b6631e9baa4e5c75c5aa9080b092c7af27640e0726da7c2d4a9858434544147da8b9c8d4b61deb3fc6b253e3705ec9272ea1a29de6779562c28e794e4e5406b16a4ab5fdede7b54bc5de063cbe675c2badff89649221e83b9c13b544aca82e468d546384cdf45dab32b8ab26161a3d591c87f74cdbb8f2dba5b3ca8ebc5f2755c44fdd6da08aa63afd6310b1fefc11799e33161fbe123c64644624290b3a5daff6bce38b0b61fe8a66e62b378def0e85803873e7b2ef9d8589f91b2ebccaf73f107c2893a5a577684625de339ea6d730ad4f2ffb51f4a6642a3a639a7886fbf377f5fc4beceb92e8fcf420ef7d955bc016d40f9b159caad0bbeba09a733210d40472550bf92f2748a7e985fa4b8342c37c227f5086c725007e1b33969cf731caa5b73de001c2e7da13272f612bf2e53e14c70b0f24cc0fb0cf1e40d297fefa6adfc92a8ef4c40142a9c621508ce404971b6a881a5cffa9bcfed3f69bbca12032fb421b9a8f2307d460b313f78983a7b1502668cdc518712e83a7229b3d797b42a44c61f41eb32bd805a9116bfa50c2ba0111a6255480e24987429bcb72bf7a07ecca585407f53a5162c92c50ac83da85b972f3c84bf7608f73a0a1e021edfedf17079f46bca9c1ff47b4db5bad10184be6bd13c87eeb83941220428916b7bdd81511b2dbc5d2ce0e4d981f637c94736a78033b7bbc5e56e539be9d4b75b5e194bdddb1ca86af0e989794956378eda624efd50d88250731721af8fb2c21841455dff9a1721268e1b1d76795846b4cb8ef5282cb7a736c404c73c8e2795cd9654abe9edd6a0c4325190d5b57ea6b73e0f5a5f739c48fde3eaa5e77420f8af4","title":"814 二叉树剪枝","link":"https://leetcode-cn.com/problems/binary-tree-pruning","question_id":832,"issue_number":82},"80":{"day":80,"pres":["剪枝","回溯"],"tags":["剪枝","回溯"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。\n\ncandidates 中的数字可以无限制重复被选取。\n\n说明:\n\n所有数字(包括 target)都是正整数。\n解集不能包含重复的组合。\n示例 1:\n\n输入:candidates = [2,3,6,7], target = 7,\n所求解集为:\n[\n[7],\n[2,2,3]\n]\n示例 2:\n\n输入:candidates = [2,3,5], target = 8,\n所求解集为:\n[\n [2,2,2,2],\n [2,3,3],\n [3,5]\n]\n\n\n提示:\n\n1 <= candidates.length <= 30\n1 <= candidates[i] <= 200\ncandidate 中的每个元素都是独一无二的。\n1 <= target <= 500\n\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d84c39b3af36d673d7a41596f265686992559eaff043a04b97aec035fdd67cb892950aecf3a3bd13fab6c0a78e61bb9969a1d190274f3c7474c431ba3825db633c6115af218ee76a234032a6e75ded9018c9e6f1dd2e5b8e4a2232d2835b837c1c0f1cc0d3df13b5e03ac109c58b9d639533b53063161c629ab289835f826736cea7479a9dc0b61847be885f21644999982aea3e262237a561705df1d7d37a8d4d995b7bca43756966a34a90d99b71ad2ff504bca47c373c1ae44e47937817cb17d16579be6724ee1930584ae0adcf0d55ce0cf3187a16e309ceefae87fa287a53f1932f1ad8dad4deaa2cecb2935c60252231cb1418cb783840bb7d8b60d106fe775ea73cc5c0f49cd63409e6bd9ae4160cf0621ae02be3d6a0d964349e59326b5723385482f15b7e11fc25cfe4d6ae1cb046e2366d6cc669989ed02edcca280fccb92b410a07e8d88549a9119092e1af7794cf812f4584903547580942289ae0fe91b0f505849ecfb7c2149e2fb75954f5159d9ca4f51c372ec368deb5abed6100a62867ded714f855e3d2e7c91e92b55146ca5658ed4796992b09b76aad2e4b9f56f7390a4f5a8379ecba19d8512a2c3ed3aaa68789cd0e7aae2b9f58610a43852170782a87c8ee945685e8c19f6207231d28d1fcbc8ff257e3e5fcda2ece911d6b924e3930ca530ffa813f1b7262001ce2562e60c8466f8bad1e8f48fc0aef59f4263b3071b868392b7e0f225d9f6bbf9a61f51ba9e894c6db5bf10174862512bc46e83cb610f2e44db595b4279bcbbb8d8c7c5586d257523fe74215e941ce80248974996f4272b86a21d0dfeb40b6ccfd2c43eb5abb260fad5f988a28dc34728b2e6af6d11937b1146f391cccccf6148e0544033fdd0985a9a546607c2ae977cc136b761cd4035d2057e1fc5635119d8105c0cba90dcef1d7b2d3cc85d2bb9dc2a451f07cb7bbc7616fb5141b028b6feddf816ada30e576bf4eda4a8f8a73800e30410dc9749420808f14f4fab129b97cfab5851b687aefd8915a3261b5eac34ff8dc1b94976857c4b65be4917229dde13ba69ab0ad2ae438b22026b3c3a2f9278fbe678035930eba90d86b02ac7a1c0992cc422cf2ee26be54af194537171a8bab081bfeed232544d3952cca6b3ce8f661d1efebee7722b03cc35cf86dfb0d92e70bd3597ef189d6bab776c547e4365053bfd15c90e084e7aa85a26292892c92a09b87bbc61b833c5a03983243b49a51a77d9830fab98d2063716e08cc8da5a1724fcb3e3fab8e4faf0d4c975defb270fd324ff3476ddbd884e045b904aeab9481f01023aa857bfa177fd5df0c341ae7563dee4d8b093c7c6aaef8e98c80f00c710571c1c149a0750ca4a187330de6cdefccac729d4f03a2e7ca6b11ea09f5f814a41b9fe6e0890d06c6eac8e9f823d79cf9c32e529d508fd6acf5528617481240dedd158cf2a9390480655db521599757fadff7d32aeb06c06327bcdd5e0f595fcf7118f682b1330a8da4e9066731e8aa50ca55907b08a8220df54522e2fde2e255ee96e33c2c5ec12d2bcf1fd2eaa9f0c531915ef887aef267bdb4b5246ae0545e2514a29589c89a251a604796f3c224777b9ca17dcb4fd1f7c76837cb87d9cfb3378828c3f771d9e6435446a580256b3e776bca9b8391b0a089eed5fc1897a6b56053adbaab77aae924a029bff55804c756b01ee886ca1407c867d91e633c731146e16a41fa11995cb842d4390757a9ca9eef3b28c59688928ce1fde8f9a8a086402d46c7832a50abc8ec06c6c95867148479709c5f2cf402b9a45100c0c1fb6a89cc453450d3d4d1f35742ebd110f9e44bb305d2733f8d4c16622437122a7ae8a6f1112c91309639d67ab200f3986f8afa3c1e58a58affbfb67c924b45ec23fad2474ceb7849999866c63c45191bb9b73beca9f48aeef52568f1490410ac14d3cf24bfe98f2144a893765fdb4d2bd6fbc3bd164d802c54171d4a63c52265050e5c47e15cc019f72b818f1a4d670736bada162f20c7642fc3d3a09be566f8254982d79881b301686ce0af186faa13fac254bc19e75c141835afadae466e3851a3f170f2e4092c89d53137a3b6785e7fcda10349bfe448962274c2680ab83f943e2c20628559c13cace3b5a12bddfff54a97fe40adfa3b64ab4fd649e3b19b4e12b2d84199d9619b11a2e2c071993c1976de56efe0149a9a78f71c58896ada0fbffa3a920b914405cba1f8745e87fc9692b734a2b634aa9a8a7020687f3e00996898d315d894914ef60796215f522c6063b8349749e7139af3717f3cfb9095478751963f6af03f29f7f568dff1a13ec518b224539316715a34ea6f274b281db951da202da773a538534c32fb036fe6759c00f4526b6e1b3449876f4aff6dc638b63e08c49654fa45cfa14213118d6223ca8906c7bd387a4d4148861ccc86b05327f6285389d977269d34021c49c029eae475a020af6f6ea6c933e39afbdcb3b5755d0955b5c52a96ff768da85eba2265dfe5f93440abdfc0320d873e0e0ae7e5e1a98047cb054135118b850dca7875f6224f94d561c470a647584d5497cb9847a81d9ce089842cc53bc8939f5eb79f71307e3a3f397a50ad4fee780642494f0a417febcfa738af47750eb52b3197794f95b3337c03a1be963a4366029280c096078e9347a4473efa33abf9097d7dbdb3ee8d0eab58eae456eadf4ddc5ad77fd43590eb04d6e8b2c520a82a0c306de8b714054b4edae6cba9f016929cd86615945f73a52ce724b1023260a18fd82b2a031e03e758cc8ab7f1d3504756b04884fdfb7107cbb92edae4da53e36d4bd93859c9986050975d983621b37b2e538fc66b85a6cf10d235035ceca9ccbb57c8feb379d659265842dba1ea3147009144bd695917456ec4f9f271de73670ad86afab57bf4f499969e5c1997cb821b3a96139096bb5a9834f2bd2dbd13ccb17690f394f33aab4c8c7c0cb045a6d597fd6e71bf41bd4cd7047696b90cc1a2b761a0f6d5535444acd2fe871d8399d2323aadbc832380f6e3c7a1d85404cd6b8b88ac2fb9318e65c0ab9057cbdea152a6bdb799a787b9a426cc2344c5d3406b483d532cb39817220f066e863e8237ec32f46c00622434d13721f202702e13e7bf1020c5a6331f060cc685d0cb5606330b79a7bb0e1f6ff4fec8845a7851b5a4a32f26fcd7009856a8613555a7d8936279d75564fe6bb195bed309e7068ab9dab9585be79e8bdb2899a5ca57350df8c939c8b0685536d01720c7a81f0584ad33b7d2a83f620d16b366eaf471aa0d48d9db061b932f12e75fcdd688d3011156af118677f1415c1a1a62ca5ab41474d175f1262946ee39e2bda99694519a94a2adf31ff9ed40b4a104a5010d7bf5cdf8c3ae655364b14de03f2d72270455ca4261cbae055017830d7ee2c51e0148e94a549c2ca8081ccfa2ca19d0b27c71245d7ab5be14fd2faaea3146ff2c1bfdd14f52504d12377767d15ade440b932d1d74663c491ebbfdcb3cf0aa2c6e2f9c49cc3c8ab8d1851bad05e02bb4e1a57f7f17a909cac99ff18378d990f2fd13803db5614feae7167a7597fdae9eef287332128e3c567b30b332ecfa20ef726a0e5606ca2c685f1c9f98bafc8bd9c3ff7adc48de2f3c398b4fbc770573b6fa65699fce04f495018d19b15ee7422a8e7b857456372862d3a8bd891f2322723547c1db41513b12f26f07be30c71dc5cb311e3c65a99e42c2485dde2529dc22c8a95ef2809b7ad61eca3b6ac61ff18abb17cfdca8c75c4eb67081f32323a05462ed34dcc0b8cae9dfd2bed75ae32aac2c2a3d60e4a0efc813c07c1a5c9b878fd06d3f33a9becdc774a8128351b3e65194e702e8058c0cef1768eaa7579b1900c010c01345b6a5c6edf29dcaf7d83bb3913297d2b23497c76e5d789e306a995d8b9ce0d5bfbd83c78121488bf1dee3ac419eb62dfd116a2aa311bc9b6783a4b5b8d2ef169199a531c80b749695d335000d97de9bfc1d25f18e642d670a9f622af645c722adda733fab247fe8a350f1e8c1a52e5d940d9264b4a6da9777e4671be5625eccdb19538ea2d23c73c87ee6ba9a4f193235398b247f454c9dec7dd8fb2f6a26cf0c31e2a6f296714e0d148a9af094bcf74cc97cd4046855753c1bf35b15e448a3f87c1520e6129426342be8c1b41cf727c7093009177cd18c9e9c06c3f8bb8b36c2510795f1e0f5c68404f59355aafd533c157210a0a9db44a90efb7d313ab3bcaa00df01541c86c62b3cb9d8a3ec67f98e2381c480720ab370fa0fdebacf90586815054f7291d7fa7ff8944936cac72cf478a7fffe33d4786492989dcf75aae29dbe572164e3f441591f74589e3c5f1e1f5998682593b55d671dd79bcc2c66f832657f4acab4979c43a4502be12622833140a340d754886f9bbb78a1527a2dd00fd01378d83479f922412fbe6b7c7c0cbee1b30bad6f7315f35219ea6a50621463bd73be9c58464b15175b71e8bf42a2a686e946fc3f9e07ab6bc43f2aecae4aea343bc29c4718357db058151c0fedbadb0a0ba602512ff1f3a1013fd2504538de985e9408419dd77647915c8dc5d121b6578e9debb3ccff6e933e716cbbeb1506c29763ee4fc7878cf160836ec03a5cf1903c1d891fd6fcdfd1e84ac44d6e36f17cac6427ea871e9e971ef04eb83daba80651e2621d9f245bbb61f73cf8607a23ddb081c1d263ea2dba10c2d8ff9980d60ec52daa2ecd63bd0ff56d12f871df76fd7ee3dc21920d4a622e9fa2d24f42587014db77dae950117dfef9f1aa7e3a449cdd1162f5f6c4bb76a528d70f84ab20c8f8f2985f7dbd89b33d15c6c0b268ef0bb152eff97e12f42910682446a656c1651819c497845ab8c6c75681473ac880299acb26be1838a889dfe7afdf320c20172dbe473595d34261104734892327c532afae10168fa4616cb3a8c80ea9a912d13a8ce4181d6177a58a38f976e741ac15830c9d20843943a447e1c642e453b4e2d81973db7ca2e509c4a48ccd9d79f9eb55988ac2e4c163083604b46b46ceba5c0ec638a40cf5b40ce64ffaf7ae687f446d3a59e08721b6a9f301769112e2d4656b7630afd75954a211a42aceac0de09696e1b33d4722a51b4d20ffa9f30dcee6647fb7220441765516155680bd4a18345ba0b8d7a1fd035cec87a93d3ccf6bfc90f1ca8e6dbec51143fba84d1e9266e91847e2cb01d069d102922d97caa1a3ad3e4835fb359382da248ced17be615d4ce1337a6a0c0e3b0dafd107b0ee40180cece8c117235bba80022d52aacef94e3cdc1d2fc93d938083c2655bf2dd898349e2c0db18f020f05b1509891b2adee4097d6c8602307b705b67d4ec84f01ffd2f723c7848f31fe6163dfebab0a8cd5581cd5825ea8c6271a58f2a88d2d616b69280298ee2476d64d11aa4c6fb6f0fe60a9659110bd5c15d1b89f5179f29d4de2f2f370f036463a60bd36ee8a90ae44a6434e35ba2a120ae56871736da3b569cc62464bb4f9a7d39d8aef635f7d6b11e84282b0606c7c12f93501542b87b42cdb3c9c8a4f1c00daa74cff98f458b1748a5d6d7d13684d8ec46cc5a385fbff5f195d06e0fa0f31aa21199a8038666857e79840d6936e27760355f243029f62199295704cd741ff2eba3fca175d6faca8effe88b3d10deb641fb34baa4b5522bc5526373dc61eb6949f0c0f15fe1464db2091632efdf6fd7081ebcee980c2f1c060917d210ffebfc6aaa287fd0203d9ff401796613637722071dd520a7fe6bc34dff6d3085418f325d6549e15afbf5d299effb3cb0d3ad3ca8af0c4521fa6deb89b3bce320e13f0e6569eb4f3de17fc173c49ff864055732a1f95f0d4d878eb66d4fb73e17d2c44328cf1cedc644d5769183e68088d8573ef1859911653956e653ae20d5b385cfa5b50dbbcf2ca651958034d62586d1313928b29f4a6a75e125bd6e42cc243094466d7dbf9b5da118018d3f0831dc36d107dd3173a0161ea05cd5e942947fe0828d54ec4da0ffbcec7544dd351df45a8bc70f68a0de917a8001e8f53c6d53c25393c7b7d66f559a638e95ac26e783c28ca7468f35117905a8795f431223fd9dbc7a1cfe257fb23a4c3b0448773ac14f75c216031adfdd9889f36e632848a0182404df1ee78c707c4978533275174f6093c19e5700ea30ea08967ec5108f272a287464303a3cbc9a0ef7576f0d02bad369bd4966529a49599375f2c939bb1917689f0be0c4be9510f0d080fec0d719fad58bd48c8129b02a956ab2e5aa8473486b4e5eba888a04bb08108bab0739b0fab0f0cec95079e146c60c0519b42e10f5131852d04ba6f6c1a270f040d6ef3633d76f9daabd08c69aa4a03fa52ce2035615ab77f6944208654daed4d1f312446458ed8542618bb284179d6b465f069c57f555058d945451b29b28f000f2873b1afb9d43590ea627bc4179c77a5ff213508bb19d35a91060a04a1ee5c18eeca619acb4eb74f243e5e27c6d5571d08a5de8269c2373d1056a11fba9a84761f2d588278f83cb47787e2afc632b4baf72d6ddc088c01a73f3b9e8ded6f2f46738b974056cbb4d8e93de7d7e9d758c3a2b33dc270bdb21fd18387b4cbbd914d31f14d407eb7afe3221fbbe7c56df926622845988b750aef0e28ecd269e8703c0b1d8006bd9aae6e53636c932ac806b23c3060a99bc881eae47110381b9ed9873c383da97aeaab27a8a0d506b0de07c806df37e85661ee39d37497e878f37cdb9f68c270bd0ceacffde5ace8658c2173a0e8a13e1ede03b6e22ee88a1bb142dcb7190501a87cc1631b8dfca829c9de3bc6a038ca83909beca80da424fb30990801c12a58e3e16f3f0bfddb8b98eef03fedcac1b6e7099fa22117512ceff57fc4afb846ff85defeb914664faac7faea53f83ecc271f35001446407071170414e6a4971b43b5f05151a17cc9fc62cdd25491e7b18c79dee63b19820759e6d2fd7b61f3610e9e524ebe1e77ae2b33a75637c484cfb1a0fb4c4c44f7c08c8ae0f065afcfeb5eeabd6ec631472b17a6975380ff72fa872cb6be0034555d56ea954df2e588a3d279e1cc132cbcd4564fce5105f221de32ede63f5314f1c4b0711648552c3e013dc7dd4398d03a48b6591b9b418d0856c10fed17b908d889980e79111cfa84dfae182738f626566d3edf555f241190723ef7c8ed54715fba9dad176f01a892a0fa50148d8bfbaf3cc76203bdedafbbdce8945055f930fdd623e85cfa7f5cad60690eab665d45180f3d938f780ce16cb1a7e6a6973180f802b6ed73466903b7254b1bf9ed47bec05b276c68c84c1a019bc1e6a1bcdaf0cf6fb7d1e9d5819f83b1a4dd522a6658668169e5d5658a8ac26e571f2ab8fde01376840380693d845a44cda2b969aa989133db03e521d4f9a631d616f8bfbf0b6bb8effb27465ba240a967ea2bc2c410810998d3a53b73d1816babe3bac33ba70617330e3b1a62edccc05daec97ee89fa78de3046482c037783073205543b6d1c6d12cc2098691093ab00051e41e548e10f207b26e714cef1ebd5b89203966c3e1dec996c3a999c69cd454fd9f4e48b5ccfd1449cc93830c938fdc4b4cc471de42e10f0ca58464ee2bb0d50d1be41e343d8ab62b34d03ae7686688811ed78f9aec2d6ffd482784edd0e5a6958b07e9ce6f2c33f25cec3015bbfa6c55a18794305e69c4effe96fd08ae0f4bed86c032a98382cb8b798ecb86a4f90c9d1c1fedc5f6c801feb70252406711fd56b15269ec9f1e8fc982d97098d6ad88f8d534803d6c8b0de7d3b070757883dee6eafbd6215d280bf39d2c20a8242530d127a223c981df7ea0b04ae85609f9c4bcc14f4d33349e9d73b06c77c1f44f5de6504a6395e51903211896d16a2a12e1a7203895103965b4b3e3b795a610b496d70fff263f58e5a281e76d465d70108e18a41e90c30fd1583ed63fdcfb53c7b349702a49b423249a31983b110989b50ea2c2b7e82ec8f3edcae5074380c2f9a73309218122782eeaf79ddc861b08c05fcb343ca8390534af0a119855bf2dbdb0c6fb37a09db18de00da55aa00521d06e","title":"39 组合总和","link":"https://leetcode-cn.com/problems/combination-sum/","question_id":39,"issue_number":83},"81":{"day":81,"pres":["剪枝","数组","回溯"],"tags":["剪枝","回溯"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。\n\ncandidates 中的每个数字在每个组合中只能使用一次。\n\n说明:\n\n所有数字(包括目标数)都是正整数。\n解集不能包含重复的组合。\n示例 1:\n\n输入: candidates = [10,1,2,7,6,1,5], target = 8,\n所求解集为:\n[\n[1, 7],\n[1, 2, 5],\n[2, 6],\n[1, 1, 6]\n]\n示例 2:\n\n输入: candidates = [2,5,2,1,2], target = 5,\n所求解集为:\n[\n [1,2,2],\n [5]\n]\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d409c9741ad6f077b58202662640f83ed5a758993317750843eaf0d2fac47a3d33d11f0f15565c67ef650633fd97fe286e25339442dc7a529560c4ca8fbef04f95e7f25d15eb065df4a3e4b2351a648a54a22f51deeceb6caa1c0bb85fdfb3f8eafc5b7998d3e624975f533d5ca1c1081ed3473173341e4c719855c69ea63144284fcca80f508ab0605af99bb5e662376320ea9d740f1d4ebfa937b1d7621a8eecd79282fa75ef6e3685819a1fbc9438268d2c902862f1cbfee08a0f5b87af504b09ca604739da16c43e8dae40558243cdb1929b67373e4cc3d72330c58c186fe416362e8a24b63b0684d0342c2df03de8c0775be4cc3cd1650f03e13419a878c6ca022fc378d9c9b262d0e8c70d0e82f0b9840726745b456151bf0287ea7cb0d119ef362ceb0422c0c9b1ea17f81caeacf226e3d78dacc515c4e01890c26215528497b10128d638cba505c6ef182c5dc77a39d79dc6b5b4e3f5560979508afad2cfddddbb6ccbb39af28a7a10179ba31457d5ddcc373be4eabad3b88ec5ab6c6140d2711e5a42e78e731124704a0a6426f4032ad16d6f7371a8ddad259e5a7d3d9a845db007d2a2add4003c5bae548a6a09c02c63378f8764c2a03559be59c6af8d1fca989ac4b637927074bda60d251020e98c4338192e0601b2229a386bd9b38bdfc0788ee1ee165f6c875c3c75d0f65698c6cdc0c846bc6b6edf0f46d81849ce2580eed1f43e093e0d4d99f50fe9adaffef9ba83c766acea2dee60976285f35b98c2c948c3911ba9374e3b22a4525b69ade147ebde8f39ca219a8b0b762d94589fa21f45f6186fe3011d6805660b7d1717e6640337d6fe1307ee499751d53ababdabe8d0a7c9137444716141a129c0f729e6a023fe0c79e44bc3c7b1dceabe670d41ffa19f1176dd20e0304e33286bc78c7c1ae646a755b8c1a6d3e960c1c03e44b454ed828c453a881ed430ee21bd8cab37ec6723490e16b9d303407de9ffc8f5cd3c8555881b9190efa5f06f253dadeb66decf10b04002602831791bdce75fca2e2ee935476e6616db11bfbacbf15169442b56d866b1c9904fe926b44132f57aa442df7818c837c1c8e0a9a00b1b30923aa11e17e2eef6b58ec6d46b5ff268f905ffcae988f39e4a8a6ebe64a02735bec92779535268caaca3bb91e305c693baf9377f22f64dd0afc44e8fa81c0dee3e5cf71c32a8bc6ad29c00a94b598475681dd30db36a24eb3155bbc4fccf237a35000c5ef4ea7f88a327571caea81f41c6608a9f3fab2cbc7b084f0ae27ebbf7933b07fe95917fedb3bf7c3fb268e2658dec0ef93962e8f173fa25df0151fbbc47544ddf4c175fef28cf1d4d9e0d66349d6bab4b6b114b72053d154f5eab0d44bcc2e4048c54b63feb51ec2945bf2bffa632153e487496dfeff11259de7f3a74c28eaf75ae0891fac78bb6f32787801df12688dfc069d12e5f964510bf60566ab1700aaba0d04fbfa5b506856710a7c9dc4fd9e4cab0b480567fbc12ff0701a798ac47e95125abffdc90f65b604115cab274900e11b6fd38c8c3592e0d6a14a8dfc7e6b6365fbc30bc04730d22f0b4ff05f72993b77402eafeac764c36e47265502d59bedd950a9a98165651fce57da3cb3aea4b00549827d1fb865316166472b578dd476bc8eb52105080da0e542cd8b4a70573436d795b774b3b44810a9f559bd4d794001f5946f867f7cba4090c20dcf393e6d01bd10893e99db982f59b97965bfa8d5cdb28c5c66a008ce0cfc88a595047303d46c52308d3cbebfe16c75a3846b478be631a9a1c92674802759244945a4d2e5c0181a157f083a989bea7a97ea6fdb71a2cafcc6720e37a0fba2e5d81c0770ba86ae027777e161ba3da190fc7e09247b076d7d95202700d118ee79991aaf4fe6bd2e6b0e457d0b949b46b6227f489b255667ce473cd1ac03d053c1e459c7f94999715129ccbd43a3b14012005300d13ec33a8c43c1450884ee7e502a4450e8df7f0089019f72b81886e28b2e1e2effbf7c9e066a5ba21d3a1caf58659e39cd2c3892016470fb800ce7c8d2a135a6344afedb26dc13c952a7809c21a6d1137709695405c0c0cf7a09256f37a0fdfb820c1e94e445876334067dd3f5c6fe02ad850d390e9c62918750037ef48cf90de322bf5ff5f1f319afbb70e7455588ed3321805c99c750b953353d4b54d6ddda56ac51e3536ea5b0b724ff92def6efb7b697b720eb515111f9389a44fd20eb2f2d735e623118e0b7ba5d52c8b2e7038bb6b1655b9b0b50f2656a7115f227dd6575d74937996661fa2c17a79dac151c5b2868638cfa41bed67510dbb81002be13d6611e64492656e846cabb27e6cff2881ba450a8134416c2719178e836a4615f9e0f3472e5a5a62d8d089be8b38e7d8b2fa9df4f2c1ce353ea2b547f1ec06c14a89a666ad2b8e18709da2bc4c777046f7630b4389d9772699a0621cc8d1298fb09140929dcf6ea6cce1413afbd997e454fd0db483f36fd6fbe688ec3bbe53613ac168e450aeeb44d3fbb1da1b4eb2d5056dd4a69a14f061015f7539be28b75246db70613582b43376dd198153eb1936a8093946cdc0b8812e8cc6a8ef041aa5d7f8491f0beaa05d4666212a18822355ed0682459f37922bf86528732a5a92532712f37837b55ad2ae03f71202b47172d64eb333e5f3feffb65ba908fbcbf9f77ac91bef0dda20964abf2d389e970b44e5c09b0457e8f2b6c1084e5be46c5aa71515dafc7ae6cbadd402a62999869495af13a52d0311d1962391747a9cfa0a72fec723dd880f862146d7b276b098851b4a47e75bf9393c1d84cf6826a28700724561aa9cfda690bb1ccac201bb81e9829b1f478ebd8cd8f24475c287ed52d25972eaf29ed478d18dd5e9cee83f6cc0d0c7d0f768812a34064d35a299ee3c9aa23e27d05c94d8fbaab06d932cae8634f7461eaf3bd084bfcb88c3f96607a6a5f426ed69481a0ca679da2b09039f48546d27685f90dd6d7ae17a87d061e4413352a3d0e24f359964e54af40f1e5d3dd875a1b4900280544811007f8dbfb8d612ec8048fe95fe207ff7a950343ce6173b67aa1d444054a9b4b5e210687bfd80bf8fd0ed1e5bb69ad16c74a21e94518d6635b6b046748777d114dbb1f36962e470b4a5b936eaadbf8c9da622e4689fee71b3791d227b28220daaf6132735eb451a72e3eee119f79296838e83142f37a103ee4c4404cbe50ad162181d8f09ad8c243b0f391d6f077cd185081d4a7f4cc3cdf0d4e6105171effd2302ccf711f2eccb7148513330bf6617d255649c1850eed21b65d7693894bd055287535ef47095d6548f5ebcf13ddf478002600164c7fc915dfd05cdcfa38694aff4a4090178dc1ec4b151d36d0901e18fc1acd32892a022555e8529fc56e185909d23f77e0f1cdee3830a1b327ed25bb0c50fb7060263d3dcdc61faa9a2fa62ece4ed08756d159d2dc95a1034dfbd192dc1fc22816e62067457d1a89e8518831c0f54660ca90f7a1d0b7c10898e0e2f8f894d2cda188225e8ad25c27ba4e2e4efae87a90afae95f8033b94bf0e11e93b0aee5904fdae5d65af7f77dbcceeffbd062217c0c66790091b3fcc8d26f7389dea5669a3f4b5facdf58a8ce3b29021f4a5ea87e1facd91a1fbfd5a91981cf2653438bd551d30149cc736b7283ce87b075e6c6a66d6a8f1753a182fb4dfe6153e9302f0467287cdda68e396871ec84fa0215bd61305d0a5512b64bc7c57e0552d4f8cd23841e62e663a47aa63fe650f89750211d77c4be0cfa596f6e4e7cfe714c607ee5234737bc05890fa01d79ceff18037326bf8c85c3a94f9c5da2ee36c91da51ebd6bd2562c760326a5c5854314d75e252a58ec616eeaf12f50e5795a70d220c5f4a5f6ef8ed81840bc78173621a33422d2426791f52472f0c93946c7c1a80b130d33874bcff289527e03f4a8524eb2611c40610b4c63c39a4dfcfd870bf2e889744ddb36946377831bc90dc03b00824182fdff178984ea92223c022b297e3c6312ed42f3afa7907e0deac56b7d4203ac114d8cc92a935e7d2ca846a90fc29595e61a878a178bd59d4eead3b44665ec7c24d1dd234a95b5a055561447a7b9faf9782bfd8c6c89e2968942554cb933b905a6c67ed917ad7bd292a910b9bb36cab135c97d0b5bbc79fd34c6f6807852228a8168b5fec4632e32d5b83b1584d69b1e48290b994c1f86866475c20952e790ddd5469290d1c63a3bef0d4aa07f76588e8409b3f119d2e66bfc4cda3259d79c1dd7d4f50521ab16f4ab3f9ebf5a251c9ce5e57f023156fafe48264ca21b4329a39f102ffa02e4c96553f8688e04cf132b8f60c3c4a2b541e9de04cdff7a69fe1bddccabe553a09a654c77ef4b2e672837f79ffaaf0103cc4610802f1577f61647822350b2878a4e4ada4d35931ab8a63ae553b8da64098c66c3ae7f5b7d48999b9552888f8a372037b2b92b5e43e2d5b7c9236cbd8d763f90e2fea0ca1af0000682cd52cc1ebb233a1b619e7aecde8b3f20aff74c82aea169541c81581aa9eacf9f3e0603311b20573470398776018c8ade9f25684509131286203cfce7e541b4f28bc9cf7758cf6ed39fa0799b2eb39277d247ffa9d5a1486455c6ccf18f6934c24db8c9dba379fb054c5ac559eef267b9f9555238f7bf4e877fe13a68ddab69d76466e7397ef35cdbf5c69abe84ee67c8f4d4f11263eaa8fa91b398fb2dd102eb552c9acf19b72cf9428947cfc54c329c9fb7e874220938c18e0d02d24f42587014db72feb88124599bdb52ea7b0f008d6c316211a395af6390bc424b01eac75dec65485eac6d8d872cd5d7641269ef1e02022a89a8d7771d369c6282336380a4f89d0002b11a285775f2b5b3df8c14ccce9fb049fd6d8c686d47afdf3209f2b5897ad200d153a305504794788767c1776aef41d40a83b56d00c8cc3abd4d56457e99a04d2d8137a5ab49e8d7d2616995f3985c0713d983a103f4e236b11770a7e96d832b7c7625289415ffed4ebc7dba5638f956e137d64c6334746fd6ce0e790a633f4128e180bc636bafc76e6cbbd59cefaca4561106399221335183472121bb17850b57ddf0b625e1ae1b0be9b5a1227663fd43b7e609ed20ffac21a81c4264bf20b5e3a1c7454614d2d60d7ac95de28e2ee0a1a987c9e9c50c196968fecc97c53b999d28f5e1a65baaea1b072629b8c7e0cb014011bc2d25cba73a4293fc7dcc840b7462d21d144c3ca6be61edb807c64aaa094e6a7dbb8073d598c48ce8f9ac55e3c46a2a04612d128eafe94ecc9c19ef696d628042b7d01963782e64fd76259cc83025b0da5179180e6cee640c3c2d56d2d1df14ce52935a40652aba9be6d93abb77f81332ddf90d6208cd51c5993821ce9c62d004efaaf877165763477198ff77c13b51e45a64c2cf7beba79ac708d55f3506efed7d21030bc914db1a6e067f73f41101bc01cee8a90ae44a6434e66b6205456e264737177f1e82a97700558bfe9bbc592f4aa30537d3f50ba05c7e46c6c751bfe10404862cae569952c8d971f4d4e92f909f988f51f9b35c40e633c43380892c530c4b486abc153192322a3b55f68e66d569ac179e0b3a57c7a8b58339baabdc69e7b9a9e7a959d6c79fc9100d012ed709f0592929b2e464736437558e730e3a42722ff192677f159267e73827cf3d0d684bdaf6acdae558531f7d7073b7cdf81a2ce2d1858345cc054fa8acb44dc94a1eccfd76276dfb81c0826a881a3582071dd520a7fe6bc7d99f6901b4939a621d600cd15a9bf41299ea3fab54c6887c68abc811c17e59ff6df728a730813f0e11ed4ceb69053f4477d1db788031a2373179cf9aa9d35bb0a9da827ef3c7c147784fa949f6c4d5765047f7503deac7bdc5636995f1dd10c207dab43573810bf15339ab0ba93044d0a420e29502c5d409e8b7db1ebf732154ddabc5fd44f471d2fd0cfff83dc50804196fe9706ee2c5339d91235116dfd3fd055831756fe2e289c47c7da0f3d7b5791c0649470ca6c24f5fa8a0fea2db80230bd50efe13c25393c7b7d66f559a638e95ac26e783c35c93976da4010b7019adaba397f54a19c82f5d5c857fb23e58de3449a73d769ec76216031adfdd988dd26e23084f453c30306f9af36940bc4ecf83f271235bb4dbcfd1eecd457c70772e000ab8407e16732e2918e0e0e4d0d27f2f53738ca3cc4535d38b44df78eb3771f6cb9b1dbe276eabffa49518a3d4f040601fa7f37d4e352a745e519dc09a615a1344ce9472adc9bedf6b8cde45ea1890badb06e8b46f34c48dcc61683466a78d37b9400a5154131833c5ec17d085e621e3f174ca1267037b094abcc8c79a34a51bf069b727b7a70f430625c3a8d01d6814d1763610b04c796543b05a6285170d6b661f0749970054c54c455430829b3a4493a6234fbbaa8dc3687ea7f6bfc46fa548fff677a5abb119f1fc5064304bcee0f4cac98f2355ac32dfde1d5a8ad015bdef7cc2a2957b576f6f283ff67c8115518dad9d0bd0bb3113ca967ebf7bddc34bce9a22970e304a903ad3f3b9e8ded2d6e0538dfc5011580bc94a03df697af8d5fcfb19420c365f2f959c79b86db8aa1904934f9570520bbe1e22e1e87ebec6df9232e7d26d6ca79cc14dbb53516f90af3f8d9d60de448543bcf97aeb200d64c2ce0796369d7de85d186ad2244364bd1898f352317a92af6d5328cff905c92d727e226cf36903d469d62fe6e9eef278b2de68228cb62d90ef6c5ffe5a0f4018c693283f3b43e1ed048e5e032f69c52e34b99ae083b0fbe7ce7635fd8d1a9609dd92cc5e12acadadd8afdbb248d56863699080b87460eaae12a3105f9d7c2caafb47fa2d6f7b7ff5bccb94d421f2af7ef758ae6f605b699dffabc1c7c0ae4d6e7be02a379db3642600970460c7a6d0d5910b3bb96406cbbe35f7e992ab3902bdcc76ad3a8c9cd3ad3a143198a4b1cfe9be72f70d9325adf0061d81214ae3733e9403bd9cecab0afe85d5751a4c6d5d5e1f87f89cfa957eae936c6780e2609e4cd0bebad26fa817ef7a2123c522a35979550eff5ecf69f2381af1321ee807f139c5c4af03cc428a389794831be84a31075defdd9afcafd4a05a7080eccab34e4de1fa30ded8f6af236872dfe494270c2afce51f9b0c5d3d493b03093c6a2e032d384e1865f9db2612a63bd819613432ef496a97b673d51fd9f5c6b6024bf5687ecd68e2426622f7e93d736e7703385208a6abcdb3facd49d62dfc4ca99acf82dc42b2cb42896e9b8b3dd58a596509489116f0140a0442b15bd9c66fb9a598ee1f2aa180565dcf1afd19c99b5e712ddf1a28a9fd3e387e69e64633e6e2bfa7d6313ea3e4f1089dce0f6340719dabd639505e2e01ee683040a2bdf1a552ea01c925c84003f31fe0dd0034c22e68a38080699bbf9cb2bed2966eb2e56e870e6025f60f385566d9aece9cba763ea82e5f79a8cdae63b2643b4260cee6e3069727fdeb30542d4f2fd93a4a89e08321569f475cc2438e5d2419dcd0b97b17d9d24cc22bda4c734ed36f739fb81af50133d586223213a6b1a338f764aa6cd78366b88d85e6a5e8d445a13f7be2aea45c533f49a580eee19c52262861ff06b4169d1e22827d434e73527868358a0869ee0e88622dfeb05c7bee5602266bf455da68c9a34aa3db9ca567997a52d6105a68bbd5f7b5a9ab846ecc0fc665e75e36e15264c27d6635f066245f819def76d31662d9d52e343102d2245fb00d21c697a43f51f0b5d1f845e4c592117159d6cfd840c9d69d0a35f785f99ded9caf9f6035a132a1e3780e5c6277843c276fe31a0dfcf1adda50a9b6a77acdcc1987e3a7f23f8d451fd0578ada87031886f1d27a3a571324b7895900e0d74727ca5f55c93d9f33a5a0f997030b6b4a2d60ff5123d76eba3b3ef63767dbf8711fa3e9193ea3ddc702bd51afefa54c1769fbfb6810e2f2d8d32be1d102d99b62cabc190ca2ff4c829561a898d6b411838b9dbcb4175694595e8db95a45b57c303b71361ce206c6abf6f6f9a16cb19e82c6e528a641b786e61c127d140ebee68ed14efd9853e9206f5cda3545a1604c178fbf07f0b86f0ca7afab7623229a49f80764413022b7c9d6b265a7b2402adeb4dd16e7bcef61192cac8717ae9dd3596587d46dd00e1686de848cd46be835df8a1d79650d7aa0f49ccf0d327a38f7722763a2a124c8729d7f23dcb5134ff2c70392ed350b68cfddbaeff6c9f4351b936883f96dc66f8969ebfe11523e6b23047121dff67087d82b030a89cc18c6a750261da5124b3efac6214d2d412263bb43deec379eaf82a317d906c4430e642b4fd2898815fc62e76b5562dee51b43bec7a7c2211a47e558420f0e67c778efdc960b82172b1f612674252ac4ba6adb0a7e46927b0082ff8128356da389aba8fb98ce433b68634354d630a85e481c254b89fc5ff3ec91cbd1ec56370b658cb77ec48f11b28338c4b06e2fe035a6929a8ecc21c62fef9a05900e1e2a92d316023e6620387393eb1e9502d160076089a407cf9e601a31bd89951e6e4c0a5e7fe3b5fc5d371642a1005f241d990e8aebea98938808cd087ecf2eff3f95cf3ac638a591da244142fc6e4b65a3640b4c644307334e6c77611bd1879073a61886be0b6bd24d403eae299c207314a3f14c6bc89d80e4f11a04b3c5aac936aa648a9fa02e6abe3427e5439221eb43c5fdd92ce757b8720de8b3ddea13c0e1eedde2020706daa240a07199d3eefbbf2cdc4f94bda8b4873b3c9be07245f24ee1a165e0014d6566596502e","title":"40 组合总数 II","link":"https://leetcode-cn.com/problems/combination-sum-ii/","question_id":40,"issue_number":84},"82":{"day":82,"pres":["回溯","数组","剪枝"],"tags":["回溯","剪枝"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个可包含重复数字的序列,返回所有不重复的全排列。\n\n示例:\n\n输入: [1,1,2]\n输出:\n[\n[1,1,2],\n[1,2,1],\n[2,1,1]\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d42bcb540b146077b582027486b2a9cec7d5887820f7750843e86172d885da1f20611f1c15560ec72f1486e21db74e782ea472bab994a608223497adab2e98e17cbd424f760b263eaa4aae3296493a431f40bdfd86d69b8fda12f0b0ed7149b04ade387740d978dd8c830a993628ed439633875193366c222af2048ba722b7647eb7852465ebf62edd4a7be9cb1f0fbe7dbfe3551e7ea88ae785c9c9782cc630d18b1def0ea38cf7ebbb37fcefece18827e9a8b589e2b0da2e209b7bdfc70b420d9d0e80bea4d56e9b4235118a5d3f4e1b37a27b767106c1989e4e8fb91106f35f3c3a4442d474dad6a46064dcadd0ec5b1ebea6ec90e501671ed3e07549bb79b67a404f21da99ebb3cebe46df82808afd261cc86ca4582571639f42943a5ca182d9ddb72cba57006721dc87cfe4b613f79a4600a55dace4e460d3bd6447e69060126e08e65d049d009dae1f823566642bf2a65b16b8f8cf7bd9cfc5d5c90787bb876d19e8ab4bc3cbb024a18a6bee43c2d0a6891a46e11ac674a5fe6a81e3229ef98bd5a5724e904f6675a73641221841f797de61fae6195df0175d061d2a8dff247dfb661736261cc0254dfe3b95ff0e5904f981f10b17f085b0ff7a5d95ae5a9b2ccc1e88234e1e4240f51d953e251382a92d5288bb5c8612f1def1c1c7ae504d77cb4595b4b9c559aa87b9a996145276dc810cd9851c799e9e146cea5c399fd9e4552b12e1784b481b7e0f6f46353b4d092da817c09409fffc68a7c7b7f3701108f31b18d08357e19eb0c36791331f9facc9fbb5f137e784977c32c7db410da31468a409af23229a5941f08f2b63564c9dfd3dbee83ed34f5b84116a59ff0abaacbb0821b71b12e4b5510163e2142bda47db6bef6647d24f23282cf99081758b569d539af26c1f948dce5a80dd03f75dd5e0b00c0d2f7916f61496cd433729f6c99ffc7d42eda5faaa932c7e06cc930464cbf56affd5553e42e81a5d762063622f90812f49d51558eec1ccc926f906f705903e39773256d723f2af4271bcf73d17d60057eeed25bffce678f631416b7d03a8b65b81bdf954482063786f381e927932e71cecbd3b13f7da16a0c8379166f4db457997da024c32e9e4725eac3b8441f358388d4d0136d4531682323280b34e1daf32f343b9ba9ce19bf0024564e17afa971f0395edd27d645fee88de7cae3dac27dc4208bc4abef538494b5984a6695d108fd3bb85bbf2f79bd79faf2348d5218f5ee48bef28c31724fede6aed11f7b2aa4dcd1b3d1e6b39bc3a132c5b36416b07fec5f29d1d600dcc0de258c1649dec3c893aa25830314af6bd61e1ba12ac7c315797db090e3c782f18ebce9c7d9286934451c178e085fd568f7db9dd270cdffd4e5c7636cfe9a32c3a975f084f568226c0836e061dff0103c85e7f89f421bc7f340e66c8e16ae07f9336e6600f5346b90d7048d1be7ec4f5109cc074c8b141485b32438f8f078594a46a0b7c99ec6d29d60a9cebee3f46f8442e63f5677d1be68d84c44d7a4e247c4240e3748448fe102d10162f5828e3fb5eddc8045b8cc7c437f66f7ea07c76430dd290b43ec5c528e3762412fb3edcb7be06d65085a36f498e3f75989ba81714712c443d90da4ad9eb00b66b0c99218b297d9df101d3bddeb0beda3d0652e45749e8d0bebee15412b580383caa619cfa1257e9188008b272c776a4d5fef5a1f269feb5672bc08e3e9e6fe61904696417636a68b6fee86566c45606c6df0a839b15ec538056e5385fcaf10e58f3b890c511a42abe1ebce410acbff7fce9eaa4479e6595a611a61cdb0f1ae733753171b542e1d6ea24964b607f7063a6c298b83ea0b526606439cc7fe655e76f399e73cac39c70e4a67b182f2978bb4ba04c1f88b0dde65c95f54eafb07117ce5dcad26804963cb7a97b88678b7f5964ab3ee5240851490460bf6483ce643ffb8d91f4da6355edcbfd69d800bc8548c02841f8c9f1e5fba86e51341894b9ad715cd6fee70a85f660ef1ac8e3b27f6f25e39ca29e6b3d345d89444ef52c7b55bf3abf15708c4330f0570be42dcc10e3eb015bc11f21f5f2dad624abdf8c0a9c0da3e0c05b55a386fbe750e6a09a79a6f0ec779b1b0f2818c3c691c84734e8cf7ae58ea125acf93ba6d336ed826b1559ef5ede307e7ea3db07214dd67e0d005ce4e4fad759be2dfc8983f485ebc20b21f89bf6d2778ae594026751d5720112de4219e020c36c87f0666a02e7379f3b6ada79a5a3e7eb6c25c1968f05acddd65dc42cfd71b83012550ac2b937976d0323db13470e76517a6d0af210652253358dbfa47b8d63d0092e31a03975aca6c0e7c1ee9ca526ccabb27e65528658a6e947baed1d14efd55a90ef12b8fc253a8eff4617319b413be1e2d1b34b80eb26e6485ace040dd32c398a9f65ff3df245097e711576173f705956ea11454387ffd34915a17d343b0c2ba4f18d76d68efd5d4af7d3976d6f97f6fee97b3144256c3db23393cec75dd42d383abe0245eed75de0c48e1bc407b9e10b3b4b2121749cc1847bb53585719ae468ce2801a5c20e252562d650a6674ddc3087ea4ac53889e806fcb4bcc0896a339f5b93ccf0f06f9a4b5def65ec8ca83fe2163d1a2fc46aceeb769c4bd7757ae18b3683ec6f102437ed02f49b322e96c1e467b0245257fe8603a1126ebfb31ab8dccb3a49772e88cb6b5c0fb4474f0ec96caae67bd00055df41423e0781759f9e9be0fc5f3341401e6a3ae3eff8e5b004899d4201a4cb0275bd83f05271775085dae88a7ab31a9673496c8af735f391e6b2e48c677d0ac1966f19ffca5598a3f36c68cb9859c99e7575b34809c251b2ceee375ff7ca34c6da66e70043b9dc780ddb53bdaab64806cdb0ad721ba50bb692d420659d7e6d7f89918966ac98c3dd2f0603b610deb7b838405bc1d4346c665b5256cce88ce97603b449cad4d2e51c14bf2a889d68ff22d680d4b5c3182a4a790b928708a02901e1ecafcb3f65a3dd9b7b696cca88fe182df318245a400ba48e7b7086c0dcee695c591d9c87ad2df0b336a6d85ac0e9a4a1a8875a56fff60e8ca2e88f87da9680397939960c18684c16804369156fd1d81a37dd6799230e9b724b2987bc99ce299a89a8ef5f9c331d7fc14d580cacbac7ae408f1f5c91fdea6816710b401661a0a833941d51c708fa68eae11bf59bfb217996ad3e7e79227adee3ad893f75d26c0b07dc746aecc1558353d1f2fc7203a104c73a230ddc8595e6b594d9f5fc8cedcccf9b32656d3b105a1d4cb033cca439e8fab7ccad4065b122f37a5249c349bdf33418d02929a98f347dedfced6884d2a5cee3248a5ffe2858689a9049f3823d26653fdd6ac36ebeb57cc7255109a9fc5f7b3ba1318e06701bd21ef9283935dc65b5de4deecda5aea876f112a6ea6874e2988c725bb01503ec3e7a2ccc24106cf2445ccab26daab4c2e9e4efe15543e2cddc03c4c685de70eb4dc279e8b9bb38e5207c924f4695882f86a546f2b151234865f297106242816196e098ec37a04dda5388b95ce3e70e05506035160a3ab4165c5f50eb89620cae01d10908c61def9134b6d361e9be7805201fc3f8bedd0026ad37fe53d2c8b99346213611c094337353d4eec66722f4b65750517003e41d25728a03afa8daa6c8c91c1f21f28ff0eb28727a1ead48a8a7dace9a22610326ff49fac5468d27cf4507cddc19739b580db0bd74bae74148c154c97e1156f34e1222e9b1c504f91cf3802fa4a227303eb6a916b5e80354f3bec6b31caacead2b3bd82abf31dc818f863586675c326f37dd06e182e250dcbd1ee200f91e64c6c3b7ce70a94190df02c385ca0b528eefa8795f188bd87ae73b041435ceb070fb09662549ef38cf4dff483ad10dc655f498b1368b5cb88e8eec2bef7907b5f5420845b7015251c8daa2b4eead89ac551eb43f13c58cd4fdf6c5ad0787fb9d6103ab6ddf3fb3bc06cc498488fdf285926305dbcc3951fc95d70146886a328d303b96322c725bb82ff947e29ac717ee82a64ae8ad72bfed1617cd314cfc492a922909bfec33ed3e7265f506aa934ba099773d4eea234256245d5d24a56c500b20f5f46055200f6b1473d6a62735c710f2bac42f86c079fc611d901717b9adf3e92fc6a78c140d6b252b16e418a83edec89abcc4d55786bc1716dc9088550f73a7bb0640faabc705075d5aac7a8f7d1d0a9267e474121d028536998036945121b7bafaed9d9821a967b9de10fe36a5486042efa889db232d87be8c7221b124b1cb62b42a9edf4e19c4cb8c7063cbe675c2bacf1847c9273e578ca1bbd4bacf470098c55209b84b25de764c2c76f454e7216049df005ddfdabd2fadf9986ee103e489954c06faca5e65cd77e10f7bff9043c8d551602a31278282944072f0c601fbaffb8eb9f1005abc677d75c1d82e504e6c6327bd5e2b3d2c4d4f04032a6c8e174104e1286f1eb3f255b5a927585ec8575f91a2ff005faba7f672a698757f5d6cf66dff741afc1cfa9fcef5aaa2f85249453e00f8144d4ef9ee3bce6bb6f3401f30478100bba6b630084e9de9105d00fc077377f50d78e241b315228c7e1ec5f8cf6fd3ded199faeb1506c750e7fa7b77058cf160826aa4af69b0524dac187b479d0b1548cf64089ef2d7283880862803fb0ac74a35adf8396f3d34a6f2a4297a63ec6cd211881c247fd568f4d1d547222bec1a103318ea1836e73a378caadfff511fb8c289960c91ddd6693a364bd616088e662b9fa6e68b576d4013ef863be951d0adfee9f30a7e3a40dc1d116655d7a52e3250ece2bf904bc6be7ca7bd6fbdb88c9768a03150567cab4b35b6ba8d9c228409500876423647d596589d0002b11a28577162e143fe9c60ad7f9ad6cf0848bcf86c867fde23ab52b58dbe473591b7b74110c3a5483613b1267aaf4007fe9160d8e2687c3e581982612bbc90df8d85b3f16e4dbdf757453ca536b8cdd773bda10447e1c642e457707389acb7cb8cb7f1fdd524dc9c8d3cb92a822849f721a7962c2340e4efa39a6a5c4fd7bd708a4180bc636bafc76e6cbbd1587e0d84b651462833156731b29210f5be27f5fbd3793593c2511a3eecde6403827663fd43b234a9ed20ffa9f30dcee6649f3623f1e17615f650b6356d5aa9543e723de6b1f8141cece7acc8f9a9efa9b5c67be89dfc61a546e8ad3adb022749bc10519be151617f19a22d93cea5a6ad88b9313ef0a1050fb0782842fe61c9a9a7663a6ec85e9fdd2a81e674abc489ccace900c7246959822719066eaa1d5e3c7dbc4f494d364033a7106df64f0b146fd6259cc83501e10b64593c5fae8f424e99f882d172dd14620ad9862bbf06e3338a83b5f3495646b69f5c1a60a4a628a902416d96d28aaf3a8767140eabc9ffd90c71939dadd2b8f45f0057fbeeabaef58b402ce4a97af273b7c97f51407892c3977bc13f9d3bfa91d842b17226adc0685c2b435fb839d3aa33d2bec3f05ac67f8809475645233163d5da4e5d9ada67e8b3524a5e894980dd1c49ce80c4dea91528b9f210c17dae400abc7a618bf3bc404632d47fc917f45f4002070249779426709a3bf5f27f22042dfd031aafc3eb2970db6ad0c777c80fc7b1f73a73069b2fa2e718831c87be6199e4f6c933b128d85a2f48b38b4003be1d9258dedaa79d1afffb252d90c339f98f4fc34cdbe5989f62b2591bfd6323b06089a8e9183c805d0574c75e6de958fe9e2f78ee1537c4017966136379da4dc1befa8ba7c3afb434cd7211324f366d673d11cf9318fc213574357f5d941731a7b1ab8178b9f3247f84eebf79f04429a0033367bb43b83bc86632a86dadcee8735341817f315b85800902a91fc1018cadbcf9bea9fbfe5f9eefaf177fe5493d5eb1bd0fd27abcd8d21adf912","title":"47 全排列 II","link":"https://leetcode-cn.com/problems/permutations-ii/","question_id":47,"issue_number":85},"83":{"day":83,"pres":["滑动窗口","字符串","Hash 运算"],"tags":["字符串"],"whys":null,"difficulty":"- 简单","description":"```\n实现 strStr() 函数。\n\n给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回  -1。\n\n示例 1:\n\n输入: haystack = \"hello\", needle = \"ll\"\n输出: 2\n示例 2:\n\n输入: haystack = \"aaaaa\", needle = \"bba\"\n输出: -1\n说明:\n\n当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。\n\n对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d84c1b032f243483d7875596a35599d892b54c0f31b000bb354ec0a71d663ea883d71adcc3e38c922a16c067bdd3cb8a6a41f0c327acbdb467d64159b9eb1359f0043708944f236f9226f654d0b88c049e78d3374efacdcd4fa451ea2ef3096c0f1dbc33138fa3f760e9213957c9ad53e613b45083e5dc32ba22a9929f52b5d59ea626883946e62410fc42247f0da772b0b69e1e62e535d2daebddfb9a5a3444d55bf5b3f00f012b2dedb3e8b7610a015b74e0295584073e8ae472d0a2bfc218cd9f9e60be4414eeba218bd9d09186bb81be8a04ca9ff1712f59cc68ec920dde96b8cef55652c7108fca2dff73922c3481ce9c6550ce181d7b922fb5a74f9d0b001128272d6490b53982242817bd1f5280588402c24ce08b99ece5fbcb4624efada1520ca414882601d9709a86ed8997101ddfcc6e93541c85f0d8945f0a8de9abaa387d84985c46053b0daf89dc9d4941da8fa3d12a0cf88fbc2e529b23ac6ce29a1681f343e5e56d1effba260309b51186d3187e933142ca9b52698e45dbc9294d39012f1af2d5ad1322f4404a08c40425af76ee4560ff39902b09b76a8ecceb9f567bc58496253faca83277e72817824638ac7266ff9764b2d3b657557d923c58981a0dc30bf0c16a5e2ae1c19f6207012db8d1cdccbef3f70297fcfb0dee73af7b838ee9f16a43dc2ac11c38fe588677fa1baac04e21bd1de44917e07c381f79f4076b12a2686839dbdc0d22fe9ffb8fa93d79a4f0975b7dbfa23b4cf285f35b9616f8ad2632411827fd3b2c81308c0fafe8b64fee1fc81b809a8a7b931c4588bc975a81f3f88e03c489fd31e3dfec4117264583e2d026cfacd3c3ef70b797f28bdfc866c2abdb49fe69afa4a1635e0ac310b137ba189b01cd7042111d3b9e8318023b7728809619c5d3b4c850c97ad78d48fec331575ee386e2c03c888b70ee77ba7eb8470cf38172edd86d010b71ccdb27ad67b22727cad5eadff9b48487d29974d339dc0473efcdf7097aa29fb7e16072780cb79503f5d4d9f6aefa0b429fd180c0c1191d601b5d021d8756e7ba0af52812fd434b6f241ce7b04c98eadad5a8c5c2ef2828ea2511184317790187a7b04e955e700a44041b49c7218eac1a2442c168e92e6dd16624a2d4829100e0b0ec8ffddf1b5e67f23077af05a301c321ef3e178824c7e9e4ae313a0dbdea5eb9780ee359917fb99969a1b8cefec8f31c928196bf15de869ce487cd6b4a9b400f51f10a49d6dc6b745caef80117d0747385e43faf09edad54f1c751a2874d3df011536ad01d5ed1259aa56e6c748c4043c83f183eda273c63977c74f5d9ac341c4754adee71ddc97ad9cb9a6f6a28548294b107011da4a82483cfc30b8c9f5b4544a37508d8e4934b5a87e9e9efc3a101dead18622f37f149edc638b1a2155044d06fef150f965811941886cf5e3d803e72565bfd0eb235aafd3221728b67d48e56d3beee41251ade71c277b3fe8adbbd5da99c246e462746f05c2885dd1335062d0b96ed87347d68ccd41d330043743a61d5802d12062cab88e0bb1eddf8a488cd87c426067f1e904d14032f7310176ca5e6487366d60ea5c2d73fa11c1df6b1237abceca9d318fc7ea402566c214a23afce486fa5553f80827dd212a0c0c7846288db13dbdcce20079501cf5be6fa8f4521c1f1a728ba0f401aacc0b19f7a562d4204f1967eede26b6162da704ccf47e9401790427d3659b5edacaf04672e4127cd7e3cda7f3a7363d8a74b716adf0b6ed616f67bf7b3154b77ef49f8b2959e4c96908d2dc7ffeb3a94643e47975611e72cfaffdae6011500e115e22206c825865b028f5240360219383ec3252443944a3f6fc6d6876f3b3e428a03adf174874bc83f5968abbae06d3cc8b2ffd67e9429b67985d15dceedb8df1e05f06bf45e6f9a01deee2f634abbc1874ce48a82d42d80255d03c9dafbb7861cf5a5a9bc1eac3d83bbc0caa57ee00c5f40b30debc4539538a8e2d854bee11a14d2eb22e19b6f3ae5e79c87d8995ae71e8ce489a4674846883737dc13f253bbac249d3b8cec2519d285adadd3b9b0fb415eade79bd1cfb397f0c655419c680d271706a233abafdaffd431180fe4881696f783880f9c6ee06b9c21b3950ef26ca94294632b280ab00f62ebe45b4e0fd46b4df68882b4998a66542c35ccf8819fd537d7a0506b98fd23ae502b74f02f6b7ba68d3dcc2f2f1a1b0c8ea6ba3145149ab7ed317a93c8261793603733a56a5fbbd4b4380feeb57df9e983732da4514bb212b2550bb7989756bc65374857a39d06559f39dfc5a4f522a314b8cfa41bed63c56dbb01f12a272c66142282d4456f54686fe69eed5f6851da25ff072671ac23dd47fa678e9674e804a2045e5b5af2dd622b1e8fac87dc560fddf512c018f08846f5c315b976c78e1d42d2f9686ed8008947bcc9b14573b7f39af129d973b2f9a4a6482bd57d2ae171f5c62c6dcea6c933e39afbd997e0300828905222dfb21f76582e9c1aa6508ac5f8e590aebba517bbb59a9aeae2c1f54df4126b94253715cf158dea79e3d0e66b7171a420143372198cb4130f0d72e88d09c64980a8d0aefdd78b6f247ea5c1cadb3d9dbe044b6decdb77924dab5a71ce0f9e810c4a07719eb4fb3096c94b05b2f37837b07e87eb5257a6c3228452536ae60325f73f4ed65e3c282fdfcca14a890aa9fa4c44871bfa0b0cbad76ef2a3200b444608b2e5673baa5ff5c96a1020f18e1b9e723f4dd1b006299d4204a5bbd245ede7e02123e750d40afb2a7bc7dda2e6691c3bf73553708743f48cb4792f92761ad9af7ac1e90320e99eafc8c9cc2ac050975d9cf2b4863f5f17db967ab5a20f1017019269dcd93c2f175d3ba37c229cc0bc868b457ad5b607300529eb6b2b191668a0387d87895b532256956a22f809f18f5591d28cf7e9f0f6cce88ce980f4511cee34d7c14925091bbf7fc92a772240c49053499aca0dbf32266cc0c8a026dbee7d7a3176ed5b7dadf9fb5ddd9cbc265832ca411ba4beea0183e48d2e4928199bc9a0386c3627d3e28c2e915c24a468825b56ff326a7dd41c9b606d46855dec0d03484c2df84677b4edf56f00cd3cf7dde2ddf60e7e46db5f759c09cff84a8d4dbb8ec822f92ba1acf9cc382ea40d508b8e9d452d3e89a351cec042e5e15a17704821c11ddf4cff77df60a98ee119d749deeafed65deba68d88ef71535dcb77cd44bfee8460d776e1657a46e7d180539ed2bddcb105e36422e9f42c8dec7ccb0b33a569de401b4da8f1527cf6482c6a570908a4e171a0d53e061d878ded63a419f6e9292d1f359decfced08e4d6409a36133bec7b6cdc9c7e718c941589b665efdc7d136eded579a662c59ceda818cfaba1e45db30089721ef9283935d941e09b18ca29918b5c80c5f7f2bbdf04e74a28765fb2b7a5dbc98e0eece4e17874f2cc7a228ded11c04dd02bf46073e16d48c6119775bfa47bbb333b080aaf3cd1307e324f46911ccac6a073b79664630c75f34770a2e145f2c2f4dddc36912d3b212d8c19c773ea75548461424efba0535909e4afc9e6e9fad4e6b90b768cd9b52123e625fd8ac8e1e44b2789be38b03249a32f874699d9022605f701f1e1b7f6b7d14a5691d6b427e5f0517003e41d25728f27faed8ae6bdfd584ac7153b673b29a27e7abc5f3cf6686e9a22610322ab8cce95433f828b900728f84da76e3c5d35fdc54f227559f1e109ea8057f3ee87018d35d091cc58e7b49a92c673d44bf7fb33f798e304a558a444c868aebd1a2efa088b84c9352e242153a3bdb58ba329e6e5a6f66469f83af630ddfaa0d772e29b410801715f27f395bbeb116afe0df99bf9bb190ab62fb490f12f77947b8d62d548bbac9f7cadd8eb201db294842981272fbd6dceec48cebbac37513116e9e25381c254ec8fe7e1cf69d82d950f14dac7810af47a46254de2c3af4db5673e5898eaf0ab777ee9e479df50a1f69a1d9580535bd1cdcf698c03c65d83644e047444ae562192b35bbfe02bfdb71b8eb034e4fb97e22feb01dc798e3c223fa47140b4bfb0c07ac938be064e3689608b74c74a956211e268b9bd8a417b24c9b97c2b9e9bd91fa447dc8d1b2ace4a6944461fc460a9f48de43c08fef415b835447cebd1593547d93fc7c498697f4c6edfd821e5c5aa450d9ba2fb246fc7fa9814be8c3433797b05ff2a9d5d6fe17335ba0bd81255e5dacc0870089aecbf394bb533e05223fef42bf18419f29b5d7129ae6642b587bf55dba0549cbebd9abe420eefd282411747cbf006495d30dcf99b3427f5b9e05810611abda77b43a05d4cf6ab1a9530474a30829dcee6352563b1695602b4cc1f9bc93e13217312883ddc9449c53a45f1a378111ef91744d1d92e13abab69e6c8e80abca91affef4f2ac6f7640525290a36c7c8e3abab94b6fa90956a9bd0d3d373c0d99b85a25a0d1e2720935ab437c63c3f6cdd802bb1d2c13a82787e200c23a79efa7d8e84dbe4c302dfe6b408e057d5c5b062a9243b868ed048f2a87709a81e4dbbbf8ecab21bfdb3b8cb8a7c653a4e8ee082e3f1fc063e44aa1c8eef00704d7ed1b65ef080d33ef22f6f73df7019fbdb35827b896d3a7f93551c209192a46f6565e81d04a235e7c9636e31292fec51d65aaf634529ae40ea311698d2a907807505b62f589aaad3829fa5d339b8609c25cf07c47d2f4d48ee124101a8ad04b3204f2e938f3494d1df5114d5ac814a9251df660d723ee068cbc7e61b24114b5bef437910131bd2fe38e060199f3fd37aee3a949cbc5522f1b781ebe7e4f8660be18ad2ea2c62e8cf7d6d8d461c711384460c37b2ff76b600834a39c4b857ea7e59e89ced40517ba8fd4112db2c7c4d3fd1b4e912c6f408c9ffc1c5c2812c2723bbf26efc0512dc4d7d2f9ccd4a3b5c25db7f1cea83d05c6fd7af79a61ae4b491c117ae791541fcc555b9e9985277b7db0d1c40ece8a0f34a7a11bae8be2a64e044877c2db7d51f27249a8a418a396402f3acb95a367859d6257f5851ca5d1c070f44b2f263bef64b64baba303ae1639d67a0421b94330218ea3c4e86efb56751524721254a17a71ea39934567104eadefd8de536f27a18570fe90e25b4aa33f3fac1f4ec421bf21b3eed3e5ac80c585b25c735cd808f80ca6fb1fbb5500d00a1d5d6b7a668cd369604049be92f31169262bb78c560ee6ef39d9df912c31083ba3539cea1d0b73bb3792c7e8719b461f8a66e63a1cbf9663076f625b0738c4b28738cf0908010ce7b8816452cdde13a150475100104a24191237ff89f1bb9254ff4e69ca10e8ee092c819cfe47d27d596d0034cb6c500bcd9f2dd64c23b28f61acda633619aa1b52378465a6cd4f2e18a2494db09c331ed95b296c004ff6af8a6020e28080936e0bb18233dbe53a88b457761dbd22b8699d61c4d33b5317b5a6793ec279052fe41cb09888c079ae644c0d12811acb898f57ab9fec66a498f5bf0b6ce464bdfa91362f6247611e28d9fbb8c49e20e11f7ffcc0fcf323b79982aa527fa10d914427e3c9976d32852d093e8474866ccbfb9087a0a80600f35e7a61640fba8ca1b9672ed3ad0485d62623ff385037ad9b0e86900c7751461efa1d51843e7c87fb0d5a8434d179c707965e691fcbb08eb0adf6a838b61630e0ec038efd9b74dab2f18568d81f095a62216ba02a358125f61e06929ce33d1e160b96a69b94feea59fa4f60d4ddb3a9eff2fb6d68c3ba151fca142865f1beb475c2c5e34a799c663e4cfadef14d6cdb0c13b55fd439a655762711fbad346e4f242dd9b779565665b712eb9dec072afe3e58606bd26c86faf17042d8ffba979d524a245aa90dcd1d09e159a5ba95df0d296a5a83aed68adcbba4e71876bb5689d3558ed952fae5fc579d9898fed0719844477711a48a9ec2c89cc0e9d2d95905ca777842f4d68b4569a247a2c0c6bd125c11594d861b8e0b0807c91ca8aed05fcad881b50882219402dd97448a9f5ad4721cba95bcf93605f905b579c1e26b97e824ab50a56646ab14b4d0920f132d757da26ddd62a0639f71c6bda4d04ba1985998d30bc87b1c0c88ef8e7f1358190b7eed3e8d7e4b5fe45de87f69af3e64237aad39412859f826b26f7c79d10d0631308f50934e294b97e28a997fc3c29b37918e76a066639a7bbec960c82f50e6c1ec0b400c0e46b0f86341ce5ba5753a5399c8312d16b2b9f97f187b24ca437840ed944ecc88c1ce8127b5f2794bde71ad42fb0186559029d9952fbcf04a600c7e7c1367a55103c47a31bf76c733cb9f1650ce3effec9f2dde69da26c885b76dddcb00a083b09c8ec58ea03293b680265d1c5849fd0e8cec1dc301f4bcc1e872cf80cbd361900a148887f2a7b38b0f19c0feb60eedc9dc11689762af22f8f5b5d512bc8ecee12e5ba4bcb9c57b63515ce35e658bbb7cb43c9e055dafe5e37f8820d97d898b9b052a97c66816824758b270e980b6b7ca505f9c9dda484d41fd01de943175a247939a40ed9cbe9d6e02beb17ca04e325b53ce33320ec1f13bfbf162fd437a928d9d743a4d7791d62b3feafdc2e16ed094adc607a4d89f34d16ef0e410ae8d98f998bcd4733ff456143af8afb63466eaaeb861f926256745c7d63c811f9eed7c65bd54e4f89f97496588ffee5b1d3967d458f5bc983c3060fd97cb8586e922593659c792a51f2317a97ae7d438cee69c0cd39059c835db24c9437ee611c97393e47aa14fe79b3bd570b003af8bcfe5bbf201cb2b3d85fda4201a9a03b686518fc85ee31fdce358570fab20a52654c9d0bf62d8da3cc9ec308cd4dfd0a0fa249c0bd33ffd081bd52a0ea2b36f7c44b0998b90a7ec37fbd7e6a2e9428ce736175e23e8b43288a6b059e2cbd2f6a406664bba80f4f257e43edd3b1e3c5b22460e767b1d1b05e8a49b0650e1a55923d567b1b936dac159dabef2d610bfee1119820759aa9be76139d92f0e83527d824b0efa6a70ec1b3acf8ec1a1a9a7000460a48fdedee8f824a386e703eaed70db70096352a0d21aa4b337b4c02cbfe44e6a2b7b7cea954df2f5a2a39e3fb4a1137c86d05152ea5e49be758d2fb88536207fe2ccf81579cbb9d1bf9abd030bef47619f8134e4de1ff748ec9048fc65874bef4f594e8bad9b01aa82c2e789e0db63dbceeae32ac39bf49755def5692b23f5ffb013176bb9c6c532342f12afd940686728f604dfa187c77126262f2cdb9a2b91744e92208a61bcd2758fcf9d6dd0c48399a7f83c00b0e63aa1572d3e1e08f72c54cb5840aadfc48a0d8c83d17a21b51e06f58ea8f26e8386ad5d7969640c5c3804bf332d2e675b56443723488ce6e0b0a026b41a5be2760e1d9fc5f1d9365441d4a421d40de7fb7de688596d76f8045f288a48f01db7180822f340dc584f7eb0e27d5a7de4e6f9886aa36d2faf3228ad23cc02556093d5173fdba1a0d6e166cf81f3edb1cdc2a7747c06b4644db726267a7b2b8de74b0bdcd9f98ba7a19f7b072f4dfa0b8d6d7ccf880081880d9cb07ad4668d3ffde2d26db87be539e681e9055d7e0c2b6c6f3a630b37956751ac8c65681284d80a2b0cca010e1af7e500b76f867cbac90c0ea250cb5c629b1f8b165a43d1b02f32c22dfd676bd4d37aa0869ee0e89741a6bf09edbeb53560518b0a77eac3d473e935b9c74b5597a2203a78a196a64534528ff11efac9f07b093bf66e5d684a2781635f066245ac588cb0642a24409d1aa21048516309f206f80c72022ca14a59131fc8171f4b756f40cf08e9c405b75e151cd0abfc4d186d7b7b02e39e93a990bc2a293487bff966b367a7644762dc652a846699fb66254204d9e2fbac691f9f6ca4b42172a7987bed9caf0f6edd9ccdda1b5caeddfdb1bb6f3a9d02652ef9f6adf6147eb1382b6ac0539af8ec6d661b49a5c8909f8d3bd03391555dab5d86ec58c81270e966ae05692b54f9af8a2ff402bdd5903671965d42673ab81c5da58fe20e4786cbb6827e406f85b0cea82f4c1d1a5bca8d058c4183e422f3eff240ed95419237dd66e38a9c4ca08eaa84e259fe52b11f28d8449b141d42eb7a872e2f2389afde9e64f92a037f1182f5e471ea3da69eec4a530aa8ec9dccd7f053a0afffd4e3df6379f128e68f3376f170621592f41d3cf855f6bac170c54ee7a54b994d9455478b1d331a46c60f3bd4f56db89666959732a9f19ae3b2ed15c70669af24dcda05889fb185078e196a085a6d7aaa1dec92609145a71615ce591c7a7869808781f9a2b3bc88348a0a334b0090305b34d8402f02049fd8d9436116e5d46c4017763eb53ca343d87a36b188bb6ad08ba863d55107b92d42d10af8d379fea7338c1ae71ff891aed613da9472b1304ac2b20a500fdd1ae4e86577de98d7a9008f7072e7cbca3201ba1f51c649ced4038f751f197d143419f286f28dc2f5ea576f53259d4f4f4f29fd4bf21f912d92e4499943bc61fd25d5a6c76f8ed60a60eaf8a0b35d7e34fae820503480f970237cacadc0e737819221c0884d0ec4c7af98fcaab06a71f92188399b21599427074218583bf5aa5e0e99f98aa9c03fb245540e3b442f03fd660c3e6b2d4e6b1c63da3734ce4fdd9a2f90ee2bc2d6b05c2140bb960d6e6cd1506bb3a111dece91fd8248e6365d7dfe37923605055594f491d594506665798188ab044b7013ffc76a6fb4703790342a22a9b48fdca6c852accd27e19e6068816e9bd23294a97503d1706fe593a0ea73f488dccd5aca333f2401564cb96c458fe57f5abe0e4b5031a84158407e1b9b1f2b9f5404cfd61ac2c959a89c78d2946b26fa7ebbf7a227f141bd576ee3bb24a246fa9adb367e5b5b31b1db489e6098db54278c2df769349c939fc5f46b68d63181ca305d5f6959540ace190ffa21faf78874a7dc6dd88d9f910658a05841ef6d80def70c3baa21db5edcde5c9e46638e16de235cb74ad2b68dce1444ccc24cf1a27a369a0d2c4a433817490a2a07375318c8ae69d29056e613129d2c086fd58b65ff8e12ea9e5fa1ddf195878210163d7abef4b511cea13d83800eab41f2b230a249733809bc2bf54424b4aca56fc743dd9ddf01b96340b3025d61a7daf95f7b16578d20448e59af916b3a815cf808a53e1ef89a97e69dd9b88a811209e3cf2154d928fe3d0bed3db0d6f0d3d9d1478e29b45c3a0fbdc0dcd5143b5ea318ec64696d2d69fb2e2796508bb1533f349a2304063a253d21fd7e3ea2c19bf08783bda8c9ea9dfc7d1454f17ccf71e8104458c6ab612c159d8c2d687e2bbe9f7521fbfc2ef18e55bd2adab84cebc6390487a26c9b1f98a94253461eb7ce2f18770e732ed936e539509e64e78ab42b8d480d58c46d7cd3559172649c0e8acaa1d4b09cfe768b39d2ae659f4dd68660f7527ce3a849ac006cb257ae9278fef32b754f5c64caec6da85c074fc5382c41086d6e3bd1d9e5e078b0b0418f4606fbb4a3c492468072867e6a3470228dd46b368d112ece4d433c99f068db4946f9b0277c0c10567c37691cc66b37349475016d0acc464c486a0a1d574daef8ac4ac415e1fade7afb34ce710a9e00dab558e4e3981850f10aceb6d401622053cad752be29d95194de55060b2286f45a6a517a9985196be828fe40ae06d47a3da9db25b816a775a18a8deb73527bc583a4146dae55041d7f37c0b00c99f210be8982bc8e3525689dd41e9bada49fe5ce5ee1ff6da097060c904dcd13b458f3e71d6f6d2e0a1fa246a9cdd3f702fce3f736dc60e458de8ea93734a520cb4ad0cec28e12f7f4d2bd8a4ce12278ef755f40d3fb896b3400b3712fbec3e5edaee59d23719b50b485a04f7e03c8d642c4a8ac043311bdee0ea2bd1e76f2ae45e4d43431971f1eaede8314c65856f434299cd0fb970530df180a7d7e8e71b798a9bfeddaa9d8ddce85979939c083ad99c8b604aa83e16a3e057ad72120b3860215a41b6e69f1e7c58a1861fbb879a5b0edea932d4ef93bd83681cc603a4aeb43d8e8a439b150e159a13a0078272be016075306ffe0c190628f708f05a1002f7e080fa48bf658d989930b98f9f3d09216c2ae426fd7c1051b4cee687af69c5f04c768d73bb2a469aeef6d0e801caea4e8f4e27a8eab393ba5ef01a6897e6f26ef37bb5e88b685bfb4e068539253092486c2eb4db64080cb7ac32efa134ecabb86a67a615bf9357dea897a5e9ee2530085a3ed977516ee6ea2eed32348f1728b8a6dd5caf7169d5bd2e76e66fe79fdb605133ba68e32d86405a1d172f7015f95a55164cedaa0f7d641a1a24b4dae2ab1ae8553a18f6fbcf771cdfd5fe9cea5aec9945b0b4ee550d72bb27abb318ad170684823715e7bf196be7231e7226c074a6f4faf2b2053dbde6cb6cd9891e1594f58b71df6e00e0261e887dc573cfddf000b4764f7dd0ee4355db0f0aaa964b1c45b0c7ee7c48081a612504bb011f2547d56655a7fda1870cdb5a15d5814246bef3d982e259be7ba929746cb17b912c9958187171ce35d3a8eaa29d317102e7bdfde5021619ec56aac9c59a5d476371a7837fcf67ebc541862139efe7fba43c063f96672a90629f524844e85fabda965cb00b6915f4e03219a70c5a067e822387c6fea48e9d30e5c5e4a7082ffd6b2610c6510339b7d66ab7831b114eb173f54afd7a9ff1c9db033dc9e905e7dee790c4117b8d32fe6aad1c1e482b8c1e01323ac97af2792efe8260d1332a7646a93e7cd6d2d22cad0e07d7d78b4fd0fe17b23b3fbabf184be9a7b7957631615dfec7ef15c3a819d5c181cb979aa233f29cb38d137822acf24ebd65690475e2e3544116ee87d200ae0718c36f6ff9140463f1a902d354e710b979a892dba9d29a5a566d85f5a64c46316db37de905c6c61dd627a422b03f08fc34769fbd18ce7de5b7b2635232b60264898cf57aa945ea6f21bca6e5dfdbc1f7437b31b4862ec58abba2f9782fa7e9106351ced1b4d5f78bba974ff568a8dcbcc449b94d096076acd9fdfd5295889b6d12eb496136563fa66fe10469121bdc4dbc550d3e946eb4fee0f04af60c358470f41715953973345ad52a8bd347ce71e346be22fe18713df75faea02be11f34d3d7fdc1a5151ec01bf7d18a93cba273c37287b02c3f36363c2eee6b8123a89c30cd5","title":"28 实现 strStr(","link":" 之 BF&RK 篇)\n\nhttps://leetcode-cn.com/problems/implement-strstr/","question_id":28},"84":{"day":84,"pres":["滑动窗口","字符串","Hash 运算"],"tags":["字符串"],"whys":null,"difficulty":"- 简单","description":"```\n实现 strStr() 函数。\n\n给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回  -1。\n\n示例 1:\n\n输入: haystack = \"hello\", needle = \"ll\"\n输出: 2\n示例 2:\n\n输入: haystack = \"aaaaa\", needle = \"bba\"\n输出: -1\n说明:\n\n当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。\n\n对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d41898a42b9490a617222305f653595ed556d87b8217f57873e8c372d8a76a0f52312f1f85458f475f25c6c01ed76f2abe143274831f1a71a48015bbcf9e606fb514524d658bb65c94621422a5cbba421e5e75a5aabc4e2829065bba2ef30529cc9b2880b44a623376a8966c64cf0af0e2b714841707aa47c914dd82ab7604508995ee0e89b7862420bf1e4a62edad2d0a5846548e823444cfa8541f2ec846e8bdb085a3321f307bededb3088b354ad4cfe524027e067592c23e7211d00139109f0d322899b0855a0ca110772b7bba4ed31427ff7e2b415459eb1661201dabca5394168eb661b4a08c49bfd84aaff6c8e808475d444d7b3819853f492b71b5a78eb77ec7f8f5e150ec16200c26ec6ee290689487268c94baa9dc61da9a87901e5cb0a20915a0af8065bd94c2fb86d0d9edd48073b2e80fbe1764d008762aaebaabba2b8f25646ba1860a4c8da51a5ea9614a5de08d1373d5985ba2abbe97f8dd370ff7d4b6f141efcb3693948f1ff62de800878a8a45d12a0707eb07e09da6f3295c6add5336cac860fb29d2d4d8feb085c146fb26e8fe77a608a755e8036331c3c2ebe7301681028fe4c0ffeb5e54db4a18114c70c423eb488ace7bbf4cf9168dbd0c88182a8638cf47b69458c1bc1337012d18d1ceecad02f731a42cf97f420bebfe70e5e9e128e3cd8aadf9da147452546c914d55cda7393f8f597622dc99bf99c5673bd2d3f86b59b9afc5aed6490ddf00035c27f560a97927a32a3f4c13709208e0d8b52a7f2fbdb3d9dd9a190966e3f59463bb2e5f2dae75da7a1b775951d899c30e61f3c88c6f4986953fdeba1c41e58a190e8ebb60f646ce3b347d9e7dec7dffd06a8fc57eddea8f193c9889b250bf5505272a1d2ef48d8022f5582fcea6dc160b471cb074b1a86cdcd6ed38db075c7e766fd83999e08c7c38e970f04e1761f2a2154fa32748dc24fcc8a2acf590e40f81eb1a3086ead51b4f78e7e4b582f945a399cc2613dd6fa7794b22ae87116070b81c86550027240b15ce587b525f9010e2d3690ee3db4f929d255597a82945cb615d4349bf347ec7b3ddc80aa8b5bb46723e8b7889c5bfe2b693fb37829624c9c5b9641bc2acb32917521e1c7a0470d29a5901050f38acee00a664a1a4154f28798324764b7e98600e25a3f05333fd8e06eb94e68ac4be632aef3fca6f8984465b99f2ded949490178bf54afc0044f0910896458414f7dfb02a84356985347530a7bc4ce198bc9ed792136ec8f47e3c07283b1f302720303c458b33acf55951e64a822b2dba93249ca4e5a70afeb8307247553a71e31273fa63b06506c961f963f7ead8b3a1dbc49de98eadfa0220e2107011d95c844a1af233aaec1a16d7087b030003366c89e934b126fc3413756e2a68e485508e739a5b24f9a0eec13426ac8876863bb869fb33a94e6f1d48f05f21ae9b599b578ccf22303dba755cea530fedc61c5198f313287c35f9b6b5f9f595c56de556676f22d78650fb3f7c65d2b84ad94f7ddaa5ed49c13c083a5fa11e4d02d10a63e08c49da78587747e6379f366c1931da8464c52759ca417262af277eef71702872ba87b958aa286e6b3227aae6e79d198cc8da732447e4128314f1d0b3f8405afb2a2edd1f3b03247e490cb2b11a82ccdc0078420dfcb552a8d554150e3273bc87f401aacc0b19f99469d727681948c8dc27be16298304e9e877b42179063edf76b455fcc9fe675beb3f45d8e4e5a5e39e363db777ac23afd49aec545765aa5037488570cd83873b70e5f94b08d2f77cc1a2a64741e47947602956c0b6c4ae583b5220025c3e376f8a7f66a60cf514356d1cac80ce045266064898f9f6757e74c388e73faa3ac03547409d8eef9886bc8804d2d6892ec167e9709277b55e11f4e3e5acf2e7650aa95ae9c5a511ecfbf4129bbe396bcf7f87286efbedd343fff09dc619699c3f79e6b3ed9a8026fd54aa2c843d909d3b76b8b7f1d5f9294b91e815c14fe849a95e4232f09e913805d836d294c823fabbd455152ae60dce637105cee7aa7b6f639a0c256bbc6dd0c8261db324ae18c614f1f777e71e8f933c7c5008dd868ef0c6850508263203ed7c2dff806b8f7134525bcfbd8365df45e8622d42dc38d9ca3b293db8cdf81bb704a25da0f7ff05fa9176e76f05ddaf2f3d811086cb19b41d29785450c1fc8668ed71e31d4ba2a4e370d785d9e7e9b1af85a953ed464b53be549d52ec78ce247036420d4906e0fbf30e06c4b2e70bdfc582205d9e0951b56d6e6b17f563d5253b9e5474dc3d47fa6559f39dfc5a4f52283349f4bf15eb847256cbab797dec13ca610e6d63261fa612caf227fb9da7d04ebc1eae397e0de85b9131ae36ac220acc46673b9ec8af63937ae5e8ae8e3ace7bc79a453d47a357eb2b1074528c4652e1d42d2f96d4a8d40a8e7c80ce3e5f727f25af5adcce213ddb456ac2931282e90f121a0adcf0ec6cd93e25aff3dc3b474cc7d50c3336ee3bbf609acaebf14f22ac5f8e590aadf5037bf259e0a9e87e5652d95d7da1465e5b52bf10d3b0b10b0624be060e452b0d7264dc87043eb39f6fdab1812ad24bc553e7a313f5b93ca34655adb8d997a50ad4a3cdaa2d2f9febc858acbcf23ac4a07719eb4fb3096c94b011243c985155ad2ae077346c7b02452536f360771320e3a86a9cbaccfdf1db3ee8d0eab58eae0927fea0d3cdaf33fd4a185ef41423e0781759f9e9be0fc5a1714054b4edae6cbadd402a2899c920544ba73c6cd77e465c7b08453efdc1f3ee75a97a34d88df8731d7651272e45db49b4f95435ffd3b9eb1ede774bdda6b9859c998605093cd2c4306263bcb77db129ee1f64bd44705911b783c68ebd758fe6378c6c894fcd6bba16b43e303e5445d3fafffd8f42c646c99f2cddbd3b2c4304e77bd5cd56f5490602cf7e9f0f6cceda8b91703d5fceaa4d7114d84bf2f5a3fcdfa76f244455764dcdede390fd6e2382199b1e30e5b2fdae0675ffb7dadf9fa1b9a7cb8c659e7cbf16b346e1e55f3c59e7dec68ed4e1ef6cde976a0e6a7a8ba71b841a0f9171ec3df326a7dd41e3b606d46855dec0d07dca96f6bc336059c902fd00c8ab38892d962eb39f3da9892785ceb18ae49195fffe85759bcf48abe2c3cbf750ce08f1f580518aa6cb3548e71f3c744e8b7704821c11ddb280a57dfe43a5ee439d3ac7eeeda327e4ee26d8c3b60920c0b6669b44f0a8520c7d354b1eed69311b4535b648f7c010103f59049f42c8dec7ccf9f53a5ecda51ca69fd5087cce5f97c6ca61c996065b54181df565c860de8d7d4f870cd3c0b0a75194c6c7fa8e4d6409a36133ec82e2989b89e751d2251dc33225b4bad12bede65cd0202c59ceda818cfaba1e18f11a08d26dbcd783c877ec5b5de4deec9915a4d3265f7f2bbdad647ec08e69fe015874ccf6e09d810c549d3547d3b62dcfcf426dd60fac7400362f92c035503e44f513b4dc31abcca5f2cf5b4cb72cbd6051a8f86a546f2b151262cf0c60254360535f646e148edd284c98f057d3c1b57470ed55177e4a4a89ff0c35cbb44afc9e6e9fad4e6bd9f1688c9513433d774acfa2d21c0fbf778ef9e25e2ccf3bb62c31d98c263a4770031741742b354fc4663f214b77750517003e41d25728a03afa8dfc25dfd895b75b53f836eace5caed698c4cf6d8da3b90c10326ff49fac5468d228b9002fa584da76e3c5d35f9a468a0d5dd650449ee1186f77ad6d51c9525001d4976c198d60227303b61de61c348035253bb658168280eb85f6c4e7c5f647a278eb095e6362aa31f673cd3d5a1c290acad7e62c0a8380053f6f70a30187540da87e1f4dbfed17e2e59595f196b58db473b4460146b07e5be2d3241ad3e28df5ca82caad1080201a0ad24769fb828fdfee8cebbac375131120cf0f751c384e84bb3014ec998fdf56fe0eea6007850be12c5c90697fb0ca397acf898ef220ea6cc4de4e9bdf6e5a376413b086cc539c5c700f2dcef634c84efa476e826bfcd6b78f7e29e17a3ae86f4ee090d779f2c33426cb5d919cecc666ebd283ca3e90a86b0bdebf68b70ba753eb742a35b1757558d2de4c5d46c15f41171e40e9b5a3f8455ff8d1b6c3ecc89e2968bc29419fe43aa9677d23d0d760d7bf2834ca1c81cb29f81341979ef0ecc7fe811e607433987161b473ed19b9294fe3275ba3bd45113b9def9299bbd8b9e6682a0e0f749533794398032345595238ccfa9c9df953eb7b80e15bb13f57d27c2eb388d4a877c76acac934470d1749a92604eff6fcf7a34980c7140c94675c2beeb0c737c621a43b8113f102fff734408e456d86cdf74dee6ce9e25b161b63161c91e608c5fd94919cefb386ee106801ca1d942ae8deaf21d76310b1feb55730d07f5c02bd123c774e146b665f3411eab0e8e3960b2fabc62afd01378def0eccc6727ba8b2bcc5ddcd8b517cfe85b24c68356fdbf1a56a680870927f858cd730ad4f7dbe05e4b8796f7206d52c88adb23bf5f74ba0eb99e8aeef0aef7dc871c01695418650d9fee5b7c1a0f321677fba4b361003f43e2e538de985bb05d04c8f39642b509bc7770d630a69f7b6f7758cf6bf7cae52cbfcf013277d247feef1705ac3001866c531bfe60577928c9aff6fdbaf45ffb47c9fc56f7b83951662c13fbdac36aa56f58396f3d331126c689cbb3ed79c5c3281c24ee67c8f4d4f112677ec8fa14f78ddf5d60176ec29c390bfc23bc1ff7cd12f871dbe29d7e67e974b728df267b29e2d6ab17dd32b67b72febc1544591f4fb75ffb7a45484fc7b57727c41e37f01c825b506ac2f8f8f2985f7dbd89b33ca153f4f67d7b4a3576bb8bda7660cda43c62823366f4206c595006211be85395f295a37acc20285acad349fd6d8c686d47afdf3209f2b5892a273115a2227454d794dbd7b48532ae7b1007ea402138e5dc6beb1fed56457e99a04d2d85b3f16e4dbdf75741aca5824c9980869943a447e1c642e4577077ed5997cf3c42618c0041daf9d96cbdbe622c1d127573c30c62c1803ae46ebe781af28de128e180bc636bafc76e682fb15cda9804b234f04d674563d547d214615e2310af075d60b6f5e0be8e194865a5c623e6baf7123479ec372d09f30dcee660bb221744a45201c2e032d46d4bb950b9e58c4205ad83ccec57a82dad7dcbfc90f1cf5cc868f115f6290bf8bb07226deca7e4fff5943528cda4ef376ea47778a83da39f20a6b2dd10782842faf5a9ad43937a6f285f3a0ceb3537d43ab4884a5b0c55e3c46eee50871c223beb6c6ee8c82879ffdd82c0d45163fa064e8830b92adc576a9281b04a35d8eeffeecf50e908b9a1e6955db51e56f60ea4506e2e6f06d9bb1b3728735229ca0a70ac290591ddfc715e9de464e0afaadc62d6e607f601a98ad385fd15911ee4c31eaa3ba39e4249710ba0547cdfdc20b1a96914df2e9fc71f03f12107dbd7eafd3c3fa05e5084079b622550ce8291a3a23a3a924dc654657b4e8b6cd96aea326113a3f59f36882b02323770de473520673caf765973c8a97074d4389a148e886bd3cb13587412d6f173858c09d6493e6caab9816044c4de7f91a73882810d9cc76f0acf1607e90473bd5efbfc5c57bb8997ab7852a70b5de41955eb03ad61d9fc8cc6209611c0f3050cb23ada06b24fe4b1c22a155343b3d8c1eab978fd1b1e63a90e71dc42aa5db5f396ff5da88ce2d185863148918bf8ac00e1b11093a4253a2cb0e07cee30ca99ca3085b3bdd590a6e9bb53495f6ce4e550fab38ad57ad0ed7fe136edbbea69f4438fc8ff7bc9c0117b5e4bcdf798a62275fa3a5548f85d9de17fc17720ca7d23b1c0e2a0295ba9bb735bb57b78227ef7a334677caf983cb254a133d5c6e304d94fe27920168915f5389736574f90d123357f35b0bf1feb3892e1a420b426c50241740808b6db1edf1320873cb952c801f475054d99aa6f09860894adcbddf54c3284529eb1c095e02ae44991b8e140e8b5753d53ac7c7123d2b2cdbc06f9461b76527bf3426bb069305c48359d272555c2524217b306ff50be36cbc088c6e313c718f7423b51844997ed7daf67c7f40a195c7acdef97da638cfcda304b059b4199c76422f75e8e7f3a2df34e7329f8e79804f47aafc36e74488b9ac76685c35e3672508e66802b3188add26be1604e82aa2c41b0a5af799c1f3bb273fbec56eb12290c9c26524bc82b3244b3ef0ff9ce238affabe0514ca7b14674845bf2737cae31ba04fd35cd540f515a83b51ba503ecdb3a2ebb5dee517fcc0589bf93dcf4dee041ded8305cd0f73688911ce64e15c0570d7790dba7d001a2f0b42107ba1367937ebbeabcc8c79a34a51bf069b727b2835e32a7e4673d34fb9ab4d1763610b04c7cb7e3b05a6285170d6e676e17fc37e070058c445554b2ca8cf457d3d57bffbfc9965fca33169f64c8755ecb1337a13bb0c9f0ec9060904a1ee1f57afd1359dcb4aac536d7b00639580315846e28aca72c27e361b5fa113d8d3c8331f7157cf369465e7258fb2b4d03ff8b8e71b77da41f015bc5b7edbc9a168154f45d6c55a3f80bc94a06eb3dbe9831d8ef2df749124fbb24c849e9dc381efd90061c5186a73b7e1b66f4cc0aeb861f96f361945978475cc5a9eed6165ac47b6be909007e4551b6686ecb78e54835d2cfc797524b19bfe9bfba4221f1c4bd1898f352317a97ab7817a82afdf0cd0d506d34c8f76ba172cee629d21daaa3dfc2da6c2688131f348a38bbcb1e9eb06f7620ec0a5e02644b903edac7ba5c85ee342f6e3585746ed28eb6357c2cefa64d4c53d88e96399d6cdd5a9b076c45f9676b3410bd20040b9b326774fb99999fcafa476a284b2e3aa0982a267155726f7f93082e5b01bbedb9ab1fb557a4ba098aeff51e102c00e1634463e0805767a15123bac95d7484c9fed512adc67e3fc628f9317dab3e3cd3adfee0c19d24e22e09ba32f7ca47a249e5235c3125dae2b33a71576d7ea86f5e1af091f4aa48fdedee8b162a3c7e116b3f32487330c5d5e999e42b7ff3cbfc23cbba93c3b7c587cb1bf4df2f5a2a3d270fae6132cee91021a9c550eb573a766f6cc62483eb184f05b3c8ea0b7fa9ab10346e65c4b9f8134e49759f740eadf1ba6659e2aae473b38cae19b1caacb8caedd889a3093c6a2f036c49ae79a1e97f9646667eede9a020c41b9c6c53234695dfdd1092633759504c2a197c76a266f721ac69a659c394e8920912fe38e7cebcf907ccbee8399a7f8612aedb45683346d605e32dd20580e95ed707f660197074634dcee50840cffa4823ae01d4931e7bcf7c1c9f0a19972dfbafe83d3afdbeebb80cdc9a73e70e233c1922fa2e08054037402ef9df84b29b45f0986ff1ecc45eeb6bf42819aa027da25fe21caf8ac23fafa720f77c9aeb2c6c7e089f1e607aa6905a26f70c6ec50b89dcb16d55f7e88e9e9d6bc78e494e9ea898c4707c0a6bc44c99b6aa1cc97f28d1926c1e34a3812117a4109dbf6a8a8099a7181f1770b04c7a325d1f8f048c649ee542321cb7ed840fc40142fbdd27a63230264576a5d58cc32688ffce3ef8280b7024507a7080a30dd2289708c31e87f4da1c81ff253ece45483313c704ed1800ca90bc5b7086ed4c154a08b9e928305f736bb66e5afec640810c2221ad643068eed13ffe31639fc","title":"28 实现 strStr(","link":" 之 KMP 篇)\n\nhttps://leetcode-cn.com/problems/implement-strstr/","question_id":28},"85":{"day":85,"pres":["堆","排序"],"tags":["堆"],"whys":null,"difficulty":"- 中等","description":"```\n\n在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。\n\n示例 1:\n\n输入: [3,2,1,5,6,4] 和 k = 2\n输出: 5\n示例 2:\n\n输入: [3,2,3,1,2,4,5,5,6] 和 k = 4\n输出: 4\n说明:\n\n你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。\n\n```","content":"096221c37c5f85fac03c87f9e42ff6164f9a33439f9240905709756ce7f7c66808b2e25e438bbe1eb009b854206a4cb13cf3cf4e62e49e134546b76e352a1ba807f0e3a76351243680d40acfe3de1e3fb1249a01597f66f479f9a00e01c9c6ce1a6246f3bf3041e8435b4a3f2e09053ab33f2e437809b349bc1f3570bd6ce670f3ae22e5efd89cf8dba458a34fc709b6765e089772270f7a08098479f0a8f3277a7637086bc3e82f7144e21722978c92d93d5459b0d1fae263dc63b0b43ec8fd93549d76c7965f852815aee014ebfbe171b646b281ac4e709be36b43e8daf2444f6638d75d26b92a7bf9d07178696b7f8bccf1a2cbd92c190c27a7003e1214475a8b015c07753bb00b216d418f552f3ec4b0eb129c6e8f12dac0a446b5c00b970a64c3da0b89ad67cb063e4909965046e8883158e2d700ada615b8d819ec44f25a5de3c0066e3049d0f7679890c00ef4cfad92ddca818e11af4a8cab7f5c67c880f1f77596aa78db5b584b0157578497368f69ff6719177d5840dc3eace7dc1f1ae430230a619fac4d38ac4840b15408d84f1d96d2abd536292d5ac9330545058880436074328502d4df3f1fa2d73ceba8e4d2b9f35e73d5ff8dc5ba5478a382a4cf391c3b8610a7c932efc1ffafe3cccf9157c0170f075b30e3639b7f1d2ebb466197a2b49acd1e8a90e3a5a59dc522c2e49373def9ba4e209d22eb5312da4f0df78cb7e81aa67c9454a356b0fffedeee061a554dd402eb014ee4943f78687028fac7bbea84052fd1085389fcd5ac7d456e3a363483269048ecba7c22f50f206d1d2adaf9eea6b9440d724447997150f220d99a200530af53b223683cc06f069dea1f03b6d6afa1edeab222a7de5bb34751392d28507b1fa871bf194a613e173d0d4eaaaf9e3b1e33255045629b47acbf7c7c70dfeb48f5308acde651deedbd0dd137b0b74a6568dca59abc0912750d78b8b400f551a9c4ad7ee019272e32dde564ee084b709d558dc3587be820b18dd7421c3626df062ee09e60688cd21bcda85d96557d5337e999522c646e12c64f88d38d6ea13444d5d214b319f7a619b32f6423f08a38fc30816b9b9f1dde107ef9c8d4b43cc67945afa7dbf97d53c70202ef392e09108f10e567c257fb59c2594694ffcb0e1cda4f5e537ebf8e4735472136060826eb1d55f1f06583e0842de05b1337322dcded40aa4e689e41e728a5ccea49693844b024ef4aebcacfb453d7c296f12046fc822d95648e33f30b21d047a4ab22fb3902a6bd66ebabba591945809fa189614a41cff09edac988fab84c22b3ade36956df416fba71e3b467d9a68811f094d25a18047c41a746adb876e162d6950dfa2245ddacd8683a782b1da6c5ab895f2fa7b7f81f1c17861d51ef53f4d082de4dcff5ccf229fe882822a80a1fda231c60a794b3eda74c8e9ede5865aa8e90890eb26af253dc649e20a43ec7b8ed930adb3168b8f006b336e6e37bbf903dcf993ec5bb2a32edd96e0dcee2e9ef6512bbd5d04f9f50a609570266dad125c353f89a5743e037d5c11c3b8115cc5b4d36c044467a458e2a0a8eb4c677b989bea9375d19ee9a103ec3319a0ba8b814970176caf98c57d4ef86ab6101039f2cee9a63003a47773f18d65f411291ca99069c4ceb34006776a19f6df5c647f7fe87e792c4dd4107fd76507cf897e7b23a22c33d1a9096dbddb65a4369bd4c4dc3fc546e8d5dc9bb96821e4fbb0199f462ba2b72ff5de0efa7ad53976f96176236b3f408bdfd1f6c48607d1091fc6df051df651f757a98f4ec45b9a1fd0e9c7b1a42abe12341c49f0906ec3f756facb96db2aeebd3945b1b152e92c6c2f08896b2fad721fda02e8d30d5b0f4ae7e07348abd9befd8482477fad2d1247d666bba454595cebc7d1630130d6f7d923a683ded01f625991bb52eb1bd6d2a40457109d5894aab6a14559d1d1761c85028c0f0599544adc25989ac04a622021199825e8bac122f330b45dd61916ddc179a00569af337503b097a898d2d41d06dd621bf4dc2af82283462baf174bc1a745cb75e7448ea1f20cc27cd2e248c066a3eb49c1db8c194e87bed710e929275da4a830ffcd5b66ff39c40441f6c5e0592c59d7427032f3ba98485ed7c2dd5c94e8a626f7812c0b986e913afe84b244cdf3ecdd83f0362bdc3f81ce532ac5ceb89b503fad261982b40ddb3292d800880da07d779282b4e4ad48f9c7ba847e41f43afa6e36bc298919982b1a8c8fa73b9674d51ac009a58e73cd94b29635b6b2a45fad1f30e06c4fbe019df8b852b5cb1115cd760796215f27fd57a7ec01d3b9e2824b43147f39bb20f0201243300e8ae41f5df3c0df1b05357ec13ca610e242d7256bb0f90fe27fb9df98903a510e0703453ca788a1bae36ac220acc0f293caae7fb259467f6a1fd8633de62fad611690aa356a621097c089e6563cbd42d2f96d4a8d45d947098de6c193b316ce241e6c43b33df062ccc942ad7845b5a120381dcb777b91413effdd95429c6354d89c1ec6cdd5baf1a59221df1cd28f248e4a8686f85be5def25463dbac4b45eaa9c309db2d7d24b9e015716e382a52d8dd0f889691d229bcb89b77311bd3d144f8e984fcc962c26f0742ff923e09a3110b1d2e45a1b3f64804e2797f3e29e0c013aad4b8a5ddc44c07792e9532bcfe99d07bfcd0dee78fdf1e8fcc7d58af236fa72343361129573006334704dfb68762529226b89813721454251bc33bcb88564abef6fdbd0cd792622a3003cc285d4122a14c8fa8e09702799ca20714effafad39b8fccaafd5e7db616d3646f560c3b01d0d5eba9ce09482c8ce1c8c90d3929c74151644da46d7827c0b7f300c5e1da1c6e9750997e8a60c19b8318f279ef278d4e1c28312444a02fd1ecf23b30bab33eb418819d96abeee83f60b51042f7764c9429c331dc32b769287432e23e57e08d057869ab8e57fe447298fd8b3cd6d3b459eb057731bc25e91a5eabfd1f126744b431d3599f9f49eb73e648b61f482fa0e395835d2e06b724a4e59441c45451ea107852ecc72c90d55d3da9d5b1962c39b703ab3434dd8b8be8ec8e39a2eea8b52a26acf1f058d8568cab6c24feb925e61fa1e405f120687a6d436dc38854e22c77aeb6af02149e32f46c006225b470876f1926e56fe5532f2477c4c0d5bf101944b9f88499f691d9936977f2b5e3ed2234ccd5202d19ebcdd579c4bbdfb43b7759eabe6920dedae7a92d2a11c5ec6a869c65bb5955a1460690b4aa320613a6635ed62dd9045527310479f0b868ac78af9fd7e3dc9ac24b388c00321d91f9fdaff4ebcdf410e045611a56dd2609b943a419f6eb892d1f359decfced0fe1f2d46f12867b5f3b7ddceccfb389c3f1ddc230ce3c78167edf057d47e5159be88c8c3a8f34a41804f4dc264f38c8b9a46ec715de4deec9915a4d360102d2bb5e42a7d888970f6014a3e82bdadde880a09b74f0687e2689d814c2e9e4efe151d7865939065436d5dee02e89063f9c2adb3a4092de324f4695882f86a546f2b1512629f5d6e6a0526160d6c2041c39e337b98be128b95ce3e70e0550603142cf0ba0c7c8db442accf60cfe80b20d1f868d9d35d1e203f1ec0cdaa5201fc3fcfab830a248632b6312cd9dc373f1d651e15033f6a6f37a532376b427e5f0517003e41d25728a06aab83b363999dc7bf1506fb7aa9b027e7ab98d9cf6686e9a226106f45f49fac5468d228b95d58a584da76e3c5d35f9a49e57308841e44ceb0163f60ad720c92077a4f91cf385f8d3d083343ab1d91552490756c5e824458e0e5e5d6b6e4f8d1991ec413f81a1e4074cc27ee7bd1205a344c16cac1e32a078380053f6f70ae0a955418b5622872b9ad28e6fb94dca28afc82a264a14a1840f9635baed9241ac3ea9ab58fd184aa4499201a5ce66d20b5d695f5ee8cebea913c5c43279756474d700b9dbb6255ea8cda8c54fa0ef52659990eea364ad22c76b1d52f6facc7daec3eea2e8d9978959a6145784e5df5c3881fd946701b27c8ab2fc81aea246e9f6beccdb7c67e7ca73422a52240fdc38d6ebf9e7a748e56d584ecec66ebd283ca3e90a8680b1966b536de6bd23284e0fd6e767c04c8ce5340fa328606496c3e2f00333fdefbd2d1f08cbec0d7673cf82507828f47c209717b98df659feb7778841ed2e803f81341979ef0ecc7fe811e2e73228b0e34f149d358a72362eb2440c5f80b1975d8aad6d5ac94c7b33a640e4d3dd24c3106d95367110b0220efe1b69df953eb26aabc409b1551dd6e04d0f8c4b23fda65978e1200585e53cf490aa7f8e9ebcd2f8c834d59ec335c63abf19766ec62e87ad240f171b0ec295d8b4f23d2a2b209a229d6ee60165c375816bff704e5f9bd9ca4a6cd8ebd552447c61dda7fa58db521bb2a43e585fc192deb731649b9126523301d6b6b413458a4e4f2c9960b2fabc62afd0164c4b54bccdb3837f0fcfaced0d4a31256d985a33142356fdbf1ed6a75080bef55858cd730ad4f7dbe43eea62a632668907488e4fc3ba7b605e7ae91a3a7f520ef7dc871c0169541c81581aa9dfef4e5af71265573d08ed88d70fbbec24b510a7e957f850eafa1abf6b1c7774f314f28bc9cf7758cf6f739ef029af2b856662d742af4ff785c8a45127fcd198dd24b2ecad4a9b300b5e30084fe0185ef6f3dccc7162b8f7bf8f436e318f5d1d7bd94741a6d6497f5779cf35528abc24ee67c8f4d4f112677ec8fe8097893a0d51755f11ccea8e7a23b95d534aa3ffa079429d7e67e974b20c8a632e0d02d24f425cf440ce77ee5891104c1a6f060eba2e70c8cdf1a27526c54e40c06c324b412942f8f8f2985f7dbd89b33d15c6b503584b4fb207bd5bda7264c9a69ec4250365b450bccca2a0151e2c53d0c424232fe8844d0e2a445e19eb487d4933faea720822b1e8eaa300d52343a110474538b6139537cf3b11511e1461c8468df97ab8484644ae9d44185d83676589489963a261a9e0a489ccc772c9c335f541c6467456a076eceb37cf3d96e5a91410c8dd496d7dba8778c82291b797ec434034fb437c1e781af288e43805d459763ffa933eec9e5178ba9d01e7e06559f095f267e7d214615ab770af82587053c1751ada39d9b44126c6f3f846a2d0edb835abfca75d4e77d21b221744a0c2b1735292d03c5c2d011e61d907508963c9e9474c69f8689fa9c4a14fcb78496431d30c2e7f5e9705bc5e02354d5190312a6b9ce5a972ce8df4f407ed45c9aa88d732da840b42c9d1a75ff8329666c063a0047397515e7875223f9b52e166c84a45e309005a5a7d16f1035bc9f97d82c072e6a14f927c78d1c84622a83cf570f0dac59dd9e8287a70ec3df812369079803b06761a41b52bbb2944793f9f22b84342193a2e80ac59b4859d5cb52adee380666f2b981607371326d1889d8091ad14b08f5402cbef0ee29a62dc50ec47a1583fdd21030bc9104fff2c95fa477195130bd2beec4d5f944ef0d1a4eb86c1958b1582b1023a3a969dc784619b7e2a081dbe9a1375f333e5cf242cce52d3f3074b07301066ecaf565953c81970e485ed2bd4cea9daa16ff60890263774a2322c0806491e6c8ab93440f5d5df1fb5f20e76940e19245b8d2f12e3bc84e11e2eff180922b8c8964bf9f226bfa9c058416fa3897189d94a7161203734e601a8438e3fc2724e60e182ebc1c68633d8d17b6ccb5e0b1af3a8cfa1d8931ecd4543a25bad4ec9a2d05453417c052fc8a80015a5f723b3f55bad65e39cbdb41a1aba3582071dd520a7fe6bc34dfa4961a4e18bd77fc37d015fdfe136edbf7a9d94c60c489dff2d51c0af89fbddf748c731213e2bf2495e3f3c217b95b7904f6861b7f592a1f95f0809d35bb0a9da827a7793d440cd3c8c682254b56610c047f028bb06e9f1c0e8a3c53956e653ae20d5b385cfa5b0392b8e7ed611a444a466c117c5140d5877da0e2ec185b0882e82c8102475d05b99aadf0891d804a96f58715dd161676d319210b7cd344841b821e4bce1f029c47c7da0f3d7b57c28922c0059a646fb07e7dac2cd04a91cd449d69771625393c26574cf559a638b90f8022317f7cd97671db18178d1283aff431625ba7a0baa187a716ab2fe5c4ad109a3a992da92e28606a87d7d9889f74a771cfde048b4a4abcaf3edd4580a9a03f391224b84b735dec610aa079e99362fb4e30a662bf97071d68f3b080eeab302ef08d6eeb1ec09acd0e4df78eb3771f6cb9b1dbe276eafaa20a19cb330a0c1849bf6e798ea643e501ce12df05b015ef7a1ae01f558ef8acb8fc84a01ff5cc58d6b06e8b46f34156bcc619856c292d8118d54ee15c585ad7790dba696c302746420d36f4643c7ef394fd83c53da31918f952ff3d2c3478fe3178730ec31cd6ea1d1b63284550c7dd583b4ce87c513998a265fc35976a7f36118a114b4b7ce1c75f3c6f31fafbf4d02bb8e6692fb31e955db9e2673153bb4ab535c5064304bcee0f4caf9835818249e3536e70166adc955f1d1ee280ca60d9541c1b5fa144909a84761f791dcf61d275ef6989aefade7abaf2a2287be6118a42c115259ec5a86c3e7e72dfce0104fdb5bea06eb3dbe9831d8ef2df749124b1b251cec5dfa3e1c5d40070b8034073b7e1b66f4c89e8b869b12a2a633edeca318902e3ed7d65e402bea8ebd234a83a5f2ac397fef3549e402cb23c3060fddec783c3ec695f1c61d1898f352317a97ab7817a82ea874fd2d6458d27df7aba5e62aa27c52ddae034ba2da6c2688131f348a38bbcb1e9f201c86e2bc0a5e02644b903edac7ba5c85ee342f6e3585746b002c163118d9caa39dfc720cba035cb9f99d9eca2359157cf23e77376ce484be3e3637c0dfecdc28ea3a43fecd0b2baa309d9884d421f6fbbbc308aaff94beacbcef2b0053217f983bfff42d121f4683c355b3e4640333e591f05a7b8a5106ab5f051629926b3873bf2883ddab3e3cd3a95ee1151c74609d1c2d32f70d9354bd3022ee9125dae2b6e8d485cca80c6dfcbcc796f4ac7c09a9b27649e89e5e917aae320965a046a56b7cd5fd9b03eafd331b8a2472a2b0129a8d904b1ef88a3d270fab05c65aa914f5bc47740ff38c420afc4340d7de5cba24775c0a983fc9af00f46af121f9fc838e49751a348e89a47eb169a79eb151163e0e19b1caacb8caeddc1d464938aa2bf73d9cfbfd40cdef2697726ee879a0e1722b9ccc52034625defdd096a727af84191f597da6a6f740530c69a659c394e8969856abf972eb9cfd5289194f0d0fdbd3c06b6af3dd25250200018b6511e8a4307f39190b90481d8b67a28ee3406f58ea8f26e8386e11c2b2e215f08384dd73e654c111a1a442a231ac9fa89f1ec4ef54913ea3e0602cc99e29a61540591ac7cb644b1be34e08559610da7685f3a8a5de310a5023926ec14ad51022c81c87d5a7de4e6f9886aa36d2fe32e50ea669f56557d93870c15dba1e990e936a7c0fd8fc78c8ea7696106e0454ae4661c7a656cceb21f428ea1a897efed97594f6e14a95fcc2e37cf8400cf9e1f99ac379511c40bf8ebc83cf43ab77ea3d2bd785465262b6c6f3a635972c13203e28c613260ec9d4b7b458c58065bfbe54cab17c139e99d000eea15d72611d245ce1f4169d1e26a66977fb3673befc8508a86c3cac2ca6b8cbf5fa2f7a16060488b0533cbcdc25cac3da786497895a5276017bc8abb1575529ab846e787a87b0830e33e6b6f546bd349042c6245ac588cb028652c48cf52eb0a4e53220cf206f8542c6956d20303561fc7170d163a7448985bbdd457b74e1845d9b0a72e18717b3e4ca79e88a9d9b7216d2ef5d7bc27e32ee13d4f23d06563c02782f671347d4d88baf2bf175ac738aaf76933f5a405e5d5a60f3ef7b18cdd1256e7fee8e5b52824963e392295bbfff41f69e879703e8a1cffaaf024284f57a3c883e0c068dc33d81b09ab5ecebf4bb4533ce963b305397954fabe914db143eda6d96c349612077d3aa70153be87eb0319ce9c87a87e406f85ede4826d1954564ff28e11ad47c2f865f3fdbf41a4d44a963ae554f998d136eff6e3caa559aa17e94b6e9b16d252000cd0368a477c6782a293c16ae32d0d3a57cea2803fbf63fed7e0180144a1b998de8aeb4cbba6f7d1e39b2d66f173a7ca7c33ae334759dce86374f10edcbac170c54ee7a54b86559b424f8b0d29217c853a37c9bb30bd844e94bc7afedb97e3b2e541825e3da167949b5ae483fcab1bb9397e09041f73aa10ec9521964ca71c15c61c116d5e6bc8dfa5feaff3fc8d368e0e775b0090285f21dc7634162dd38db417291bf4dd6540122b44e775ee06d17a3fb1d0fe7a85d2e66bcf4112be5811e45080b22df6e92bf12eb2719789e79634f09939708ec721059e958b70dc594af2a80cc78f289c357e58b8ed8b6b49f65516dd12879546da5f564a7d553b6199dff2c187ebf8416b5a4cb7070ac7ec22c30b8b1dfa5a73a17aca75ef847b48733368e18a0431fed286ad2ee2f10c60c9e2a15b02e3ddb624227828e26302ba113c90d55f2432057b2876dde730961cfa72cd27be614a06dee5a06642b965e1bc84a207d467d7aeceafa4938a22878ef48be2c9d0f3ce6ff8a8628b403ca06635ed25332daae7d13f26cbc3d53ee0ed7b3eb61745293e75a2856816756fc460b8cbf93dcdb584544cf0f9d7e2490e0ac2f3ffdb7966adf469f0951ca4f7da392246948c9af67c42b60265e68071a20b70fb127eb78a77beee495d5920e10f624a1bf440dad3b0d5928372bbde521bedef1ec6fbf9b52fee989ac2de3ebcec0bd4c16245dc7a469f013cbe1173fcd30af6073d2bff2ac03ed7a85b34e32bdc332d4ff0d3d9c0ac0d12ff0aa338797e","title":"215. 数组中的第 K 个最大元素","link":"https://leetcode-cn.com/problems/kth-largest-element-in-an-array/","question_id":215},"86":{"day":86,"pres":["堆"],"tags":["堆"],"whys":null,"difficulty":"- 简单","description":"```java\n有一堆石头,每块石头的重量都是正整数。\n\n每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:\n\n如果 x == y,那么两块石头都会被完全粉碎;\n如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。\n最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回 0。\n\n \n\n示例:\n\n输入:[2,7,4,1,8,1]\n输出:1\n解释:\n先选出 7 和 8,得到 1,所以数组转换为 [2,4,1,1,1],\n再选出 2 和 4,得到 2,所以数组转换为 [2,1,1,1],\n接着是 2 和 1,得到 1,所以数组转换为 [1,1,1],\n最后选出 1 和 1,得到 0,最终数组转换为 [1],这就是最后剩下那块石头的重量。\n \n\n提示:\n\n1 <= stones.length <= 30\n1 <= stones[i] <= 1000\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d84c0a525fc6e7d305a79595c2a57b684274efbfd231c09a85de02d51d540e9801b79afd31638e22ca84d2f7afa13b9b1861d3d2a995b6d822d5664d49ec46dbf7e1c42d11bea51a00b3a26505dddff3c8e8f651eeecfb6fd9be09b4d57b650a4c8710075119c614c6af609c6279f8a454f640a2954f148ee30889a2dd5295e5107fced833388c4ae976b213552602d7615284c61e5e503659dcd726deca36d4d56761f07608c11e94861f63613528b7a2ad8d21bc4ace54b68f74a742d997eb744145498e64b7ae9b5095e10a7d2ccde56cccedd0d72ffd660727c4e5ac48ab43f0a2eafe78fa246a1b5c2c96220990e5e611ab35f8cab90981df6ceaf115169a56fed73c5550f0fa8074ece3e5d23d38d778be7c82fce6541a97aaca66d46f7c9195903b4ac16b4f81fcc40fd6a59e0d71a67084ad9e46499b0f700f7fca090e8cb92b41fb24383b45f5371c581d2dc75b59b7bf4605b4e3f534d827a90c5e61ba3452f322542b94b80af87097aba3b445578d6c37851c37228ed4860a3409297e2871cda842e78e7f75a5753fda810154c5be705858e0f72c7e5b004e1c38ce6e131eb642d3278b55862a1a58f1699c5ed2ba56356a03d727a66732508ee41a5b0e9cee19f34e1f5240660d844e17537c65d8c36e2ecc8fc781b43cc92cec236237cbc535bd7ed59fdc874ddc57c286476a66deb368564f2b0e2dd16069bc0ceea3874c9770de1cabdd3b3c65a5f79b8d488d9bb472e4e5139673eb98724633b5ae92bcad10f7e2206ab742f256405b6bbcfc7dd636d216223df62217c9d1cfd0146a24d94f22423a0bdf053dcd37d7ab090e64c722e35a43db16535a4b3faa99bd2b1bb057db11b49642a3202d064a5ce0eb5d48c731567dc53d7ccd552032ffe6da753bb4d97c8159ad0c755e55f10d41f6a03bbb0f0e23e470b240b7037c44cf5a8db8373f302cbb2678aea0e9c3b2c33a708d5e7c9f13325829a381431505be06f7ac5f41344eb8c3bb1c340d90b4e266eecd8090d092a1da01b97accd52f57d4c017af4d455efd566ac57173ebbd12baa659438d18c7d8d191588e0bfec32a12c6cc8c9f5803f46806a0c837b0c5f4fa4439a6a8d26f33596612debcb9d4a0f2e82abe015a60d2207c2cc6e22e4b9bc99c77b6e08f4f3f8b25a5416203032eceb698ff0e0149977956a7d447b4f37395f71c23e8afb91e64fa94a03fc084af1be029e639adcb2294cb177c8fe2aa797a763e27b88370e51217f80b1b88b724e8770bac7d9b9e6d6f0d7ec75dceb240edb2bd81c73d09d66c79e47f658b2ec1649484736a5377028cbc7b27c2ec84ef68c7a7dd8673aafb39b615de8d16b4aff8db8b98cd121420ad8319bdef48052a68fc08f985a3ba4a27cab8e12af8a75d090c23337f1a8482f1b3d9c0890aa0e7bd7943cfa2c12be6b67dd5ae0c90adb3468b6e804a102204724093cb56b72e74a32ecc92853a6d21202783cc898b8c1c65d21c52ddfe1b7dda0dd46753c6e7ad2b364d4766bda9cdf8e5e9c0825466e932e5ae56f35ffc5e1211538bea921f1e4181c440aa9f453987b539219422ccb1838bf64c597fb4a8f9f50ab3566690c11abe5f09e2ab5c5f47e2573c3198713fdc9b0fb7069f80d10d1270f0c187b4834b8bd158bc7dc01972f32100805c2ff155e08512aa92717ac0a1890b86c6e8a5fcdbadf8b0855ee5d98ba2adc5661a122bcbcb7b01a8a6fd9122e6593975fbde1026c59706d00daee7ff122a6684f3aed6551658d7a354b907ef4bc6881ec2384446b6678ba6e3ba94251e8765a8fac11878e9ce5704814004f203c7405b5133bab489f395d0714f1dbd86617737313a3ad8166143dc4ffaf25e350d978316ff8c2fdfcce85f859e4aef2028404dc17ee5ff00339a9b2cac68bdc104b972db1c4c954dd91a126d2f93a37967ccd6d6c9f79458e4eacc4d35514844e22f2eb88a9f753e13ee122ed5c9cf74361d7d9edbd953923eafb74aa69b229800c232598f2986f79d3408a9c8a78c1e48f71bbef508b08c8c808e9c4a57d6f8c16657864fa2bdfbc5708da4baf759f151b70ac221e8f9388bda98928565b9cc9ecc7eb2f011d4ba9d8100281079ef197bc2d3f7b0886654481ce9f58ea029c364c399a8c6cf213b26db73603148e2c0ae54bcec3502ab6e24799492add65f8b2e4bd2eb982d2fc4fa870f091296777fe28784f372f3b651f6ca01fdb9eb593158556a9f519d9b1b89de2f3a9297a65cb86627d32e116716cacbf7780b202e7a491983f881895b34cd5dde6396d3ceaf635117d9fe0e4ed94d36353ec7a4eb892433a9ccb44d663ccc8c2d32605a11c8f798e638f7840e73e8108f1efba07d915f718bb63bea604a4aca64218668a79e50a70763ed144b3051ab5d08947a96bf3fffec73ba9c86711859653440e1dfa6bfc6b24fbc0b5ba9c2ad71d31b1c9382c2ccc1aca7f6bdbfcd69b51334fcf54aab96b2534b6959382c940b2e023aa5fd15662576ce88a69c61891951930b8c535e2782534ca99812bc29049c4bdb276d65b91e214c48daa37a73972efd8b4e6186a87847f1182291f4998f2039a1273159585e068eb091bbe77453bcf79fe89a7eb32659493ad1ce9736e80ee8a3759ab05f25f2dbef3176e64d07b26e266b5237d2335021e0f1cae60325f23f3ea7dffd3ccb4bf8f3ea491b9e1fdfa4669bbd796cdae7ba108510ea07f57ca2b4316b7aced06c5fa5b6a54b4edae6cbadd405a30d09b72535aa61942d82b0e40033b0a51ba84a1f075f92b34c58db6364a7621752246da45caa02560ba86fcf700d67f13d1a6e08c9c9498055075d4cf734178969d7db129ee1f64bd44364b699d8b8fc0e975c6e62d8c3fdd00ca68e917d43e2d23540b96bfbbb1ca4c8a53d6d637d3f37777614dee60ffe756f5490602cf7e9f582487c48bc52d3f40c0b00426519a59d8ebbefccdae6f7f6e225c67cdede390fd6e23824bde032be3fca5a30a6e85e6d48fd0b0df85c2974f9e2cea54ff0fa2e516720d9cea889d91ec8134869333736e678ea5548d5164ef25a96fbd2fa7866bc9b606d42113dec888349ac2d4c8192e1c9156fd1dc8e57dde2ddf60e7e46db88c7d8fdab9c1fadc83b8a7cd249ba97981c8c3cbf750ce08acdfe31fdea6813555e70f751b1ade254a824c40d3a786ad38fe03eba75ed42bdaf1fce876a3be7f9dd8ff54749fe4388e22b5e6155868171f2fad607a3a6645b436958f5e033f3a4bdb0707427de69af37a16cdbd62b196c615218d6499d8fe618890414163051da524d871dddf7f009710e1c69ebd1ca98a8797c6196c5ae62d75e082b1ccd4c7a202c86b34d2350a868e9f6290e45797250610808e9ba6faba1e18f11a089769ef8f83e850950f12aa9becdf5af6d3750b3065f8ad2d67889471f44f156db1c2e08d810a529d6506cfa729cdd04266db0fae5c12676dd3c91e673e14b447e09963e595aef3c24c2daf61ba61108bf874547e313f1262cf0c60254360535f646e5582976a5185be5aced49e6f7ea8104753012ff3f7443cc7b402b9df3ecea3062e98a1388a831b03641c1e9be7805201fc3fcfab830a6dc032f7312dc4dc2574393551594f3763741da532376b427e5f055f457f11835960e57baadda97697d0ddbb5b12b67eb2d82ecdab98d9cf6686e9a27455663aa6d1ac5920a938c4003bc9849276a689801a9a0b8a0d77961004b4cb721c258b7640de067a65d18f7848f44a743251eb7bfa6520b321405f8376078388edc2f6baa8c7e613cb06e206503333d326f57cdb3d536f3d6c9f83ec2c0acafe056f3e70fa448f1109fc412d419db70de8fb9acda8afa191b262fd0c5176b02d49ff8d245cd5e887eadb9899aa0b9c6c1a488a4773e199dbb0bd85ebe1e97513116e935e36596b1f9dbb2b59acda8e8e0ebf1ef52645c04ebf4854de7110de867c24adc0c2b720e23c95d0549485651d6a6443f5d2811f826c705d689ae029c81dbe6d2f8276fc86e6813a25f62f32bd3446a7f1d57be5de2e26cc09c58fbbf74cebd283ca7ddfe63b5f1966fc6ca173c67d90abfc6e6061498e926511d129b240000f4076024e24f4fbd2d1b68aaac8966868e66c45968f0cf309387b84df2ec2ab623dc144cea47cbd1b43cf9cfcec86fe8c1e6c3870e6717cb408de7cf76c6fc92d5bbdbd5f4c2796aa8684f098c083257a5a567c9c33664388037345140326a2bfcdc8bc06ae73899a59e16d58d27c67aed19f9b6cbf769fa4310f5c3163ef698f63157f0f45c05f48d8be18a1e29be4baed1d02ba20fc3e8034866b64e48304b5fd0c102809a64796810c1b1ab8a1c41d14d84c3c421d5c575c1c68dff4bbce729c44a491e84fde673a9bf3b590f00cb6a196669681abd9b6aefcd9fb8d50b487ebf8022b81","title":"1046.最后一块石头的重量","link":"https://leetcode-cn.com/problems/last-stone-weight/","question_id":1127},"87":{"day":87,"pres":["堆","链表","分而治之"],"tags":["链表"],"whys":null,"difficulty":"- 分治","description":"```java\n给你一个链表数组,每个链表都已经按升序排列。\n\n请你将所有链表合并到一个升序链表中,返回合并后的链表。\n\n \n\n示例 1:\n\n输入:lists = [[1,4,5],[1,3,4],[2,6]]\n输出:[1,1,2,3,4,4,5,6]\n解释:链表数组如下:\n[\n 1->4->5,\n 1->3->4,\n 2->6\n]\n将它们合并到一个有序链表中得到。\n1->1->2->3->4->4->5->6\n示例 2:\n\n输入:lists = []\n输出:[]\n示例 3:\n\n输入:lists = [[]]\n输出:[]\n \n\n提示:\n\nk == lists.length\n0 <= k <= 10^4\n0 <= lists[i].length <= 500\n-10^4 <= lists[i][j] <= 10^4\nlists[i] 按 升序 排列\nlists[i].length 的总和不超过 10^4\n```","content":"096221c37c5f85fac03c87f9e42ff6164f9a3341809041ac4f074a7e2f1d4e6f309a0eefe389a13a7c55a83e810921b257a1dd1c11f3fc5647c87fd16a6c01ed76de97e378074213eb49a8e6cadddbbfd063b058fecb41debd4afb46266bc6e71a618f809b6b1ef4ef5b6d32ea54205bf8049f435109b080f7254a0c88279f5ca6d63f4d325521e4c86c2883209934e4eeb8cfe94e6a4558baa71e12a191ab535b3b7c13074c61a0b190bb6e12d0d78acc2b1a15f0d9faaa74d122b7be7e84e3cf5890778d8b5ec5271cb9ea02e9fbb86af458a796af066f86bd7a5ca2bd9d09186bb81be8a04ca9fc042df8bef66b7fc88fb1210837aa88457ab16b6b0d40f5d00fd996e4ec60c4026f177ed93c065f9183806eb707fe1a9792b31ce5cc45f7373caedd5ec2bac846aa53142ef7297c82ca182d9ddb72cba570067212c371fe484ae0c3286e3d46d9d76295bede0fc9e7a0a4d4c9b18613bd7e8e8b505e4ad282c7f476a2b774f26a557a275475ad9f26afa12bd31834495b4cd43eb1f6de1510e62f24044681ab501ca7484e5fe6479eddb896dabd11e382e9d38c6b27c2eaf0b2371f7572ef3da907f68f562616dc6f1b336c61e17fd198ab9463c6d86a335cd94275249c7fd6f2f6647e2c046d7e53ee9e7d1b550b543ce24547edbae709d06dea9d56daca4de9a487390d4e5c96c2fba870ceec67d5ff4ba85b9b997d919d5faad8ce0faa78955cca5b6b585ef4a506165847edc76ba687690e256a7144f65f2e5797bab9c0756f0a92b5bf93111b7269523bdb6c96e863223044d2605d78745fc0a1938ff63a31301d75ea2c4c62f279faa3903dfa427d94fe3118c99b4465b6da187f78017f313e8ea3fa635df3ba797fcde6c236827c88074859351f1e32ca6c5ae042132ee0ab9e625ed9d9d4692325ec7b198b194d81fb1686d508da860b0a52fc0530c1d2faa3694153e81bc1e350f64c6f1f6bcb0abcc59a4486ea399a00398c42b8d5e7bad6ad4992ff9648426c247aebfe5945c8f80700ec5f55e11f8a9cdbff0d7bdd95bef3854bde36060afc76c6dcbfa9546a80702dea44bd82c8766b9a75e55eeb427ed958a3b8545700059f12f9947e0f5721f99848ffe479c7fab1f16aaa5fdf19e27a8e27e9ab62125fd6c3e10e6d5ed31a678260454149386193bdb3ef7a581411230bcb24cff3da88992561bb72dfba1849c125a0ccd3a6f18a80ed14941bea94948ed3024b5720a5897859827bfc23f6b22549bf4aeffc32b85f3fc50de32937d31e1bf9482fc6fd441606e95f5675bae7d0fcecc575fbe0270cd4c96f93b67dd902e2ccd00260943095dd8dd48271ef2971e953b24a12c756d08c6d4f1decacae99b3a5d1ad8b7b26a4a0d2d8af4ffb0c1eb34d96b6afa01ed8ac99ff8d377181e126aac84e9ad9cf35457e84f367279af27665a8899fb90978f19f3dd90ed70beb65e85b266e5c810b18e0d842cc34b399772fba59c8d8e5672eecef0d50a5d615034e3cdf8eb9f3e75750fe0b06721f67e8ec2ce9631449a2c576bd134782fde61d800061527aff4459498c0f038eabd674b2b2b78808f3c03c1f4728aaf16b9a79619518622fd63239be6803445af3d8a338fb201a0a3145c3c6b9f309d198e41478508f78897cafddf484691b8f1a468d3554570e193d33d2ef1ae1b4d466245b76a2b807f5ef1467135d16b12717b700c23b21f9a970d512451e5bf7de29afdab01ceb90d122c03c3d6f35ba1da33d93f79a2e518d7b719eaaf0efbbac59ae54b1cc14e18a968f054e0ad57b6b318f02bca0e6634b8186665484cd02a5bac3246394294b0643409ed3f0f519260c7e343b772105f54b0ce823b54f270942a9dcb10a172f2e2cc4f3b32f6422ae9c8063b27fa720353a80c3a6a5e2e5844eadf0e364f52cb76cfd3c96027acfb385a29b8a7c62c77d8eba855cb6ec9748aae8517c9e198a5301c56b3fe144fc99f11765823565fab3d1bc8d17d7578b208636859e365fbbb6efdae90d4882ce14f653e462ba5f4412315b26b3f03b99463dca3ad9b2f548daba4ae46dc25beb5864a86b6849dbc87a70f124c2905a13fd4fb5735ae6def765a61488a589a5a28f0e605498f7ecc9c22f211b4692fe10138901bbdc7835803c691c865858483b43d0725e20dac6ee5b4b11ec7fdd4fd6573a73d32254bd6baaa04baf312d9b08cf40b35f94dfe1c2a1164a529ccf0fb78a9f5f26639e515510741256223e3fe519adcd8155926fb76ea72aa8caa8d1a6ebc27944369e970c2d108b714809e0851edfb2910b212f983e901494ad8e8fc255f2fe4fa1c15a5260e08acf9af6d030f04b94fcfbea7074c9f12aa95ea4a4d6a590cf2ed57f7fbe4d580772816ab27581e1d25adc578921f303adce578aecc7437d0f8110b02a2c2a25b217836d4799add769d71ec799a8cd58f0d42645b6eb0a486e61cd01ae684ea3e5fee6af69bc2f52e8c6559a9e0450c0091ef79f9f85186d66a434b4f12e115cf0bdc72c4b88f9fd6fd96eae00762e33f3cd04f948e7ba685299bd45cf276934bbdab75eb98c309d9bd3fc5e72b8e1d35fcaf634c193f9016934229bcb87866911bd3d144d8257de6439fddf783a2595896c15edf893d6f34bfee081eb37779483ad14f9e8bb758aa02c33c14fb3096cc4e519637ec07b39e479b4197b283e02086064e92559333af5fc62befc85aea5b571ac9591c88ee24074aaf3da84b219df001840f4042aca785e1ff9e1f24696f5224049a9ede039f69140763e999869495aac665bd8300c0822754309fdd1fac475a97a34d88df8731d765127394cdc59ccb7547baa9ff5f034f4774bdda6b9859c99ea4c5a21b7806f0d63eef22eb134ee5131f1086b2e119d83c68ebd758fe671c33e8947cd63ee1eb73e3023441096f6bbadca00c350d38b76d9f07c623d4cfc7b9cc65dfc630602cf7e9f0f6cce88cec5253d549de3507c59d7029fb0d7ab90cb2677105b543588beef90b12770d618a50318bee7d789176ed5b7dadf9ffcc1c89fd937d02cb811ac1488e516720dc189ecc991b58179d3812e347d28aea00fd024018160a922f87de0c31f9ef96a9d3b018dc8bc7dd796e38e776b1cdd47f11da4ac2e8a439024a2e421fad4739bb6d584a8d4dbb8aacd7ddbf4538984d2cbea4dce46a4b9851f82fa817947e7123a5e00de3b488b3611ddf4cff77df60aebba43d4689fbaa9ea69ada22bd88eea5d3ad0a8649517b5aa07582f3d0e14f60a10104c35ed62ddc0107c760a50f10d8c9bc78af1f87f1ed8a50cf2c7870837da17baddf861af904b1e411514a924c879cbdf2e418205d9d799b6189ad4e4fa8e4d6409a36133ecd5aad1d7cce7599e7a589a7b5eb3929d7aedeb519a771459cfc781c2aff65211f14122bd21ef9283935dc65b5de4deecd053a4db6a4e717dfce16435888b37b5571172c5e8bba7ab0a529d650687e2689d814c2e9e4efe15127f2ede88710c7a1afa02b8cd63f8c2aaab95232de324f4695882f86a546f2b151262cf4071255e601f4e6a2051d6c3337b98be128b95ce3e70e05506030c60e6b35f70cbef60d69e6e9fad4e6bd9f168c5d3134b6d361edda6cb1749b97e8ba5cd4f7cd232ab3160cbc74d6e133551594f3763741da532376b427e1317171d3e0dc05966e562ae96d625dfd895b75b53b673b29a27ba81b2d9cf6686e9a22610326ff49fea15239760fc41368f99da30a28e9617df5ae4291393081085cb186f25e839049b1c0d65bbcf3802a760227303ad76f0733c85344b1f88441a9ecfb896bab6a880ae5dc607e7051e2c3bcc63ba289e2248744c469f83af634499aa577a3b25b50ac10013ac22225cb5b15f8da9d399f183de89cd67b5456076b32e0cb01992cd50347c7d15340562ecb8684c4603db899ffcd5b5aec6aaec825f505d2f905c386f6a029daa3753ead88da628bf4da1695bd005e82b17de4073a7d2123ca1cc8ebf65b82b81b56b948c74466b0814a697e6509d030b2068d6ea35d21de36d35a841fcd6b78f7e60a77a07ba3801fcc38372c6c22421c041f0c495b808a496c6d43ec1fd2d5e5c24e171ef66c073a4bce474777d58dfea4b56d43ee7115a4e583e0c3373ccf2d2dca8c3a0d9907f29b46c0a9fc345d75f79378dc40492fa6c788f159be145b14015f9d1b4a9c7b8c0556b592e8d357ca908cd13a06c5eaa7e0f81b74f5c7dc8a3cdfffed193e6682a0e0f18dc602d2dd7472c45101765b6fa819dbf12a03ee8a41af5243bb72e2efa889de677956dcbdc714770521ab10d05a3fdb9faa24481d41d5af7340878e79ac737c621a43b8113f102ffa0354fc208258dc9f609a33492e5735a56773c52d4a34c89b8efdbe1f59986ee1068019b48d17fadd0e067912642b9b6f0163d9f643c28a3122c6d64146b66087c58a6f5e8eb975a7aee936ff34864e8a25e989f3072bcb2a9aaaf99f01b7cf385a33142356fdb9dec393c663fd63a85cf8262ff4f60be54f4b17f6f667c9a60c4a5bb20dfdd4ba0eb99e8aeef0aef7dc871895095498b40d3f890b0f9f8ba217648ba05635c4ffd142e538de985bb05d04c8f39642b509bc7261a741a6db2d3b133c9a4b73ffb0099f2be567f292d648d9d701486455c2a804af69b056adbc999ea24d1a658d0fe1c85ac3a29d18e3c62c13fbdac36aa56f58396f387745f76688aa66a83fb0c3ccf8716b267a54d4f112677ec8fa11252ddf598442eb8528abffa8b6ed99b7c976ecc58d66c96a270d90e789cbd18e0d02d24a90fda2b0df76fc1eb5e4f547018f61a4161d30252be81da87a9bd7d65a7a87fd426ba1f49a62a31665952801dd1be8d63a4b077c3e1603d2fa1ae438c5a84e693a90e248d16bdaa3b8843c0c9a1a3e7690caf5f1142eb2f50175a3cfe50f0f3e625bf9d715fbcc5a1bcf89dc8a2a600beb496875274d7ade1141a9826457634d0bb60987532c17a659eb8bd217769bae8fa05cf950e05aead0e9682f29da0b6df731510d156e05f4abd961b8988420c0d0d756ee47d71e0cc94f507cd8dfb16a971614537b2da7d86101acd24b1f278e8c0d61cfba3f04237482ab97c2a7b063c621d1d893a1bf909dc60320519b5d79ef55316e8fa9313b68a8e0545cb603134b3e60d75e93329364f4e152a2920035d6876de28e2c04f52b340c4ab068896989bd4c00b36df0b0f5cd8e3eb552a0c76cf841b50f88063e369788193ce49a82ff0d145527a179d027a24d52d8f84ea2ffc55488333c9a8abaef1b6","title":"23.合并 K 个排序链表","link":"https://leetcode-cn.com/problems/merge-k-sorted-lists/","question_id":23},"88":{"day":88,"pres":["排序算法","堆","哈希表"],"tags":["链表","堆"],"whys":null,"difficulty":"- 中等","description":"```\n给定一个字符串,请将字符串里的字符按照出现的频率降序排列。\n\n示例 1:\n\n输入:\n\"tree\"\n\n输出:\n\"eert\"\n\n解释:\n'e'出现两次,'r'和't'都只出现一次。\n因此'e'必须出现在'r'和't'之前。此外,\"eetr\"也是一个有效的答案。\n示例 2:\n\n输入:\n\"cccaaa\"\n\n输出:\n\"cccaaa\"\n\n解释:\n'c'和'a'都出现三次。此外,\"aaaccc\"也是有效的答案。\n注意\"cacaca\"是不正确的,因为相同的字母必须放在一起。\n示例 3:\n\n输入:\n\"Aabb\"\n\n输出:\n\"bbAa\"\n\n解释:\n此外,\"bbaA\"也是一个有效的答案,但\"Aabb\"是不正确的。\n注意'A'和'a'被认为是两种不同的字符。\n```","content":"096221c37c5f85fac03c87f9e42ff6164f9a3341809041ac4f0b4a4822046a6411b00ec8e04d3a5f386bef76b785c31ffbaefc191debdfbbf06c7fee56809762b37ee39f45511b3563498fe50d4590f8fa0d17ecd7e24c17f641a2352926505ddcdf2f86bd5dcf7b787181bf73572573fb1bb3aef78c7627a4605c5bfa2beb2798b444434f0c135914fe4419a214f926be80d522d9acc6b35c21cbf92d2f76d5d4f0fcc2a13619a7a788ae705bd08b89db3a4315f7dcede674cb69a6a23ec9ea9051807e999348842900e4ee08a9fdf077ef59fcf9c10820cf27acb76a2c39ccb4c4b906c04ddd677aeba8f7badf84db320b69cb8df961670f56cf2370491cffbf57edd4a2c83b9c25225c7c8e771b3fc68de50f946f8026d8d6b745a1cb0b923d66cecd09a2bba02e963d6b27996e57eaa21156e1de0092aa1482ea1fe451f975680f79492c0e2281c0cb4d176aed80f1d6d1d989323ad441bc0f56f2b0f890d9d99614a2029743b1d8a9fb92c70a983d80a013cdc7a5f0dbfbb95cb2a7b5357ab911464174d0ff7d9336ef29c760a24af05bf2c3e27af7ec4e5884590d2c5898ea085b1357828bd6f03f1a8ff1118468a5d7d8a474e801423d28dc5a0edaaf26873ea29a2605ffdffa63662c0a5a726ff623e1938183f0ff6de551a4ebbf4edebf0e0858e5c640d6ae8c3d3d4153a1cccf8871c1d867c3ef48af519ca17474c6611a677aa4aa7b8268f49eebfe977b201c2d571abd8934f3ca41240fb0e2e925d2c96778285c46b88d8f483b50097159683630395182090ba07f082e69889f2b780bb698c1c9d06e6d25712dd1682752931fd50d44b4529cec26ee7d479bd51932b90095cda0acfde9940da2cb515ed7b5bee0b6bcf9b46b14b49e4b6f38162627846648f7505072e2165bc752dfc7d7433a2df14fa54c974599cd17a3fecc51d3500be0137d02b5adfbe32b6a2f2bff5728a63fd0f4a2a428b22a85c06fe38536c25f23551555b3fd5462c0e6312238f8456e2d9564304372d7990a0bfd092cc59b5161590cdf4be797e0ace441dc0031c26ae5716f3fa37eb010f4a427a1264d1f3d54d678c112688f891ffc317cd9e7d4b718c55543acbae3fb4370c62104ec3d1b03168c13c26506832adc1bff4796d4c81a3d5cca939994380938012b462e880800f3dbf910f7c23caaf03477dd8f5b771ca1aa71f11368de36f445fee88fe4eee2dcd87cec2188e6afec5ea49ca5b24c699a33e811bf0adc748fe4bd7eccfc10b3500fe6ef46821d3c93bd15eb9dcad4751909d6b3c8c0554276f1cccf99647b2626d726dd3c7dfc97887507448d8c0861dccbf192a2144a780ff32bd95f45af5c9ad372cdf276396901f1c1f4efda48a54bffc28bda6dbf4518e432afcbf58b46a682df8f98413bb7af7f8bbb11bb96b133080897ab2f38f597720cf688fcc01336ac816a840da068f328aa6c4f1d55d65d02a79b5a8c5dbcfa223237b4765ae6621fefe4145cbcfe1d25503cd383b9c5f398d76ce46c65602fc08572d53f5f6dd08f4cda6c66da9cdf49e10c0b1b6ba8377109d5066cec968c01bbe1d19c4b9cd17c435564c1f306c54f30d4330879d3595c85d4efe1eaf0f48b39d0021a343048ecd5b8c329dd8ec5166f758e45957db9dcf4b24b19851646b3395c6532190d12d3c1220e097c65116474b58d07f5c5175725593a95c89a27cdaa1d7f859e039d092f6457858b0ace6432f35be5b716956b093b658562f317f0ad985a1bb812d7126c8df0dbd65e1cfa2ba749dbe2fd9268392fa7337e72dd29c0d2c3072788dd0263c978936e386ce228bb62122527f322d1c2e81b01377e3c14741d0bf54b1a5ed464c0d5e797f1dbd8a0fdaae0cdcff7958aa2c2411353fd72b720f19dfc5e092d7c81bf86eb43280ee21dfa25981bb51ed8f12c7913014700999a57ac61311bff7156338f513ed2f84c824dba9b1c89ba1086775029d8824fbca3507b1d1d45c52fc32d924e8d0008d0a16434451350898d2d41d06d9268af5098f7826e6904ffbf7cf24f390fbe323b1aea5c68cc6e836022db7f646dfbce49b0c8bee87bed714adbd121f34c9f27ae86b665ef9247310b605048d180913f4a206f70e9bf85a40c5dd5aa01ce27750479ccaac6b743ac8d1a3947d87adcd5395770bdd8ee05e47fe41df5e8f313a9dd6c802d419caf2768d95c97f308805f7d2a4252d6dd817ff876e51a47e5c9c93896dc8ab3a8f2e4dbec73b909021ffb7ef917a93c8261793619612c54e0b0ff0e50c4fbe04d898c803602f04514bb212b2550a12bdd2c3bd10c27cc3f70fa2e59f99daa706552283349a6fa41be8479028ee21d57be56994b4e2d230c7c82079cfa2785d2f399816aa499132e56823bd067ef1cef6e4b9f5c291caaf9fa799f6dffe8e8a4578b2fa9df4d3c0da15bed6f2f6509de223fe1927f6ac781ed9a1e9f4683d96a5f482b6be65cda9721609a5d0be6df57ccae5b5a1203b1b7ba70f07678fdfcda2a46528edb29382cec28b23a8dc3a8e53046f81adc5917adbb462cf231a1b3e6131f4a841a26fc1c373a5cfc5892e2d05f0e2bf8541350620d6321d1cb5c30e0cc2ec1d0c922cb4c8016f2ce6dbdb135b8461ca6b3d0bda50ad4a3cdaa642494f0e258eff3a77490e52517bb1ae7013f9af3136e65e22f5de423ec7777232e4c116064a027770b1cf4cc74f0d199b1a5d36de693a2f4dccf5d2fb7a9df84f93af50b1851fd1f00e0781759f9e9be0fc5cd381300a880ef3cb4b80e7e30c0c843524fad2954c93b19506a1c1040b886b6bc6bb77a7891deac7300761f623c09e95eccb80d59b680edf700d6340488e8edc0ce97c34b5d2780bc6e1c6bb5be669b03ee1f64bd4470043bfecc8ac2f836dbaf78c23f871ccb7fee16b2777e77580bd8faecb1a903c753c68a39c1fa60390445b775b08302a7101a61873fcd4e2f9acd9cc925065f9aa60a39468c4ed0fca3a7f58d6f2444085c67cdede390fd6e43ed1d9b1837feb8b889176ed5b7dadf9ffc938dcb8c35cb6ea61dbc0febab42724ed3ee9688c3f08944c7936c18707c90b040e7020f9764ea3bf87dab860287e243932d07c0c09f2588c2e080632079df02af44d486359f7f9e23b3a13fe4dd1a8ec8bac3ed86c5b8e5df7492e979abc8c3cbf750ce08f1f5c91fdea6813555b54a730b1cc5774b90125698a0b9b631a34fe3b343d93a95fff2ff62f9987b94c6b2557d9ece289508b5e61558353d4205ed7d10104c35ed62ddc0104d36422eb542c8dec7ccb0b33a25c9b601bc9de5133bc15393c6ab67848c0f46494b58f224ef60c9967d06a611dbde95b60bd6c6d5faa44d6409a36133ec82a4d7c989ef3c933b56fe280aaf9ecd55a5ac05db78521c9cd681e5b4ee5b5fb448169764a1c6d1ca5ddc5b11ad8db8903fa4d3265f7f2bbdad642988c763f453503685a6b48dc80a4f9d751d87ab6881810960ca1ca71b137b31ed8178187b1cbd5ce0d068eecbccba8e092de324f4695882f86a546f2b1540279c02217513251d1b6c2b5adac5715fdffb46e0d0973679e94e2c295160a3ff0c35cbb418b9ca3bcde34e399ca266919c601f3f7f50dcef89492bfc3fcfabde2079ac18f6716cf3f6041e633532160b72ace8a78f18772b023d0f553d437200810428d375b6d8a86c909695ec7103e331fed364fd8198d9cf66d5bdf06f5e756fb2cde9053d9766fa5901c0d68e7eb0918116d45ca07454d60b6e9ee1186f25e83904ce521f1dd58a6a47e31f6f3253f774f37726cc75465f921f42879fbebcf6a7a881b35d8852e2074a3377c53cfd66d66e476f3548d3c6e12410d1a20c244570e744c1545efc2c2a56bfe54ce6fc87d6f1d8b79ce73df556435ceb070fb0df245496a7c9b98f98cab314a96a527ac74c3b9fd695f5ee8cebbac32839116ec30f381c254e9ebb3d48eb8acadc43f61fbd2a43c415a8621d907824ea862a36a692a4f220ea6cc4de07dd996f47636c1ca097c71fdf0f245d729aee368f4eb1476e826bfcd6b78f7e60a77a77be340da0cf9a7bfbd62231fa1fddce8de42fbfdb98e03e90a8680b1924fc2c8b239773d4eead3b256743d4cf1645c438f54d17015d61083a33dead9792b886a28c962064f8177a97cc18975a6c7bd49e67c0e62f30ce4797e160b6475f9798b1e0c7bdce507d656b9c3035e614c01eb63e3ee36415bbe60b1f37d1aa8dfffed193e6682a0e0f7495337911dd573c170a5269e8a9d9deb61daf7b9ee119bf6c54de6160be93b7e677952b848e714f411252cf634ae7b8b9b2e705969a4f5ff0205c79abe4dc1dc621a43b8113f102b9ef2e09ca41389cc7b20fd96adaa726584f336b52cea31accfbe6dbbadf9986ee106801ca1d942ae8dee96e856318f8b0e1573096621612b812656d78142533122f11a3bbe3ea965005abc62afd01378def0eccc6387bb5b2f2d2c0cdfe4b29a0cddc73037624d3b2ed63732270927f858cd730ad4f7dbe05fcde2a2a682cd52c88adef11f5f74ba0eb99e8aebd4fbb289a3fc044d015d33f81aa9efee18ab33a5d7ffa0b763a29fe34ebd7202f3819c04aca4a91c2edee2bcd7d651b87a622989971486e25b923e50c7076d7bff7e2ca3778ecb8822e58ee18d033359ea3282111379d586f8640668b435aff51a99816a476a9741ba26fd258452b5116ab94e9f42da251ced85759cd8d098d758b674211e1fe764616dbbd59585ef98c7dc80c222365fc3041ba7faa41b30cec4d49b10bf124a7ae59e9d4070efe2f4f9ef67e977ddb5e4f91320dbf6253228c2b18d2bc99fc9709b0e11d649e42a72dee862d43404d112ca7469d92c3da687129ddae191542faa41cec76efa7acf796f54f5196edbf1040edf0a788da86a2019aac26982c104b73424ed6fdfe205aabfe1d4ac19c81d45e3b0f3905c6f495eeff6d3e641127e6e203b10307337a13f7e22d02a41640fbf7b1701443d9b0cb679ba66e41bdd05d9de8ba84c9ead8e8c0ca5d5ce6404781bf15a3864005100c6142e46f63e2cd93f323c283e618aa53684908a21b851fdea26df31c45b368757abb176a3ee9197feb73e392a0e7baaff1d37184c56ccffc217e500b2e1d045ec188e3fe9f10a3a98f1a55c67b09f55c484c19bc21b1d4cfe7b2a1c6a0b45f6456d52cca0bbcf61dac6803d3221c6b757a6cacdb614c43639491ff3684b2be72e37643b9fb779cc7d545129e36bc4c9dd02e0860943a9ee3e24dab470bb66ada3c1ca68c6e216c625a2a34d2a28c3ae00b112d00f6ac815441cec91fa36754532c0a4b0e271300e188c8a6927df4424efe10ccfe0a3fa292cf5bd067616d2010c94f5907f1942dcf42e5ef9e38c0fc2e6c33da547574ef4cf3ac434762ad211098f4550f99200fe84e19b3e6c63120e281b0937533b19a39dadd3c8ba56d94902aee27c59175d3d2035cf83af427128a310774962bf9f0b1af218c84cbc6ef6e8c290f63b26c7117e460ffa6998983299c380c58a7ecd8c29fe1bc305f0e245dbd16cbff2e6c62749a7301066e9aa027d975c2973c584893bb4eab8bf453e0608140206530775a948817c5b481e5d416190008f89f7568a228109a8338a395b07e27ab5b7a9aaeb2d4d729d5cb41b888677af0875f841aff2c9f4cd38e993c1223775c787bc521a5a13c4baa4b5522bc5526374d9457f9c5d69ee8de6fc9af589552edd3067325a1c4f0d02d48093441c01abfddc834494646780b01fdba0b39d2db10b689ab192c719f5b0a72f8bc799ea6dd095e1efb2edf1ddd15b0bf43609cb2b4970d618edda096811c17e59ff6df72cc3c0856aba611d09ebade0afc072749b6865c55202453d0bec7c97db30386a86ee437753e77c2b5c69f250313205c7f3c009fae34c2442799455dd62624688359537155f65b1d9aaebdce6b1965106a6c166d080cca832ebfa8bf730969d6e065880e4710269391ade18006aa6096bdc2548d6d1d7dd619264520ed0cd849c71146831e28d10697d444782224d4946c9d79e06c27f53f2da02c9305c48310c4235359637f79297525bd50bd12c35ac26e783c7c8f394bcb4a0d8a13b58fed756f50a1db95e49ce24afb6da0dae337ce219e27ab1474297de9b88b80966f8d5bcfde53c30306f9af61dc4288a9f03e77433bf11e1010f47012f80ba9860c94164da67ea2974f5829a3cbc9e3a73424f0c16ee46399cb987428bbc2bb7e0446b9b1dbe276eabffa4951c37b06031c45fc686284b71bf401ca1dcb4eaf50b4724be01f55a4f8acb8fc84a01ff5cc58d6f9668051ab4910ef920bd746342d9103d507e1400533982c43ee2f46532c4d4b2766a1267037b094abcc8c79a34a51bf06c937287431e72f694637cb179ab0673d63610b04c796543b588c025170d6e620a43c9763104844d85f4b1939b2c95c3b5529edb2b2de6df5b81b2fb91e87008fa24d3a1afb3bb515cfc3c7a97a53ad89351ef0296dc109e32e7a21405d55855c28e64e52e807f381dcd32780081042c38fb681632cff7123bb1377540eb31b5967ed8960cd77cc249ffd2b1dc7076305fe6853c8a21479100da80e792c199b416e6570fe2cdfb93ac88193d3c2ebfe2a7db8c4c9e97e5622aac86d6805c33cf5edfcd92d801ac43197e94b","title":"451 根据字符出现频率排序","link":"https://leetcode-cn.com/problems/sort-characters-by-frequency/comments/"},"89":{"day":89,"pres":["二分查找","堆"],"tags":null,"whys":null,"difficulty":null,"description":"```\n给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。\n请注意,它是排序后的第 k 小元素,而不是第 k 个不同的元素。\n\n \n\n示例:\n\nmatrix = [\n [ 1, 5, 9],\n [10, 11, 13],\n [12, 13, 15]\n],\nk = 8,\n\n返回 13。\n \n\n提示:\n你可以假设 k 的值永远是有效的,1 ≤ k ≤ n2 。\n\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d84c3b1093584ce3c64605a7e2355b8822559eafe011808b071ec3141d560c88a224daded3538f60ea9442272fd1cbb8ab91e0a3676cde4476b5f1bb393b10bbc024d4a8f7ed6d34f8da4e3254fa1a534c7e4494babd4d14f2cfd8986fdf82aadace1a5743fb76e4a5ef731d727ba9f8286fd0c19591cd849f62dff6ae66edae5079eb4d7a65b788bb2246770cf99fcf7caa32505e6a68ba632588d9784c52b0305b0d6ebef3acc61b5bd7fcee0c91a97778d8b48843e54a2e34aa5bde676e95eb697e646629bbc6757a2bd9d09186bb81be8a04ca9fc042df8bef66b7fc88fb1418efa52670c5bcc3756491ce7924b0f1c755fb0ee03206e4280430834c2b3e90dae6ca20fdbd4af4aace1088c3867e4e509ad96a225a53d4503955141eba01f5af5d40092aa1482ea1fd649f54966e3fa106d3c76d8d44295b5d503d0e2a298f00c63101385418da9545f77fb80fed37098ba97897b0a3d3c182b84ff759fc571e97e494f113ad249edfab4600e8f523a693293efd1df642d7cda0900bd3006d191bb79b5894506db5a5b504fffa008da9bf7e439998f2771c7c5ba06d5c48dd8ce32e74426074d58e029e60d0b12bdfdec14a9644484d0e7a4e2a3e3860ce571173f2d4630f13253f0a2eb1cc97797b7872045ae4e0e48dea697e3081b6b2cb66a6fdd42718e2ef92410c45201f493afe41ebf14b23fd27c3e4d4fdebd0a2d7f91617eb00935431f36bbdcf8ca97d35778ecb0b53c4854c6a5c0097d436b3a381c8f338b8d061d720cf0c9d3e21c2cd7fafb92b86e317547579b516b348d709e3c29f75ef7bf16402d06183fde71f0c4cedbe2143c3dca24a7de5bb34751392d28507b1fa871bf194a613e173d0d4eaaaf9e3b1e33244a4f8d3ee1acae4b7f43eeeb6ff6f60aa34bf81b7d080cec1b75d74ee7847f17969e39144e08789fb7cb53cfa7ea9f9c7a96c889408be7017fb680f43f5497da586be4cc08feaa4c4a540897753d9cdc5231cadf7a8ba02afc4016072e8dd64e50047d4a9c72ecac9c24d12c0d111492cb3fb5fb2517829dfc78589477a0d4348cf079df7902e581a5bf578e5e2ef2858d8969d82b682d8c7a0b4342bf6e9844a927ca249f6e34e8c98d442c3382b8d7d202464b275021372c0a0bf61d0ef0a2f77e2b42d531c8dadaad97ae9e51f2226bdf2ce24efac08dd8c3e0c9f17dc42089e484ed4bb39cae994a4ca5de12f53a814cb11f5176fd4bff159d5328e9e25ea3f290277a69e1e9b9d71c4d32a7cdd4b1e5e3b39ceaaf20dcb47f39b94bf4542ef1da0af9c1ef068e2556ddd4c892a2148e273ea25fdb1c3fa12befe7197f78b1a2e0c487d08dbfc00e38f5f2e2aad4509f4b3fff319dd1ff877ba5a3c68c9b4a3bb7af7d88bb13908ab1330f0795af271efd946131f582cac01312ac816a8538b668f32fa84c44105afc502c84994ebd5abef524093c59077dac152cafb5182ef5e97d577a7ba294cb9dc4d09363b50b4d3a65d3c922c04316429dc57f8d1159bbffdd0389327f526ed44771778d3706879ce576b1beb48523f2c60f1e7732a9ce779b787a93335a2fc60639b75102564ef1e8b534c30f1a281b47d7f9b9ed06d08df3165c738f59a57da4daf7a64711a31e44b0355e7b0c1b193d153fb2ec9bc76b3c6174b5960bf3ec1d463e5b30b1cb8301cc8b39b8743a0081272c797e85943dcf6814f259dbbb069c681c37689e53fe06f3afac4e11be1138b7d58dd0ccd54000f8369349c1c4f5b460391296315a4dd006cadfeb0626a4da0167c49119cf11452a7399254d2f4f5bb0d2e2e51b3b327c123777190cfd562eeb038e4d04014d84d9b20304242a20c6c3882d493ead84a660be5fa9320b38a5e6afb4cbebbb42a0cfe461ed015bfa9247945d04e3e3e0bbf3f5710b9949ebd7a713e2e3f5379abd2851cf4aa72d7bc90062ed31a08fbb6f54cc597b9ad7e9c2cb2cbe31b85ddf3bc6f3323bdebba79cc44f16ac8946fe109e5cc000604488b5ea6429bb48ebfcaf22bbe8e129bf820b935ca4eb6f93dce23d72e07552112fc149be923e54dd39cb4cd66b3439e53d54d5bfd5e3a9ce555c1ffac69caade7a693c15cae0506d8040e2fbe8fd047e033aec3a67dbaa9107bd043050c6c5744a26cc7fe854d6720e70ea0959ba42a98a6967e1cb04e75b4eb7789ce1d4c39935496ab5208d2e8b98422b7c815f7d397a2a4a233227e72d96c7814c9157906cac2da4cb9adf92f3c36d4c368a810122018b4d4c0ad9b11dfe807d8faee2ea05ee78bffc10d2bb5098a841e59f7e1934c5f695af9e8d3c56841670faf66676f0c429835ba98fc1a7befb21e6707fbd405e177e64dc1fc82a790ecc3ac579a365e16346804a7a3be8f0e3689b67ffbcbec733866ea48c523b1ba856a3221d6509de3475f0a92567c280f88747c93a9c857707723c37f95bcd98212e8d543099d11d9ce95270380b1a4f64a53384fe15195cc199c4187587e2fa6cf342ad3b472d1ce8cf16fb4ac3a6685da5bd61ece9ca84735edc30b5ea6e8bd5b3c139dc2d2479c1cbc527c1acd1e2fba2e50046878c5012aa0f176f865de76f942809f66911f90cd5913513111017c5480a0818c8e2285027c8037b489e0105d4de7fcf7c95c45127ddebaf29b3d21fe57cdef7ccd9c4ed94f235ecf7f0fc6233b470016e385641fb484c2d0f2a6a91aa3717474b759f3da0b4846ca9ec72f7d3c15320038d0c03f287d3192b17e2737dfaeef8351188bcc86cddd027da8cc8e8b0c2a13a7b572aed24b3834c4e58d1375c505c781e9002d5ad1c38ac9ef8a7529b241fd0e3f5c0d1dcc851043c97c26a4530f3e529f46de35225e916395c368efecec6e921dfb52d8363d941cd7df35df06864735b5182fbe3e78242c053c0d152bfb832e3c09a22d34509ce7880b1960ade03cbf5654d7e6beaf3bd084bfcb88f1e95777a67675a61c4bb8c97e5a35567263061ab8d198350cba2394b3b1fbeab510d1f4f2e39362e0c18e5589465916fa0667fb8b58035675c67543b22ee3c67a1dd9c02c2e99921dd8a58966fd924ea3b29ae5927c06ce793517418aa270a0c6df494b857ea5dd8784bb9468d1ac8502bf14418f5625a41386c4c56711d59b8322e950e7c057757957ea6356d69da761144b1d228938b96c11fb1bc2cd889503d7863b853a92c2ec31c98552b7202e22969fe423d3fc2cd417c885d891921affcf394e2c35189ffb5eff279e21e60b210fae9825aea71186f7d7428b692064a8d427442d8d248be7b5d0a980471a99cf291d80db458ac361ab7c600de3c51715173f4ceb5c399556a42f7293ebfcfa3d4d7ccb405df2e14de2b1bb393dc7fa3e0169768490b9a9fc581b7fb4a4ab84205855ce7dad7c70d954152eb8ee2d045ed902809367bb2e032389f866fb54b0079c5c2ca8081ceca37a19e2724e51847e49f5ad572d1c884ad1541f3c389d02ce72401e9e581a9efc05de27f8832c1e94663e692c4b4dd8ddb0b94ea25002f0611306ed13c3b281a98768d305d4f92b66fe1ce9df24a89f20cf04d168c42226edce21b258df1ad557cd7d1c33655547b2c9a8e68f9770545a29542a93af88c701acce7d48ff59dd7baaac3896092abaec6f49a95b8c4a4e71dcb8468987548729f1b403870d7d573c31a5c9a666f034f00fa2a2f0a97d4a9e33d230c9cee73e029a3b43a101fe165007fc553ac34e3c54c5009d7a5186425f9132e961c95c9330986bea7236d264dbf377eb2f304efa1118dcede66072a02301f06471bec4cc92780be9afd2bfb7d883aaac2e2aff10b460fff821429c0baf2b64ff209f4fb39a8e6dc6962803d0f103953185c6523bc79cddaff76989b7570b7913a3d000e1b9887b700f80304070bf3b1714c3bf5adc3bef49775d695e90795961c6e4e0c67c1d90b571e2f9f79e510ad90098e04cb9275a5fd4e22b9d3794f367de667ef015b9a1a6584daffc85d307808d954c2b8c2d15304ca42d647a5cd1fa36c75713aeaa43fe077a5380aae87d73a780bcd7440ed1a486e55a3445d4b69a35434d2ce879338e90ce63fe313751efd9b8826ac961ed53ddb3ebffc81afbbc69dba166466140d7dec9bca683aac6007dac113d509fed332178e37fa2131cb155242b43dbcce530575235b5244a5aef7e648b5e41dc023f331d09224b6f32b64b1dfc14e6c636e3b790321d7a3c7b7e151abf48422a7addde496b06c3f393e3ec76bb41c4d932e86d505a4eb5f2b5a72f751b23b48fcccdaa3c623cbfb2323357a61a4036783d104c3998e4d7753b705810611abd544963b38f6c14c81aa463f7a9605ee1a00e0ae95b689eb1223db4e024b147d4fb3acef6b7b16d213df7ea0d3fc6c962f5cf4ade15a3cda3a5b47ed4621242a192a6b0c7b43bef5aceedb4a7bf98f72f0154a85a75a98966b61babda28eccc9b95872a5ccf33e54637b8ae9e3642258379b55af44488964e8d178b90830b28aacb45fe90c2a77b56331f22e223845674c9729f27cb95eb552f779d3221b594418674cb8b8c9168fafafc54cb1e8fb3c2c1808c078f14684daeec80300c1fef7ec9973005bb0376679d53e94634d358d8fb9bdda600dd4d324dc93b62c4abade403eccc390ff2a576ca44c709b4043f5bf1a2ad0de68fa2304f32eec31190c356eb4db91e6583a920326cdf4394d8c46c047eed2d4a2c82b0e2f8be7603324e4e923fa4c450e1ba00713d54fea2f8d79937323db348cb44862aa4015a39e31990fc6f23ee6535490dd1c302c98687f1b8b242a3c0ddbb4ad71f6e74bd87e8f46a96114ac89f79b1f20ab449496c2dd6e7204cdae082e49feac1fcd7ced9fbe754b1bdb9958e2b60e4ccaddabb4d1ac4db9196878b47078670f315ab37f4be4078b9d555eb5e5b2b3f392c3a6aa009bab97af5176fb9725dbc00eb83b90ff958730937137c264559c85b22d7b43bdebe20ec9970e359dac1a8483c4b8a18be6b093fe959756d9488ea2199f804032190f4063ea4e70e1ef92f41bc08fde1faf4b45440e8f169c10ddae65f12e7c76abcb7bad086e21c2faedbb12ecdbfad8f1210d1526a98036c976cefff1cc520f522ecad7aad1f048977b4a586a803d20b91556f3cf2aacb1efe6e788ae0360035f5274d701c80d87f51b9c6c00e7311c7f6d7b5283d96a474e40b092cb0668140bb59c7a0cc9d93af9fa9d102922d931ea9fec28087eafbf432f309c0a934bb3039f1477fe8d02684e2633296d9694df69d4669387881778815441cdd433a17e635038064923251804c588ffad936bebc0c11718fef50a2aa29fdf66d175746c362bcb53798422f589458b78a7f13c9c5ae6a4af6498e8ef661bfdcf177412cc0c425410553ebc2e1ec48a96092358bbe58daa6819123fcf30921e8020eeea4902f760a939885eff9f892f387aa9f51907853f27749734fafc8ca425aca581c8a35569dfe2f35accd6c325e3988be73825ac4cde0e5039236c464e2e2bfbc530600027de2e78ffd5ffde273f4ec0d26a32fe3df911318aa48a126b97e60e06b49b1f0395fff8db92ce6920ac0e7607373fd1fe98cc391b9bf20eedb83c4587263e58b0fd618dfe607f363a3637960fb07c1a97ad7358c242ef31bb20d81a7849af8ac67dcba89c41d40e6fb3e1b656196d7bef82f29865d9221750561d68b7253fb21ef53a2f9cbdc7303d2a0681bb9d8fc805f25f4f45fcdeb381eedae16050fbb90a26c9140967c080b545d8cce46774a24c3e5ccbddf772a84d8b17af5938a6fe18574259e5c8435d0fbccd53172107561afc30b5e2d96450d64d26661a8f71d288c63b1ee093e8abd703634812b07eaf3e6fb36ffbc6b0b26716010ba5c0b3827655224d1b789854afcf57aedc53d7ebf342b79c82f83ec1fc1e56154f91c8cceb90e6cc809be82f4fe63d2d4fbd9eb7182cb62fc5d382ea0f2f685e12db29d459216e9136eddbf01492ece8ec32fe5fa76e9a913ac0b0168e7054c6bfc39431624ebe73c96ce250ace414a254a75d4b9717b4e3a60f13317bb9fc599c0e9e2fe547a8d1a256a5343859a4ed01ce781d1bb0e2ad661c7d050a67e033b46a427fec5cc570ae67f6e7dcba686d474000cc61cd661acb63caa74a698a3dce5e433f80aedb8d2d8acff96da6f337b92e12ba173c67ab7e6717e997b50b0f55182ad0de3718e930db765f3e93a86b27995d1c6fb9754061b16a1ed06311833b051e624ab50d37c0e37ba542871dcb10f559a53f5caa4b3bcbf8e5fce197b707f5801998be3d8542fd000ae29442ce12032d8b32d544e1271667cf040dd1600e1a540b03412ae4752437d5d8ee81c937f74a18f106da72083522e33a68081e8200c1e2153d636b042e81c31a7851ef671f7098a974c36ed270015943e95e1e0528e98a49207434e7f7fccd24aee4747bb01edc77a5ff68755a7c9c36db5e91879e122bb3c4e2d961d3825fb797bcfdcdda291c8fda0babce05ee6eb886a79835c6572020be80deda478350ed6ae6213b3d21f27a480ba5a408864bac7ab5bc561965e5e095fd4270c79a34f1dde4ab23742e39b94b577cb305a4752adb427b4492e1efd40f7fb8c5e8c2737a3aa6ec696813e83cf8edf7dd3c4cf27e950241a5f8108367625504e96497f4ef66343967d4b4402cfe796460be8bd7a3c9fa2259365bcaa38f352c18a9bf333bbf121e1aa42df40dc825c038e9432c8d0df15eb9c548cf73a6df68cc70a71aead3c7a194b503c9653494f0fb465f930ce2acbd19689b53b1187bf892ee5aef51c7d6191e3ff028a16988e32cca8589d9c59b05ad20e502df0816ce6361cecc0c1331deedc2dbafb56d8884b2afef5d82f022111f72bbac2ba085b005e983d3fbb8553a49ac9988f145aa65893e576109771e4e7f7b171014aee1de133db5ed512ad368e33aed3b5b8979755f6dff2540d58122c2f11d5c148bab6cf1c833dcf071be09ef7974e241b130644371666a99b060a48fdedea1be24ab82e803b8e928bd33127465abc922d1931389f30794832b0c014d7cbed41fb5b0f6aad22bd0e6132cee910248d94c05b5758d0599a01d2b51c4ea8440168efd9dfac7b1460ab5194bc4ab34e4de1ff748ec9a52bb2cd33eae7f7e54b582f469c4bf8ca3dd99811a93c6a2a2739098fd9d529bf9612f2af2d5f97c7b14daa9b05c40695bfbd14467677af65cb9e2c295186938524b8fe76582391ac872842fe3d22efee59d6dd0c48399a7f8750dbdb456a91e2d201e18aa0052cb1140b6c2cbcb0d471014bc8c41fc994c470f5ea6052768f7f9784e0c5c3850d7722c23421a11592a6a1ac2a7b2eac64ef54913b7144f44cc91f3cf2f260283e627de27ebfb69cca9592024b0410a76c41cca19b74b543e954fda522877a1c81d0a3cb6a7b48831ed3862ed2a50d65eb77f0860de94436d92f9c390e336c790e1f786c18efc27344ba2495eb96e1b1137218b811907dbe9fa90e6b68226022c51fb02e62e3dc0ae568e9f4893a877a727cc3ab8aeda13b866e57fb3cfaa511431422b64227b370b3b993e03a9852c281284d8436d0cc24c4f4ea5ac58e409c332fd9d440ebe50877f62c95adf43080dd1ac3f2adb64996766898d048ad5caa1ba9e6b91bf44aceab7297a66d2340cb6f1811ee97cbbcb4b3d93bf2c3216f589ae5f211b83cf0bef9dae32187bee2b56615a66da445f171f3ee119d8e2613d1117e05caf064e40760df216f80d14332ca14a0e5b5684521f05696909d412bdd84cf20d5105d0ebd60418717b7d03e9cddca994fe652072adecad27e133a76f476ad420648827c7b363304f5686f6fbba235ad631b1dd6933f5f96caa9bf55b639ed4d9934656b3b0f2aaa706389714392fab99e2e6146eb43c672f9b01e8f4ec202f5f40bee2cdb58d3b9975915d1ee44089eb10825377e063e051782b49b4f79148bd46bdde90276abc0f07336faf1e0ea8cef40855c79aade5370474afede4df054c1d15049f07d671c738163ee9e9a046a4994b9777b562fe8694f657412752059f2a80c34b288601860f1b0c846597063333d7dd83894ef024175575cda848bb03be433c259c9a81474a133334b20fcbc9f2d82521bbe446ec625fcaf51e9ccbca5a7cd5ce3594707f69d603f16263e24bca45a98f44f4a2fe8653f2ab0d6dfff0d331b2c93faab69fb1bfa9488b5a396efb385dd8460d356b8d79dde0d1a3f3c43cd95b01e412e161a1b703cbd6f1aeb489e0e4f6ff342e74be6682b1c68856c081a736a1bbfbfe13210ad2adb63260c78588f0aa7fefee02d51537ffcef469d8d2a527881d5be9e0a13b61a7b2ea7f73bf6ce76cdf100f1a74db4015fc2a8355ecdd024106d91e27489518a0ce86e7c734a6f2153042e3f17da1dfbc318a993d864b0f172e5128619bceffcccfb7b2512e5727c95f495868f143c117d671e5a10cd65caa28dc32cfe2c8259c8f0b35f3b9f8e167726bfaef691d20c8870ea3aa65684271bb405fe7197fdff33f573b7611161bace24cee149514e38f5cfde7c183fcfd0968cdfa726502020ff35fd7a8faafb688890fbe82ddb7ece4edf2ff60f3ac6e8b453aa0613fec2e0e21a6cdd3363fceded53dc1ff7625ab1940263b46b56affafbd3dcb03d8d895ce0d3c5a0419eeb389d1304f11a04b1c56ba930920b9733f51e2d7b27a39080f545fa94b0aef2882756e853481d03dd4a1264284337ca6d4bda466fa819d9a4390636b6e75144ba55a549af46417fb0388f7d2af8fea9591b236dabc0d939f60d609d5a259fbc839d2d1fac62ef31b13c9ae268363f3f827229b67e9755e40b3bbfe95dd08538e36d15f61f0e229a133f5d72a68495400caa667a04763b398f5e99cfe8a0db9a46fca287247a06962d53615345688ef66cbf47ad8391b4abbfc2bad1286114f8d58cbc3786e8a1d3a950286e2ddc02416e9b802f8b2195f50c0e6ddccd59bd0b1a9cf85d1cf0c6ee4","title":"378. 有序矩阵中第 K 小的元素","link":"https://leetcode-cn.com/problems/kth-smallest-element-in-a-sorted-matrix/","question_id":378},"90":{"day":90,"pres":["堆","贪心"],"tags":["堆","贪心"],"whys":null,"difficulty":"- 中等","description":"在一个仓库里,有一排条形码,其中第 i 个条形码为 barcodes[i]。\n\n请你重新排列这些条形码,使其中两个相邻的条形码 不能 相等。 你可以返回任何满足该要求的答案,此题保证存在答案。\n\n \n\n示例 1:\n\n输入:[1,1,1,2,2,2]\n输出:[2,1,2,1,2,1]\n示例 2:\n\n输入:[1,1,1,1,2,2,3,3]\n输出:[1,3,1,3,2,1,2,1]\n \n\n提示:\n\n1 <= barcodes.length <= 10000\n1 <= barcodes[i] <= 10000","content":"096221c37c5f85fac03c87f9e42ff6164f863d84c1bd23f07d6231746d59590f54a19b245fe7f8390508b05be10a76d05bdb801b79acff2039f736a84d2f7add1bb9968e18342399636081e50f5dbaf8fa3a17ecd9e1895ed2d3688e6f77660886c1a56322f6dba7d3ef82a56cbba2f03e529ce4bc871aaa14a4f1cbfa2be2278d9d47516d0c345614fe45229849b97cee1b589011661831b3fa4330c1e58f3f1c0e324a33e48c68440b779422f59092dd3e1d4cb092f3e272cb6fbbb57686f0d319917485c95d98251ba7e80ab7bff170e85eb29dbf06618ebc6d40e9d2e4053141729a50ae759ffd100cf68ec989ca18e5db418cdd63661a41cc377c491fdeb551f2d58af331902f216d628d633d3df0adea15b96da700dadba14db1e1089b0265f3c70b89ad67c9063e4909965167e8913458d8d201909f30ac1a9b1ea575918f7628c7d55746bd41e19482d703d5efacb3d1ca9e8010bb5c8fbb47524de183f0e875859978dc765a7b0e5f718c94279cac11f119177a5a64f83fb0eadc1e26e8371b0a4fbba56c15a1756eb24c041e330afc9684487dee525a847a342b609a2c404750328f2ed7d03a149dc1d37ad1a4d3e6a968c6027e2627e45903e9a2e95398a1b928c5117cf977792f225f7e53f823e1938d85fef46ef49b6e0f2e9164be2b3f59d0fd42cfa68b0515adc5ea8a500a71ffe664d0f08e3f36c3bbfc74c97b3366418a65f52239cf5a644143d2b70a15594b83e0bd2c3886a9bfb7e0e09b675f6c5e381314f7dec2184450e43d442f613c93596792f28d90721cdd0c3d67140ac9444a026ff2b8b1c9e74fe5f6fe22d54bf4abf87ae0b52d76f39a60ed4b7da8c81d7e7518602339a87672e8e447f3f94728bcd7ac6f308c7b11469afa93889a3809f6504170af94a61b980b2f5f89eda270dd7ff6229a1571c2326f08d55497f239848ee136520c5defa0e9b84f92a613e6417f4e3ab57496c8ad5a84d02d9223063fb0341d4d9dfcae6684121fd2456414955e167372d6fb4b8f1fb6ce78dce5f85424c0984f2d677e14c666a5d38464a00d585222f0bf3adda715872f7f01fabe23fd3d8f6988811eff2671e3dcd79536c64c49ad9bcbf86366c5341ded072b093a8c18c36fc242d656f95e45b6fbc81a3b5edfbd97af280b2d142f481c6d523fbe9bff794e1ffdd0f25ce8164d365650fda43da32e3a8729bf1bc06404260d2d557cb64e42d3f0ce816ad6c48cf10173fc8105995cbd33f93223d647aea721f5371caaa571e0af9b56324780b0aa88667740ecc19df4d780ea9889d233aff66753d752810b39b8b02896b8e745cc1f3faed08cc2b071d51c72c750b17910ce72f38f52481ef9bbaf8f9ea7e79588622ca6aefdd6a675f53a00b1578bb7938612cf8c95ef99395da9e83687ca63a7d6c90b474a98fc5a009cfb7965a8a6929c0179cf973dd623dd30c76af04f265852821c17efe565c115a3934d0654e9641dbf7d72bacd7f2e99be7d15335ef3dee5e694fec71ca64d280033a9ef439c5a701fac830e854c078f8a8234eb5962182ef5072769fb6f0ecdc5e121d0accbf237939c20561615fb8e5ff32868e3424e7da30a6def5d5828758a888c5da41147653e1ba8f8dc9f0295c4dc7d2761d218af14f7cb9114e71aa4314494025e451c182f03d1ec18eb98d065157c76a1ae05e2e01456135b19a5c89a27cfb42370b99b03aa1c2f6757898309cd4811f364f5b52588643e1a6ab47ef40af0a3a95118a22a388ffd8cfcc7d66607fa1ea249c3dcffb6643926aa325d46d013fedfea2b289ac50263fe9723c2fddc4f28bd5d1a392a1c88b39ccd71442610413b107532971f3f894e902ab0838e348feb1b5e5320439cd133e3d276f6b9eb3b9e37cc22485fae83c1a98b86aa05f2de8625ce66d743924dad5d2ed8eed9a9fbd36ae529e62d7fc54ef291b32e3f5150638917884a08ed483fe554f79ec7ba905cb12ac0d73e5e11de34dfeb0eeff0702b4b6fd21e055206c8fe6e13993d820bc66ed9bcc3355761bbfa66d865794ffe3e351eab356380669e3371b21a2838af8706fec8e5c251ed710e92c220ca439e19aed2f875ddac136d09645612d386da7a38683d38a6eaeadd04149bfe7ab32737136ac3b682ef10f6c21347289c72989c7a037ef4e1ea18ab1ea345b0e4f318b89144833b409aea2d76c31f80dd57a9162f781a04ddca853a8d43e4076fadb3ff269ed59199a8f2e489a920b914724fb01b815efd65f3343c635c3b0a48b4beb44b54dab2fe1cdfd0cc2b5d8d4564e968647719f572ac797ed60c68d23c65a26959aa94fc575152207006f3b415fb8432119ee45b0ee513c7614d22366802ad14c4fc62b295efd547ff0599136e16c2719131ae36ea6d58cc076021b1b5e1789b22abe8f1cf2fc860ed9a4e6065ed12ae6f5c315b976c78e1d46e60c39afc910fc86599df36196e3235af51d2c23c3ddf542f8b9a03a3fc3f1f544289babe64dd6b74a3bd8977030b82ca496d52836ff76893c3ebaa654ee30d8e5143e3a10335a714e0faae3d114fd6506ba7095655058f1dc6ead956246db70613582b43372198cb4160a1d961ce969070900c991eb59213dfb93ca34655adb8d9deeb5ed4ea89f2643994e0f97286bcf23ac4a07719eb18fb4020d1b0537f668d281cf76fe87e34727b134c256d844a325f73a6a831b690ccfdf1db77a684eaf3c7fc5a73febdd3d4b83da54f540cfc0d26ca2b521ab6a7fa0fd8a121115ae4a2e220b2d45b004899d4201a0eff68179d7e4b5c28340c57b285b6bd0ee03e6cd38685730076176e395adc17b4f95435ffd3b9eb1ede774bdde4f8d7dfd6c2405a0e908b734368c1b760b17aab5c2bf3006b2e119d83c68ebd758fe6378c6c890ccb78f44abb6c2373015f9ef9f2e399188603c4972ddbe177776743a22fdd8b1fa71a520bcf739f1e65d5a2cec5256f11cee34d7c1492509bbaf6b28be23d2a145d086f9ea8a0dfb32a2f8208911f2be3b9afad502b81bf899adcb3ddc9c28c689e3de34fd525a2e516720d9ca3c6c991b58160c0c36a3e717d8cbd19d644098071a129f47df4d262c9a806c4617fdec0d03484c28dc1332e1c9156fd1dc8b52cd0629926a2b665ae942193c8f69f82d4dbb8aacd7d92b25381c8c382b150c64bbea0874b9bf48f7210b307741b0dc439408b1c0fdde4c6dd7df60aebba43d43adaeefcb827adee3a88c2f91232c3a17a9d5bf0a55a167134592fed203a104c35ed6280ea3a103f59049f42c8de8e8ab0bb6a0793b701a89f8f4f729317c69d8135c1df0f5b49051da5249c34d99e61028b00d7c1aaba1d86c4c5ad8e506459f26f63a3ceae909292cd7bd26b589b665efdc78373b9b805d43b44189c99cec8bfe90532f11a08977cc5cfa9d31d8671779487b8d15aead345103b6ea7874e69c88775e255187182c2a3c1c059019d1649cbb73cd4ce0234b44efe15547a20ddc066087f46e606aede268783b4f9c14d68b02ca72c14c4f46a162e79565d268a5f7a252f29000b1f275adaea215195a012e7dc9d6a0ba91b527e4b4aa3ff0c35cbb44afcdd21cae31a2e8bf175c5b05c1e23625bc9efc21353bf708beed0030e8632b6312cd9dc672613285122473a35781dee3b372d0d2c5f4e1b0068419b1928e375afc3a8608dd6dce31e1ee57bbbe70de7ab98d9cf6686e9ea6351623efad7e915389b6ee0083a86aeda76e3c5d35f9a1be1690ed64d44e59c326f25e839049b1c5018d9867447a728385903eb37bb3674c0750f11c60114c6cfee96eba7e0c4f20dd95ce30c5f636bcf22b27a97445a6f66469f83af634499aa05696f6de749977e5efc2c6c19ede544a7a9d399b090a7daa677a5400418b866069adf245496a7c9b98f98cafe449b6f1a4fd66d20b5d695f5ee8cebbac37513116ec30f6e0e294e83ec7e01a49093cd52ee43e92c4ad517eb325c962510f4867c73e5898ef220ea6cc4de07dddf760763795df8959a35d946705d689aa366864eea6d6e826bfc9ff18f2872a76477f96b4ee6cf967be6992931c40dccd895a46ea3de83c23398fe7a0b1424ed78ad23dc61dde7873b25340c869b1e13817bfb0f5246142f417d6cd0ba8281f38da8c0d53b61d26c079f8f57d909387b84df2edbbc6c2e8f0b9bf033f85b04d6cea1e28fbbc04e7e6438847934b8088b5bff3a32ee2d4ae6f40b527cd180d6d5fed193e6682a5c4a20c0613743d94d3a6f041268ccd0ffed89538834c4a4419b1551dd6e6daad8b7a53bd478d78e0200504e1dac2c04e7e393e2b24789875e0c94675c2beee68274926ef627c85da51cfff2394890522c86cff76be37bd1e462534976401797f703dba4a695b5eb9f86ac513a428559d179e1def40bd76310b1feb55779c3315950e7577e28206b26270f2858a4e4e4e3df457bb5c669b25479d9aa5cd7ec387bb5b2f2808599b6542ef38dea7f1635218ebca570684a31c03ccac89263a4657dbe05a1f42a2a682cd52c88eefd6ebba30ef290d7bde39201e466e271c0169541c81581faccb7f3f2a7752e2aeb1e734546e86e6f1adff5ccf551dc4cc67730354e9b9726541b4f28bc9cf7758cf6f933fc52c3bda547687b2404e9e23d188606137fce1e8b9b1f6accc381f47edab109aefe0185ef6f7b83951662c13fedfd38fa03a6cb9ea8907e47683c9ba67093fb013b9ae84ee67c8f4d4f112621a9ccf5002ac1bcd61030b800cfbea4f53b8bd57cd12f871de9619eaa3b97437099a861a98a682cfd2599015cbe2fb0eb544591f4b530a7e3a44984975772487619cc3400d82ea55be526ebda64948adbc59b63d2176b4a37c2bda85b3bf999dd295cd24add022336380a4f89d0002b11a285360a3c5b73d7cb4dcce2b43cb9d69693cbc607fdee20cf7a568fab2351126074415d345689623d5a2cd0b14e3be1465fcb268cc3abd4872104e7ca518190247d57a790d73b211edb5a22e3892269943a447e1c642e4577553b86972ca6dd6e6c9f454fce95d89e96f42bdafb27573c3083604b46b46cebe7c8e928d61f835b449378eeed76f8cbad1c87f9cf4563007d9e7c0d7e1b286f1204ee3144a538c756664521e8ab949b5a1227663fd43b2303d8d207f7927393bb285fa0216a4a55291c7e522353cdbb9819ef1b8b75148c2ec2c534d797c581b6d2251cf5cc86c611547fcd84a1b07226deca7e4fb61f435a8dc359fd79a70a3ed3c6c91af2582e7edf57d7d767d018db97723ff6f1cef3baccf55a3a10e30b81c1decc451646eee508719066eab1d1f4d9ddd8b585dd3f56453c55d364d6e612cc48198cc328712ea2419cb6ebffee5e97dfab227942c166cf6975e44c13fde8ed2ec1b0a27ffe6e69d5c1ab008cb54c18c1c351e9de221b47f1ae945e5d783a66178fe03b5eda4d6fa6462c97ecff7db8768b55b51e40cebf97424bc1cc67b1acbd08f27e0e1032f877bcd8d1e003e3210f67b023561df3252d3a65f6e72a88310957f9efb3d390efab260c746b4ac24282b0602f7610e3270145219fbb31d06e818a4f425f8df564ea9dae1faa1fc40e633c05775ac08827dea89bff93581f4408ecf35f2ae37a53d5c77df0f1f17511c8133bc8eff1809238969e66a2997033e690158c19eb319351db83933e5c1f735d3e51c125a5e6722ca34b097ebc452f3736c60fbf8cb5cab1af3ad1d01d8931a5d11b7c35a181f29f2d05587a1997548ad8810b49465d733300e19e1b74dcdd43e5d1e20a656bdd5a4b73e6fe3ddfebcd4e5805a6228258821bbabb476699fee0924c2bc893c4e8c44e19a2daa2d733832e534d89ef5f849eb59145fc1f7f06b1d514553d7f5295bfc69d76f45fd3fc62bd3237512e91bdcf96255839205c7f3c4ddefe3ac2407dd45802c02b307fea430e7555e17150dbfeb3d4044d0a420e6a1f620e149ed938e2ebea32207599c22c8102475767dad6e8f0814dd144c5f4981185641d6390477d45738444991bc7520e83046bd309948e0f7b3205c2946489709a3d29b17a7cf569c640cc8a0bbe725d1625393c7b7d25ba17f56ce909872d3772388f2438cf494a8011868fe16c6e1dfac0eda1cfe257fb23e58db101c97d873cbf3e292678ffae8d81845ea771cfde53c30306abea659a5b91bfb037745776f7033154bf0e4bf002a0dd26be160ee92becc30a0a27f08e9da8a93c24a3d662f92086cfd87022a580f4324b64fff889b122e3bff74940ca60654d4845bf2737cae358a654c908de12e646a52e00ba413cc1b6e8b4fcc7ef4abb981d84f7678a57a3121ce28945da4f29208109dc55cb5c0570d7790dba340f5c274e014233ef723565bed3ee98843fea1802eb0f9b6c7b6a79b724060873c35493ab4d1763610b0497c75a7e4bf77d142593ee66ed6ec4655c073b8a114b4b7ce1c708290c7dbffbfc9965fca37869b916c412f0b1333f08b556da4bcd550647f3a04b45af863591c207ec7924700b6a95db1b5846e28aca22937073550ef401c5df8c255a3a52816c9d6ecd2389b2fa957abcf4ff4a3ea741f15596153b9e8da46b6e0d688ecb525cdaf99ca96eaddbf98a1dd5d8df749124b1b251849c91ebc5bf815338b053117df3a4e73a0995ebb068f074413345978428e65a9eed6137e913aaaade981be44344009e8cd4b314de6a06b13f3360385a28173b0fe7deb08e792f498b933d83b2391fb51e151aa939199948a217fc7ca2bc2afa0725b4aef23dab625ac548965e8d272679144a7cdb0cefeb4a7e55fc9b0b99e9c77f8fe29854891554cc92c240ee56c1d4171a35f0278f0680ce2fcb91b6d0add05c1ed61ca4049cce4aadc81f11aae6c27f0578d2c0ac1dab8098","title":"1054. 距离相等的条形码","link":"https://leetcode-cn.com/problems/distant-barcodes/","question_id":1140},"91":{"day":91,"pres":null,"tags":["跳表"],"whys":null,"difficulty":"- 困难","description":"不使用任何库函数,设计一个跳表。\n\n跳表是在 O(log(n)) 时间内完成增加、删除、搜索操作的数据结构。跳表相比于树堆与红黑树,其功能与性能相当,并且跳表的代码长度相较下更短,其设计思想与链表相似。\n\n例如,一个跳表包含 [30, 40, 50, 60, 70, 90],然后增加 80、45 到跳表中,以下图的方式操作:\n\nArtyom Kalinin [CC BY-SA 3.0], via Wikimedia Commons\n\n跳表中有很多层,每一层是一个短的链表。在第一层的作用下,增加、删除和搜索操作的时间复杂度不超过 O(n)。跳表的每一个操作的平均时间复杂度是 O(log(n)),空间复杂度是 O(n)。\n\n在本题中,你的设计应该要包含这些函数:\n\nbool search(int target) : 返回 target 是否存在于跳表中。\nvoid add(int num): 插入一个元素到跳表。\nbool erase(int num): 在跳表中删除一个值,如果 num 不存在,直接返回 false. 如果存在多个 num ,删除其中任意一个即可。\n了解更多 : https://en.wikipedia.org/wiki/Skip_list\n\n注意,跳表中可能存在多个相同的值,你的代码需要处理这种情况。\n\n样例:\n\n```\nSkiplist skiplist = new Skiplist();\n\nskiplist.add(1);\nskiplist.add(2);\nskiplist.add(3);\nskiplist.search(0); // 返回 false\nskiplist.add(4);\nskiplist.search(1); // 返回 true\nskiplist.erase(0); // 返回 false,0 不在跳表中\nskiplist.erase(1); // 返回 true\nskiplist.search(1); // 返回 false,1 已被擦除\n约束条件:\n\n0 <= num, target <= 20000\n最多调用 50000 次 search, add, 以及 erase操作。\n```","content":"096221c37c5f85fac03c87f9e42ff6164f863d842c3d4da25c067868220c57680898ed435087b8217750843294112d894dafe10c10fbe95567cac4128fd47ec11254003bdb501c0f8dfb1821537bd5b8f4619055114ec311e855a0100f267c7cdfde268f885e1ec8d0b9d0ac2210003a8432c7c9d92099833da7344b946ed77e1c398fed355e1a3e5aeac7198b5fadbb544d0ab750caa9fb08a73f2da198abb1f0b0b08f67e4f32f5e4a2e81981a656646f2e647ad8da9a93757a26a39bd0a7b0a841aba400991634073a3f913b4e3af36b446b696bf486c8bab234ce399f445566421cb1f25bb6277f88d7464350812c6c2a2200031a7ebd1b50785dc8e876db949f9db96d138a32c2f4e5b63d15963f3dbb137ff1cb24686c0c41f9888578d5106f68c7995eefb2cce744f4bde6d22b5ac7207d2bb529bcd53a49b7aeecc101d5db69b0f20525e90ae77d40d2fcf0420221c3205211010a27883a4645f74fd82e4ff7590a878c34a58512f534d81951283a00de31e2f56584cc03cbce2dd1613e5083c0a4fbba56404a24562b25716d8493692fe851deaba2143cb30267006b79840407e31a010d6cb19189adbd15beda9d3ccab75c20b790b2ad75c0ecc98e976a4a3b024c40b5ff659502e186f7452e72af0bb819ed0f469fd9b763d239d54bc2d135ac6ca43ceaf81102842758ecdc1b87ee5df64d6f048956d98be5b919d49450672c724f750cc5f90d5f0947d36c29ffb904d54bd330384b5bdbce0c623d5f15778ee81ae3e4a6cc6a5d6e7217e2f671d5bdc3bc6c92f7f1627ab7913e2a08563335b1a6ef2a9a8c8e75dfff4fe31ce48858129f42ebf1640fba24c53eadf7e46b2b7cc9472373867c4dfed8c6dd4d1fdcaedebd4293cd22c00332c7c461303e1911fd4a8ad276a478e20deaf8d617f59dd05ff4afc16bf4bf8792c5c9006dab0139781e73c5e1126ddbe8aa430ebba7097517c6a00cb7b965b4db6433aea1ed5ceb27bdb7667f3b326ab6d7641f8a73809c30934d19c4d758df516ce9847964b68593ae79e513964612ac4468ade9b4fa000475121f4b205faa61c9a2e6b17f6a50af121986fb6941cf8367fcdcbd4b732c67848adb5eff86468c61838ee241803168c12dd7dc148eb5df95c4486dbc53b145ff5bc98a50a0916272e552166532fbca7f9794735f2d8d65df4314e2e5752f3a231ad263a8e2bb31ec16c276b0d2f87d51b941adc948aa114a9ffefbb200da0b96cc975e645da4879c410db9f48a40475de800f93a1df292916c182c9f3781b1de7b3e3fa7f207e78032ebb2772ea5ae34f82192fb4a8369a80ea4bf71c3d80de82eeb5b425b7fa6e2ed778a92b2be3c11b5b54bcb8d2c5afec86bbe10312e1fdc7b5d45fad4518f532a8caf89452a8bcf18daf5b3689a57299b512adabb00c1f0897ab2f38e378fee37f6d1a04d8f92b66b90aab5be23fa23bb7b29f801391ad325f099626e5ed5595c43290956685b7ecc437518df01f124c3fd992b8c3f295cd47e94f656238e2824afdd084955e47ca5c928617720bda4fd298dae374822769fb6f0ecdc4d111d1b0fbf028949f2c5b1a0aff8954cc2876d2476e484cd8b368b2c5a9b8761346f42ae48bacd2d52054655853a9888c477312cb55db20b9ae9bbe0467bb761bb4670341677f1d5c89d877a2a6ba1d01cdfc6f6fc3a9d77f1f1f2673af85f221a6c3362cf99440d9175d147cf31bef489ce973cf56b737aa6b0217689761fe2ad4aeb2521aba37fd51390560b28c5c6b9731c135ef899fbe08642fd46f6932b119bf82e26f79a984695e89fd36ae9bcdc828ba471d22051fb3819cef66818cb8c0cfe6e1f920d8af6bc33edfd3e2cd6e0230e9d6e5f9de47646ea099fb644a68ed768023f6dda8176cafaac6e5986ea6f4e26ada30b951dc3fac1678c2a588a2a98a5877c659a6ba856fb5ceb948aee35148a617b24f0bf95b36d559fc9ffd176bae347edfbccea68c2adb59a2338617a49c3455b681d6d4d7244b8ee415cb43e24ca6b2c044b5a3ea611466d865794ffe5e0703a34f6c85749960228a1c3421b29d1db0d5bea63eba717dd9db25c446840ea692ad0b8c8258761c694d13c6c6dc7b1e217e72f284fcc5450d99e3529a2934167c88ebcfb169ac89013d4ed521cc923b473afc9fa2539d24a658a5efff19e09f7e882e579ee77778ca47cf8819f25c7db098b056346c3aa343fb1c47c6b0a871c690c3e0fcfca5cded28ad1d1937aa1f9a47e575d13577655c663145a8f3e2071dc4b2ae42d0cd04faac1ffeaabb757970158b7896656bcf0027983a28a8240ab695ec535452283349a9f54176498893600e5311ad5f9924c1f1cf36562cde677e9b6e55204f86779677a1e33c913ad861e27fff7604895d683ca0bdbe24cd22b1e8b381728be7366bd8d2f1ed46fc3a191b08dc2528ad9d7e7b9887ed950f857dc49a374c3b7f39a01d9d5feddd5fbd9fcc991680fd1e958eafcdf62ffb01f6bb247b2af8cab906f187ecfe6fd248ae2e422f31f31286759e5916b0f54d2ebf55e0b4ef2c195fcc0432e8070f004cec48b8246cffcbe90dce83fbecf7bf218ddb5120e0d7e80451d571dd039e10f48539b4fd78af4691363d1c380f0a91f18cf921e2275d26c5107f5298eee03759c165b00a6f9476fb92ff14f47f87ef5bf7f0f4e1c4fdaafe20fefad1f26f2a89790c6038544cfa75632f1a2c66a98485685d162daa5c7d104efa0b24c4775b1cbabdeb5d80ae300402f5a3ed29fed0503c6cd49029d5925368df02c782fbc6bdd1803959772aed23bca7504b5cdcdad4c80d4118860c5b56dbf164567f488d16e6ca15361a4d1d1140bd86b1416fefd0e97b2acc768378d8ff0e82cea0f4012f000112b1176cff26ce4eed1deb06b73aa6a9e7cc8150131c7878e4459f2b1de635709db6acb64bbe4b6d926de22c10c17e5a80f70821500d8fcdd66c7a8ac6b054e74e300345103bc3e1eb8798fc482b400335ffa246d0708cd917396a25d3f67f7f5d6d5a6033484c27a0008c2ffb6cc91259d1e68f533f6a0e0c0446b23a05edd2fbb9602fe40b8cf26ce033c07a9503ac78c7b6c07bda907b451683120a0351f6b3a957d952d85947b871a217c37a2dd14815f5615a50366d715e7f1069b90f1f941c460c575b9455a6356d62da400645adff2eaf979ad601b1ab30d9b4583b535bbb4e852e0ac51295682b593de02058fd6d1630e9e5434e93528939238df9f09bd1c0639a1004423528ca5d09a994f9ee9250de641a5c62742b909303448c6a7142eef2428b7a52019f0750a09ed8a7da29a259843317b5e002d530556b5791746d09721789ffa766fc80292b4f5d0a2b2ee24ca3d913a3f67d0e68b2c7c754993bc2c24d1d012dd090da8372dd8836e75b1d453ffc09c7e7e4b49f9565fd876e1031e421010759f8cb4ffa571114e682938de24516d8aa9a3dc842ddc10c64cd64f11a543ea20054f2e7bad02ce72401e9ab87beee48a58a2a965cacea2ebc250321edb9b5ab7da44a63162e100b2d215a8ef96715ddb644cad9c23e3ea50d52034c60edaa4079c7b40eb3c9209fb04e258cbd24ccd348616d364ad3aed35c57bd73cfb6835c65ca299c312c8d942e3d1d7b14011b377e7453e06a6370687e5f515f496d4f96187fee3ae78db86a88968e9d06799c25f3c82794e0d189832fd5bda23b10743abadcf81d279c28b10972d4aeda76b78d9a0c9453e56619d64d44d0a44f6f4ba77d4193520503ddc62328fa7b08590ce13d91367ec0155f5094400fca94ebc3bbe5edd3ee5ddc13f90e5b67118078ba52cc2b0e3a34089fd8ed2c0bd5ef4471325ae74ece7e2db7653c55a4b610a9f981d6a591a08db762fb560f1de26e47b0c22412c3e98aedc6d784fe4c86684840891329b58dbff5eec0aeeec33d56502ac31238486d079bf03659e59ccda602bf1ae92047c047ac2a119f6833f4dd5673e5898efd2feaa57740cf5c57e6a9caa1c75a0c14b31dddde98c13766f8268b5ac3a617fbd6d6b78f7e37ef333bad7146e6cf966fb9d9242cd15d9a8bc6a423aa968d847bc8fc665d5868fc6da177d62193abf932256f26869b1e13817bb34a13021432007b7a9fbfdc9ff39bb8d3b42968f86c5ab58f57d909713d84d72fdabf2d3c815bdeb97df84f1d97d6b5ad83f0cf5b7665659a3030b4168302b63e75a67952efa3211975d8aad6d5f1de9323d89bca97df5da6e96998036945445260a3bbd89de453a33ec1a555f57046d33504fa889de62a956ec8dd344f473149e5634ae7b8ebf7b35097801d42ec321930c4b0c737c67c8e3b814edb02fff2395d975223c8cef345f16c89817b0d30541958de894c83b88f8ba0a7d8cbee4b2654875fd178b5dee1749a4910bbfed5053cc22a444ca3497a222d50364c5f3e1ec0c3a3aac64766f89224ad5378d9a05a95967d75f4f6b6809899b64e32b0d1ea7e0c356795a4e86368535a927fc6c39963f94f2eea44e2bf2a376857a837a2adb277b0a34be3becbe8b3ef5ea7349b7f8853d405d33f81aa91f1bc675aa9b3cd1a8fae9ac57496e6dd1d2c180ec35fe34ba1c4eec13902d8c0f9ecb578004db323447ad92b957158348e8abab9f18db77043ce0c106f8042b5ce57638fd7feba2a9fe357ccb74dc0ef6738d6c7182c8467e9ac30ac56b6d6c4fd9d744a7266c1e772c6aa5c7cd48f47e627a54d4f112677ecccf41d78c0f5db117cb61ccfb5ebc4118bd57cd172ad1dbe29d7b52ad6086bc6f667b3982567a1778e1a67b72febc11710c3f4a830e4b6f647c0d84169071319b72a65a760f145e626623ba1416f7b1c03b9459998c0f87d702ef6a3260748fbb91cfb49ed93b0f08cee4f7fb2eeb4274aebf3aea8d36912b75d344bea2d761d572410e25d36ae25e2e47b2cf5f8ddd4c6d4a9bf0e03bdac96ad4e77ce9328c7c90e832f043f54dc4e57e9d64186d8126c78a19e9b1c3a008f016dc994223dc66f016536642e0932537e91d62bbde0695798041185d3c38797fd08c1d1701f757cc660430fe702aea2c5c6668d57dc4c0bc030baaf22a788f61bcbecd00c671d27d62f7c3d547d210a50b6315aa230d6166f0d5fa9e8df950a5d776e36cf11234a9ed200f59ff6735ca3ae37e4d1e982b49ce19f81c4037c16bb30588a65028c338a8a2dccda11701800bdb4dfcc86c611042dd5a0eff52a72ded77e01ba0e433cc3d74dfb72bf17668a9e9256fc442e75850b82c060f814f49b7d72afbbeaa7f59cfd177b14e82681cbdfc5433c16bca0063fd53ebef8bea08c8f96bad898aae7d4fbd45fa1136d8856ec9c4239c6c3ef278f7d01302762ab60185cedfbbf548955affc18a69a2d0876ef183f65b011cbe3f5ebab0a8c9c4f37d6c75880cb3f0b58e7ebdb254d646e6c588fe23a5ed0534daf4c30f7aeb43cf60ec555b37a3f83fddd1f307917ef77180ee63ea599a3c178b373450c02813bf08b9c5eaabbf8669999ffb20160ca41bee9ab34087745490629d7c6b8ceb22fd6027ffcc0f1c108babda6a64c54a20ebb460cc2c9847a3191010b09a4749041c1ff908690b10636f4547d526f0bb68f98aa6c29f3a023a0d73413fc3b623798ab0d88a10c77514503d91c6e8b3148a217b5d508c257b635cc3f968598025c18735d641f842a87a82761aa1f1d6bef5b6e727c821eab97d18fe6af54c3be58817ff0de183e66bbc4f5ce43571c71548e01b786c80a4e4345264211eb9c1012c8da49a18da30c68388e5c423aa7f83dc4dcd34e4660ae77fc37df1ff7d41364db97b0de1e29cac6d1f2d45155a0cdabdf3cdf3e7056a9ef3fd6dba78b45b217670bb0c90c10326442bff08a921fc841d4f86ba66f281a2790fa92d0715a4365523a6e0c8dbb3a8f1135c45810c1272a74e205156d11f35b0bf1feb3c56b190a0a4b68142c4040cac334e2e5bf771a4c99c22c814e02542fc0dfe8be8900800cd7f1911196471d7dc71e3d096dae4cd15e861607835f029c47c7da00327b922d48a109c30fc58a30ae8f65b233c06d2ed801e2771625393c2c352fb91ca630a11f832a767239d76d38991e448c11969eaa776e4da7d591e083e24bfb6db0c0ea44c159d769ec76216079e8bc9d888274ef348e9a5d8d465eadb41c940bc4eca515271235b8427a5d61baeb349a0b15b32e3c4da67ea2de095821a2838ce1ab7b38b5da3af93f959ade6126b380fd324738b7e79aae76f4bfb41c1cca7b14674845bf2737caab5ea84587419b08ad54a4744ca6533195d2acb8fc84fd1fb0800b93f97be503ab4159a1c6049146ef841fdd7dde25c6a3b858fcc81f97818ea76c420d66a1267064f5d1e5cc9179f71804fa1db1727b7a70b77f23077307cf3d6ed0a4a6c8a6cd74089cba8d6380d1b96f620aa43c9731551c59cf500f4532a49f5c743b7df7bebddd6bb2e6697bb750c205f1e44d7a5abb119f1fca0943c1224ecbd404b23581cb07b7536c354a2e95c61b1003a3cec4368d29780075a144909ad95c1f7940e5289427a277dce0b49529f9b1ec7b14fa5adb48fc5511b4fdb479264a76dfa64e51c5a6be8a2ef39bb9da37cdbe9e27c224c2f918d4829deb9ff5fe2a70b8034037f2a7b6103389e0f1358610636000dbc27cd6709eed6165ac47fff8dcdd0ff510422ab8f9b1b711964d3dbb3c762fafdefad1cfe32216770596cc8724351ed450b7817a82afdf0c9a8c448f2edb76a71757802dd964d2b82db117b7cb68c77ea148dc8bf5ffe9e90ec26c36c8a9f66522b903edac7ba5c85ee35993b1581e46a466eb3150c3dbbf648c9e60928a6384d6ddd9a9fa76d95f866dff4d4d9a7b47dfbd3d3503f8cdc2cbaff63fe5cce698e374a8a267421f6fbbbc308aafb005f28edce3861c4f04bd84adf012b779c53650612077464b332f247d40e6e8de4817b5ed512adc67b1b525c7c76c93ceed8975c2a01104825510edd3fa5424d96a0e8f2f1fc3125dae2b33a7153acf86d28eecbe741118edc8968ae8e524f186ee1fbedb7dd70d6d2617e49e5faaff72a9c234b1e2153e4e057cf79501b7b3f6d8c20dd0cc132cee91465fda1f56fb29df25bec4310d72f788f00f7ddcbad8ae80b14a08b2554b929f34a69150bb528adf06bb65d323ae1c526d98e1861cf98ec0e8d3dad57fc7eca2a27390cfb5d41e89b1202a6fee96cf410d41b9c6c53234695dfdd109263361f90496e0c5802f726f333085cf37926b07ce689764e19a62bfcf9e6d998a83cbe6b67b459aaf7ca91e2d201e18f72a52cb1140b6c287915f819e9c397dbc3a42bad9e6d86e8386ad5d7969640c5c3850923e3720114e5b166d664ec9b9a3b2b91cfb1b5aad761b4a9ad0fc807d574d9aa874910db9ba7aa1c6732076f5155f248a1c985ce4507e63bf40930d5077b6c83e0f2feab4b0cf22f7472faf6f02ad23cc02556093d5527388e4f3bae936a7c0a0a5c78c8ea7696106e00c0cb62b046e65658b951917ca96a8dee6edcc734f6e46ec0b997c79cfe241839e0df2d63fd46a8d32b1ad8906fc3fed6aa3cdaf095d305966766f732d0d7bc13f1de2e2633d7d9ef20a2b0cca010e1af7a655b8459b7ce98c4048ac02d93936b11f8b165a43d1e26a35c33ef02c66d8c82bf7ac9ee0e8ca6b8cbf09baf6ac2c671d811c25bca69a34e97cf78e1f3dd6f1683242b3c4ac5e215c89fd01e69df22d0139a2700526407b975375066245ac588cb028656a079d52e34300547604b150f65d397843ef0e51504a9a1e350d3a3d488646bdc44cb743150cd0b0fc474d237b234ce4cbdaa79df8766e45adbff966b367a7644762dc656f80748fa91a640e04d2fffba43d5ac738aaf76933f5ba7ab7d5bb0f2088c9828f5b11e6e496e5f3616ad2556d6aa9a8e8b3473ad23e683ee362b0f8ec6d661b49a59f85fcc17ed060c5141ee00fedbf109e533ce963b30539791df7bfc305e902ee81d1753a985f486367e3785dedceb14611c787ada87e4021caa9a182324c73554fdac707904f8a826dbda8f212a8d402d37bb527fe8dd07afa8eaa8ded0daa0ae9087d864a80130e0ad01cc3476167ccf7de9264b064573c0a95acdf76e930aa9efd06520baba9ff8d84b805e1e3ffd8e3962d2db83ea78b3576b9140e50dcb34974f10edcbac170c54ee7a5059a469f1c038a0f2a721a9517698cdf65f0d735ddc173e5f197e3b2b513c75e20a129dbdf12c3cbb9ea4bca70244c1f3573aa59aa9573d702e35358c803117b7267c7dbe4a8fafba3d161f702774b0c90601a608c057d4c68da969e557b5eb5964f6a12766ee731ab40d13f6df0d1fe2683c5e42d8d1411b86e1b9902e4e624f6e468db31e614f1d38dd61eda9333b63951abe7585012dd49a1a4713cd882cab32a8f3e37b0a38b6149e85f1cd94dc2dd46895f795831472c19d886f28dc2a5bf1574522fd148004330ea10961fd87ef7b51cd80fef698e71cea98966dbcf4f24bebbf9e120782ff4ee335e3280e13e4c2ee2adcce77ecfc62194fb194f9693a68083f8b07771ba74da3796205ada48490618453ba1d90a4fcbad8ae78c26b5114e1e240a3f4ffb7d1964716c0038626d8c7678d465dd9a66deba2b92a5e41d7314bb8b0d7e34ae286baea1528b9c9faf9c47e72e3275aa44c67757515588f4d49b95156e0a63ab88ab044b7013ffc76a6ffd363f98606f39a8e8c2c6aedd7bacc56e92897468db35d2987ac7e62043963926cf9bf0ab27a0cd8e8354897b7e76600244bb5a5c81e16e17be1e4b2322fa0d7b1b541b9b1f2b9f5404cfd61ac2c959a8df2dd2d12273eb65e9bfa724f54aa67e6eb1fe69ed10bf9a9a7a325b4254cc95629e6098db54278c2da52c34ba959097f2252e824dc48e1a77752a1515599d1961e516ebacf020acd776b6c8d9917927e91608e638ffd6a44977ec2ddb5ad8c614dc0463880dcc2e1380249df8c89f3e5da9bf42ac8c1f521b9fb5a7c399d0c1a7ee9a8bc8da0721c02e158246ca8a60a2d8e91323d43711ab2d2a8420093d9bc4db465eaec0073373d84f5cf96c04846ed15d76aa04d5aad88b2fc97cabe5710a25ef108e55382a8672f6af6cfae8c9535c3fa2aea0d109f8a90abd7773b6f0149435943ad794385872211b1c3e6608e8f02c58f6da16cb6ebe8b29a0615e001e1b4ebb07c6758f96ae7550545affc19755f065d0f5aa978377cac0b433b5bc073e0d957c0d4f75612311d7547ee281cbffec8cf1f49af0ebce7e432ba535803ff23a161181e371694e9db10c566164c6972664b7ba22b58943aa7993f961d5b0554cf9f060c67bf7b11d354048f6ce284a0d4537609536f8394aef4eb7dff667c40b173b826d329c4fde7e60cf5d96cea3dbabf7b0328b77eeb12c8144da9178ba4156b88249ac006cb257ae9230bbe02a21070e648fab47e613430acd28255a6b2b6e759ed0cf8239e9e3158c4a02b7fba2819f518d32c6767d3324378fcd2573c51862d0296172dcb52c970c4fe3d8683340100439636901c62d762a82644f1544cc4b5d626a0a1d1902eabda603c140fde7cf34e17196350e9e5bb4ae72cee3981850f10aceb6831b6e384390da07fc519c1fc0d77f060b22ceb509222e77f2c91976e838d440ae06d47532a9db32b611b430e99690e9202d2997c6ea4060b0071d087e2e87b00d85e308ecf6d0eecb7b716583861193b7f0c9e5c445b3ff69a0844e1a8e41c453a814b4e2086234650e07b16cb5d1d3f57eb2e1ec1cdc60e411988ee03728a56c8e5390c9cb8e5ef8e489f5e502b52f66bd3c180887fb8f6d3443e62335badef99fe6f6986424cf15eb80a97c285e84820996fdff50313bb5a15ce6b55637abfd11a5977f4ade6254fb81d11eda485eeb7568c08b83d24b64d206583439c625acb283bfeddae1998e86fac1d875c0cff691dbb11fb583853e331b289e6668e7861f08a4751b059db3d8845f67faea36e0aaf8b5ca3a53be798c29899a2a7642ba45ddb2ad39a01d871cda737d712726e05955170ea68bc3996ba5708f05a1002f7e080fa48bf61b8cdbc11a97ffb488c65592e1107acbdc454022a13f34edb65f04c768d73bb2e125fdaa7779aa1caea4e8f4e27a8eab393ba5aa4df584153c6e9061fa1288ab85b79ee0685392535b61d297b903b614d29e3fd804fa13068be8ced92c7d3dd3387de2c6281a96aa401c82a2fe9a3e2be622fcab844c06f93cce9203b38ffe6b940d90ae6534fb35bbff4e5466a6ca679d6517ecfb78fd0157d9e01f6cced0a1f69004ebf7141ffa6de5a79d53b99867b5a952e7fd5fe9cea5aec9c21e481aaa02cb65fd37fe3194c32f2610662b4547fadab35f21e722366e011406d222205edbc676bb89dfd8a0051420f253a2e9240261e887dc573cfd842a0b0f25a49571b27411b0f5b7fe7caac1534117b296d2c4e8465d55e258b51c601063157f875022d3b5a1011b4f3366e430c52336cdb7f6d3c502850ab548abead7c65b1cfe403adaeb7b9452442e3ad2cf023b6589c23ef0df518bcf293e116232ace172bf500970328fe436b152bd63e47b72e74325ff3b8406fb94f2ed20a749e5c5511e5672d20f87e176e67e2e7b73b844a78a070b310478ccba93f62d496c10389b2f19f92a74ff40eb0a3f45bfd1aee81cc9ad2dd197c758279731731756f4d332fbf7afaab6c5fd95e0526de8d9a8228eb6bc23010f0780266293a9d8230612e2f0be5e7669aeb404f00623eca9e4f3c1b290647905722f169af173b4244584c6363236b3736fa792ef21d25de141e72ecc7e2db4ce233b40b8a6c6f220c9b6dd1ff128a63f5c3a8497e38060e0a5a3bb06d39e46b1165ba12460a15d9bc2f600fb8412824154c4f62bff2215622653647d03e0912b51085718af97b0eaf7b092d3c84503d6514c9647169d27f3925e191b1b3fdd10256be8973716e9626c6c866c97e9ff6fe4b5d3815461b705c26d6f4c0f985c016778b5f0cd9bb0dd445883b6bf27b05abcc700b9357ccb8858d86c565f26d92a0ea971c92193beab0fcb494e0b6b151c1d1aa6fe2da46df26c02a35c70e641af2479d04dfb0a62e86bdf029db6df59f6f8f12abd16b8b430f51f8afad6d6eded2e60b78842364661ddfd0117e7ff14acbd6910572c39643d59c80f72c3cafe95360cecc64b608109695f714e306349006436b4be97cdf6215a15cee65f312efca9907c84259d21d3e4abe4e1e0f6119ecdc5bdd4e67e844220b608de7bfee2c17ada59fc8e73182c4029ef0bb0f195c7f5d5245ee74363afdaefcff87b78c71aaa75049afc9e5dcbee5b3bd38efaa109d0294a175a2099ac7a60aca59d4fa53edcffc101128e2cf72d75fbc108cd49eb67d7bd20aa9827131ab7a91c55a742066b05b5e5786f77e1d7c4db67899633a64153f4358a18dda214e0333a1aa00ddc6831b9790c027db7421d15e92cdd6d3fdd72629dda8e34af6d8b57531d57743cd59fa016a62a1141d24ece3122de6548c363a811ec96b0dd39f166844c2a7140691422ecb140d10b0b6645c33f58d85a9121b7914d4c2d9df4f5da36dcefd78e10275cecae24983bf0c25030646881d5290ee1fa2aa2bdd742e844448913aac4bb1bcf29e6933f37b7ddb8c38d8a8f7c7106367fb377449498bf5e35857f2ff0b1f95ea05751b5db1cbf03be4fa90ca2911faa73abcbfefe224063b84becd0fb40cec8c7131521ca7a499b2a073d6558ec695b61c268734895e1176e5192a546a3e0fbded21bd37b24a8655197d6617232c19be3545ed6769e0c0eec35fde58d82ed680066de85ba6fc4e1c8bdb78112e8af71cd620e6e08616520332165d1ebf58b7029b4ca0a0597efa83c01d1182f1b097cab7ee53e9a1ea2991d12c7905d345f786d940518c9a87575e2fab8f3d9792157008467d23f2f683b62ab87ab180773c3751676b1318e0a14918315a1fbf1d6c28e9eaa5673d171ffdcee47419c775742c8467c9b5e15df6925efe78a2cd70a637cd1ed08aaa579219033d64a72d08d2613bf1b4387af6ab3674723ac00a90c8739d1d6a8112f620310c11245278a96daa086bdd60c14c24c9c9302b10ff0d72c339ed03c6cc1a3db734192ae92d93a73cab673151a6e8a58e0c2e6bca2a57f08f6045499d71edfcdece110f1f659acd27fe9c9b10e817e394541103172f17f5930dde6fe6c14c44fc562f48d1a3a5ee80330f2581bc320543088c495e046ccd8deff36f60869b05eb822070387bba1f446e7824dcdd235ddc173e92cc4e6b739d69b35ce6b4af12f57c047493dba7fd51c4866d8df5bf330cd3ea6bf835501ee549b3d55f61bd9d9f86999983eeea362c5bd0f2592b01b684da47ea9d76e33962aabec1da619b622be15d8fdc0124c960a947d8c636095464eaa97a35f6c4d66228c4ad9d5f87867864a696887b24252e3e4f89552d870e22a99fffb2a1917c9921359599cedb230e1beb6b5c595f0a933e0ae8209d6302ea08a0e463d0746c2a3cbf451a949272cae9eddfb289385daf6b63aa05d2868068d5790667474836835c0de45eeef5b6ffcd57ee26b292d3606869b815244d1394193a6d864a4c94680fb32f0ef9f6ce82d664422d91082d9d77e7307788f995cee8d375f2952f97e8052ae5af9c74882f46f587baf983acef9e9a0919a913d71e6bd086222e166cc3f2e401190be209a69ed5a0d4115c86abee09d419635dfd1d6b9edaffcaee2b28e73778fc7e7c3542c4b6b8028d43b198185f783596cca6bdfa946705f470523f5d0a9e1db19ced07b8791c767b6110a38e17b4308ad72bd4eb7a701695450c745b386fd2e8aa126c4f5055a587061c3f05dce2a13586b5e2a2d7b6072940d93fcb9d14ab83461097af770d43e833333be774c93f5b43effd88b2d2441775d2262a8051c3701b53a0ed2c5e844aca7e7d511e0e914ed4fbb625387c00765f95138dfebaf95a3542b9f80f74aebf1f49aa04db9ed7f510c4c8b98570b5cd000d88208ca7f60a1fdbcd5df9e8a1538300e3fd9c7148da5b7a1a98a57a904a83f50fec7c6828a4d19c865bbaad5bc4e1a4adead1fdc31c6e45e252f9f74f761103ac52ec8e374c0a8d8bab3a8e65b5e5021ab699ab2093ff00f156209c35b99e7f07b052479bbed9536e1b3fc661a952212efcfc176d36a9f16d1381491b817ce54cdc7fa118c0081059776297ef8fa22c63438f89b93a263e09a7223f2f81306b40901263defe74fe89bfebcaf8e835638856b2ae20a6817f78c6d3b97600d70104ceb98ebbf9c52973acbe1673fcbb3a14b551844ff3bc3d10b6103aaaca3c8a3d55720d58847879eea7dc9f95a17b2f1c1d5238910daee29e5ebcf3d1014b6733cb5cd06b381f274310a5897cd7b01a5b6c0a6ffcddc4b40915786827c9e7790580b0fd6afd8ce50bb4175ed475cc2a07fbd4d0bc2834cf1ccc22a52457237f00302f58bc6516def3e26c0d386445b765059851d4c69298004393061df9eefcbe390b8a4829e8b4b562da24960db46b627fb18b8034780b5b414e21c3a76ab768e2c9150e23550871ff28f89838e55d35c12845b78578c766177377bd0b0ac18376febb21102f9002fa710a00b3ba4fe94798aaa682f24df5a0f27b558b3b4239cb19e36f34c9cae13aaaacdec8095bc36f773eeb32390fe164e5c77dc30f6349f5a9a07f573d4a5a2e44ecfd4d9cd53e1129f1759bd940db13e613ac2d06e240f42861372cbbba7b1ca9128657f5eed432e6ba4ca382a8376d1ed04ed737ace1451aec29679f718d860cb7249d0432fe6ab84f209da088fcc410688b93a738caa778d2496aa5c52ac370c719ab271e6ebe802d05e4678e87fc6b1ed9406b85da6a1e5e130e6c46d3e1f6e7d579206c19c46430b4a2a021c1c0723410791c15f8747b77440cabbc4375ca8e2f95ef2f12e2620e9a8a4d72d99c157958d142bb0eb872d036370c220bd096f5c27d713e165b72a73b3e49425f82e4a1428fff2379d000121402e5c04a75d8ec2ff7839180aab4481cdb31328f79c82d50b48012796dfabcf19b784127a2eacaddbd72bc03c8d283da954d20c42755d1e2d93fb7c5b90ecd8eddcadd97bd61207a871d1f0561060805584dcfa5bd6d0368e75da68f17de8323cf48a8612b33237187e5c5d448e904ec549f5d134ff2133de9f396005677c8b92db0cee862b6acecfe9bc35a7bd17ffb10224db8cc26fb08dd36f058aa4d95b744c8395434fab294eea94670a27e5bc3b5c3d03b4f3d8414d4c3046cbbe85b0c49ec111c6f73cc5c474de55552abedf64ea5ff0d51b8d7e75e821084058b4c9cc48e387473cad5ec80acdd3cb608664617541e899bf350304c5031a5d06de7b9407bcd5ae0a3e15b43ac8cb26a5747e7054528022f18978c83156791415ed9ebc6cfa158ed8fb939f1ee75ea0f7ddf20078dd53c2ce6d58c1d03d5eb61747dd7c90dfdaaad5c42cd3f99af29966c3a70ac839ced3d055ee03e7868ca3a2c0500a285803464e2f15f0ccfca358a9c62da6449b8c46e9312146471a30e44e0eec07d84cbd59427b5df5ac24261fccbab66950e29afad402edf82fdacf8827a0f9dd5128a6c1d425de71374d0f3723257d08bd0eb3b779f04035ca1a2fcfbad191b626aac9d7fd1e6547450f13ce93ee6bd1d493218b36c1526c947b7fb4fc078179330616dbcf0a2b0022f407820bd193a1e8fe30eab2911bf9d080eb282e244ba8ced7a86db72b550c8431ceea5872606513fd2b5c7952cf581c976efb720e6356529f45399922a19320831b3cfeb26eb4be327225f71580961a4c4d5fad23b51fe258f1720f1d2107d2cebd175cd4de6991f9b7d2f62011df3c51fdc10798a5369718aa07bcaeba6ed39a7f47d30fc60bbbf80653394cba51181b35a0154760e9e38613bf8167359a988e1246e29500b90bdabd6807a3c8e0356947501b8cf92a5816d43c976276d83ba5958c6f721884dfd7c513348ad7cea9864e71d015961af78abd7a3af2518d789699e326de3068b777fb655781eaa7294c3faf9a8eaa7f0c04c2533e16ac03784fc520977d355254951300d30cc8fb4a4f9c0d6c08cdc5bed48b5382f16aae97f0c853ee26170f61a13ee77f45f867dfeb483a2c84efa2dfab5dcd00ffec3cb3e89435857d3734b29ec513cce25d46cd017e812ef93a613612f4f2093daccd2ca80eaf1ac27b60e5791b69cbbd877eac8d6fe8b3e2310edf9a889b6e4d4b1b6d42f529dd6a1ad70664c02a7743191d5465217bd0efb8d790a1b050fd9f01be065e09db36b821c0a94b50ada051308420447ea94ef6eeb03233cd8562d7bc469dd093c5dd5958a3ac2480eba1489fbe5a85363f1032a67c2d78130c0cee97b205d6169214f5dc982f9e4646522130d87ff2e29fbc7631655ecc7432f809910df372234296026bb8a064fbd2c1c0368be2547dbc5e4c5b94ce01215d7a61532d59b3594857a9004472382b2d4cfdec14fb808d10ef5096502c398d16a920fb6f89f6f70f660019361cdf5fc3010127aade8cb6b26d87dae8e45d3e3d585224f3292e768c0b26573b30addbad5202e3deae9afdfc464d5fbf14d0e5cd7bf05b245801ccb07dbd216821d64d6881d74ef11a213c988ff547281094463aa53b0e05575d30db829772108728abee8cef10d56bb4471854698eddb27a7e503d4fb6f6619797f39498f4ca3fa78a761b5ed4cb87b11815c90aca6819e4f45aa9d6c5c18b44de1c1c573698dc1ee90235948ce43a6e4a7a4b9c2c6bc6ad15b44bddcf04751fc689b608597af417549d719663c96ed7b70f97e17fe1e05da686ff94bb025a7d2c8d0e0551ffa2cc0ed6ce7f98674d018418a23085fdd6a73a0dff26578aeb564a06d3462187ce8122e1981dbf080df2ee8c7a5ebe7d73f562d594fc7e0f2693f149e094c95dc6b3eb5c384ad3f1e84959bba4c58b9ee4af38481d34fd6d78c08aa2733467e22e193524958f799f74793859c031016fc4a1ab80e8255714be3fc2e52ef887c1e41cfaa5333d881812146faeb520c8a01b1b57ec088334f3329d61793242e9e0ed34cfc69007af9afcc58f3381ab9f6aac2a253df71b7ea97339f5450825751d7f978b5c0f709f57dff86a4e01bfd3ae698578ba8ed21ed43933f9c2c49e62ce6ac5f21a14a400515686ba41ebec70e0eeb0","title":"1206. 设计跳表","link":"https://leetcode-cn.com/problems/design-skiplist/","question_id":1337},"-3":{"title":"预打卡","link":"此处正常应该是链接","description":"让大家熟悉如何打卡","day":0,"tags":["预打卡"]},"-8":{"title":"预打卡","link":"此处正常应该是链接","description":"让大家熟悉如何打卡","day":0,"tags":["预打卡"]}} \ No newline at end of file